@magic-xpa/engine 4.801.0-dev481.243 → 4.801.0-dev481.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/index.mjs +190 -0
- package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
- package/esm2020/src/AccessHelper.mjs +3 -0
- package/esm2020/src/ClientManager.mjs +403 -0
- package/esm2020/src/CommandsProcessorBase.mjs +58 -0
- package/esm2020/src/CommandsProcessorManager.mjs +26 -0
- package/esm2020/src/CommandsTable.mjs +163 -0
- package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
- package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
- package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
- package/esm2020/src/GUIManager.mjs +63 -0
- package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
- package/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -0
- package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
- package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
- package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
- package/esm2020/src/bridge/MagicBridge.mjs +41 -0
- package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
- package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
- package/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -0
- package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
- package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
- package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
- package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
- package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
- package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
- package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
- package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
- package/esm2020/src/data/DataView.mjs +1634 -0
- package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
- package/esm2020/src/data/DataviewManager.mjs +28 -0
- package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
- package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
- package/esm2020/src/data/Field.mjs +645 -0
- package/esm2020/src/data/FieldBase.mjs +18 -0
- package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
- package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
- package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
- package/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
- package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
- package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
- package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
- package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -0
- package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
- package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2020/src/env/Environment.mjs +554 -0
- package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
- package/esm2020/src/env/LanguageData.mjs +222 -0
- package/esm2020/src/env/MirrorString.mjs +66 -0
- package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
- package/esm2020/src/event/Event.mjs +1436 -0
- package/esm2020/src/event/EventHandler.mjs +773 -0
- package/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
- package/esm2020/src/event/EventsManager.mjs +2983 -0
- package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
- package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -0
- package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
- package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
- package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
- package/esm2020/src/exp/Expression.mjs +200 -0
- package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
- package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
- package/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -0
- package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2020/src/exp/YesNoExp.mjs +41 -0
- package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
- package/esm2020/src/gui/FormsTable.mjs +66 -0
- package/esm2020/src/gui/MgControl.mjs +357 -0
- package/esm2020/src/gui/MgForm.mjs +1195 -0
- package/esm2020/src/http/HttpManager.mjs +97 -0
- package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
- package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
- package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
- package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
- package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
- package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
- package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
- package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
- package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -0
- package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
- package/esm2020/src/rt/Argument.mjs +274 -0
- package/esm2020/src/rt/ArgumentsList.mjs +103 -0
- package/esm2020/src/rt/Boundary.mjs +158 -0
- package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
- package/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
- package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
- package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
- package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
- package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
- package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
- package/esm2020/src/rt/Operation.mjs +745 -0
- package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
- package/esm2020/src/rt/Recompute.mjs +355 -0
- package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
- package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
- package/esm2020/src/rt/TableCache.mjs +177 -0
- package/esm2020/src/rt/TableCacheManager.mjs +67 -0
- package/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -0
- package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
- package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
- package/esm2020/src/tasks/MGData.mjs +552 -0
- package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
- package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
- package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
- package/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -0
- package/esm2020/src/tasks/Task.mjs +2501 -0
- package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
- package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2020/src/tasks/TasksTable.mjs +80 -0
- package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
- package/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
- package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
- package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
- package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
- package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
- package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
- package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
- package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
- package/esm2020/src/util/ParamParseResult.mjs +8 -0
- package/esm2020/src/util/PrmMap.mjs +151 -0
- package/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
- package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -0
- package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
- package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
- package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
- package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
- package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +102 -5
- package/fesm2015/magic-xpa-engine.mjs.map +1 -0
- package/fesm2020/magic-xpa-engine.mjs +30705 -0
- package/fesm2020/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/package.json +27 -13
- package/src/AccessHelper.d.ts +1 -1
- package/src/CommandsProcessorBase.d.ts +3 -3
- package/src/commands/DataViewCommandBase.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +1 -1
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
- package/src/data/FieldBase.d.ts +3 -3
- package/src/env/EnvVariablesTable.d.ts +2 -15
- package/src/env/MirrorString.d.ts +15 -0
- package/src/exp/GlobalParamsTable.d.ts +2 -1
- package/src/http/client/HttpClientBase.d.ts +2 -2
- package/src/rt/DataviewHeaderBase.d.ts +1 -1
- package/src/tasks/TaskBase.d.ts +7 -7
- package/src/util/IMirrorXML.d.ts +1 -1
- package/src/util/ParamParseResult.d.ts +6 -0
- package/src/util/PrmMap.d.ts +0 -6
- package/bundles/magic-xpa-engine.umd.js +0 -37983
- package/bundles/magic-xpa-engine.umd.js.map +0 -1
- package/bundles/magic-xpa-engine.umd.min.js +0 -16
- package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -188
- package/esm2015/src/AccessHelper.js +0 -3
- package/esm2015/src/ClientManager.js +0 -412
- package/esm2015/src/CommandsProcessorBase.js +0 -54
- package/esm2015/src/CommandsProcessorManager.js +0 -31
- package/esm2015/src/CommandsTable.js +0 -166
- package/esm2015/src/GUIManager.js +0 -72
- package/esm2015/src/bridge/MagicBridge.js +0 -44
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
- package/esm2015/src/commands/DataViewCommandBase.js +0 -6
- package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
- package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
- package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
- package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
- package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
- package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
- package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
- package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
- package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
- package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
- package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
- package/esm2015/src/data/DataView.js +0 -1692
- package/esm2015/src/data/DataviewManager.js +0 -31
- package/esm2015/src/data/DataviewManagerBase.js +0 -18
- package/esm2015/src/data/Field.js +0 -671
- package/esm2015/src/data/FieldBase.js +0 -9
- package/esm2015/src/data/TaskTransactionManager.js +0 -110
- package/esm2015/src/env/EnvVariablesTable.js +0 -408
- package/esm2015/src/env/Environment.js +0 -557
- package/esm2015/src/env/LanguageData.js +0 -229
- package/esm2015/src/event/Event.js +0 -1441
- package/esm2015/src/event/EventHandler.js +0 -786
- package/esm2015/src/event/EventsManager.js +0 -3106
- package/esm2015/src/exp/Expression.js +0 -209
- package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
- package/esm2015/src/exp/GlobalParamsTable.js +0 -84
- package/esm2015/src/exp/YesNoExp.js +0 -44
- package/esm2015/src/gui/FormsTable.js +0 -73
- package/esm2015/src/gui/MgControl.js +0 -424
- package/esm2015/src/gui/MgForm.js +0 -1291
- package/esm2015/src/http/HttpManager.js +0 -100
- package/esm2015/src/http/client/HttpClientAsync.js +0 -72
- package/esm2015/src/http/client/HttpClientBase.js +0 -147
- package/esm2015/src/http/client/HttpClientSync.js +0 -47
- package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -901
- package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
- package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
- package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
- package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
- package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
- package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
- package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
- package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
- package/esm2015/src/rt/Argument.js +0 -281
- package/esm2015/src/rt/ArgumentsList.js +0 -108
- package/esm2015/src/rt/Boundary.js +0 -161
- package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
- package/esm2015/src/rt/Operation.js +0 -772
- package/esm2015/src/rt/Recompute.js +0 -372
- package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
- package/esm2015/src/rt/TableCache.js +0 -182
- package/esm2015/src/rt/TableCacheManager.js +0 -70
- package/esm2015/src/tasks/MGData.js +0 -561
- package/esm2015/src/tasks/MGDataCollection.js +0 -270
- package/esm2015/src/tasks/Task.js +0 -2601
- package/esm2015/src/tasks/TaskServiceBase.js +0 -30
- package/esm2015/src/tasks/TasksTable.js +0 -87
- package/esm2015/src/util/FlowMonitorQueue.js +0 -364
- package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
- package/esm2015/src/util/PrmMap.js +0 -157
- package/fesm2015/magic-xpa-engine.js.map +0 -1
|
@@ -1,1291 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Commands, CommandType, DataModificationTypes, GuiEnvironment, Manager, MgFormBase, PropInterface } from '@magic-xpa/gui';
|
|
3
|
-
import { Constants, InternalInterface, Logger, MgControlType, Misc, Priority, XMLConstants } from '@magic-xpa/utils';
|
|
4
|
-
import { ApplicationException, Debug, Exception, Int32, NString, RefParam, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
|
5
|
-
import { MgControl } from './MgControl';
|
|
6
|
-
import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
|
|
7
|
-
import { SET_DISPLAYLINE_BY_DV } from '../data/DataView';
|
|
8
|
-
import { TaskBase } from '../tasks/TaskBase';
|
|
9
|
-
import { ServerError } from '../remote/ServerError';
|
|
10
|
-
import { ConstInterface } from '../ConstInterface';
|
|
11
|
-
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
|
12
|
-
import { CreatedFormVector } from './CreatedFormVector';
|
|
13
|
-
import { AccessHelper } from '../AccessHelper';
|
|
14
|
-
export class MgForm extends MgFormBase {
|
|
15
|
-
constructor() {
|
|
16
|
-
super();
|
|
17
|
-
this.IsMovingInView = false;
|
|
18
|
-
this.PrevDisplayLine = 0;
|
|
19
|
-
this.RefreshAllRows = false;
|
|
20
|
-
this.IgnoreFirstRecordCycle = false;
|
|
21
|
-
this.MovedToFirstControl = false;
|
|
22
|
-
this._suffixDone = false;
|
|
23
|
-
this.hiddenControlsIsnsList = null;
|
|
24
|
-
this._transferringDataToGUI = false;
|
|
25
|
-
this.isFetchingRecordsAhead = false;
|
|
26
|
-
}
|
|
27
|
-
static get CreatedForms() {
|
|
28
|
-
return MgForm._createdForms;
|
|
29
|
-
}
|
|
30
|
-
get InRestore() {
|
|
31
|
-
return this._inRestore;
|
|
32
|
-
}
|
|
33
|
-
get TransferringDataToGUI() {
|
|
34
|
-
return this._transferringDataToGUI;
|
|
35
|
-
}
|
|
36
|
-
get shouldFetchRecordsAheadFromServer() {
|
|
37
|
-
if (this.isTableWithPagination()) {
|
|
38
|
-
let prop = this._tableMgControl.GetComputedProperty(PropInterface.PROP_TYPE_SERVER_READ_AHEAD);
|
|
39
|
-
return (prop != null ? prop.GetComputedValueBoolean() : false);
|
|
40
|
-
}
|
|
41
|
-
else
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
FetchRecordsAheadFromServer() {
|
|
45
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
-
this.isFetchingRecordsAhead = true;
|
|
47
|
-
yield this.GetDataview().FetchRecordsAheadFromServer();
|
|
48
|
-
this.isFetchingRecordsAhead = false;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
GetDataview() {
|
|
52
|
-
let dv = null;
|
|
53
|
-
if (this._task != null)
|
|
54
|
-
dv = this._task.DataView;
|
|
55
|
-
return (dv);
|
|
56
|
-
}
|
|
57
|
-
moveInView(unit, direction, returnToCtrl) {
|
|
58
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
if (isNullOrUndefined(returnToCtrl))
|
|
60
|
-
yield this.moveInView_0(unit, direction);
|
|
61
|
-
else
|
|
62
|
-
yield this.moveInView_1(unit, direction, returnToCtrl);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
moveInView_0(unit, direction) {
|
|
66
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
-
yield this.moveInView(unit, direction, true);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
moveInView_1(unit, direction, returnToCtrl) {
|
|
71
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
let oldRecId = Int32.MinValue;
|
|
73
|
-
let lastParkedCtrl;
|
|
74
|
-
let currRec = this.GetDataview().getCurrRec();
|
|
75
|
-
let oldTaskMode = ' ';
|
|
76
|
-
let returnToVisibleLine = false;
|
|
77
|
-
let recordOutOfView = false;
|
|
78
|
-
let visibleLine = 0;
|
|
79
|
-
try {
|
|
80
|
-
this.IsMovingInView = true;
|
|
81
|
-
let oldDisplayLine = this.DisplayLine;
|
|
82
|
-
if (unit === Constants.MOVE_UNIT_TABLE) {
|
|
83
|
-
try {
|
|
84
|
-
if (direction === Constants.MOVE_DIRECTION_BEGIN) {
|
|
85
|
-
yield this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_FIRST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
|
|
86
|
-
if (this.isLineMode()) {
|
|
87
|
-
this.GetDataview().setTopRecIdx(0);
|
|
88
|
-
yield this.setCurrRowByDisplayLine(0, false, false);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
yield this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_LAST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
|
|
93
|
-
if (this.isLineMode()) {
|
|
94
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage + 1);
|
|
95
|
-
if (this.GetDataview().getTopRecIdx() >= 0)
|
|
96
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
|
|
97
|
-
else {
|
|
98
|
-
this.GetDataview().setTopRecIdx(0);
|
|
99
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
this.updateDisplayLineByDV();
|
|
104
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
105
|
-
}
|
|
106
|
-
catch (ex) {
|
|
107
|
-
if (ex instanceof RecordOutOfDataViewException)
|
|
108
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.getTopIndexFromGUI();
|
|
113
|
-
let size;
|
|
114
|
-
if (unit === Constants.MOVE_UNIT_PAGE && this.isLineMode()) {
|
|
115
|
-
switch (direction) {
|
|
116
|
-
case Constants.MOVE_DIRECTION_BEGIN:
|
|
117
|
-
size = this.GetDataview().getCurrRecIdx() - this.GetDataview().getTopRecIdx();
|
|
118
|
-
break;
|
|
119
|
-
case Constants.MOVE_DIRECTION_END:
|
|
120
|
-
let last = this.GetDataview().getTopRecIdx() + this._rowsInPage - 1;
|
|
121
|
-
last = Math.min(last, this.GetDataview().getSize() - 1);
|
|
122
|
-
size = last - this.GetDataview().getCurrRecIdx();
|
|
123
|
-
break;
|
|
124
|
-
default:
|
|
125
|
-
returnToVisibleLine = true;
|
|
126
|
-
size = this._rowsInPage;
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
else
|
|
131
|
-
size = 1;
|
|
132
|
-
size = (direction === Constants.MOVE_DIRECTION_PREV ||
|
|
133
|
-
direction === Constants.MOVE_DIRECTION_BEGIN
|
|
134
|
-
? -size
|
|
135
|
-
: size);
|
|
136
|
-
if (this.isLineMode()) {
|
|
137
|
-
visibleLine = this.getVisibleLine();
|
|
138
|
-
if (visibleLine < 0) {
|
|
139
|
-
visibleLine = 0;
|
|
140
|
-
recordOutOfView = true;
|
|
141
|
-
}
|
|
142
|
-
if (visibleLine > this._rowsInPage + 1) {
|
|
143
|
-
visibleLine = this._rowsInPage;
|
|
144
|
-
recordOutOfView = true;
|
|
145
|
-
}
|
|
146
|
-
if (unit === Constants.MOVE_UNIT_PAGE &&
|
|
147
|
-
(direction === Constants.MOVE_DIRECTION_NEXT ||
|
|
148
|
-
direction === Constants.MOVE_DIRECTION_PREV) ||
|
|
149
|
-
unit === Constants.MOVE_UNIT_ROW &&
|
|
150
|
-
(direction === Constants.MOVE_DIRECTION_NEXT && visibleLine === this._rowsInPage - 1 ||
|
|
151
|
-
direction === Constants.MOVE_DIRECTION_PREV && visibleLine === 0)) {
|
|
152
|
-
if (direction === Constants.MOVE_DIRECTION_PREV &&
|
|
153
|
-
(unit === Constants.MOVE_UNIT_ROW || unit === Constants.MOVE_UNIT_PAGE) &&
|
|
154
|
-
visibleLine === 0 && this.GetDataview().getCurrRecIdx() === 0 && this.GetDataview().IncludesFirst())
|
|
155
|
-
return;
|
|
156
|
-
if (direction === Constants.MOVE_DIRECTION_NEXT && unit === Constants.MOVE_UNIT_PAGE &&
|
|
157
|
-
visibleLine === this.getLastValidRow() && this.GetDataview().getCurrRecIdx() === this.GetDataview().getSize() - 1 && this.GetDataview().IncludesLast())
|
|
158
|
-
return;
|
|
159
|
-
oldRecId = (this.GetDataview().getCurrRec()).getId();
|
|
160
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + size);
|
|
161
|
-
this.GetDataview().setTopRecIdxModified(true);
|
|
162
|
-
try {
|
|
163
|
-
this._suffixDone = false;
|
|
164
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx() + size, true, false);
|
|
165
|
-
this.GetDataview().setTopRecIdxModified(false);
|
|
166
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
167
|
-
}
|
|
168
|
-
catch (ex) {
|
|
169
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
170
|
-
this.GetDataview().setTopRecIdxModified(false);
|
|
171
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
172
|
-
this.GetDataview().restoreTopRecIdx();
|
|
173
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (this.GetDataview().getTopRecIdx() < 0) {
|
|
177
|
-
this.GetDataview().setTopRecIdx(0);
|
|
178
|
-
try {
|
|
179
|
-
yield this.setCurrRowByDisplayLine(0, true, false);
|
|
180
|
-
}
|
|
181
|
-
catch (exception) {
|
|
182
|
-
if (exception instanceof Exception) {
|
|
183
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
184
|
-
this.GetDataview().restoreTopRecIdx();
|
|
185
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
191
|
-
}
|
|
192
|
-
else if (unit !== Constants.MOVE_UNIT_ROW && this.GetDataview().recExists(this.GetDataview().getTopRecIdx())) {
|
|
193
|
-
let newRecId = (this.GetDataview().getCurrRec()).getId();
|
|
194
|
-
if (newRecId === oldRecId && !this._suffixDone) {
|
|
195
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
|
196
|
-
if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
197
|
-
this.GetDataview().restoreTopRecIdx();
|
|
198
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
try {
|
|
202
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
203
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + this.getLastValidRow(), false, true);
|
|
204
|
-
}
|
|
205
|
-
catch (Exception) {
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
this.GetDataview().restoreTopRecIdx();
|
|
211
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
212
|
-
if (unit === Constants.MOVE_UNIT_ROW && direction === Constants.MOVE_DIRECTION_NEXT) {
|
|
213
|
-
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
|
214
|
-
this._task.setExecEndTask();
|
|
215
|
-
else
|
|
216
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
|
217
|
-
}
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
try {
|
|
226
|
-
oldTaskMode = this._task.getMode();
|
|
227
|
-
oldRecId = (this.GetDataview().getCurrRec()).getId();
|
|
228
|
-
yield this.setCurrRowByDisplayLine(oldDisplayLine + size, true, false);
|
|
229
|
-
if (!this.GetDataview().recExistsById(oldRecId)) {
|
|
230
|
-
if (size > 0 || oldTaskMode !== Constants.TASK_MODE_CREATE)
|
|
231
|
-
if (size !== -1 || this.GetDataview().recExists(oldDisplayLine))
|
|
232
|
-
yield this.setCurrRowByDisplayLine(oldDisplayLine, false, false);
|
|
233
|
-
else
|
|
234
|
-
Logger.Instance.WriteDevToLog(NString.Format("skipped setcurrRow for row {0}", oldDisplayLine));
|
|
235
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
236
|
-
}
|
|
237
|
-
else if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
|
238
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
catch (ex) {
|
|
242
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
243
|
-
if (this.GetDataview().recExistsById(oldRecId)) {
|
|
244
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
245
|
-
if (!currRec.Synced && oldTaskMode === Constants.TASK_MODE_CREATE) {
|
|
246
|
-
this._task.setMode(Constants.TASK_MODE_CREATE);
|
|
247
|
-
currRec.clearMode();
|
|
248
|
-
currRec.setMode(DataModificationTypes.Insert);
|
|
249
|
-
currRec.setNewRec();
|
|
250
|
-
}
|
|
251
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0)
|
|
255
|
-
yield this.restoreOldDisplayLine(oldDisplayLine - 1);
|
|
256
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
257
|
-
}
|
|
258
|
-
if (size <= 0 || AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
259
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
260
|
-
else {
|
|
261
|
-
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
|
|
262
|
-
this._task.setExecEndTask();
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
if (this._task.ActionManager.isEnabled(InternalInterface.MG_ACT_CRELINE))
|
|
267
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
|
268
|
-
else {
|
|
269
|
-
let doRecordSuffix = true;
|
|
270
|
-
let refdoRecordSuffix = new RefParam(doRecordSuffix);
|
|
271
|
-
if (!(yield AccessHelper.eventsManager.DoTaskLevelRecordSuffix(this._task, refdoRecordSuffix)))
|
|
272
|
-
yield AccessHelper.eventsManager.DoTaskLevelRecordPrefix(this._task);
|
|
273
|
-
doRecordSuffix = refdoRecordSuffix.value;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
try {
|
|
284
|
-
yield this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx() + size, true, false, true, SET_DISPLAYLINE_BY_DV);
|
|
285
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
286
|
-
}
|
|
287
|
-
catch (ex) {
|
|
288
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
289
|
-
if (size > 0) {
|
|
290
|
-
if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
|
291
|
-
this._task.setExecEndTask();
|
|
292
|
-
else
|
|
293
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
|
294
|
-
}
|
|
295
|
-
else
|
|
296
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
else if (ex instanceof ServerError) {
|
|
300
|
-
yield this._task.stop();
|
|
301
|
-
this._task.abort();
|
|
302
|
-
yield AccessHelper.eventsManager.ProcessAbortingError(ex);
|
|
303
|
-
}
|
|
304
|
-
else if (ex instanceof Exception) {
|
|
305
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
if (returnToVisibleLine) {
|
|
312
|
-
if (recordOutOfView) {
|
|
313
|
-
if (visibleLine === 0)
|
|
314
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
|
|
315
|
-
else
|
|
316
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage);
|
|
317
|
-
this.SetTableTopIndex();
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
this.SetTableTopIndex();
|
|
321
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + visibleLine, false, true);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
else
|
|
325
|
-
this.SetTableTopIndex();
|
|
326
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
327
|
-
if (returnToCtrl) {
|
|
328
|
-
lastParkedCtrl = this._task.getLastParkedCtrl();
|
|
329
|
-
if (lastParkedCtrl != null) {
|
|
330
|
-
let cursorMoved = yield lastParkedCtrl.invoke();
|
|
331
|
-
if (!cursorMoved) {
|
|
332
|
-
yield AccessHelper.eventsManager.HandleNonParkableControls(this._task);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
catch (e) {
|
|
338
|
-
if (e instanceof RecordOutOfDataViewException) {
|
|
339
|
-
Logger.Instance.WriteDevToLog(e.Message);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
finally {
|
|
343
|
-
this.SelectRow();
|
|
344
|
-
this.IsMovingInView = false;
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
addRec(doSuffix, isCrelineAbove) {
|
|
349
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
350
|
-
let newLine = 1;
|
|
351
|
-
let currLine = -1;
|
|
352
|
-
if (!this._task.DataView.isEmptyDataview())
|
|
353
|
-
currLine = this.getVisibleLine();
|
|
354
|
-
if (this.isTableWithAbsoluteScrollbar()) {
|
|
355
|
-
this.GetDataview().TotalRecordsCount += 1;
|
|
356
|
-
this.RefreshAllRows = true;
|
|
357
|
-
}
|
|
358
|
-
let newRecIdx = yield this.GetDataview().addRecord(doSuffix, false, isCrelineAbove);
|
|
359
|
-
if (newRecIdx > -1) {
|
|
360
|
-
if (this.isLineMode()) {
|
|
361
|
-
let newCurrRow;
|
|
362
|
-
if (this.GetDataview().getSize() === 0 || this.GetDataview().getTopRecIdx() === Int32.MinValue) {
|
|
363
|
-
this.GetDataview().setTopRecIdx(0);
|
|
364
|
-
newCurrRow = 0;
|
|
365
|
-
}
|
|
366
|
-
else if (currLine === this._rowsInPage - 1) {
|
|
367
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + 1);
|
|
368
|
-
newCurrRow = this.getVisibleLine();
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
if (isCrelineAbove)
|
|
372
|
-
newCurrRow = currLine > 0 ? currLine : 0;
|
|
373
|
-
else
|
|
374
|
-
newCurrRow = currLine + 1;
|
|
375
|
-
}
|
|
376
|
-
newLine = this.GetDataview().getTopRecIdx() + newCurrRow;
|
|
377
|
-
this.removeRecordsAfterIdx(this.GetDataview().getTopRecIdx() + newCurrRow);
|
|
378
|
-
try {
|
|
379
|
-
if (!this._task.DataView.isEmptyDataview())
|
|
380
|
-
this._task.setMode(Constants.TASK_MODE_CREATE);
|
|
381
|
-
yield this.setCurrRowByDisplayLine(newLine, false, false);
|
|
382
|
-
}
|
|
383
|
-
catch (ex) {
|
|
384
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
385
|
-
Logger.Instance.WriteDevToLog(NString.Format("in Form.addRec() {0}", ex.Message));
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
else if (this.isTableWithAbsoluteScrollbar()) {
|
|
392
|
-
this.GetDataview().TotalRecordsCount -= 1;
|
|
393
|
-
this.RefreshAllRows = false;
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
delCurrRec() {
|
|
398
|
-
const _super = Object.create(null, {
|
|
399
|
-
isLineMode: { get: () => super.isLineMode },
|
|
400
|
-
HasTable: { get: () => super.HasTable }
|
|
401
|
-
});
|
|
402
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
403
|
-
let topTableRow = _super.isLineMode.call(this) && this.GetDataview().getTopRecIdx() === this.GetDataview().getCurrRecIdx();
|
|
404
|
-
yield this.GetDataview().removeCurrRec();
|
|
405
|
-
if (this.GetDataview().isEmpty() && !this._task.IsTryingToStop) {
|
|
406
|
-
if (this._task.DataView.isEmptyDataview()) {
|
|
407
|
-
yield this.addRec(false, false);
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
if (yield this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) {
|
|
411
|
-
if (this._task.getMode() !== Constants.TASK_MODE_CREATE)
|
|
412
|
-
this._task.setMode(Constants.TASK_MODE_CREATE);
|
|
413
|
-
this._task.enableCreateActs(true);
|
|
414
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
|
415
|
-
}
|
|
416
|
-
else
|
|
417
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_EXIT);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
if (!this.GetDataview().isEmpty()) {
|
|
421
|
-
if (topTableRow)
|
|
422
|
-
this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
|
|
423
|
-
if (_super.isLineMode.call(this)) {
|
|
424
|
-
if (_super.HasTable.call(this)) {
|
|
425
|
-
if (this.isTableWithAbsoluteScrollbar()) {
|
|
426
|
-
this.GetDataview().TotalRecordsCount--;
|
|
427
|
-
this.RefreshAllRows = true;
|
|
428
|
-
}
|
|
429
|
-
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
|
430
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
431
|
-
}
|
|
432
|
-
else
|
|
433
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
try {
|
|
437
|
-
yield this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), true, true, true, SET_DISPLAYLINE_BY_DV);
|
|
438
|
-
}
|
|
439
|
-
catch (ex) {
|
|
440
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
441
|
-
}
|
|
442
|
-
else
|
|
443
|
-
throw ex;
|
|
444
|
-
}
|
|
445
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
cancelEdit(isActCancel, isQuitEvent) {
|
|
451
|
-
const _super = Object.create(null, {
|
|
452
|
-
isLineMode: { get: () => super.isLineMode },
|
|
453
|
-
HasTable: { get: () => super.HasTable }
|
|
454
|
-
});
|
|
455
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
456
|
-
let mode = this._task.getMode();
|
|
457
|
-
let newMode;
|
|
458
|
-
let row = 0;
|
|
459
|
-
let execRecPrefix = false;
|
|
460
|
-
if (this.GetDataview().getSize() === 1 && mode === Constants.TASK_MODE_CREATE)
|
|
461
|
-
newMode = Constants.TASK_MODE_CREATE;
|
|
462
|
-
else
|
|
463
|
-
newMode = Constants.TASK_MODE_MODIFY;
|
|
464
|
-
let recRemoved = yield this.GetDataview().cancelEdit(false, false);
|
|
465
|
-
this.GetDataview().setPrevCurrRec(null);
|
|
466
|
-
if ((this.GetDataview().isEmpty() || ((isActCancel && recRemoved) && (!GuiEnvironment.Environment.GetSpecialCancelOnCreate()) && this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE)) && !this._task.IsTryingToStop) {
|
|
467
|
-
let orgCancelWasRaised = this._task.cancelWasRaised();
|
|
468
|
-
this._task.setCancelWasRaised(isActCancel);
|
|
469
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
|
|
470
|
-
this._task.setCancelWasRaised(orgCancelWasRaised);
|
|
471
|
-
}
|
|
472
|
-
else if (isActCancel)
|
|
473
|
-
execRecPrefix = true;
|
|
474
|
-
if (!this.GetDataview().isEmpty()) {
|
|
475
|
-
if (_super.isLineMode.call(this)) {
|
|
476
|
-
try {
|
|
477
|
-
if (_super.HasTable.call(this)) {
|
|
478
|
-
row = this.getVisibleLine();
|
|
479
|
-
if (row < 0 || row >= this._rowsInPage) {
|
|
480
|
-
let topRecIdx = this.GetDataview().getTopRecIdx();
|
|
481
|
-
let currRecIdx = this.GetDataview().getCurrRecIdx();
|
|
482
|
-
if (topRecIdx > currRecIdx)
|
|
483
|
-
this.GetDataview().setTopRecIdx(currRecIdx);
|
|
484
|
-
row = 0;
|
|
485
|
-
}
|
|
486
|
-
yield this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + row, false, true);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
catch (ex) {
|
|
490
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
491
|
-
if (row !== 0)
|
|
492
|
-
Logger.Instance.WriteDevToLog(NString.Format("in Form.cancelEdit() {0}", ex.Message));
|
|
493
|
-
}
|
|
494
|
-
else
|
|
495
|
-
throw ex;
|
|
496
|
-
}
|
|
497
|
-
if (_super.HasTable.call(this)) {
|
|
498
|
-
if (this.isTableWithAbsoluteScrollbar() && recRemoved) {
|
|
499
|
-
this.GetDataview().TotalRecordsCount--;
|
|
500
|
-
this.RefreshAllRows = true;
|
|
501
|
-
}
|
|
502
|
-
this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
try {
|
|
507
|
-
yield this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), false, true, true, SET_DISPLAYLINE_BY_DV);
|
|
508
|
-
}
|
|
509
|
-
catch (ex) {
|
|
510
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
511
|
-
Logger.Instance.WriteDevToLog("in Form.cancelEdit() error in Screen mode for Current Record");
|
|
512
|
-
}
|
|
513
|
-
else
|
|
514
|
-
throw ex;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
this._task.setMode(newMode);
|
|
518
|
-
if (!this._task.InEndTask)
|
|
519
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
|
520
|
-
if (!this._task.InEndTask)
|
|
521
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
522
|
-
}
|
|
523
|
-
if (execRecPrefix) {
|
|
524
|
-
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
|
525
|
-
let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
|
|
526
|
-
if (lastParkedCtrl !== null) {
|
|
527
|
-
if (lastParkedCtrl.getForm().getTask().pathContains(this._task))
|
|
528
|
-
for (let parent = lastParkedCtrl.getForm().getTask(); parent !== null && parent !== this._task; parent = parent.getParent()) {
|
|
529
|
-
parent.setLevel(Constants.TASK_LEVEL_TASK);
|
|
530
|
-
(parent.DataView.getCurrRec()).resetModified();
|
|
531
|
-
}
|
|
532
|
-
else
|
|
533
|
-
lastParkedCtrl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
|
|
534
|
-
}
|
|
535
|
-
if (!isQuitEvent) {
|
|
536
|
-
yield AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
|
|
537
|
-
yield AccessHelper.eventsManager.HandleParkabilityOnRowChange(this._task);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
refreshOnExpressions() {
|
|
543
|
-
const _super = Object.create(null, {
|
|
544
|
-
refreshPropsOnExpression: { get: () => super.refreshPropsOnExpression }
|
|
545
|
-
});
|
|
546
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
547
|
-
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
548
|
-
let mgControl = ((this.CtrlTab.getCtrl(i) instanceof MgControl) ? this.CtrlTab.getCtrl(i) : null);
|
|
549
|
-
if (mgControl != null)
|
|
550
|
-
yield mgControl.refreshOnExpression();
|
|
551
|
-
else
|
|
552
|
-
Debug.Assert(false);
|
|
553
|
-
}
|
|
554
|
-
yield _super.refreshPropsOnExpression.call(this);
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
removeRefsToCtrls() {
|
|
558
|
-
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
|
559
|
-
if (lastFocusedControl !== null && lastFocusedControl.getForm() === this)
|
|
560
|
-
LastFocusedManager.setLastFocusedControl(this._task, null);
|
|
561
|
-
super.removeRefsToCtrls();
|
|
562
|
-
}
|
|
563
|
-
getCtrlByCtrlName(ctrlName) {
|
|
564
|
-
return this.CtrlTab.getCtrl(ctrlName);
|
|
565
|
-
}
|
|
566
|
-
getSubFormCtrlByName(ctrlName) {
|
|
567
|
-
let guiParentTask;
|
|
568
|
-
let destSubForm = null;
|
|
569
|
-
for (guiParentTask = this._task; destSubForm === null && guiParentTask !== null && guiParentTask.getForm() !== null; guiParentTask = guiParentTask.getParent()) {
|
|
570
|
-
destSubForm = guiParentTask.getForm().getCtrlByName(ctrlName, MgControlType.CTRL_TYPE_SUBFORM);
|
|
571
|
-
if (destSubForm == null) {
|
|
572
|
-
if (!guiParentTask.IsSubForm || NString.Equals(guiParentTask.getForm().getSubFormCtrl().Name, ctrlName, true))
|
|
573
|
-
break;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
return destSubForm;
|
|
577
|
-
}
|
|
578
|
-
setSuffixDone() {
|
|
579
|
-
this._suffixDone = true;
|
|
580
|
-
}
|
|
581
|
-
getDestinationRow() {
|
|
582
|
-
return this._destTblRow;
|
|
583
|
-
}
|
|
584
|
-
setSubFormCtrl(subFormCtrl) {
|
|
585
|
-
Debug.Assert(this._subFormCtrl === null && subFormCtrl !== null);
|
|
586
|
-
this._subFormCtrl = subFormCtrl;
|
|
587
|
-
}
|
|
588
|
-
getSubFormCtrlForTask(taskId) {
|
|
589
|
-
let curr = null;
|
|
590
|
-
let parentCtrlTab;
|
|
591
|
-
let guiParentForm = null;
|
|
592
|
-
let destSubForm = null;
|
|
593
|
-
for (guiParentForm = this; guiParentForm != null; guiParentForm = guiParentForm.ParentForm) {
|
|
594
|
-
parentCtrlTab = guiParentForm.CtrlTab;
|
|
595
|
-
for (let i = 0; i < parentCtrlTab.getSize(); i++) {
|
|
596
|
-
curr = ((parentCtrlTab.getCtrl(i) instanceof MgControl) ? parentCtrlTab.getCtrl(i) : null);
|
|
597
|
-
if (curr != null && curr.isSubform() && (curr.getSubformTaskId() != null))
|
|
598
|
-
if (curr.getSubformTaskId() === taskId) {
|
|
599
|
-
destSubForm = curr;
|
|
600
|
-
break;
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
if (destSubForm != null)
|
|
604
|
-
break;
|
|
605
|
-
}
|
|
606
|
-
return destSubForm;
|
|
607
|
-
}
|
|
608
|
-
removeRecordsAfterIdx(idx) {
|
|
609
|
-
let removeAll = false;
|
|
610
|
-
if (this.isTableWithPagination())
|
|
611
|
-
this.setTableItemsCount(false);
|
|
612
|
-
else {
|
|
613
|
-
if (idx <= this._rowsInPage + 1 && this.GetDataview().getSize() > this._rowsInPage)
|
|
614
|
-
idx = 0;
|
|
615
|
-
if (idx === 0)
|
|
616
|
-
removeAll = true;
|
|
617
|
-
super.SetTableItemsCount(idx, removeAll);
|
|
618
|
-
this.setTableItemsCount(false);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
isRowValidated(idx) {
|
|
622
|
-
if (this.Rows.length <= idx || idx < 0)
|
|
623
|
-
return false;
|
|
624
|
-
let row = this.Rows.get_Item(idx);
|
|
625
|
-
if (row == null)
|
|
626
|
-
return false;
|
|
627
|
-
return row.Created && row.Validated;
|
|
628
|
-
}
|
|
629
|
-
transferDataToGui() {
|
|
630
|
-
const _super = Object.create(null, {
|
|
631
|
-
getTask: { get: () => super.getTask },
|
|
632
|
-
checkAndCreateRow: { get: () => super.checkAndCreateRow },
|
|
633
|
-
refreshControls: { get: () => super.refreshControls }
|
|
634
|
-
});
|
|
635
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
636
|
-
let saveRowIdx = this.GetDataview().getCurrRecIdx();
|
|
637
|
-
let maxTime = Misc.getSystemMilliseconds() + MgForm.TIME_LIMIT;
|
|
638
|
-
let updated = false;
|
|
639
|
-
let currentEditingControl = _super.getTask.call(this).CurrentEditingControl;
|
|
640
|
-
try {
|
|
641
|
-
let bkpRecord = this.GetDataview().backupCurrent();
|
|
642
|
-
while (Misc.getSystemMilliseconds() < maxTime && this.RefreshRepeatableAllowed) {
|
|
643
|
-
if (this._lastRowSent + 1 >= this.GetDataview().getSize()) {
|
|
644
|
-
this.RefreshUI();
|
|
645
|
-
break;
|
|
646
|
-
}
|
|
647
|
-
else if (this.isTableWithPagination() && this._lastRowSent + 1 >= this.getMaxRowsInPaginatedTable()) {
|
|
648
|
-
this.RefreshUI();
|
|
649
|
-
break;
|
|
650
|
-
}
|
|
651
|
-
this._lastRowSent++;
|
|
652
|
-
this._transferringDataToGUI = true;
|
|
653
|
-
this.AllowedSubformRecompute = false;
|
|
654
|
-
if (!this.isRowValidated(this._lastRowSent)) {
|
|
655
|
-
_super.checkAndCreateRow.call(this, this._lastRowSent);
|
|
656
|
-
if (this._lastRowSent !== saveRowIdx) {
|
|
657
|
-
_super.getTask.call(this).CurrentEditingControl = null;
|
|
658
|
-
yield this.setCurrRowByDisplayLine(this._lastRowSent, false, true);
|
|
659
|
-
yield _super.refreshControls.call(this, true);
|
|
660
|
-
updated = true;
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
this.AllowedSubformRecompute = true;
|
|
664
|
-
this._transferringDataToGUI = false;
|
|
665
|
-
}
|
|
666
|
-
if (updated) {
|
|
667
|
-
yield this.restoreBackup(saveRowIdx, bkpRecord);
|
|
668
|
-
yield _super.refreshControls.call(this, true);
|
|
669
|
-
_super.getTask.call(this).CurrentEditingControl = currentEditingControl;
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
catch (ex) {
|
|
673
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
674
|
-
Logger.Instance.WriteDevToLog(ex.Message);
|
|
675
|
-
}
|
|
676
|
-
else
|
|
677
|
-
throw ex;
|
|
678
|
-
}
|
|
679
|
-
this._transferingData = false;
|
|
680
|
-
this.checkAndCreateRowsEvent();
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
checkAndCreateRowsEvent() {
|
|
684
|
-
if (this._tableMgControl !== null && this.Opened && this.RefreshRepeatableAllowed) {
|
|
685
|
-
let size = this.GetDataview().getSize();
|
|
686
|
-
if (this._lastRowSent >= this.Rows.length) {
|
|
687
|
-
this._lastRowSent = this.Rows.length - 1;
|
|
688
|
-
}
|
|
689
|
-
let transferDataToGui = this._lastRowSent < (size - 1);
|
|
690
|
-
if (this.isTableWithPagination() && (this._lastRowSent + 1) >= this.getMaxRowsInPaginatedTable())
|
|
691
|
-
transferDataToGui = false;
|
|
692
|
-
if (transferDataToGui && !this._transferingData) {
|
|
693
|
-
AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_DV_TO_GUI, Priority.LOWEST);
|
|
694
|
-
this._transferingData = true;
|
|
695
|
-
}
|
|
696
|
-
else if (this.shouldFetchRecordsAheadFromServer && !transferDataToGui && (!this.GetDataview().IncludesLast() || !this.GetDataview().IncludesFirst())) {
|
|
697
|
-
AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER, Priority.LOWEST);
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
setRowData(desiredTopIndex, sendAll) {
|
|
702
|
-
const _super = Object.create(null, {
|
|
703
|
-
refreshControls: { get: () => super.refreshControls },
|
|
704
|
-
SelectRow: { get: () => super.SelectRow }
|
|
705
|
-
});
|
|
706
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
707
|
-
let saveRowIdx = this.GetDataview().getCurrRecIdx();
|
|
708
|
-
let diff = 0;
|
|
709
|
-
let getPrevChunk = false;
|
|
710
|
-
let getNextChunk = false;
|
|
711
|
-
let updated = false;
|
|
712
|
-
if (desiredTopIndex !== Int32.MinValue) {
|
|
713
|
-
if (desiredTopIndex < 0) {
|
|
714
|
-
getPrevChunk = true;
|
|
715
|
-
this.GetDataview().setTopRecIdx(0);
|
|
716
|
-
}
|
|
717
|
-
else if (desiredTopIndex + this._rowsInPage + 1 >= this.GetDataview().getSize())
|
|
718
|
-
getNextChunk = true;
|
|
719
|
-
}
|
|
720
|
-
else
|
|
721
|
-
desiredTopIndex = this.GetDataview().getTopRecIdx();
|
|
722
|
-
let bkpRecord = this.GetDataview().backupCurrent();
|
|
723
|
-
this._transferringDataToGUI = true;
|
|
724
|
-
this.AllowedSubformRecompute = false;
|
|
725
|
-
let diffRef = new RefParam(diff);
|
|
726
|
-
updated = yield this.refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef);
|
|
727
|
-
diff = diffRef.value;
|
|
728
|
-
if ((getPrevChunk && diff !== 0) || getNextChunk) {
|
|
729
|
-
this.GetDataview().setTopRecIdx(desiredTopIndex + diff);
|
|
730
|
-
this.SetTableTopIndex();
|
|
731
|
-
if (this._topIndexUpdated) {
|
|
732
|
-
this._topIndexUpdated = false;
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
this.AllowedSubformRecompute = true;
|
|
736
|
-
this._transferringDataToGUI = false;
|
|
737
|
-
if (updated) {
|
|
738
|
-
yield this.restoreBackup(saveRowIdx + diff, bkpRecord);
|
|
739
|
-
yield _super.refreshControls.call(this, true);
|
|
740
|
-
}
|
|
741
|
-
_super.SelectRow.call(this);
|
|
742
|
-
if (getPrevChunk) {
|
|
743
|
-
let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
|
|
744
|
-
if (lastFocusedControl !== null && lastFocusedControl.getParentTable() === this._tableMgControl) {
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
}
|
|
749
|
-
refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef) {
|
|
750
|
-
const _super = Object.create(null, {
|
|
751
|
-
checkAndCreateRow: { get: () => super.checkAndCreateRow },
|
|
752
|
-
refreshControls: { get: () => super.refreshControls },
|
|
753
|
-
isRowCreated: { get: () => super.isRowCreated },
|
|
754
|
-
markRowNOTCreated: { get: () => super.markRowNOTCreated }
|
|
755
|
-
});
|
|
756
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
757
|
-
let index = 0;
|
|
758
|
-
let updated = false;
|
|
759
|
-
diffRef.value = 0;
|
|
760
|
-
let orgIncludesFirst = this.GetDataview().IncludesFirst();
|
|
761
|
-
let orgIncludesLast = this.GetDataview().IncludesLast();
|
|
762
|
-
for (let i = 0; i < this._rowsInPage; i++) {
|
|
763
|
-
let idx = desiredTopIndex + i;
|
|
764
|
-
let prevTopIdx = this.GetDataview().getTopRecIdx();
|
|
765
|
-
try {
|
|
766
|
-
index = idx + diffRef.value;
|
|
767
|
-
if (!this.isRowValidated(idx) || sendAll || this.RefreshAllRows) {
|
|
768
|
-
if (index >= 0)
|
|
769
|
-
_super.checkAndCreateRow.call(this, index);
|
|
770
|
-
if (saveRowIdx + diffRef.value !== index) {
|
|
771
|
-
yield this.setCurrRowByDisplayLine(index, false, true);
|
|
772
|
-
yield _super.refreshControls.call(this, true);
|
|
773
|
-
}
|
|
774
|
-
updated = true;
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
catch (ex) {
|
|
778
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
779
|
-
if (_super.isRowCreated.call(this, index))
|
|
780
|
-
_super.markRowNOTCreated.call(this, index);
|
|
781
|
-
break;
|
|
782
|
-
}
|
|
783
|
-
else
|
|
784
|
-
throw ex;
|
|
785
|
-
}
|
|
786
|
-
finally {
|
|
787
|
-
diffRef.value = diffRef.value + (this.GetDataview().getTopRecIdx() - prevTopIdx);
|
|
788
|
-
prevTopIdx = this.GetDataview().getTopRecIdx();
|
|
789
|
-
if (!updated && this.GetDataview().DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast))
|
|
790
|
-
updated = true;
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
this.RefreshUI();
|
|
794
|
-
this.RefreshAllRows = false;
|
|
795
|
-
return updated;
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
getVisibleLine() {
|
|
799
|
-
let currRecIdx = 0;
|
|
800
|
-
if (this.GetDataview().getCurrRecIdx() !== Int32.MinValue)
|
|
801
|
-
currRecIdx = this.GetDataview().getCurrRecIdx();
|
|
802
|
-
return currRecIdx - Math.max(this.GetDataview().getTopRecIdx(), 0);
|
|
803
|
-
}
|
|
804
|
-
bringRecordToPage() {
|
|
805
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
806
|
-
if (this._tableMgControl !== null && !this._task.DataView.isEmptyDataview()) {
|
|
807
|
-
let topIndex = Commands.getTopIndex(this._tableMgControl);
|
|
808
|
-
let currIdx = this.GetDataview().getCurrRecIdx();
|
|
809
|
-
let newTopIndex = topIndex;
|
|
810
|
-
if (!this.isTableWithPagination()) {
|
|
811
|
-
if (topIndex > currIdx) {
|
|
812
|
-
this._topIndexUpdated = true;
|
|
813
|
-
newTopIndex = currIdx;
|
|
814
|
-
}
|
|
815
|
-
else if (topIndex + this._rowsInPage - 1 < currIdx) {
|
|
816
|
-
this._topIndexUpdated = true;
|
|
817
|
-
if (this._rowsInPage > 0)
|
|
818
|
-
newTopIndex = currIdx - this._rowsInPage + 1;
|
|
819
|
-
else
|
|
820
|
-
newTopIndex = currIdx;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
else {
|
|
824
|
-
let currGuiIdx = this.getGuiRowidx(currIdx);
|
|
825
|
-
let newTopGuiIndex = (currGuiIdx) - ((currGuiIdx) % this._rowsInPage);
|
|
826
|
-
newTopIndex = this.getDvRowIdx(newTopGuiIndex);
|
|
827
|
-
if (newTopIndex !== this._prevGuiTopIndex || this.IsMovingInView)
|
|
828
|
-
this._topIndexUpdated = true;
|
|
829
|
-
}
|
|
830
|
-
if (this.GetDataview().getTopRecIdx() !== newTopIndex || this._topIndexUpdated) {
|
|
831
|
-
this.GetDataview().setTopRecIdx(newTopIndex);
|
|
832
|
-
this.SetTableTopIndex();
|
|
833
|
-
yield this.setRowData(Int32.MinValue, false);
|
|
834
|
-
this._topIndexUpdated = false;
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
});
|
|
838
|
-
}
|
|
839
|
-
invalidateTable() {
|
|
840
|
-
for (let i = 0; i < this.Rows.length; i++) {
|
|
841
|
-
let row = this.Rows.get_Item(i);
|
|
842
|
-
if (row !== null)
|
|
843
|
-
row.Validated = false;
|
|
844
|
-
}
|
|
845
|
-
this._lastRowSent = -1;
|
|
846
|
-
this.checkAndCreateRowsEvent();
|
|
847
|
-
}
|
|
848
|
-
getPrevLine(line) {
|
|
849
|
-
return line - 1;
|
|
850
|
-
}
|
|
851
|
-
clearTableColumnSortMark(clearSortMark) {
|
|
852
|
-
if (clearSortMark) {
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
stopRowEditing(idx) {
|
|
856
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
857
|
-
if (this.getIsRowEditingFromGui(idx)) {
|
|
858
|
-
Commands.addValueWithLine(CommandType.SET_NOT_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
|
|
859
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
860
|
-
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
|
861
|
-
}
|
|
862
|
-
});
|
|
863
|
-
}
|
|
864
|
-
startRowEditing(idx) {
|
|
865
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
866
|
-
if (!this.getIsRowEditingFromGui(idx)) {
|
|
867
|
-
Commands.addValueWithLine(CommandType.SET_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
|
|
868
|
-
yield this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
|
869
|
-
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
|
870
|
-
}
|
|
871
|
-
});
|
|
872
|
-
}
|
|
873
|
-
getIsRowEditingFromGui(displayIndex) {
|
|
874
|
-
let isRowEditing = Commands.getIsRowEditing(this, this.isLineMode() ? displayIndex : 0, this.isLineMode());
|
|
875
|
-
return isRowEditing;
|
|
876
|
-
}
|
|
877
|
-
RefreshDisplay(refreshType) {
|
|
878
|
-
const _super = Object.create(null, {
|
|
879
|
-
HasTable: { get: () => super.HasTable },
|
|
880
|
-
hasTable: { get: () => super.hasTable },
|
|
881
|
-
SelectRow: { get: () => super.SelectRow },
|
|
882
|
-
refreshProps: { get: () => super.refreshProps },
|
|
883
|
-
refreshControls: { get: () => super.refreshControls },
|
|
884
|
-
getTask: { get: () => super.getTask },
|
|
885
|
-
isLineMode: { get: () => super.isLineMode }
|
|
886
|
-
});
|
|
887
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
888
|
-
let task = this._task;
|
|
889
|
-
if (this.isFetchingRecordsAhead)
|
|
890
|
-
return false;
|
|
891
|
-
if (task.isAborting())
|
|
892
|
-
return false;
|
|
893
|
-
let currRec = this.GetDataview().getCurrRec();
|
|
894
|
-
if (currRec !== null && currRec.InCompute && !currRec.isNewRec())
|
|
895
|
-
return false;
|
|
896
|
-
if (this._inRefreshDisp)
|
|
897
|
-
return false;
|
|
898
|
-
this._inRefreshDisp = true;
|
|
899
|
-
try {
|
|
900
|
-
if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_TABLE) {
|
|
901
|
-
if (_super.HasTable.call(this) && this.Opened)
|
|
902
|
-
yield this.refreshTable();
|
|
903
|
-
}
|
|
904
|
-
if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_CURR_REC) {
|
|
905
|
-
if (refreshType === Constants.TASK_REFRESH_CURR_REC && _super.hasTable.call(this)) {
|
|
906
|
-
this.SetTableTopIndex();
|
|
907
|
-
_super.SelectRow.call(this);
|
|
908
|
-
yield this.fetchPrevChunkForCurrentPage();
|
|
909
|
-
}
|
|
910
|
-
yield _super.refreshProps.call(this);
|
|
911
|
-
yield _super.refreshControls.call(this, false);
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
catch (ex) {
|
|
915
|
-
if (ex instanceof Exception) {
|
|
916
|
-
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("{0} : {1} in task {2}", ex.GetType(), ex.Message, _super.getTask.call(this).PreviouslyActiveTaskId));
|
|
917
|
-
}
|
|
918
|
-
else
|
|
919
|
-
throw ex;
|
|
920
|
-
}
|
|
921
|
-
finally {
|
|
922
|
-
this._inRefreshDisp = false;
|
|
923
|
-
}
|
|
924
|
-
if (refreshType === Constants.TASK_REFRESH_CURR_REC && (!_super.isLineMode.call(this) || this._tableRefreshed))
|
|
925
|
-
this.FormRefreshed = true;
|
|
926
|
-
return true;
|
|
927
|
-
});
|
|
928
|
-
}
|
|
929
|
-
RefreshUI() {
|
|
930
|
-
if (!this.getTask().isMainProg()) {
|
|
931
|
-
Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
refreshTable() {
|
|
935
|
-
const _super = Object.create(null, {
|
|
936
|
-
checkAndCreateRow: { get: () => super.checkAndCreateRow },
|
|
937
|
-
refreshControls: { get: () => super.refreshControls },
|
|
938
|
-
isRowCreated: { get: () => super.isRowCreated },
|
|
939
|
-
markRowNOTCreated: { get: () => super.markRowNOTCreated }
|
|
940
|
-
});
|
|
941
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
942
|
-
if (this.isFetchingRecordsAhead)
|
|
943
|
-
return;
|
|
944
|
-
Logger.Instance.WriteGuiToLog("Start form.refreshTable()");
|
|
945
|
-
this.updateDisplayLineByDV();
|
|
946
|
-
let oldCurrRow = this.DisplayLine;
|
|
947
|
-
let currRecIdx = this.GetDataview().getCurrRecIdx();
|
|
948
|
-
if (!this._tableRefreshed && currRecIdx >= 0) {
|
|
949
|
-
oldCurrRow = this.GetDataview().getCurrRecIdx();
|
|
950
|
-
if (oldCurrRow + 1 > this._rowsInPage)
|
|
951
|
-
this.GetDataview().setTopRecIdx(oldCurrRow - Math.floor(this._rowsInPage / 2) + 1);
|
|
952
|
-
else
|
|
953
|
-
this.GetDataview().setTopRecIdx(0);
|
|
954
|
-
}
|
|
955
|
-
else {
|
|
956
|
-
if (oldCurrRow === Int32.MinValue)
|
|
957
|
-
oldCurrRow = 0;
|
|
958
|
-
if (this.GetDataview().getTopRecIdx() === Int32.MinValue)
|
|
959
|
-
this.GetDataview().setTopRecIdx(currRecIdx);
|
|
960
|
-
}
|
|
961
|
-
if (this.GetDataview().getTopRecIdx() < 0)
|
|
962
|
-
return;
|
|
963
|
-
oldCurrRow = oldCurrRow - this.GetDataview().getTopRecIdx();
|
|
964
|
-
let bkpRecord = this.GetDataview().backupCurrent();
|
|
965
|
-
this._tableRefreshed = true;
|
|
966
|
-
let oriTransferDataToGui = this._transferringDataToGUI;
|
|
967
|
-
if (!oriTransferDataToGui)
|
|
968
|
-
this._transferringDataToGUI = true;
|
|
969
|
-
this.AllowedSubformRecompute = false;
|
|
970
|
-
for (let i = 0; i < this._rowsInPage; i++) {
|
|
971
|
-
let topIndex = this.GetDataview().getTopRecIdx();
|
|
972
|
-
if (topIndex < 0) {
|
|
973
|
-
this.GetDataview().setTopRecIdx(0);
|
|
974
|
-
topIndex = 0;
|
|
975
|
-
}
|
|
976
|
-
let idx = topIndex + i;
|
|
977
|
-
try {
|
|
978
|
-
_super.checkAndCreateRow.call(this, idx);
|
|
979
|
-
if (i !== oldCurrRow) {
|
|
980
|
-
yield this.setCurrRowByDisplayLine(idx, false, true);
|
|
981
|
-
yield _super.refreshControls.call(this, true);
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
catch (ex) {
|
|
985
|
-
if (ex.name == "RecordOutOfDataViewException") {
|
|
986
|
-
if (_super.isRowCreated.call(this, idx))
|
|
987
|
-
_super.markRowNOTCreated.call(this, idx);
|
|
988
|
-
break;
|
|
989
|
-
}
|
|
990
|
-
else
|
|
991
|
-
throw ex;
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
this.AllowedSubformRecompute = true;
|
|
995
|
-
if (!oriTransferDataToGui)
|
|
996
|
-
this._transferringDataToGUI = false;
|
|
997
|
-
yield this.restoreBackup(oldCurrRow + this.GetDataview().getTopRecIdx(), bkpRecord);
|
|
998
|
-
yield _super.refreshControls.call(this, true);
|
|
999
|
-
this.RefreshUI();
|
|
1000
|
-
Logger.Instance.WriteGuiToLog("End form.refreshTable()");
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
updateDisplayLineByDV() {
|
|
1004
|
-
this.DisplayLine = this.recordIdx2DisplayLine(this.GetDataview().getCurrRecIdx());
|
|
1005
|
-
}
|
|
1006
|
-
setCurrRowByDisplayLine(displayLine, doSuffix, ignoreCurrRec) {
|
|
1007
|
-
const _super = Object.create(null, {
|
|
1008
|
-
HasTable: { get: () => super.HasTable }
|
|
1009
|
-
});
|
|
1010
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1011
|
-
let recIdx = this.displayLine2RecordIdx(displayLine);
|
|
1012
|
-
yield this.setCurrRowByRecIdx(recIdx, doSuffix, ignoreCurrRec, displayLine);
|
|
1013
|
-
if (_super.HasTable.call(this))
|
|
1014
|
-
this.updateDisplayLineByDV();
|
|
1015
|
-
else
|
|
1016
|
-
this.DisplayLine = displayLine;
|
|
1017
|
-
});
|
|
1018
|
-
}
|
|
1019
|
-
setCurrRowByRecIdx(rowNum, doSuffix, ignoreCurrRec, displayLine) {
|
|
1020
|
-
const _super = Object.create(null, {
|
|
1021
|
-
hasTable: { get: () => super.hasTable }
|
|
1022
|
-
});
|
|
1023
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1024
|
-
if (this.GetDataview() === null || (!_super.hasTable.call(this) && rowNum !== 0))
|
|
1025
|
-
throw new ApplicationException("in Form.setCurrRow() no table ");
|
|
1026
|
-
try {
|
|
1027
|
-
this._destTblRow = rowNum;
|
|
1028
|
-
yield this.GetDataview().setCurrRecByIdx(rowNum, doSuffix, ignoreCurrRec, true, displayLine);
|
|
1029
|
-
}
|
|
1030
|
-
finally {
|
|
1031
|
-
this._destTblRow = rowNum - this.GetDataview().getTopRecIdx();
|
|
1032
|
-
}
|
|
1033
|
-
});
|
|
1034
|
-
}
|
|
1035
|
-
getLastValidRow() {
|
|
1036
|
-
return Math.min(this._rowsInPage - 1, this.GetDataview().getSize() - 1 - this.GetDataview().getTopRecIdx());
|
|
1037
|
-
}
|
|
1038
|
-
recordIdx2DisplayLine(recIdx) {
|
|
1039
|
-
return recIdx;
|
|
1040
|
-
}
|
|
1041
|
-
displayLine2RecordIdx(displayLine) {
|
|
1042
|
-
return displayLine;
|
|
1043
|
-
}
|
|
1044
|
-
restoreOldDisplayLine(displayLine) {
|
|
1045
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1046
|
-
try {
|
|
1047
|
-
this._inRestore = true;
|
|
1048
|
-
yield this.setCurrRowByDisplayLine(displayLine, false, true);
|
|
1049
|
-
}
|
|
1050
|
-
catch (ex) {
|
|
1051
|
-
if (ex instanceof RecordOutOfDataViewException) {
|
|
1052
|
-
}
|
|
1053
|
-
else
|
|
1054
|
-
throw ex;
|
|
1055
|
-
}
|
|
1056
|
-
finally {
|
|
1057
|
-
this._inRestore = false;
|
|
1058
|
-
}
|
|
1059
|
-
});
|
|
1060
|
-
}
|
|
1061
|
-
getTopIndexFromGUI() {
|
|
1062
|
-
let topDisplayLine = super.getTopIndexFromGUI();
|
|
1063
|
-
if (super.hasTable())
|
|
1064
|
-
this.GetDataview().setTopRecIdx(this.displayLine2RecordIdx(topDisplayLine));
|
|
1065
|
-
return topDisplayLine;
|
|
1066
|
-
}
|
|
1067
|
-
getCurrRecPosInForm() {
|
|
1068
|
-
let topDisplayLine = super.getTopIndexFromGUI();
|
|
1069
|
-
return this.DisplayLine - topDisplayLine + 1;
|
|
1070
|
-
}
|
|
1071
|
-
restoreBackup(oldDisplayLine, bkpRecord) {
|
|
1072
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1073
|
-
if (bkpRecord.getId() >= 0 && this.GetDataview().getRecIdx(bkpRecord.getId()) >= 0 && oldDisplayLine >= 0 && oldDisplayLine < this.GetDataview().getSize() && this.GetDataview().getCurrRecIdx() >= 0 && bkpRecord.getMode() === DataModificationTypes.None) {
|
|
1074
|
-
this.GetDataview().restoreCurrent(bkpRecord);
|
|
1075
|
-
this.updateDisplayLineByDV();
|
|
1076
|
-
}
|
|
1077
|
-
else
|
|
1078
|
-
yield this.restoreOldDisplayLine(oldDisplayLine);
|
|
1079
|
-
});
|
|
1080
|
-
}
|
|
1081
|
-
ConstructMgControl(type, taskOrParentMgForm, parentControlOrParentControlIdx) {
|
|
1082
|
-
if (arguments.length === 0) {
|
|
1083
|
-
return this.ConstructMgControl_0();
|
|
1084
|
-
}
|
|
1085
|
-
if (arguments.length === 3 && (type === null || type.constructor === Number) && (taskOrParentMgForm === null || taskOrParentMgForm instanceof TaskBase) && (parentControlOrParentControlIdx === null || parentControlOrParentControlIdx.constructor === Number)) {
|
|
1086
|
-
return this.ConstructMgControl_1(type, taskOrParentMgForm, parentControlOrParentControlIdx);
|
|
1087
|
-
}
|
|
1088
|
-
return this.ConstructMgControl_2(type, taskOrParentMgForm, parentControlOrParentControlIdx);
|
|
1089
|
-
}
|
|
1090
|
-
ConstructMgControl_0() {
|
|
1091
|
-
return new MgControl();
|
|
1092
|
-
}
|
|
1093
|
-
ConstructMgControl_1(type, task, parentControl) {
|
|
1094
|
-
return new MgControl(type, task, parentControl);
|
|
1095
|
-
}
|
|
1096
|
-
ConstructMgControl_2(type, parentMgForm, parentControlIdx) {
|
|
1097
|
-
return new MgControl(type, parentMgForm, parentControlIdx);
|
|
1098
|
-
}
|
|
1099
|
-
alreadyMovedToFirstControl() {
|
|
1100
|
-
return this._task.getMGData().AlreadyMovedToFirstControl();
|
|
1101
|
-
}
|
|
1102
|
-
firstTableRefresh() {
|
|
1103
|
-
const _super = Object.create(null, {
|
|
1104
|
-
firstTableRefresh: { get: () => super.firstTableRefresh },
|
|
1105
|
-
SelectRow: { get: () => super.SelectRow }
|
|
1106
|
-
});
|
|
1107
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1108
|
-
if (this._tableMgControl !== null) {
|
|
1109
|
-
_super.firstTableRefresh.call(this);
|
|
1110
|
-
this.setTableItemsCount(false);
|
|
1111
|
-
yield this.refreshTable();
|
|
1112
|
-
_super.SelectRow.call(this);
|
|
1113
|
-
}
|
|
1114
|
-
});
|
|
1115
|
-
}
|
|
1116
|
-
InsertTableItems(idx, count) {
|
|
1117
|
-
if (this._tableMgControl != null) {
|
|
1118
|
-
this.Rows.InsertRange(new Array(count));
|
|
1119
|
-
this.InsertTableChildrenArrays(idx, count);
|
|
1120
|
-
this._lastRowSent = -1;
|
|
1121
|
-
}
|
|
1122
|
-
this.setTableItemsCount(false);
|
|
1123
|
-
}
|
|
1124
|
-
setTableItemsCount(removeAll) {
|
|
1125
|
-
let tableItemsCount;
|
|
1126
|
-
if (this.isTableWithAbsoluteScrollbar()) {
|
|
1127
|
-
if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE
|
|
1128
|
-
&& this._task.getMode() == Constants.TASK_MODE_CREATE) {
|
|
1129
|
-
tableItemsCount = this.GetDataview().getSize();
|
|
1130
|
-
if (this.GetDataview().RecordsBeforeCurrentView > 0) {
|
|
1131
|
-
this.GetDataview().RecordsBeforeCurrentView = 0;
|
|
1132
|
-
this.SetRecordsBeforeCurrentView(0);
|
|
1133
|
-
this.RefreshUI();
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
else {
|
|
1137
|
-
tableItemsCount = (this.GetDataview().TotalRecordsCount > 0) ? this.GetDataview().TotalRecordsCount : 1;
|
|
1138
|
-
this.SetRecordsBeforeCurrentView(this.GetDataview().RecordsBeforeCurrentView);
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
else {
|
|
1142
|
-
tableItemsCount = this.GetDataview().getSize();
|
|
1143
|
-
}
|
|
1144
|
-
super.SetTableItemsCount(this.GetDataview().getSize(), tableItemsCount, removeAll);
|
|
1145
|
-
}
|
|
1146
|
-
InitTableControl(dvSize, tableItemsCount, removeAll) {
|
|
1147
|
-
if (arguments.length === 0) {
|
|
1148
|
-
this.InitTableControl_00();
|
|
1149
|
-
return;
|
|
1150
|
-
}
|
|
1151
|
-
this.InitTableControl_01(dvSize, tableItemsCount, removeAll);
|
|
1152
|
-
}
|
|
1153
|
-
InitTableControl_00() {
|
|
1154
|
-
let dvSize = 1;
|
|
1155
|
-
let tableItemsCount = 1;
|
|
1156
|
-
if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
|
|
1157
|
-
let recordsBeforeCurrentView = this.GetDataview().RecordsBeforeCurrentView;
|
|
1158
|
-
tableItemsCount = this.GetDataview().TotalRecordsCount;
|
|
1159
|
-
Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, recordsBeforeCurrentView);
|
|
1160
|
-
}
|
|
1161
|
-
this.InitTableControl(dvSize, tableItemsCount, false);
|
|
1162
|
-
this.SetTableTopIndex();
|
|
1163
|
-
}
|
|
1164
|
-
InitTableControl_01(dvSize, tableItemsCount, removeAll) {
|
|
1165
|
-
if (this._tableMgControl !== null) {
|
|
1166
|
-
if (removeAll) {
|
|
1167
|
-
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, true);
|
|
1168
|
-
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, true);
|
|
1169
|
-
}
|
|
1170
|
-
else {
|
|
1171
|
-
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, this.GetDataview().IncludesFirst() || this.GetDataview().IsOneWayKey);
|
|
1172
|
-
Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, this.GetDataview().IncludesLast());
|
|
1173
|
-
Commands.addBoolWithLine(CommandType.SET_EMPTY_DATAVIEW, this._tableMgControl, 0, this.GetDataview().isEmptyDataview());
|
|
1174
|
-
}
|
|
1175
|
-
super.InitTableControl(dvSize, tableItemsCount, removeAll);
|
|
1176
|
-
this.checkAndCreateRowsEvent();
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
SetTableTopIndex() {
|
|
1180
|
-
if (this._tableMgControl !== null) {
|
|
1181
|
-
let index = this.GetDataview().getTopRecIdx();
|
|
1182
|
-
if (index === Int32.MinValue)
|
|
1183
|
-
index = 0;
|
|
1184
|
-
if (!this.isTableWithPagination()) {
|
|
1185
|
-
if (this.GetDataview().IncludesLast()) {
|
|
1186
|
-
if (index + this._rowsInPage > this.GetDataview().getSize()) {
|
|
1187
|
-
if (this.GetDataview().IncludesFirst() || this.GetDataview().getSize() > this._rowsInPage + 1) {
|
|
1188
|
-
index = Math.max(this.GetDataview().getSize() - this._rowsInPage, 0);
|
|
1189
|
-
this.GetDataview().setTopRecIdx(index);
|
|
1190
|
-
this._topIndexUpdated = true;
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
|
-
}
|
|
1194
|
-
}
|
|
1195
|
-
if (index !== this._prevGuiTopIndex || this.IsMovingInView) {
|
|
1196
|
-
Commands.addWithNumber(CommandType.SET_TABLE_TOP_INDEX, this._tableMgControl, index);
|
|
1197
|
-
this._prevGuiTopIndex = this.getGuiRowidx(index);
|
|
1198
|
-
}
|
|
1199
|
-
}
|
|
1200
|
-
}
|
|
1201
|
-
createForm() {
|
|
1202
|
-
super.createForm();
|
|
1203
|
-
MgForm.CreatedForms.add(this);
|
|
1204
|
-
}
|
|
1205
|
-
UpdateStatusBar() {
|
|
1206
|
-
}
|
|
1207
|
-
initInnerObjects(foundTagName) {
|
|
1208
|
-
if (foundTagName === null)
|
|
1209
|
-
return false;
|
|
1210
|
-
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
1211
|
-
if (foundTagName === XMLConstants.MG_TAG_RECOMPUTE) {
|
|
1212
|
-
Logger.Instance.WriteDevToLog("goes to recompute form");
|
|
1213
|
-
this._task.RecomputeFillData(parser);
|
|
1214
|
-
return true;
|
|
1215
|
-
}
|
|
1216
|
-
return super.initInnerObjects(foundTagName);
|
|
1217
|
-
}
|
|
1218
|
-
toString() {
|
|
1219
|
-
return "{" + this.constructor.name + ": task=" + this._task + ", Id=" + this._userStateId + "}";
|
|
1220
|
-
}
|
|
1221
|
-
GetHiddenControlListXML() {
|
|
1222
|
-
let xml = new StringBuilder();
|
|
1223
|
-
if (this.hiddenControlsIsnsList !== null && this.hiddenControlsIsnsList.length > 0) {
|
|
1224
|
-
xml.Append("<" + ConstInterface.MG_TAG_HIDDEN_CONTOLS + " " + ConstInterface.MG_ATTR_ISNS + "=\"");
|
|
1225
|
-
this.hiddenControlsIsnsList.forEach((change) => {
|
|
1226
|
-
xml.Append(change + ",");
|
|
1227
|
-
});
|
|
1228
|
-
xml.Remove(xml.Length - 1, 1);
|
|
1229
|
-
xml.Append("\"/>");
|
|
1230
|
-
this.hiddenControlsIsnsList = null;
|
|
1231
|
-
}
|
|
1232
|
-
return xml.ToString();
|
|
1233
|
-
}
|
|
1234
|
-
ShouldBehaveAsModal() {
|
|
1235
|
-
let shouldBeModal = false;
|
|
1236
|
-
if (!this._task.IsInteractive && !this._task.isMainProg())
|
|
1237
|
-
shouldBeModal = TaskBase.ShouldNonInteractiveBeModal();
|
|
1238
|
-
else {
|
|
1239
|
-
let parentTask = this._task.ParentTask;
|
|
1240
|
-
if (parentTask !== null && !parentTask.IsInteractive && !parentTask.isMainProg())
|
|
1241
|
-
shouldBeModal = parentTask.ShouldNonInteractiveChildBeModal();
|
|
1242
|
-
}
|
|
1243
|
-
return shouldBeModal;
|
|
1244
|
-
}
|
|
1245
|
-
isTableWithPagination() {
|
|
1246
|
-
return this.isTableWithAbsoluteScrollbar();
|
|
1247
|
-
}
|
|
1248
|
-
isTableWithAbsoluteScrollbar() {
|
|
1249
|
-
let tableWithAbsoluteScrollbar = false;
|
|
1250
|
-
if (this._tableMgControl !== null)
|
|
1251
|
-
tableWithAbsoluteScrollbar = this._tableMgControl.IsTableWithAbsoluteScrollbar();
|
|
1252
|
-
return tableWithAbsoluteScrollbar;
|
|
1253
|
-
}
|
|
1254
|
-
SetRecordsBeforeCurrentView(value) {
|
|
1255
|
-
if (this._tableMgControl !== null) {
|
|
1256
|
-
Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, value);
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
buildFormName() {
|
|
1260
|
-
let name = this.UniqueName;
|
|
1261
|
-
let task = this.getTask();
|
|
1262
|
-
name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
|
|
1263
|
-
while (task.IsSubtask) {
|
|
1264
|
-
task = task.StudioParentTask;
|
|
1265
|
-
name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
|
|
1266
|
-
}
|
|
1267
|
-
name = name.replace(/ /g, "_");
|
|
1268
|
-
name = name.replace(/-/g, "_");
|
|
1269
|
-
return name;
|
|
1270
|
-
}
|
|
1271
|
-
fetchPrevChunkForCurrentPage() {
|
|
1272
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1273
|
-
if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
|
|
1274
|
-
let recPosOnPage = this.GetDataview().RecordsBeforeCurrentView % this._rowsInPage;
|
|
1275
|
-
if (recPosOnPage > 0 && this.DisplayLine === 0) {
|
|
1276
|
-
let lastFocusedVal = { guiMgControl: this.getTableCtrl(), Line: recPosOnPage, Val: "" };
|
|
1277
|
-
yield this.setRowData(-recPosOnPage, false);
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
});
|
|
1281
|
-
}
|
|
1282
|
-
getGuiRowidx(dvRowIdx) {
|
|
1283
|
-
return dvRowIdx + this.GetDataview().RecordsBeforeCurrentView;
|
|
1284
|
-
}
|
|
1285
|
-
getDvRowIdx(guiRowIdx) {
|
|
1286
|
-
return guiRowIdx - this.GetDataview().RecordsBeforeCurrentView;
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
|
-
MgForm.TIME_LIMIT = 50;
|
|
1290
|
-
MgForm._createdForms = new CreatedFormVector();
|
|
1291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFFWCxxQkFBcUIsRUFDckIsY0FBYyxFQUVkLE9BQU8sRUFFUCxVQUFVLEVBQ1YsYUFBYSxFQUVkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGFBQWEsRUFDYixJQUFJLEVBQ0osUUFBUSxFQUNSLFlBQVksRUFFYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2xCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQVcscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFNN0MsTUFBTSxPQUFPLE1BQU8sU0FBUSxVQUFVO0lBb0JwQztR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QztJQUNoRSxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQWlCO1FBQzNCLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztJQUNqRSxDQUFDOztBQTV4RGMsaUJBQVUsR0FBVyxFQUFFLENBQUM7QUFZaEMsb0JBQWEsR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBDb21tYW5kVHlwZSxcclxuICBDb250cm9sVGFibGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIExhc3RGb2N1c2VkVmFsLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXIsXHJcbiAgaXNOdWxsT3JVbmRlZmluZWRcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbn0gZnJvbSAnLi4vZGF0YS9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHtEYXRhVmlldywgU0VUX0RJU1BMQVlMSU5FX0JZX0RWfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIE1nRm9ybSBleHRlbmRzIE1nRm9ybUJhc2Uge1xyXG4gIHByaXZhdGUgc3RhdGljIFRJTUVfTElNSVQ6IG51bWJlciA9IDUwOyAvLyB0aW1lIGxpbWl0IGZvciBvbmUgdHJhbnNmZXIgb3BlcmF0aW9uIChpbiBtaWxsaSBzZWNvbmRzKVxyXG4gIElzTW92aW5nSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJldkRpc3BsYXlMaW5lOiBudW1iZXIgPSAwOyAvLyBkaXNwbGF5IGlkZW50aWZpZXIgb2YgcHJldiBsaW5lXHJcbiAgUmVmcmVzaEFsbFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgSWdub3JlRmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1vdmVkVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIG1vdmUgdG8gZmlyc3QgY29udHJvbCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGZvcm1cclxuXHJcbiAgcHJpdmF0ZSBfc3VmZml4RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGhpZGRlbkNvbnRyb2xzSXNuc0xpc3Q6IExpc3Q8bnVtYmVyPiA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IG5ldyBDcmVhdGVkRm9ybVZlY3RvcigpO1xyXG5cclxuICAvL1RPRE86IE1heWJlIHRoZSBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlIGFsbG93RmllbGRDb21wdXRlXHJcbiAgcHJpdmF0ZSBfdHJhbnNmZXJyaW5nRGF0YVRvR1VJOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaXNGZXRjaGluZ1JlY29yZHNBaGVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IENyZWF0ZWRGb3JtcygpOiBDcmVhdGVkRm9ybVZlY3RvciB7XHJcbiAgICByZXR1cm4gTWdGb3JtLl9jcmVhdGVkRm9ybXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5SZXN0b3JlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVzdG9yZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2ZlcnJpbmdEYXRhVG9HVUkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgIGxldCBwcm9wID0gdGhpcy5fdGFibGVNZ0NvbnRyb2wuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRCk7XHJcblxyXG4gICAgICByZXR1cm4gKHByb3AgIT0gbnVsbCA/IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSA6IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSB0YXNrIGRhdGF2aWV3LCBpZiB0aGUgdGFzayBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSB0YXNrIGRhdGF2aWV3PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0RGF0YXZpZXcoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbClcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuXHJcbiAgICByZXR1cm4gKGR2KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG1vdmVJblZpZXcodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJldHVyblRvQ3RybCkpXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18wKHVuaXQsIGRpcmVjdGlvbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMubW92ZUluVmlld18xKHVuaXQsIGRpcmVjdGlvbiwgcmV0dXJuVG9DdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG1vdmVJblZpZXdfMCh1bml0OiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vdmVJblZpZXcodW5pdCwgZGlyZWN0aW9uLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVyblRvQ3RybFwiPnNob3VsZCB0aGUgY3Vyc29yIHJldHVybiB0byB0aGUgbGFzdCBwYXJrZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBtb3ZlSW5WaWV3XzEodW5pdDogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZywgcmV0dXJuVG9DdHJsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgbGV0IHJldHVyblRvVmlzaWJsZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNvcmRPdXRPZlZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB2aXNpYmxlTGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gdHJ1ZTtcclxuICAgICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgICAgLy8gdGFibGUgbW92ZW1lbnRzIChmaXJzdCAvIGxhc3QgcmVjb3JkKVxyXG4gICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBCRUdJTklORyBPRiBUQUJMRVxyXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRU5EIE9GIFRBQkxFXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSArIDEpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPj0gMClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFnZSBhbmQgcm93IG1vdmVtZW50c1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlY29yZHMgdG8gc2tpcFxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJiB0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORDpcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3Q6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxO1xyXG4gICAgICAgICAgICAgIGxhc3QgPSBNYXRoLm1pbihsYXN0LCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IGxhc3QgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVyblRvVmlzaWJsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzaXplID0gMTtcclxuXHJcbiAgICAgICAgc2l6ZSA9IChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWIHx8XHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTlxyXG4gICAgICAgICAgPyAtc2l6ZVxyXG4gICAgICAgICAgOiBzaXplKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICB2aXNpYmxlTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA8IDApIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSAwO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID4gdGhpcy5fcm93c0luUGFnZSArIDEpIHtcclxuICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICByZWNvcmRPdXRPZlZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nIHRoZSB0YWJsZSBvbmUgcGFnZSBvciBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGlmICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKSB8fFxyXG4gICAgICAgICAgICB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJlxyXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCAmJiB2aXNpYmxlTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEgfHxcclxuICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWICYmIHZpc2libGVMaW5lID09PSAwKSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBwcmV2aW91cyByb3cgYnV0IHdlIGFyZSBhdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgZGF0YSB2aWV3XHJcbiAgICAgICAgICAgIC8vIHRoZW4gZG8gbm90aGluZ1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJlxyXG4gICAgICAgICAgICAgICh1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyB8fCB1bml0ID09PSBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UpICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gMCAmJiB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHdlIG1vdmUgdG8gdGhlIG5leHQgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IG9mIHRoZSB0YWJsZSBhbmQgdGhlIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPT09IHRoaXMuZ2V0TGFzdFZhbGlkUm93KCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA9PT0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIDEgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgc2l6ZSk7XHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5zZXRUb3BSZWNJZHhNb2RpZmllZCh0cnVlKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdWZmaXhEb25lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5NTQ5Njogd2hlbiB0aGUgcmVjb3JkIHN1ZmZpeCBmYWlsZWQgZ28gYmFjayB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaXQgIT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XICYmICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHModGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzk5MjEwMTogaWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgdGhlIHJlYyBzdWZmaXhcclxuICAgICAgICAgICAgICAgICAgLy8gd2Fzbid0IGV4ZWN1dGVkIHNvIHdlIG11c3QgaGFuZGxlIGl0IGJlZm9yZSB3ZSBnbyB0byBhIG5ldyByb3dcclxuICAgICAgICAgICAgICAgICAgbGV0IG5ld1JlY0lkOiBudW1iZXIgPSAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1JlY0lkID09PSBvbGRSZWNJZCAmJiAhdGhpcy5fc3VmZml4RG9uZSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSIDc1ODYzOVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5nZXRMYXN0VmFsaWRSb3coKSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIG1vdmluZyB0aGUgbWFya2luZyBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIG9sZFRhc2tNb2RlID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCB3YXMgZGVsZXRlZCBpbiBSdW4gVGltZSBieSBGb3JjZSBEZWxldGUgZm9yIGV4YW1wbGVcclxuICAgICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwIHx8IG9sZFRhc2tNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IC0xIHx8ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHMob2xkRGlzcGxheUxpbmUpKVxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI5MzY2OFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInNraXBwZWQgc2V0Y3VyclJvdyBmb3Igcm93IHswfVwiLCBvbGREaXNwbGF5TGluZSkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogaWYgZXZlcnl0aGluZyBpcyBPSywgY3VyciByZWMgd2lsbCBsYXRlciBiZSByZWZyZXNoZWQgaW5cclxuICAgICAgICAgICAgICAgIC8vIFJFQ19QUkVGSVhcclxuICAgICAgICAgICAgICAgIC8vIHRodXMsIHJlZnJlc2ggb25seSBpbiBjYXNlIG9mIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBlcnJvciBpcyBiZWNhdXNlIHRoZSBvbGQtcmVjIHdhcyByZW1vdmVkIChjYW5jZWxFZGl0J2VkKSwgc28gcmVmcmVzaCBmb3JtLlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBRQ1IgIzc3NTMwOTogaWYgbGVhdmluZyB0aGUgbmV3IGNyZWF0ZWQgcmVjb3JkIGZhaWxlZCB0aGVuIHJlc3RvcmVcclxuICAgICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhIG5ldyByZWNvcmQgc28gdGhlIG5leHQgYWN0aW9uIHdvdWxkXHJcbiAgICAgICAgICAgICAgICAgIC8vIFwia25vd1wiIHRoYXQgaXQgaXMgc3RpbGwgYSBuZXcgcmVjb3JkLlxyXG4gICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgIyA4MTYyNyA6IElmIHRhc2sgaXMgaGF2aW5nIGEgc3ViZm9ybSwgdGhlbiB3aGlsZSBtb3ZpbmcgdG8gc3ViZm9ybSwgbmV3bHkgY3JlYXRlZCByZWNvcmRcclxuICAgICAgICAgICAgICAgICAgLy8gaXMgc3luY2VkIGFuZCBpdCBpcyBpbnNlcnRlZCBpbiBfbW9kaWZpZWRUYWIgYXMgJ2luc2VydCcgcmVjb3JkLiBTbywgYW55IHJlcXVlc3QgdG8gc2VydmVyIGluc2VydHNcclxuICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRvIHNlcnZlci4gRXZlbiBpZiB3ZSBkb250IGdvIHRvIHNlcnZlciwgaXQgaXMgdGhlcmUgaW4gX21vZGlmaWVkVGFiIGFzIG5ldyByZWNvcmQuIEluc2VydGluZ1xyXG4gICAgICAgICAgICAgICAgICAvLyBoZXJlIGFscmVhZHkgc3luY2VkIHJlY29yZCBjYXVzZXMgaW5zZXJ0aW9uIG9mIHJlY29yZCB0d2ljZS4gU28sIElmIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBzeW5jZWQgdGhlbiBvbmx5IGluc2VydC5cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghY3VyclJlYy5TeW5jZWQgJiYgb2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjOTgwNTI4OiBSZWZyZXNoIHRoZSBjdXJyZW50IHJvdyBhZnRlciBjYW5jZWwgZWRpdCB0byByZWZsZWN0XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0b3JlZCB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQgYnVnICM6OTQxNzYzLCB3aGlsZSBjcmVhdGUgaXNuJ3QgYWxsb3dlZCBuZWVkIHRvIGRvIHN1ZmZpeCBhbmQgcHJlZml4IG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRvUmVjb3JkU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCByZWZkb1JlY29yZFN1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9SZWNvcmRTdWZmaXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgoPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIHJlZmRvUmVjb3JkU3VmZml4KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGhpcy5fdGFzayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkb1JlY29yZFN1ZmZpeCA9IHJlZmRvUmVjb3JkU3VmZml4LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgZm9ybSBkb2VzIG5vdCBoYXZlIGEgdGFibGUsIG1vdmUgdG8gb25lIHJvdyBpbiB0aGUgY2hvc2VuIERpcmVjdGlvblxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICsgc2l6ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUsIGVuZCBvZiBkYXRhIG1lYW5zIGVuZCBvZiBvd25lclRhc2ssIHVubGVzcyB3ZSBhcmUgaW4gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnN0b3AoKTtcclxuICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXR1cm5Ub1Zpc2libGVMaW5lKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZE91dE9mVmlldykge1xyXG4gICAgICAgICAgaWYgKHZpc2libGVMaW5lID09PSAwKVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLl9yb3dzSW5QYWdlKTtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyB2aXNpYmxlTGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgaWYgKHJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBjdXJzb3JNb3ZlZDogYm9vbGVhbiA9IGF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgaWYgKCFjdXJzb3JNb3ZlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5NZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcblxyXG4gICAgICB0aGlzLlNlbGVjdFJvdygpO1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhIHJlY29yZCB0byB0aGUgZm9ybSBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGFkZFJlYyhkb1N1ZmZpeDogYm9vbGVhbixpc0NyZWxpbmVBYm92ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG5ld0xpbmU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgY3VyckxpbmU6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgY3VyckxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcblxyXG4gICAgLy8gSW5jcmVtZW50IHRoZSBUb3RhbFJlY29yZHNDb3VudCBhcyByZWNvcmQgYmVpbmcgYWRkZWQgaW50byB0aGUgdmlldy5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSlcclxuICAgIHtcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ICs9IDE7XHJcbiAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdSZWNJZHg6IG51bWJlciA9IGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5hZGRSZWNvcmQoZG9TdWZmaXgsIGZhbHNlLCBpc0NyZWxpbmVBYm92ZSk7XHJcblxyXG4gICAgaWYgKG5ld1JlY0lkeCA+IC0xKSB7XHJcbiAgICAgIC8vIGZvcm1zIHdpdGggYSB0YWJsZVxyXG4gICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAvLyB0aGVyZSBhcmUgbm8gcmVjb3JkcyBpbiB0aGUgdGFibGUgc28gdGhlIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlclxyXG4gICAgICAgIC8vIHNldHRpbmcgdGhlIHRvcCByZWNvcmQgdG8gMCBhbmQgdGhlIGN1cnJlbnQgcm93IHRvIDBcclxuICAgICAgICBsZXQgbmV3Q3VyclJvdzogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAwIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIGN1cnNvciBpcyBwYXJraW5nIG9uIHRoZSBsYXN0IHJvdyBvZiB0aGUgZGlzcGxheWVkIHRhYmxlIHNvIHRoZVxyXG4gICAgICAgIC8vIG5ldyByb3cgaXMgY3JlYXRlZCBhZnRlciBpbmNyZW1lbnRpbmcgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAgICAgICBlbHNlIGlmIChjdXJyTGluZSA9PT0gdGhpcy5fcm93c0luUGFnZSAtIDEpIHtcclxuICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgMSk7XHJcbiAgICAgICAgICBuZXdDdXJyUm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRvcCByZWNvcmRcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKGlzQ3JlbGluZUFib3ZlKVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgPiAwID8gY3VyckxpbmUgOiAwO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuZXdDdXJyUm93ID0gY3VyckxpbmUgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG5ld0xpbmUgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93O1xyXG5cclxuICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgbmV3Q3VyclJvdyk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0xpbmUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmVcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmFkZFJlYygpIHswfVwiLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9UQUJMRSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgLT0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRlbEN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9wVGFibGVSb3c6IGJvb2xlYW4gPSBzdXBlci5pc0xpbmVNb2RlKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5yZW1vdmVDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkgJiYgISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSXNUcnlpbmdUb1N0b3ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlYyhmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl90YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyBjaGFuZ2UgdG8gY3JlYXRlIG1vZGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICAgICAgLy8gTUdfQUNUX0NSRUxJTkUgbWF5IGJlIGRpc2FibGVkIC5pLmUuIFBST1BfVFlQRV9BTExPV19DUkVBVEUgZXhwcmVzc2lvbiBjYW4gYmUgY2hhbmdlZFxyXG4gICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHRoZSBvd25lclRhc2tcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0b3BUYWJsZVJvdylcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQtLTtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZWNvcmRzQWZ0ZXJJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FuY2VsIHRoZSBlZGl0aW5nIG9mIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgcmVzdG9yZSB0aGUgb2xkIHZhbHVlcyBvZiB0aGUgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2FuY2VsXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIEFDVF9DQU5DRUwsIGZhbHNlIG90aGVyd2lzZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRFdmVudFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgY2FuY2VsRWRpdChpc0FjdENhbmNlbDogYm9vbGVhbiwgaXNRdWl0RXZlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtb2RlOiBzdHJpbmcgPSB0aGlzLl90YXNrLmdldE1vZGUoKTtcclxuICAgIGxldCBuZXdNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgcm93OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4ZWNSZWNQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBXZSByZXR1cm4gdG8gY3JlYXRlIG1vZGUgb25seSBpZiB0aGVyZSBpcyBubyByZWNvcmQgdG8gZ28gdG8gYWZ0ZXIgdGhlIGNhbmNlbCBhY3Rpb25cclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID09PSAxICYmIG1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICBuZXdNb2RlID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEU7XHJcbiAgICBlbHNlXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWTtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIC8vIDk5NzA3MyAmIDkzMTAyMS5cclxuICAgIC8vIEV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyBjYW5jZWwgZXZlbnQsIGZvciBhIG5ldyByZWNvcmQ6XHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgbm90IGNyZWF0ZSwgZGVsZXRlIHRoZSBuZXcgcmVjb3JkIGFuZCBnbyBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAvLyBJZiB0aGUgb3JpZ2luYWwgb3duZXJUYXNrIG1vZGUgaXMgY3JlYXRlLCBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLlxyXG5cclxuICAgIC8vIGR2LmNhbmNlbEVkaXQoKSByZW1vdmVzIHRoZSBuZXcgcmVjb3JkIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gU28sIGluIGNhc2Ugb2Ygb3JnVGFza01vZGU9Qywgc2luY2Ugd2Ugd2FudCB0byBzdGF5IG9uIHRoZSBuZXcgcmVjb3JkLCB3ZSBuZWVkIHRvIHJlLWNyZWF0ZSBhIHJlY29yZC5cclxuXHJcbiAgICAvLyBCdXQgYXMgc2FpZCwgZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgT05MWSB1bmRlciBzb21lIGNvbmRpdGlvbi5cclxuICAgIC8vIFRoZSBjb25kaXRpb24gaXMgYXMgZm9sbG93czpcclxuICAgIC8vIFRoZSByZWNvcmQgaXMgcmVtb3ZlZCBvbmx5IGlmIHRoZSBkdiBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxLiBTbywgaWYgdGhlIGR2IHNpemUgaXMgMSwgZHYuY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBkb2VzIG5vdCByZW1vdmUgdGhlIHJlY29yZCBhbmQgaGVuY2UgaW4gdGhpcyBjYXNlLCBmb3JtLmNhbmNlbEVkaXQoKSBzaG91bGQgbm90IGNyZWF0ZSBhIG5ldyByZWNvcmQuXHJcbiAgICAvLyBGb3IgdGhpcyByZWFzb24sIHRoZSBzaWduYXR1cmUgb2YgZHYuY2FuY2VsRWRpdCgpIGlzIGNoYW5nZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgcmVjb3JkIHdhcyByZW1vdmVkIG9yIG5vdC5cclxuXHJcbiAgICAvLyBUaGlzIGlzIG9uZSBwYXJ0LlxyXG5cclxuICAgIC8vIE5vdywgYWZ0ZXIgY2FuY2VsRWRpdCwgUlAgaGFzIHRvIGJlIGV4ZWN1dGVkLiBUaGlzIHdhcyBkb25lIGluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwuXHJcbiAgICAvLyBCdXQgd2hhdCBoYXBwZW5zIGlzLCBpZiBmb3JtLmNhbmNlbEVkaXQoKSBjcmVhdGVkIGEgbmV3IGxpbmUsIFJQIHdhcyBhbHJlYWR5IGV4ZWN1dGVkIGZyb20gdGhlcmUuIEFuZCBmcm9tXHJcbiAgICAvLyBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKSwgUlAgaXMgZXhlY3V0ZWQgZm9yIHRoZSBzZWNvbmQgdGltZS5cclxuICAgIC8vIFNvLCBtb3ZlZCB0aGUgY29kZSBvZiBleGVjdXRpbmcgUlAgZnJvbSBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXIoKS0+Y2FzZSBNR19BQ1RfQ0FOQ0VMIHRvIGZvcm0uY2FuY2VsRWRpdCgpXHJcbiAgICAvLyBhbmQgdGhhdCB3aWxsIGJlIGRvbmUgb25seSBpZiB0aGUgY3JlYXRlIGxpbmUgd2FzIG5vdCBleGVjdXRlZC5cclxuXHJcbiAgICAvLyBOb3csIHdlIGhhdmUgb25lIG1vcmUgaXNzdWUuXHJcblxyXG4gICAgLy8gVW50aWwgbm93LCB0aGUgUlAgd2FzIGV4ZWN1dGVkIGFmdGVyIGZvcm0uY2FuY2VsRWRpdCgpLlxyXG4gICAgLy8gU28sIHdoZW4gdGhlIGNvZGUgaXMgbW92ZWQgdG8gZm9ybS5jYW5jZWxFZGl0KCksIGl0IHNob3VsZCBiZSB0aGUgbGFzdCB0aGluZyB0byBiZSBleGVjdXRlZC5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIGxldCByZWNSZW1vdmVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRQcmV2Q3VyclJlYyhudWxsKTtcclxuICAgIGlmICgodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSB8fCAoKGlzQWN0Q2FuY2VsICYmIHJlY1JlbW92ZWQpICYmICghR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbENhbmNlbE9uQ3JlYXRlKCkpJiYoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICAvLyBTZXQgQ2FuY2VsIGluZGljYXRpb24gb24gdGhlIHRhc2sgZm9yIHRvIG5vdCBwZXJmb3JtIGNvbnRyb2wgdmFsdWUgdmFsaWRhdGlvbiBpbiB0aGUgQ3JlYXRlIGxpbmUgYWN0aW9uLlxyXG4gICAgICBsZXQgb3JnQ2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRDYW5jZWxXYXNSYWlzZWQoaXNBY3RDYW5jZWwpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChvcmdDYW5jZWxXYXNSYWlzZWQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNBY3RDYW5jZWwpXHJcbiAgICAgIGV4ZWNSZWNQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIHRoZSBlbXB0aW5lc3Mgb2YgdGhlIERWIG11c3QgYmUgY2hlY2tlZCBhZ2FpbiBiZWNhdXNlIHRoZSBcImNyZWF0ZSBsaW5lXCIgbWF5IGZhaWxcclxuICAgIGlmICghdGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuICAgICAgICAgICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IHRoaXMuX3Jvd3NJblBhZ2UpIHtcclxuICAgICAgICAgICAgICBsZXQgdG9wUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgaWYgKHRvcFJlY0lkeCA+IGN1cnJSZWNJZHgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KGN1cnJSZWNJZHgpO1xyXG4gICAgICAgICAgICAgIHJvdyA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZSh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyByb3csIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiBzaG91bGQgcmVhbGx5IGJlIGNhdWdodCBoZXJlLlxyXG4gICAgICAgICAgICBpZiAocm93ICE9PSAwKVxyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBkZWxldGVkLlxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpICYmIHJlY1JlbW92ZWQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gc2NyZWVuIG1vZGVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIHRydWUsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImluIEZvcm0uY2FuY2VsRWRpdCgpIGVycm9yIGluIFNjcmVlbiBtb2RlIGZvciBDdXJyZW50IFJlY29yZFwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShuZXdNb2RlKTtcclxuICAgICAgaWYgKCEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluRW5kVGFzaylcclxuICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcblxyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV4ZWNSZWNQcmVmaXgpIHtcclxuICAgICAgLy8gUUNSICM5MjU2NDYsICM0NTQxNjc6IGV4aXQgdG8gdGhlIG93bmVyVGFzayBsZXZlbCBpbiBvcmRlciB0byBza2lwIGNvbnRyb2wgc3VmZml4XHJcbiAgICAgIC8vIGFuZCByZWNvcmQgc3VmZml4IG9mIHRoZSBjYW5jZWxlZCBuZXcgcmVjb3JkIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGVcclxuICAgICAgLy8gbmV4dCByZWNvcmQgcGVyZml4IHdvdWxkIGJlIGV4ZWN1dGVkXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIC8vIHdlIHJvbGxiYWNrIGEgcGFyZW50IG93bmVyVGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vb3duZXJUYXNrLiBXZSBkbyBub3Qgd2FudCB0aGUgY3RybCBvbiB0aGUgc3ViZm9ybSB0byBkbyBjdHJsIHN1ZmZpeC5cclxuICAgICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICgoPFRhc2tCYXNlPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLnBhdGhDb250YWlucyg8VGFza0Jhc2U+dGhpcy5fdGFzaykpXHJcbiAgICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSA8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgcGFyZW50ICE9PSBudWxsICYmIHBhcmVudCAhPT0gdGhpcy5fdGFzaztcclxuICAgICAgICAgICAgICAgcGFyZW50ID0gPFRhc2tCYXNlPnBhcmVudC5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICBwYXJlbnQuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICAgICgoPERhdGFWaWV3PnBhcmVudC5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzUXVpdEV2ZW50KSB7XHJcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgZm9sbG93aW5nIDIgbGluZXMgY2FuIGJlIG1lcmdlZCBpbiBvbmUgbWV0aG9kXHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5IYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKHRoaXMuX3Rhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2NhbiBhbGwgY29udHJvbHMgaW4gdGhlIGZvcm0uIEV2ZXJ5IGNvbnRyb2wgd2hpY2ggaGFzIGEgcHJvcGVydHkgdGhhdCBpcyBhbiBleHByZXNzaW9uIHdpbGwgYmVcclxuICAvLy8gICByZWZyZXNoZWQuIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhlIGNvbnRyb2wncyBkaXNwbGF5IGlzIHN5bmNoZWQgd2l0aCB0aGUgZXhwcmVzc2luJ3MgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hPbkV4cHJlc3Npb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgOiBudWxsKTtcclxuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICBhd2FpdCBtZ0NvbnRyb2wucmVmcmVzaE9uRXhwcmVzc2lvbigpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIHJlZnJlc2ggdGhlIGZvcm0gcHJvcGVydGllc1xyXG4gICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzT25FeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGNvbnRyb2xzIG9mIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmc1RvQ3RybHMoKTogdm9pZCB7XHJcbiAgICAvLyBpZiBsYXN0IGZvY3VzZWQgY29udHJvbCB3YXMgZnJvbSB0aGlzIHRhc2sgLSB6ZXJvIGl0LlxyXG4gICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0Rm9ybSgpID09PSB0aGlzKVxyXG4gICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKDxUYXNrQmFzZT50aGlzLl90YXNrLCBudWxsKTtcclxuXHJcbiAgICBzdXBlci5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxCeUN0cmxOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIDxNZ0NvbnRyb2w+dGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgc3ViZm9ybSBjb250cm9sIHdpdGggdGhlIHR5cGVkIG5hbWUgZnJvbSBhbGwgcGFyZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPiB0aGUgcmVxdWVzdGVkIHN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRTdWJGb3JtQ3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sIHtcclxuICAgIGxldCBndWlQYXJlbnRUYXNrOiBUYXNrQmFzZTtcclxuICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGd1aVBhcmVudFRhc2sgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuICAgICAgICAgZGVzdFN1YkZvcm0gPT09IG51bGwgJiYgZ3VpUGFyZW50VGFzayAhPT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrLmdldEZvcm0oKSAhPT0gbnVsbDtcclxuICAgICAgICAgZ3VpUGFyZW50VGFzayA9IGd1aVBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgZGVzdFN1YkZvcm0gPSA8TWdDb250cm9sPmd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY3RybE5hbWUsIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghZ3VpUGFyZW50VGFzay5Jc1N1YkZvcm0gfHwgTlN0cmluZy5FcXVhbHMoZ3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKS5OYW1lLCBjdHJsTmFtZSwgdHJ1ZSkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHN1ZmZpeERvbmUgcGFyYW1ldGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN1ZmZpeERvbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWZmaXhEb25lID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERlc3RpbmF0aW9uUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdFRibFJvdztcclxuICB9XHJcblxyXG4gIHNldFN1YkZvcm1DdHJsKHN1YkZvcm1DdHJsOiBNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl9zdWJGb3JtQ3RybCA9PT0gbnVsbCAmJiBzdWJGb3JtQ3RybCAhPT0gbnVsbCk7XHJcbiAgICB0aGlzLl9zdWJGb3JtQ3RybCA9IHN1YkZvcm1DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBzdWJmb3JtIGNvbnRyb2wgdGhhdCBwb2ludHMgdG8gYSB0YXNrIHdob3NlIGlkIGlzIGdpdmVuIGluIHRhc2tJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj50aGUgaWQgb2YgcmVxdWVzdGVkIHN1YmZvcm0gb3duZXJUYXNrPC9wYXJhbT5cclxuICBnZXRTdWJGb3JtQ3RybEZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN1cnI6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcGFyZW50Q3RybFRhYjogQ29udHJvbFRhYmxlO1xyXG4gICAgbGV0IGd1aVBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50Rm9ybSA9IHRoaXM7IGd1aVBhcmVudEZvcm0gIT0gbnVsbDsgZ3VpUGFyZW50Rm9ybSA9IGd1aVBhcmVudEZvcm0uUGFyZW50Rm9ybSkge1xyXG4gICAgICBwYXJlbnRDdHJsVGFiID0gZ3VpUGFyZW50Rm9ybS5DdHJsVGFiO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFyZW50Q3RybFRhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGN1cnIgPSAoKHBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSBpbnN0YW5jZW9mIE1nQ29udHJvbCkgPyA8TWdDb250cm9sPnBhcmVudEN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG4gICAgICAgIGlmIChjdXJyICE9IG51bGwgJiYgY3Vyci5pc1N1YmZvcm0oKSAmJiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgIT0gbnVsbCkpXHJcbiAgICAgICAgICBpZiAoY3Vyci5nZXRTdWJmb3JtVGFza0lkKCkgPT09IHRhc2tJZCkge1xyXG4gICAgICAgICAgICBkZXN0U3ViRm9ybSA9IGN1cnI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGVzdFN1YkZvcm0gIT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBkZXN0U3ViRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNyZWF0ZSByZWNvcmRzIGJldHdlZW4gaWR4IGFuZCBlbmQgb2YgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICByZW1vdmVSZWNvcmRzQWZ0ZXJJZHgoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1vdmVBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBpbiBzb21lIGNhc2VzIGludmlzaWJsZSAtMSByb3cgKHRoYXQgZXhpc3Qgb25seSBmb3Igc2Nyb2xsYmFyIGVmZmVjdHMpIGJlY29tZXMgdmlzaWJsZS5cclxuICAgIC8vIFRvIHByZXZlbnQgdGhpcyB3ZSdsbCByZW1vdmUgYWxsIHJlY29yZHMuIFRoaXMgd2lsbCBub3QgY2F1c2UgcGVyZnJvbWFuY2UgcHJvYmxlbXMgc2luY2VcclxuICAgIC8vIHdlIHdpbGwgYWRkIG1heGltdW0gcm93SW5QYWdlIHJlY29yZHMgbW9yZSB0aGVuIHdlIGludGVuZGVkIGluIHRoZSBiZWdpbmluZ1xyXG5cclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKVxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGlkeCA8PSB0aGlzLl9yb3dzSW5QYWdlICsgMSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpID4gdGhpcy5fcm93c0luUGFnZSlcclxuICAgICAgICBpZHggPSAwO1xyXG4gICAgICBpZiAoaWR4ID09PSAwKVxyXG4gICAgICAgIHJlbW92ZUFsbCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBpbnZhbGlkYXRlcyBhbGwgcmVjb3JkcyBhZnRlciBuZXdDdXJyUm93XHJcbiAgICAgIHN1cGVyLlNldFRhYmxlSXRlbXNDb3VudChpZHgsIHJlbW92ZUFsbCk7XHJcbiAgICAgIC8vIHVwZGF0ZXMgdGFibGUgaXRlbSdzIGNvdW50XHJcblxyXG4gICAgICB0aGlzLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHJvdyBpcyB2YWxpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNSb3dWYWxpZGF0ZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeCB8fCBpZHggPCAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgcm93ID0gPFJvdz50aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgIGlmIChyb3cgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHJvdy5DcmVhdGVkICYmIHJvdy5WYWxpZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcnVucyBpbiBXb3JrZXIgdGhyZWFkIHdoZW4gdGhlIHRocmVhZCBpcyBmcmVlIGFuZCBzZW5kIHRvIEdVSSB0aHJlYWQgY29udHJvbHMgZGF0YSBvZiBhbGwgcm93c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgdHJhbnNmZXJEYXRhVG9HdWkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBtYXhUaW1lOiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpICsgTWdGb3JtLlRJTUVfTElNSVQ7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJlbnRFZGl0aW5nQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2w7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgICAgLy8gdGhpcyBsaW1pdGF0aW9uIGlzIG5lZWRlZCBzbyB0aGlzIHJlcXVlc3Qgd2lsbCBuZXZlciB0YWtlIHRvbyBtdWNoIHRpbWVcclxuICAgICAgd2hpbGUgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgPCBtYXhUaW1lICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgLy8gYWxsIHJvd3MgYWxyZWFkeSBzZW50XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiB0aGlzLl9sYXN0Um93U2VudCArIDEgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50Kys7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKHRoaXMuX2xhc3RSb3dTZW50KSkge1xyXG4gICAgICAgICAgLy8gcm93IG5lZWRzIHRvIGJlIHNlbnRcclxuICAgICAgICAgIC8vIHNlbmQgcm93IGRhdGFcclxuICAgICAgICAgIHN1cGVyLmNoZWNrQW5kQ3JlYXRlUm93KHRoaXMuX2xhc3RSb3dTZW50KTtcclxuICAgICAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCAhPT0gc2F2ZVJvd0lkeCkge1xyXG4gICAgICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDsgLy8gcmVzZXQgdGhlIGZsYWdcclxuICAgICAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdHJlZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuX2xhc3RSb3dTZW50LCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAgICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCwgYmtwUmVjb3JkKTtcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IGN1cnJlbnRFZGl0aW5nQ29udHJvbDsgLy8gc2V0IHRoZSBmbGFnIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGFueSByb3dzIG5lZWQgdG8gYmUgc2VudCB0byBHVUkgdGhyZWFkXHJcbiAgLy8vICAgaWYgdGhlcmUgYXJlLCBwdXRzIGV2ZW50IGluIGV2ZW50IHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIHRoaXMuT3BlbmVkICYmIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKSB7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpO1xyXG4gICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgPj0gdGhpcy5Sb3dzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIHdoZW4gd2UgZGVjcmVhc2Ugc2l6ZSBvZiByb3dzIGFycmF5IGFkanVzdCBsYXN0Um93U2VudFxyXG4gICAgICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gdGhpcy5Sb3dzLmxlbmd0aCAtIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHRoZXJlIGFyZSByb3dzIHRvIHNlbmQgYW5kIHRoZXJlIGlzIG5vdyByZXF1ZXN0IGZvciByb3dzIHlldFxyXG4gICAgICAvLyBhZGQgcmVxdWVzdCBmb3Igcm93c1xyXG4gICAgICBsZXQgdHJhbnNmZXJEYXRhVG9HdWk6IGJvb2xlYW4gPSB0aGlzLl9sYXN0Um93U2VudCA8IChzaXplIC0gMSk7XHJcblxyXG4gICAgICAvLyBGb3IgcGFnaW5hdGVkIHRhYmxlIGNoZWNrIHRoZSBtYXggcm93cyBvZiBHVUkgdGFibGUgY29udHJvbC5cclxuICAgICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkgJiYgKHRoaXMuX2xhc3RSb3dTZW50ICsgMSkgPj0gdGhpcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSgpKVxyXG4gICAgICAgIHRyYW5zZmVyRGF0YVRvR3VpID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodHJhbnNmZXJEYXRhVG9HdWkgJiYgIXRoaXMuX3RyYW5zZmVyaW5nRGF0YSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RWX1RPX0dVSSwgUHJpb3JpdHkuTE9XRVNUKTtcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcmluZ0RhdGEgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2hvdWxkRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyICYmICF0cmFuc2ZlckRhdGFUb0d1aSAmJiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSB8fCAhdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSkpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkodGhpcy5fdGFibGVNZ0NvbnRyb2wsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByb3cgZGF0YSBmb3IgdGhlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzaXJlZFRvcEluZGV4XCI+ZGVzaXJlZCB0b3AgaW5kZXggaWYgZGVzaXJlZFRvcEluZGV4IGlzIEludGVnZXIuTUlOX1ZBTFVFLCB0b3AgaW5kZXggaXMgY2VjaWV2ZWQgZm9ybSBkdjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3JkcywgZXZlbiBpZiB0aGV5IGFyZSBjcmVhdGVkIGFuZCB2YWxpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdEZvY3VzZWRWYWxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4gKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZVJvd0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgIGxldCBkaWZmOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdldFByZXZDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGdldE5leHRDaHVuazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZGVzaXJlZFRvcEluZGV4ICE9PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBpZiAoZGVzaXJlZFRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgcmVxdWVzdCBmb3IgbGluZSBvciBwYWdlIGJlZm9yZSBjdXJyZW50IGNodW5rXHJcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZSB0b3AgaW5kZXggaXMgYWx3YXlzIDBcclxuICAgICAgICBnZXRQcmV2Q2h1bmsgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGVzaXJlZFRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSArIDEgPj0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSlcclxuICAgICAgLy8gcGFnZWRvd24gb3IgYXJyb3dkb3duIGF0IGVuZCBvZiB0aGUgZGF0YXZpZXdcclxuICAgICAgICBnZXROZXh0Q2h1bmsgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBkZXNpcmVkVG9wSW5kZXggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcblxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuXHJcbiAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oZGlmZik7XHJcbiAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5yZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwsIHNhdmVSb3dJZHgsIGRpZmZSZWYpO1xyXG4gICAgZGlmZiA9IGRpZmZSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKChnZXRQcmV2Q2h1bmsgJiYgZGlmZiAhPT0gMCkgfHwgZ2V0TmV4dENodW5rKSB7XHJcbiAgICAgIC8vIGlmIGRpZmYgIT0gMCBhIG5ldyBjaHVuayB3YXMgYnJvdWdodCB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGR2XHJcbiAgICAgIC8vIHNldCB0b3AgaW5kZXggdG8gZmlyc3QgcmVxdWVzdGVkIGluZGV4XHJcbiAgICAgIC8vIGlmIG5leHQgY2h1bmsgd2FzIGJyb3VnaHQsIHRvcCBpbmRleCBtYXkgYWxzbyBiZSB1cGRhdGVkXHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoZGVzaXJlZFRvcEluZGV4ICsgZGlmZik7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVUb3BJbmRleCgpO1xyXG4gICAgICBpZiAodGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gaWYgdG9wIGluZGV4IHdhcyB1cGRhdGVkIGluIHRoZSBzZXRUYWJsZVRvcEluZGV4IC0gd2UgbWlnaHQgaGF2ZSByb3dzIHRoYXQgd2VyZSBub3QgcmVmcmVzaGVkXHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh1cGRhdGVkKSB7XHJcbiAgICAgIC8vIGFueSByb3cgd2FzIHVwZGF0ZWRcclxuICAgICAgLy8gcmVzdG9yZSBjdXJyZW50IHJlY29yZFxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVCYWNrdXAoc2F2ZVJvd0lkeCArIGRpZmYsIGJrcFJlY29yZCk7XHJcbiAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIGFzayB0YWJsZSB0byByZWZyZXNoIHRoZSBwYWdlXHJcblxyXG4gICAgc3VwZXIuU2VsZWN0Um93KCk7XHJcbiAgICBpZiAoZ2V0UHJldkNodW5rKSB7XHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBmb2N1c2VkXHJcbiAgICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwgJiYgbGFzdEZvY3VzZWRDb250cm9sLmdldFBhcmVudFRhYmxlKCkgPT09IHRoaXMuX3RhYmxlTWdDb250cm9sKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgcm93cyBpbiB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzYXZlUm93SWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpZmZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoUm93cyhkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgc2F2ZVJvd0lkeDogbnVtYmVyLCBkaWZmUmVmOiBSZWZQYXJhbTxudW1iZXI+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZGlmZlJlZi52YWx1ZSA9IDA7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiA9IHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCk7XHJcbiAgICBsZXQgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Jvd3NJblBhZ2U7IGkrKykge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBkZXNpcmVkVG9wSW5kZXggKyBpO1xyXG4gICAgICBsZXQgcHJldlRvcElkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGlmIHdlIGZhaWwgdG8gZ2V0IG9uZSByZWNvcmQsIHdlIG1heSBzdWNjZWVkIHRvIGdldCB0aGUgbmV4dCBvbmVcclxuICAgICAgICBpbmRleCA9IGlkeCArIGRpZmZSZWYudmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm93VmFsaWRhdGVkKGlkeCkgfHwgc2VuZEFsbCB8fCB0aGlzLlJlZnJlc2hBbGxSb3dzKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMClcclxuICAgICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3coaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGlmIChzYXZlUm93SWR4ICsgZGlmZlJlZi52YWx1ZSAhPT0gaW5kZXgpIHsgLy8gbm90IGN1cnJlbnQgbGluZVxyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoaW5kZXgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGlmIGEgbmV3IGNodW5rIGlzIGJyb3VnaHQgdG9wIGluZGV4IHdpbGwgYmUgY2hhbmdlZFxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpbmRleCkpXHJcbiAgICAgICAgICAgIHN1cGVyLm1hcmtSb3dOT1RDcmVhdGVkKGluZGV4KTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gUUNSICMyNjEwNTUsIGV2ZW4gc28gcmVxdWlyZWQgcmVjb3JkIG1heSBub3QgYmUgZm91bmQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBuZXcgY2h1bmsgaGFzIGJlZW4gc2VudFxyXG4gICAgICAgIC8vIGFuZCBkaWZmIG11c3QgYmUgdXBkYXRlZFxyXG4gICAgICAgIGRpZmZSZWYudmFsdWUgPSBkaWZmUmVmLnZhbHVlICsgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAtIHByZXZUb3BJZHgpO1xyXG4gICAgICAgIHByZXZUb3BJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgaWYgKCF1cGRhdGVkICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5EYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdCwgb3JnSW5jbHVkZXNMYXN0KSlcclxuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHJvdyBpbiB0aGUgcGFnZTwvcmV0dXJucz5cclxuICBnZXRWaXNpYmxlTGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgIGN1cnJSZWNJZHggPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIHJldHVybiBjdXJyUmVjSWR4IC0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpLCAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhc3NlcnRzIHRoYXQgY3VycmVudCByZWNvcmQgaXMgaW4gdGhlIHZpZXcsIGlmIGl0IGlzIG5vdCBvbiB0aGUgcGFnZSwgYWRqdXN0cyB0b3AgaW5kZXgsIHNvIHRoYXQgY3VycmVudFxyXG4gIC8vLyAgIHJlY29yZCB3aWxsIGJlIG9uIHRoZSB2aXNpYmxlIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJyaW5nUmVjb3JkVG9QYWdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGxldCB0b3BJbmRleDogbnVtYmVyID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgY3VycklkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgbGV0IG5ld1RvcEluZGV4OiBudW1iZXIgPSB0b3BJbmRleDtcclxuXHJcbiAgICAgIC8vIFRhYmxlIHRvcCBpbmRleCBmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZVxyXG4gICAgICBpZiAoIXRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICBpZiAodG9wSW5kZXggPiBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3BJbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxIDwgY3VycklkeCkge1xyXG4gICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLl9yb3dzSW5QYWdlID4gMClcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4IC0gdGhpcy5fcm93c0luUGFnZSArIDE7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld1RvcEluZGV4ID0gY3VycklkeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSB0b3AgaW5kZXggZm9yIHBhZ2luYXRlZCB0YWJsZS5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIGZpcnN0IHJlY29yZCBvbiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHJlY29yZCB0byBiZSBzZWxlY3RlZC5cclxuICAgICAgICBsZXQgY3Vyckd1aUlkeCA9IHRoaXMuZ2V0R3VpUm93aWR4KGN1cnJJZHgpO1xyXG4gICAgICAgIGxldCBuZXdUb3BHdWlJbmRleCA9IChjdXJyR3VpSWR4KSAtICgoY3Vyckd1aUlkeCkgJSB0aGlzLl9yb3dzSW5QYWdlKTsgLy9ndWkgaWR4IG9mIGZpcnN0IHJlY29yZCBvZiByZXNwZWN0aXZlIHBhZ2VcclxuXHJcbiAgICAgICAgbmV3VG9wSW5kZXggPSB0aGlzLmdldER2Um93SWR4KG5ld1RvcEd1aUluZGV4KTtcclxuXHJcbiAgICAgICAgaWYobmV3VG9wSW5kZXggIT09IHRoaXMuX3ByZXZHdWlUb3BJbmRleCB8fCB0aGlzLklzTW92aW5nSW5WaWV3IClcclxuICAgICAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBiZSBjdXJyZW50IGxpbmVcclxuICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSAhPT0gbmV3VG9wSW5kZXggfHwgdGhpcy5fdG9wSW5kZXhVcGRhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChuZXdUb3BJbmRleCk7XHJcbiAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKEludDMyLk1pblZhbHVlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fdG9wSW5kZXhVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnZhbGlkYXRlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbnZhbGlkYXRlVGFibGUoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3c6IFJvdyA9IDxSb3c+dGhpcy5Sb3dzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAocm93ICE9PSBudWxsKVxyXG4gICAgICAgIHJvdy5WYWxpZGF0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBwcmV2aW91cyB2aXNpYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRQcmV2TGluZShsaW5lOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGxpbmUgLSAxO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBzb3J0IG1hcmsoZGVsdGEpIGZyb20gdGhlIGNvbHVtbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2xlYXJTb3J0TWFya1wiPjwvcGFyYW0+XHJcbiAgY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKGNsZWFyU29ydE1hcms6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjbGVhclNvcnRNYXJrKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0b3AgdGhlIHJvdyBmcm9tIGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBhc3luYyBzdG9wUm93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICBpZiAodGhpcy5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGlkeCkpIHtcclxuICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX05PVF9JU19ST1dfRURJVElORywgdGhpcywgIHRoaXMuaXNMaW5lTW9kZSgpICA/IGlkeCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHN0YXJ0IHRoZSByb3cgZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHN0YXJ0Um93RWRpdGluZyhpZHg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBpZiAoIXRoaXMuZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShpZHgpKSB7XHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9JU19ST1dfRURJVElORywgdGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBpZHggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkTm9QYXJhbWV0ZXJzKENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSywgdGhpcy5nZXRGb3JtKCkpO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCByZXR1cm4gaWYgdGhlIHJvdyBpcyBpbiBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgcHVibGljIGdldElzUm93RWRpdGluZ0Zyb21HdWkoZGlzcGxheUluZGV4Om51bWJlciApOiBib29sZWFuIHtcclxuICAgIGxldCBpc1Jvd0VkaXRpbmc6IGJvb2xlYW4gPSBDb21tYW5kcy5nZXRJc1Jvd0VkaXRpbmcodGhpcywgdGhpcy5pc0xpbmVNb2RlKCkgPyBkaXNwbGF5SW5kZXggOiAwLCB0aGlzLmlzTGluZU1vZGUoKSk7XHJcbiAgICByZXR1cm4gaXNSb3dFZGl0aW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0aGUgZGlzcGxheSwgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShyZWZyZXNoVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFza0Jhc2UgPSA8VGFza0Jhc2U+dGhpcy5fdGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5pc0ZldGNoaW5nUmVjb3Jkc0FoZWFkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gVGFrZSBhbm90aGVyIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBvZiBRQ1JzICM5ODQ5OTksICM5MzM2MzkgJiAjNjk5ODIxOlxyXG4gICAgLy8gTm93LCB0aGUgZGlzcGxheSB3b3VsZCBiZSByZWZyZXNoZWQgb25seSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgTk9UIGFuIG9sZFxyXG4gICAgLy8gcmVjb3JkIHdoaWNoIGlzIGJlaW5nIGNvbXB1dGVkLiBUaGUgcmVzdWx0IG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgZHVyaW5nIHRoZVxyXG4gICAgLy8gY29tcHV0ZSBwcm9jZXNzIG9mIGEgcmVjb3JkIHRoZSBkaXNwbGF5IGlzIG5vdCByZWZyZXNoZWQgKHdoaWNoIGlzIGdvb2QgZm9yIHVzKS5cclxuICAgIC8vIFRoZSBkaXNwbGF5IHdvdWxkIGJlIHJlZnJlc2hlZCBhbnl3YXkgQUZURVIgdGhlIGNvbXB1dGUgcHJvY2VzcyBpcyBkb25lLlxyXG4gICAgLy8gKEVodWQgMjEtTUFZLTIwMDIpXHJcbiAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiBjdXJyUmVjLkluQ29tcHV0ZSAmJiAhY3VyclJlYy5pc05ld1JlYygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2luUmVmcmVzaERpc3ApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNIHx8IHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybSBhbmQgcmVmcmVzaCBpdFxyXG4gICAgICAgIGlmIChzdXBlci5IYXNUYWJsZSgpICYmIHRoaXMuT3BlbmVkKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0gfHwgcmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpIHtcclxuICAgICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgc3VwZXIuaGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoUHJldkNodW5rRm9yQ3VycmVudFBhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaFByb3BzKCk7XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgY3VycmVudCByZWNvcmQvUm93XHJcbiAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IHsxfSBpbiB0YXNrIHsyfVwiLCBleC5HZXRUeXBlKCksIGV4Lk1lc3NhZ2UsICg8VGFza0Jhc2U+c3VwZXIuZ2V0VGFzaygpKS5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luUmVmcmVzaERpc3AgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaWduYWwgd2UgY29tcGxldGVkIHRoZSBmaXJzdCBjeWNsZSBvZiByZWZyZXNoaW5nIHRoZSBmb3JtXHJcbiAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMgJiYgKCFzdXBlci5pc0xpbmVNb2RlKCkgfHwgdGhpcy5fdGFibGVSZWZyZXNoZWQpKVxyXG4gICAgICB0aGlzLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hVSSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRUYXNrKCkuaXNNYWluUHJvZygpIC8qJiYgSW5pdGlhbGl6YXRpb25GaW5pc2hlZCovKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGZvcm1zIHdpdGggdGFibGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiU3RhcnQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuICAgIC8vIHRvZG8gZm9yIG5vdyAtIGFsd2F5cyBzaG93IGFsbCByZWNvcmRzXHJcbiAgICAvLyBzYXZlIHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBsZXQgb2xkQ3VyclJvdzogbnVtYmVyID0gdGhpcy5EaXNwbGF5TGluZTtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSB3ZSByZWZyZXNoIHRoZSB0YWJsZSAtIHNldCBjdXJyLXJvdyBhbmQgdG9wLXJlYy1pZHggdG8gYmUgdGhlXHJcbiAgICAvLyBvbmVzIHJlcXVlc3RlZCBieSB0aGUgZGF0YXZpZXcuXHJcbiAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHJlZnJlc2hlcyAtIHdlIGNoYW5nZSBjdXJyLXJvdyBhbmQgdG9wLXJlYyBvbmx5IGlmIHRoZSB0YWJsZVxyXG4gICAgLy8gYmVjb21lcyBlbXB0eS5cclxuICAgIGlmICghdGhpcy5fdGFibGVSZWZyZXNoZWQgJiYgY3VyclJlY0lkeCA+PSAwKSB7XHJcbiAgICAgIG9sZEN1cnJSb3cgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuXHJcbiAgICAgIGlmIChvbGRDdXJyUm93ICsgMSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChvbGRDdXJyUm93IC0gTWF0aC5mbG9vcih0aGlzLl9yb3dzSW5QYWdlIC8gMikgKyAxKTtcclxuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChvbGRDdXJyUm93ID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBvbGRDdXJyUm93ID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiBUb3BSZWNJZHggPCAwIGl0IG1lYW5zIHdlIHNob2xkIG5vdCBjb250aW51ZSB0aGUgcmVmcmVzaCBzaW5jZSB3ZSBhcmUgaW4gdGVtcG9yYXJ5IHNpdHVhdGlvbi5cclxuICAgIC8vIEFub3RoZXIgcmVmcmVzaCB3aWxsIGJlIGRvbmUgc29vbiB3aXRoIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgLy8gVGhpcyBpcyBjYW4gaGFwcGVuIHdoZW4gOlxyXG4gICAgLy8gSW4gZmV0Y2hDaHVua0Zyb21TZXJ2ZXIgd2UgZ28gdG8gdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBleHBlY3RzIG5ldyByZWNvcmRzLlxyXG4gICAgLy8gV2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZmV0Y2hpbmdDaHVuaywgd2UgbWlnaHQgZ28gYWdhaW4gdG8gdGhlIHNlcnZlciwgYmVmb3JlIHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGNodW5rLlxyXG4gICAgLy8gR29pbmcgdG8gdGhlIHNlcnZlciBpbiB0aGUgZ2V0IGNodW5rIHByb2Nlc3MgLCBjYW4gYmUgZm9yIGV4YW1wbGU6IHJlY29yZCBzdWZmaXgsIG9yIGFueSBzZXJ2ZXIgc2lkZSBvcCBpbiByZWMgc3VmZiBvciBWQy5cclxuICAgIC8vIFVzdWFsbHksIGR1cmluZyB0aGlzIHBhcnQsIHdlIGRvIG5vdCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIC8vIEJ1dCwgZm9yIGV4YW1wbGUgaW4gUUNSICM2OTgyMTcsIGEgY2FsbCB3YXMgbWFkZSB0byByZWZyZXNoVGFibGUgd2l0aCBUb3BSZWNJZHggPT0gLTEuXHJcbiAgICAvLyBUaGUgcmVhc29uIHdhcywgdGhhdCBpbiB0aGUgVkMgdGhlcmUgd2FzIGEgc2VydmVyIG9wIHRoYXQgdXBkYXRlZCBhIHZhciBpbiB0aGUgdGFzay4gQXMgYSByZXN1bHQsIHRoZSAnbW9kaScgZmxhZ1xyXG4gICAgLy8gZnJvbSB0aGUgc2VydmVyIHdhcyBvbiwgd2hpY2ggY2F1c2VkIHRoZSBcInRlbXBcIiByZWZyZXNoVGFibGUgYmVmb3JlIHRoZSByZWFsIGNodW5rIGFycml2ZWQuXHJcbiAgICAvLyBUaGlzIGluIHR1cm4gY2F1c2VkIGEgY2hhbmdlIGluIHRoZSBjdXJyIHJlYyBpZCwgd2hpY2ggd2FzIHdyb25nLlxyXG4gICAgLy8gQWZ0ZXIgdGhlIGNodW5rIGFycml2ZXMsIHRoZSByZWZyZXNoIHNldHMgdGhlIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBvbGRDdXJyUm93ID0gb2xkQ3VyclJvdyAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTsgLy8gc2F2ZSBvbGRDdXJyUm93IHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBpbmRleFxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgIHRoaXMuX3RhYmxlUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb3JpVHJhbnNmZXJEYXRhVG9HdWkgPSB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcblxyXG4gICAgaWYgKCFvcmlUcmFuc2ZlckRhdGFUb0d1aSlcclxuICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjOTk4MDY3LCB3ZSBtdXN0IG5vdCByZWZyZXNoIHN1YmZvcm1zIGZvciBhbnkgcm93cyB0aGF0IGFyZSBub3Qgb3VyIHJlYWwgY3VycmVudCByb3dcclxuXHJcbiAgICAvLyByZWZyZXNoIGFsbCB0aGUgcm93cyBCVVQgbm90IHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyByZWNvcmQgZm9yIGEgcm93IGp1c3QgZGlzYWJsZSBpdCBhbmQgdmljZSB2ZXJzYVxyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgaWYgKHRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgdG9wSW5kZXggPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IHRvcEluZGV4ICsgaTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpZHgpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBvbGQgY3VycmVudCByb3cuIHRoZSByZWZyZXNoIGZvciB0aGlzIHJvdyBpcyBkb25lIGJ5IHRoZSBjYWxsZXJcclxuICAgICAgICAvLyBhbmQgcmVmcmVzaCBvbmx5IHZhbGlkIGxpbmVzIHRoYXQgd2VyZSBub3QgZGlzYWJsZWRcclxuICAgICAgICBpZiAoaSAhPT0gb2xkQ3VyclJvdykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpZHgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4Lm5hbWUgPT0gXCJSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uXCIpIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKG9sZEN1cnJSb3cgKyB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIGJrcFJlY29yZCk7XHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlR3VpVG9Mb2coXCJFbmQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGRpc3BsYXkgbGluZSBieSByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdXBkYXRlRGlzcGxheUxpbmVCeURWKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNwbGF5TGluZSA9IHRoaXMucmVjb3JkSWR4MkRpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj5pcyB0aGUgbmV3IGN1cnJlbnQgZGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZTogbnVtYmVyLCBkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmUpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlSZWNJZHgocmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZGlzcGxheUxpbmUpO1xyXG4gICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRGlzcGxheUxpbmUgPSBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd051bVwiPmlzIHRoZSBuZXcgY3VycmVudCByb3cgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNldEN1cnJSb3dCeVJlY0lkeChyb3dOdW06IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkgPT09IG51bGwgfHwgKCFzdXBlci5oYXNUYWJsZSgpICYmIHJvd051bSAhPT0gMCkpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEZvcm0uc2V0Q3VyclJvdygpIG5vIHRhYmxlIFwiKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtO1xyXG4gICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHJvd051bSwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIHRydWUsIGRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGxhc3QgdmFsaWQgcm93IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFZhbGlkUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fcm93c0luUGFnZSAtIDEsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgcmVjb3JkIGxpbmUgdG8gZGlzcGxheSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICByZWNvcmRJZHgyRGlzcGxheUxpbmUocmVjSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgZGlzcGxheSBsaW5lIHRvIHJlY29yZCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGRpc3BsYXlMaW5lMlJlY29yZElkeChkaXNwbGF5TGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgY3VycmVudCByb3cgdXNpbmcgdGhlIHBhcmFtZXRlciBhbmQgaWdub3JpbmcgYW55IGV4Y2VwdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPnRoZSBvbGQgY3VycmVudCByb3cgbnVtYmVyIHRvIGJlIHJlc3RvcmVkPC9wYXJhbT5cclxuICBhc3luYyByZXN0b3JlT2xkRGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByZWNvcmQgZnJvbSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLmRpc3BsYXlMaW5lMlJlY29yZElkeCh0b3BEaXNwbGF5TGluZSkpO1xyXG5cclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCByZWNvcmQgcG9zaXRpb24gaW4gdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNQb3NJbkZvcm0oKTogbnVtYmVyIHtcclxuICAgIC8vIHdoZW4gdGhlIHNlbGVjdGVkIHJlY29yZCBpcyBvdXRzaWRlIHRoZSB2aWV3LCB0b3BJbmRleCBhbmQgRGlzcGxheUxpbmUgd2lsbCBiZSAwXHJcbiAgICAvLyByZXN1bHRpbmcgaW4gY3VyclJlY1Bvc0luRm9ybSA9PSAxXHJcbiAgICBsZXQgdG9wRGlzcGxheUxpbmU6IG51bWJlciA9IHN1cGVyLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuRGlzcGxheUxpbmUgLSB0b3BEaXNwbGF5TGluZSArIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkRGlzcGxheUxpbmVcIj5vbGQgY3VycmVudCByZWNvcmQgaWR4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJrcFJlY29yZFwiPnNhdmVkIHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZUJhY2t1cChvbGREaXNwbGF5TGluZTogbnVtYmVyLCBia3BSZWNvcmQ6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUUNSICM5NDI4NzgsIGlmIHJlY29yZCBpcyBpbiBwcm9jZXNzIG9mIGluc2VydCwgZGVsZXRlIG9yIG1vZGlmeSB3ZSBtdXN0IHBlcmZvcm0gcmVzdG9yZU9sZEN1cnJSb3dcclxuICAgIC8vIHRoYXQgd2lsbCBwZXJmb3JtIGFsbCBuZWNlc3NhcnkgYWN0aW9ucyBmb3IgdGhlIHJlY29yZCwgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IHJlc3RvcmUgaXQgZnJvbSBiYWNrdXBcclxuICAgIGlmIChia3BSZWNvcmQuZ2V0SWQoKSA+PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRSZWNJZHgoYmtwUmVjb3JkLmdldElkKCkpID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPj0gMCAmJiBvbGREaXNwbGF5TGluZSA8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA+PSAwICYmIGJrcFJlY29yZC5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lKSB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5yZXN0b3JlQ3VycmVudChia3BSZWNvcmQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZT86IE1nQ29udHJvbFR5cGUsIHRhc2tPclBhcmVudE1nRm9ybT86IGFueSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeD86IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzAoKTtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICh0eXBlID09PSBudWxsIHx8IHR5cGUuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHRhc2tPclBhcmVudE1nRm9ybSA9PT0gbnVsbCB8fCB0YXNrT3JQYXJlbnRNZ0Zvcm0gaW5zdGFuY2VvZiBUYXNrQmFzZSkgJiYgKHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHggPT09IG51bGwgfHwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5Db25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzAoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCB0YXNrOiBUYXNrQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCB0YXNrLCBwYXJlbnRDb250cm9sKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzIodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiBuZXcgTWdDb250cm9sKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFscmVhZHkgbW92ZWQgdG8gdGhlIGZpcnN0IGNvbnRyb2wgb24gb25lIG9mIHRoZSBNZ0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0TUdEYXRhKCkuQWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRhYmxlIGZpcnN0IHRpbWUgd2UgZW50ZXIgdGhlIG93bmVyVGFza1xyXG4gIC8vLyAgIGdldCByb3dzIG51bWJlciBmb3JtIGd1aSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3JlYXRlRm9ybSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgbGV0IGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCA9IHtndWlNZ0NvbnRyb2w6IHRoaXMuZ2V0VGFibGVDdHJsKCksIExpbmU6IHJlY1Bvc09uUGFnZSwgVmFsOiBcIlwifTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFJvd0RhdGEoLXJlY1Bvc09uUGFnZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRHdWlSb3dpZHgoZHZSb3dJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZHZSb3dJZHggKyB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0RHZSb3dJZHgoZ3VpUm93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGd1aVJvd0lkeCAtIHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|