@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
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import { ApplicationException, Debug, List, NNumber, NString, RefParam, isNullOrUndefined } from "@magic-xpa/mscorelib";
|
|
2
|
+
import { Constants, InternalInterface, Logger, MsgInterface, PICInterface, StorageAttribute, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from "@magic-xpa/utils";
|
|
3
|
+
import { BlobType, DisplayConvertor, ExpVal, FieldDef, NUM_TYPE, PIC, VectorType } from "@magic-xpa/gui";
|
|
4
|
+
import { YesNoExp } from "../exp/YesNoExp";
|
|
5
|
+
import { ExpressionEvaluator } from "../exp/ExpressionEvaluator";
|
|
6
|
+
import { Recompute, Recompute_RcmpBy } from "../rt/Recompute";
|
|
7
|
+
import { Boundary } from "../rt/Boundary";
|
|
8
|
+
import { ArgumentsList } from "../rt/ArgumentsList";
|
|
9
|
+
import { ConstInterface } from "../ConstInterface";
|
|
10
|
+
import { RunTimeEvent } from "../event/RunTimeEvent";
|
|
11
|
+
import { Record } from "./Record";
|
|
12
|
+
import { Environment } from "../env/Environment";
|
|
13
|
+
import { FieldBase } from "./FieldBase";
|
|
14
|
+
import { LastFocusedManager } from "../rt/LastFocusedManager";
|
|
15
|
+
import { LanguageData } from "../env/LanguageData";
|
|
16
|
+
import { AccessHelper } from "../AccessHelper";
|
|
17
|
+
export class Field extends FieldBase {
|
|
18
|
+
constructor(dataview, id) {
|
|
19
|
+
super(id);
|
|
20
|
+
this._linkExp = null;
|
|
21
|
+
this._recompute = null;
|
|
22
|
+
this.CacheTableFldIdx = 0;
|
|
23
|
+
this._causeTableInvalidation = false;
|
|
24
|
+
this._form = null;
|
|
25
|
+
this._hasChangeEvent = false;
|
|
26
|
+
this._hasZoomHandler = false;
|
|
27
|
+
this._inEvalProcess = false;
|
|
28
|
+
this._initExp = null;
|
|
29
|
+
this._invalidValue = true;
|
|
30
|
+
this._isLinkFld = false;
|
|
31
|
+
this._isVirtual = false;
|
|
32
|
+
this._dataviewHeaderId = -1;
|
|
33
|
+
this._linkCreate = false;
|
|
34
|
+
this.Locate = null;
|
|
35
|
+
this.Range = null;
|
|
36
|
+
this._isParam = false;
|
|
37
|
+
this._isExposedRouteParam = false;
|
|
38
|
+
this._isExposedToClient = true;
|
|
39
|
+
this._prevIsNull = false;
|
|
40
|
+
this._prevValue = null;
|
|
41
|
+
this._tableName = null;
|
|
42
|
+
this._indexInTable = -1;
|
|
43
|
+
this._virAsReal = false;
|
|
44
|
+
this._val = null;
|
|
45
|
+
this.modifiedAtLeastOnce = false;
|
|
46
|
+
this._isNull = false;
|
|
47
|
+
this._clearVectorType = true;
|
|
48
|
+
this._vectorType = null;
|
|
49
|
+
if (Field.NUM0 === null) {
|
|
50
|
+
Field.NUM0 = new NUM_TYPE();
|
|
51
|
+
Field.NUM1 = new NUM_TYPE();
|
|
52
|
+
Field.NUM0.NUM_4_LONG(0);
|
|
53
|
+
Field.NUM1.NUM_4_LONG(1);
|
|
54
|
+
}
|
|
55
|
+
this._dataview = dataview;
|
|
56
|
+
this._linkExp = new YesNoExp(false);
|
|
57
|
+
FieldDef._default_date = DisplayConvertor.Instance.disp2mg(PICInterface.DEFAULT_DATE, new PIC("6", StorageAttribute.NUMERIC, super.getTask().getCompIdx()), super.getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
|
|
58
|
+
}
|
|
59
|
+
get VirAsReal() {
|
|
60
|
+
return this._virAsReal;
|
|
61
|
+
}
|
|
62
|
+
get IsVirtual() {
|
|
63
|
+
return this._isVirtual;
|
|
64
|
+
}
|
|
65
|
+
get IsExposedRouteParam() {
|
|
66
|
+
return this._isExposedRouteParam;
|
|
67
|
+
}
|
|
68
|
+
get IsExposedToClient() {
|
|
69
|
+
return this._isExposedToClient;
|
|
70
|
+
}
|
|
71
|
+
get IndexInTable() {
|
|
72
|
+
return this._indexInTable;
|
|
73
|
+
}
|
|
74
|
+
setAttribute(attribute, valueStr) {
|
|
75
|
+
let isTagProcessed = super.setAttribute(attribute, valueStr);
|
|
76
|
+
if (!isTagProcessed) {
|
|
77
|
+
let data = StrUtil.tokenize(valueStr, ",");
|
|
78
|
+
isTagProcessed = true;
|
|
79
|
+
switch (attribute) {
|
|
80
|
+
case ConstInterface.MG_ATTR_VIRTUAL:
|
|
81
|
+
this._isVirtual = (XmlParser.getInt(valueStr) !== 0);
|
|
82
|
+
break;
|
|
83
|
+
case ConstInterface.MG_ATTR_PARAM:
|
|
84
|
+
this._isParam = (XmlParser.getInt(valueStr) !== 0);
|
|
85
|
+
if (!this._isVirtual && this._isParam)
|
|
86
|
+
throw new ApplicationException("in Field.initElements(): non virtual field is defined as a parameter");
|
|
87
|
+
break;
|
|
88
|
+
case ConstInterface.MG_ATTR_EXPOSED_ROUTE_PARAMS:
|
|
89
|
+
this._isExposedRouteParam = (XmlParser.getInt(valueStr) !== 0);
|
|
90
|
+
if (!this._isParam && this._isExposedRouteParam)
|
|
91
|
+
throw new ApplicationException("in Field.initElements(): non parameter field is defined as a exposed route parameter");
|
|
92
|
+
break;
|
|
93
|
+
case ConstInterface.MG_ATTR_EXPOSED_TO_CLIENT:
|
|
94
|
+
if (XmlParser.getInt(valueStr) == 0)
|
|
95
|
+
this._isExposedToClient = false;
|
|
96
|
+
break;
|
|
97
|
+
case ConstInterface.MG_ATTR_VIR_AS_REAL:
|
|
98
|
+
this._virAsReal = XmlParser.getBoolean(valueStr);
|
|
99
|
+
break;
|
|
100
|
+
case ConstInterface.MG_ATTR_LNK_CREATE:
|
|
101
|
+
this._linkCreate = XmlParser.getBoolean(valueStr);
|
|
102
|
+
break;
|
|
103
|
+
case ConstInterface.MG_ATTR_LNKEXP:
|
|
104
|
+
this._linkExp.setVal((this.getTask()), valueStr);
|
|
105
|
+
break;
|
|
106
|
+
case ConstInterface.MG_ATTR_TABLE_NAME:
|
|
107
|
+
this._tableName = XmlParser.unescape(valueStr);
|
|
108
|
+
break;
|
|
109
|
+
case ConstInterface.MG_ATTR_INDEX_IN_TABLE:
|
|
110
|
+
this._indexInTable = XmlParser.getInt(valueStr);
|
|
111
|
+
break;
|
|
112
|
+
case ConstInterface.MG_ATTR_INIT:
|
|
113
|
+
let expNum = XmlParser.getInt(valueStr);
|
|
114
|
+
this._initExp = this.getTask().getExpById(expNum);
|
|
115
|
+
break;
|
|
116
|
+
case XMLConstants.MG_ATTR_NAME:
|
|
117
|
+
{
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
case ConstInterface.MG_ATTR_CHACHED_FLD_ID:
|
|
121
|
+
this.CacheTableFldIdx = NNumber.Parse(data[1]);
|
|
122
|
+
break;
|
|
123
|
+
case ConstInterface.MG_ATTR_LOCATE:
|
|
124
|
+
this.Locate = new Boundary(this.getTask(), NNumber.Parse(data[1]), NNumber.Parse(data[0]), this.getType(), this.getSize(), this.CacheTableFldIdx);
|
|
125
|
+
break;
|
|
126
|
+
case ConstInterface.MG_ATTR_RANGE:
|
|
127
|
+
this.Range = new Boundary(this.getTask(), NNumber.Parse(data[1]), NNumber.Parse(data[0]), this.getType(), this.getSize(), this.CacheTableFldIdx);
|
|
128
|
+
break;
|
|
129
|
+
case ConstInterface.MG_ATTR_LINK:
|
|
130
|
+
this._dataviewHeaderId = NNumber.Parse(valueStr);
|
|
131
|
+
break;
|
|
132
|
+
case ConstInterface.MG_ATTR_IS_LINK_FIELD:
|
|
133
|
+
this._isLinkFld = XmlParser.getBoolean(valueStr);
|
|
134
|
+
break;
|
|
135
|
+
default:
|
|
136
|
+
isTagProcessed = false;
|
|
137
|
+
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return isTagProcessed;
|
|
142
|
+
}
|
|
143
|
+
setRecompute(recompRef) {
|
|
144
|
+
this._recompute = recompRef;
|
|
145
|
+
}
|
|
146
|
+
RemoveSubformFromRecompute(subformTask) {
|
|
147
|
+
if (this._recompute !== null) {
|
|
148
|
+
this._recompute.RemoveSubform(subformTask);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
AddSubformRecompute(subformTask) {
|
|
152
|
+
if (this._recompute === null) {
|
|
153
|
+
this._recompute = new Recompute();
|
|
154
|
+
this._recompute.Task = super.getTask();
|
|
155
|
+
this._recompute.OwnerFld = this;
|
|
156
|
+
this._recompute.RcmpMode = Recompute_RcmpBy.CLIENT;
|
|
157
|
+
}
|
|
158
|
+
this._recompute.AddSubform(subformTask);
|
|
159
|
+
}
|
|
160
|
+
SetControl(ctrl) {
|
|
161
|
+
super.SetControl(ctrl);
|
|
162
|
+
if (this._isVirtual && ctrl.IsRepeatable && this._initExp === null) {
|
|
163
|
+
this._causeTableInvalidation = true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async compute(recompute) {
|
|
167
|
+
let result = new RefParam(this.getValue(false));
|
|
168
|
+
let isNullFld = new RefParam(this._isNull);
|
|
169
|
+
let rec = this._dataview.getCurrRec();
|
|
170
|
+
let task = super.getTask();
|
|
171
|
+
let zeroReal = this._linkCreate && rec.InCompute && !recompute && task.getMode() === Constants.TASK_MODE_CREATE;
|
|
172
|
+
if (this._form == null)
|
|
173
|
+
this._form = task.getForm();
|
|
174
|
+
if ((this._form != null && this._form.InRestore) || AccessHelper.eventsManager.GetStopExecutionFlag())
|
|
175
|
+
zeroReal = false;
|
|
176
|
+
let rtEvt = AccessHelper.eventsManager.getLastRtEvent();
|
|
177
|
+
let computeOnCancelEvent = false;
|
|
178
|
+
if (rtEvt != null)
|
|
179
|
+
computeOnCancelEvent = rtEvt.getInternalCode() === InternalInterface.MG_ACT_CANCEL;
|
|
180
|
+
if (!this._virAsReal && (this._form == null || !this._form.InRestore) &&
|
|
181
|
+
((this._isVirtual || (task.getMode() === Constants.TASK_MODE_CREATE && computeOnCancelEvent)) || recompute ||
|
|
182
|
+
zeroReal || rec.isNewRec() && !rec.isComputed())) {
|
|
183
|
+
if (!task.DataView.isEmptyDataview() || (task.DataView.isEmptyDataview() && !this.PartOfDataview)) {
|
|
184
|
+
if ((this._isVirtual || task.getMode() === Constants.TASK_MODE_CREATE) || this._dataview.computeByClient() ||
|
|
185
|
+
!rec.InCompute || zeroReal || rec.lateCompute()) {
|
|
186
|
+
if (this._initExp != null) {
|
|
187
|
+
await this.EvaluateInitExpression(result, isNullFld);
|
|
188
|
+
}
|
|
189
|
+
else if (zeroReal)
|
|
190
|
+
result.value = this.getDefaultValue();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (this._invalidValue) {
|
|
195
|
+
this._prevValue = result.value;
|
|
196
|
+
this._prevIsNull = isNullFld.value;
|
|
197
|
+
}
|
|
198
|
+
await this.setValue(result.value, isNullFld.value, recompute, false, recompute && !this._isVirtual, false, false);
|
|
199
|
+
}
|
|
200
|
+
async EvaluateInitExpression(result, isNullFld) {
|
|
201
|
+
Debug.Assert(this._initExp !== null);
|
|
202
|
+
try {
|
|
203
|
+
this._inEvalProcess = true;
|
|
204
|
+
result.value = await this._initExp.evaluateWithResultTypeAndLength(this._type, this._size);
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
this._inEvalProcess = false;
|
|
208
|
+
}
|
|
209
|
+
isNullFld.value = (result.value === null);
|
|
210
|
+
if (isNullFld.value && this.NullAllowed) {
|
|
211
|
+
result.value = this.getValue(false);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
getValue(checkNullArithmetic) {
|
|
215
|
+
if (super.getTask().getEvalOldValues())
|
|
216
|
+
return this.getOriginalValue();
|
|
217
|
+
if (this._invalidValue)
|
|
218
|
+
this.takeValFromRec();
|
|
219
|
+
if (this._isNull)
|
|
220
|
+
this._val = this.getValueForNull(checkNullArithmetic);
|
|
221
|
+
return this._val;
|
|
222
|
+
}
|
|
223
|
+
isChanged(newValue, isNull) {
|
|
224
|
+
return this._prevValue !== null && (!(this._prevValue === newValue) || this._prevIsNull !== isNull);
|
|
225
|
+
}
|
|
226
|
+
takeValFromRec() {
|
|
227
|
+
let rec = this._dataview.getCurrRec();
|
|
228
|
+
if (rec !== null) {
|
|
229
|
+
this._val = rec.GetFieldValue(this._id);
|
|
230
|
+
this._isNull = rec.IsNull(this._id);
|
|
231
|
+
}
|
|
232
|
+
if (this._invalidValue) {
|
|
233
|
+
if (rec !== null && this._causeTableInvalidation && this.isChanged(this._val, this._isNull) && this._form !== null) {
|
|
234
|
+
rec.setCauseInvalidation(true);
|
|
235
|
+
}
|
|
236
|
+
this._prevValue = this._val;
|
|
237
|
+
this._prevIsNull = this._isNull;
|
|
238
|
+
this._invalidValue = false;
|
|
239
|
+
}
|
|
240
|
+
this._vectorType = null;
|
|
241
|
+
}
|
|
242
|
+
getOriginalValue() {
|
|
243
|
+
let originalRec = this._dataview.getOriginalRec();
|
|
244
|
+
if (originalRec.IsNull(this._id))
|
|
245
|
+
return this.getMagicDefaultValue();
|
|
246
|
+
return originalRec.GetFieldValue(this._id);
|
|
247
|
+
}
|
|
248
|
+
isOriginalValueNull() {
|
|
249
|
+
let originalRec = this._dataview.getOriginalRec();
|
|
250
|
+
return originalRec.IsNull(this._id);
|
|
251
|
+
}
|
|
252
|
+
getValueByRecIdx(idx) {
|
|
253
|
+
let rec = this._dataview.getRecByIdx(idx);
|
|
254
|
+
let fieldValue = rec.GetFieldValue(this._id);
|
|
255
|
+
return rec.IsNull(this._id) ? this.getValueForNull(false) : fieldValue;
|
|
256
|
+
}
|
|
257
|
+
getModifiedAtLeastOnce() {
|
|
258
|
+
return this.modifiedAtLeastOnce;
|
|
259
|
+
}
|
|
260
|
+
isNullByRecIdx(idx) {
|
|
261
|
+
let rec = this._dataview.getRecByIdx(idx);
|
|
262
|
+
return rec.IsNull(this._id);
|
|
263
|
+
}
|
|
264
|
+
isEqual(mgValue, isNullFld, type, recIdx) {
|
|
265
|
+
let rec = (this._dataview.getRecByIdx(recIdx));
|
|
266
|
+
let valsEqual = false;
|
|
267
|
+
if (rec != null) {
|
|
268
|
+
let fieldValue = rec.GetFieldValue(this._id);
|
|
269
|
+
let fielsIsNull = rec.IsNull(this._id);
|
|
270
|
+
valsEqual = ExpressionEvaluator.mgValsEqual(fieldValue, fielsIsNull, this._type, mgValue, isNullFld, type);
|
|
271
|
+
}
|
|
272
|
+
return valsEqual;
|
|
273
|
+
}
|
|
274
|
+
getNewRecValue(clobberedOnly) {
|
|
275
|
+
if (this._isVirtual && this._initExp == null)
|
|
276
|
+
return this._val;
|
|
277
|
+
return !clobberedOnly ? this.getDefaultValue() : null;
|
|
278
|
+
}
|
|
279
|
+
async setValueAndStartRecompute(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, enforceVariableChange) {
|
|
280
|
+
if (isNullOrUndefined(enforceVariableChange))
|
|
281
|
+
enforceVariableChange = false;
|
|
282
|
+
await this.setValueAndStartRecompute_1(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, false);
|
|
283
|
+
}
|
|
284
|
+
async setValueAndStartRecompute_1(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, enforceVariableChange) {
|
|
285
|
+
let task = this.getTask();
|
|
286
|
+
if (task != null)
|
|
287
|
+
task.VewFirst++;
|
|
288
|
+
let valueWasUpdated = await this.setValue(val, isNullFld, recompute, setRecordUpdated, !this._isVirtual, isArgUpdate, enforceVariableChange);
|
|
289
|
+
if (task !== null && task.VewFirst === 1 && this._form !== null && !this.IsEventHandlerField) {
|
|
290
|
+
if (recompute && valueWasUpdated)
|
|
291
|
+
await this._form.refreshOnExpressions();
|
|
292
|
+
}
|
|
293
|
+
if (task != null)
|
|
294
|
+
task.VewFirst--;
|
|
295
|
+
}
|
|
296
|
+
async setValue(newVal, isNullFld, recompute, setRecordModified, setCrsrModified, isArgUpdate, enforceValiableChange) {
|
|
297
|
+
let rec;
|
|
298
|
+
let recFldVal;
|
|
299
|
+
let valsEqual = false;
|
|
300
|
+
let remainder;
|
|
301
|
+
let zeroReal;
|
|
302
|
+
let args = null;
|
|
303
|
+
let mainCtrl = this.getCtrl();
|
|
304
|
+
let pendingEvents;
|
|
305
|
+
let evts;
|
|
306
|
+
let forceUpdate = false;
|
|
307
|
+
let checkForVariableChange = recompute || enforceValiableChange;
|
|
308
|
+
let task = this.getTask();
|
|
309
|
+
if (this._form === null)
|
|
310
|
+
this._form = task.getForm();
|
|
311
|
+
if (isNullFld && !this.NullAllowed && this._type !== StorageAttribute.BLOB_VECTOR) {
|
|
312
|
+
newVal = this.getDefaultValue();
|
|
313
|
+
isNullFld = false;
|
|
314
|
+
}
|
|
315
|
+
if (this._type === StorageAttribute.NUMERIC && newVal != null && !NUM_TYPE.numHexStrIsLong(newVal)) {
|
|
316
|
+
let numVal = new NUM_TYPE(newVal);
|
|
317
|
+
let pic = new PIC(this._picture, this._type, super.getTask().getCompIdx());
|
|
318
|
+
let decs = pic.getDec();
|
|
319
|
+
numVal.round(decs);
|
|
320
|
+
newVal = numVal.toXMLrecord();
|
|
321
|
+
}
|
|
322
|
+
rec = this._dataview.getCurrRec();
|
|
323
|
+
if (rec == null)
|
|
324
|
+
throw new ApplicationException(LanguageData.Instance.getConstMessage(MsgInterface.RT_STR_NO_RECS_IN_RNG));
|
|
325
|
+
if (!this.IsVirtual &&
|
|
326
|
+
(task.getMode() === Constants.TASK_MODE_QUERY &&
|
|
327
|
+
!Environment.Instance.allowUpdateInQueryMode(task.getCompIdx())
|
|
328
|
+
|| rec.InForceUpdate && rec.InCompute))
|
|
329
|
+
return !valsEqual;
|
|
330
|
+
if (checkForVariableChange && this.getHasChangeEvent()) {
|
|
331
|
+
let argsList = new Array(2);
|
|
332
|
+
argsList[0] = new ExpVal(StorageAttribute.NUMERIC, false, (mainCtrl !== null && mainCtrl.IsInteractiveUpdate
|
|
333
|
+
? Field.NUM0.toXMLrecord()
|
|
334
|
+
: Field.NUM1.toXMLrecord()));
|
|
335
|
+
argsList[1] = new ExpVal(this.getType(), this.isNull(), this.getValue(false));
|
|
336
|
+
args = new ArgumentsList(argsList);
|
|
337
|
+
}
|
|
338
|
+
if (mainCtrl != null)
|
|
339
|
+
mainCtrl.IsInteractiveUpdate = false;
|
|
340
|
+
if (this._type !== StorageAttribute.UNICODE && UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
341
|
+
if (newVal != null)
|
|
342
|
+
remainder = this._size - UtilStrByteMode.lenB(newVal);
|
|
343
|
+
else
|
|
344
|
+
remainder = 0;
|
|
345
|
+
if (newVal != null && this._type !== StorageAttribute.BLOB && this._type !== StorageAttribute.BLOB_VECTOR &&
|
|
346
|
+
remainder < 0)
|
|
347
|
+
this._val = UtilStrByteMode.leftB(newVal, this._size);
|
|
348
|
+
else if (this._type === StorageAttribute.ALPHA && remainder > 0)
|
|
349
|
+
this._val = newVal + NString.FromChars(this._spaces, 0, remainder);
|
|
350
|
+
else if (this._type === StorageAttribute.BLOB)
|
|
351
|
+
this._val = BlobType.copyBlob(this._val, newVal);
|
|
352
|
+
else
|
|
353
|
+
this._val = newVal;
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
if (newVal != null)
|
|
357
|
+
remainder = this._size - newVal.length;
|
|
358
|
+
else
|
|
359
|
+
remainder = 0;
|
|
360
|
+
if (newVal != null && this._type !== StorageAttribute.BLOB && this._type !== StorageAttribute.BLOB_VECTOR && remainder < 0)
|
|
361
|
+
this._val = newVal.substr(0, this._size);
|
|
362
|
+
else if ((this._type === StorageAttribute.ALPHA || this._type === StorageAttribute.UNICODE) && remainder > 0)
|
|
363
|
+
this._val = newVal + NString.FromChars(this._spaces, 0, remainder);
|
|
364
|
+
else if (this._type === StorageAttribute.BLOB) {
|
|
365
|
+
if (this._val === null)
|
|
366
|
+
this._val = this.getMagicDefaultValue();
|
|
367
|
+
this._val = BlobType.copyBlob(this._val, newVal);
|
|
368
|
+
}
|
|
369
|
+
else
|
|
370
|
+
this._val = newVal;
|
|
371
|
+
}
|
|
372
|
+
{
|
|
373
|
+
recFldVal = rec.GetFieldValue(this._id);
|
|
374
|
+
let oldNullVal = this._isNull;
|
|
375
|
+
if (!recompute && !isArgUpdate && this._initExp == null)
|
|
376
|
+
oldNullVal = rec.IsNull(this._id);
|
|
377
|
+
try {
|
|
378
|
+
valsEqual = ExpressionEvaluator.mgValsEqual(this._val, isNullFld, this._type, recFldVal, oldNullVal, this._type);
|
|
379
|
+
}
|
|
380
|
+
catch (exception) {
|
|
381
|
+
this._val = this.getMagicDefaultValue();
|
|
382
|
+
valsEqual = false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (this._clearVectorType)
|
|
386
|
+
this._vectorType = null;
|
|
387
|
+
if (this._invalidValue) {
|
|
388
|
+
this._invalidValue = false;
|
|
389
|
+
rec.clearFlag(this._id, Record.FLAG_UPDATED);
|
|
390
|
+
rec.clearFlag(this._id, Record.FLAG_MODIFIED);
|
|
391
|
+
}
|
|
392
|
+
zeroReal = this._linkCreate && rec.InCompute && !recompute && (this._form == null || !this._form.InRestore) &&
|
|
393
|
+
!AccessHelper.eventsManager.GetStopExecutionFlag();
|
|
394
|
+
if ((this._isVirtual || zeroReal) && !rec.isNewRec() && !valsEqual)
|
|
395
|
+
forceUpdate = true;
|
|
396
|
+
if (checkForVariableChange || forceUpdate || rec.isNewRec()) {
|
|
397
|
+
this.UpdateNull(isNullFld, rec);
|
|
398
|
+
if (setCrsrModified)
|
|
399
|
+
rec.setFlag(this._id, Record.FLAG_CRSR_MODIFIED);
|
|
400
|
+
rec.setFieldValue(this._id, this._val, setRecordModified);
|
|
401
|
+
evts = Field._variableChangeEvts;
|
|
402
|
+
pendingEvents = evts.length;
|
|
403
|
+
if (checkForVariableChange && this.getHasChangeEvent() && !evts.Contains(this) && !valsEqual) {
|
|
404
|
+
let rtEvt = new RunTimeEvent(this);
|
|
405
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_VARIABLE);
|
|
406
|
+
rtEvt.setArgList(args);
|
|
407
|
+
evts.push(this);
|
|
408
|
+
evts.push(rtEvt);
|
|
409
|
+
}
|
|
410
|
+
if (this._recompute != null && (recompute || forceUpdate) && !this._dataview.InLocalDataviewCommand) {
|
|
411
|
+
try {
|
|
412
|
+
if (forceUpdate)
|
|
413
|
+
rec.InForceUpdate = true;
|
|
414
|
+
await this._recompute.execute(rec);
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
if (forceUpdate)
|
|
418
|
+
rec.InForceUpdate = false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (this._causeTableInvalidation && this.isChanged(this._val, isNullFld))
|
|
422
|
+
rec.setCauseInvalidation(true);
|
|
423
|
+
if ((recompute || forceUpdate) && !this._dataview.InLocalDataviewCommand && mainCtrl != null) {
|
|
424
|
+
if (mainCtrl.isChoiceControl())
|
|
425
|
+
await this.updateDisplay();
|
|
426
|
+
}
|
|
427
|
+
if (pendingEvents === 0 && checkForVariableChange && this.getHasChangeEvent()) {
|
|
428
|
+
while (evts.length > 0) {
|
|
429
|
+
let evt = evts.get_Item(1);
|
|
430
|
+
evts.RemoveAt(0);
|
|
431
|
+
evts.RemoveAt(0);
|
|
432
|
+
if (LastFocusedManager.Instance.getLastFocusedTask() == null)
|
|
433
|
+
evt.setTask(this.getTask());
|
|
434
|
+
else {
|
|
435
|
+
let taskRef = LastFocusedManager.Instance.getLastFocusedTask();
|
|
436
|
+
if (taskRef.TaskSuffixExecuted) {
|
|
437
|
+
taskRef = (taskRef.PathParentTask != null) ? taskRef.PathParentTask : taskRef;
|
|
438
|
+
}
|
|
439
|
+
evt.setTask(taskRef);
|
|
440
|
+
}
|
|
441
|
+
evt.setCtrl(LastFocusedManager.getLastFocusedControl());
|
|
442
|
+
await AccessHelper.eventsManager.handleEvent(evt, false);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
if (recompute && !valsEqual)
|
|
447
|
+
this.setModified();
|
|
448
|
+
return !valsEqual;
|
|
449
|
+
}
|
|
450
|
+
UpdateNull(isNullFld, rec) {
|
|
451
|
+
if (isNullFld)
|
|
452
|
+
rec.setFlag(this._id, Record.FLAG_NULL);
|
|
453
|
+
else
|
|
454
|
+
rec.clearFlag(this._id, Record.FLAG_NULL);
|
|
455
|
+
this._isNull = isNullFld;
|
|
456
|
+
}
|
|
457
|
+
async setCellVecValue(idx, newVal, valIsNull) {
|
|
458
|
+
let res = false;
|
|
459
|
+
if (this._type === StorageAttribute.BLOB_VECTOR) {
|
|
460
|
+
if (this._vectorType == null) {
|
|
461
|
+
this._vectorType = this.isNull()
|
|
462
|
+
? new VectorType(this._vecCellsType, this._vecCellsContentType, this.DefaultValue, this.isNullDefault(), this.NullAllowed, this._vecCellsSize)
|
|
463
|
+
: new VectorType(this._val);
|
|
464
|
+
}
|
|
465
|
+
if (this._vecCellsType === StorageAttribute.BLOB) {
|
|
466
|
+
let tmpNewVal = this.getCellDefualtValue();
|
|
467
|
+
newVal = BlobType.copyBlob(tmpNewVal, newVal);
|
|
468
|
+
}
|
|
469
|
+
res = this._vectorType.setVecCell(idx, newVal, valIsNull);
|
|
470
|
+
if (res) {
|
|
471
|
+
this._clearVectorType = false;
|
|
472
|
+
await this.setValueAndStartRecompute(this._vectorType.toString(), false, true, false, false);
|
|
473
|
+
this._clearVectorType = true;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return res;
|
|
477
|
+
}
|
|
478
|
+
getVecCellValue(idx) {
|
|
479
|
+
if (this._type === StorageAttribute.BLOB_VECTOR) {
|
|
480
|
+
if (this._vectorType == null)
|
|
481
|
+
this._vectorType = new VectorType(this._val);
|
|
482
|
+
return this._vectorType.getVecCell(idx);
|
|
483
|
+
}
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
setRecomputed() {
|
|
487
|
+
}
|
|
488
|
+
invalidate(forceInvalidate, clearFlags) {
|
|
489
|
+
let rec = this._dataview.getCurrRec();
|
|
490
|
+
if (!this._isVirtual || this._virAsReal || this._initExp !== null || forceInvalidate) {
|
|
491
|
+
this._invalidValue = true;
|
|
492
|
+
}
|
|
493
|
+
if (clearFlags && rec !== null) {
|
|
494
|
+
rec.clearFlag(this._id, Record.FLAG_UPDATED);
|
|
495
|
+
rec.clearFlag(this._id, Record.FLAG_MODIFIED);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
getTableName() {
|
|
499
|
+
if (this._tableName == null)
|
|
500
|
+
return "";
|
|
501
|
+
return this._tableName;
|
|
502
|
+
}
|
|
503
|
+
getName() {
|
|
504
|
+
if (this._isParam)
|
|
505
|
+
return "Parameter." + this.getVarName();
|
|
506
|
+
else if (this._isVirtual)
|
|
507
|
+
return "Virtual." + this.getVarName();
|
|
508
|
+
else
|
|
509
|
+
return this.getTableName() + "." + this.getVarName();
|
|
510
|
+
}
|
|
511
|
+
isNull() {
|
|
512
|
+
if (super.getTask().getEvalOldValues())
|
|
513
|
+
return this.isOriginalValueNull();
|
|
514
|
+
else if (this._invalidValue)
|
|
515
|
+
this.takeValFromRec();
|
|
516
|
+
return this._isNull;
|
|
517
|
+
}
|
|
518
|
+
PrevIsNull() {
|
|
519
|
+
return this._prevIsNull;
|
|
520
|
+
}
|
|
521
|
+
isModified() {
|
|
522
|
+
let currRec = this._dataview.getCurrRec();
|
|
523
|
+
return currRec.isFldModified(this._id);
|
|
524
|
+
}
|
|
525
|
+
setModified() {
|
|
526
|
+
let rec = (this._dataview.getCurrRec());
|
|
527
|
+
rec.setFlag(this._id, Record.FLAG_MODIFIED);
|
|
528
|
+
rec.setFlag(this._id, Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
|
529
|
+
if (this.IsVirtual)
|
|
530
|
+
this.modifiedAtLeastOnce = true;
|
|
531
|
+
}
|
|
532
|
+
setUpdated() {
|
|
533
|
+
let currRec = this._dataview.getCurrRec();
|
|
534
|
+
currRec.setFlag(this._id, Record.FLAG_UPDATED);
|
|
535
|
+
currRec.setUpdated();
|
|
536
|
+
}
|
|
537
|
+
isParam() {
|
|
538
|
+
return this._isParam;
|
|
539
|
+
}
|
|
540
|
+
isInEvalProcess() {
|
|
541
|
+
return this._inEvalProcess;
|
|
542
|
+
}
|
|
543
|
+
hasInitExp() {
|
|
544
|
+
return this._initExp !== null;
|
|
545
|
+
}
|
|
546
|
+
isServerRcmp() {
|
|
547
|
+
return this._recompute !== null && this._recompute.isServerRcmp();
|
|
548
|
+
}
|
|
549
|
+
getPicture() {
|
|
550
|
+
return this._picture;
|
|
551
|
+
}
|
|
552
|
+
getDataviewHeaderId() {
|
|
553
|
+
return this._dataviewHeaderId;
|
|
554
|
+
}
|
|
555
|
+
get IsLinkField() {
|
|
556
|
+
return this._isLinkFld;
|
|
557
|
+
}
|
|
558
|
+
async getInitExpVal(res, isNull) {
|
|
559
|
+
if (this._initExp != null)
|
|
560
|
+
await this.EvaluateInitExpression(res, isNull);
|
|
561
|
+
else
|
|
562
|
+
res.value = this.getDefaultValue();
|
|
563
|
+
}
|
|
564
|
+
setHasChangeEvent() {
|
|
565
|
+
this._hasChangeEvent = true;
|
|
566
|
+
}
|
|
567
|
+
getHasChangeEvent() {
|
|
568
|
+
return this._hasChangeEvent;
|
|
569
|
+
}
|
|
570
|
+
setHasZoomHandler() {
|
|
571
|
+
this._hasZoomHandler = true;
|
|
572
|
+
}
|
|
573
|
+
getHasZoomHandler() {
|
|
574
|
+
return this._hasZoomHandler;
|
|
575
|
+
}
|
|
576
|
+
isCauseTableInvalidation() {
|
|
577
|
+
return this._causeTableInvalidation;
|
|
578
|
+
}
|
|
579
|
+
causeTableInvalidation(causeTableInvalidation) {
|
|
580
|
+
this._causeTableInvalidation = causeTableInvalidation;
|
|
581
|
+
}
|
|
582
|
+
getValueForNull(checkNullArithmetic) {
|
|
583
|
+
let val;
|
|
584
|
+
if (this.NullAllowed) {
|
|
585
|
+
if (checkNullArithmetic && super.getTask().getNullArithmetic() === Constants.NULL_ARITH_NULLIFY) {
|
|
586
|
+
val = null;
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
if (this._nullValue === null) {
|
|
590
|
+
this._nullValue = super.getMagicDefaultValue();
|
|
591
|
+
}
|
|
592
|
+
val = this._nullValue;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
val = super.getMagicDefaultValue();
|
|
597
|
+
}
|
|
598
|
+
return val;
|
|
599
|
+
}
|
|
600
|
+
getCtrl() {
|
|
601
|
+
let ctrl;
|
|
602
|
+
if (this._controls != null) {
|
|
603
|
+
for (let i = 0; i < this._controls.length; i++) {
|
|
604
|
+
ctrl = this._controls.get_Item(i);
|
|
605
|
+
if (ctrl.getForm().getTask() === this.getTask())
|
|
606
|
+
return ctrl;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
611
|
+
async updateDisplay() {
|
|
612
|
+
await super.updateDisplayWithValue(this.getDispValue(), this.isNull());
|
|
613
|
+
}
|
|
614
|
+
getDispValue() {
|
|
615
|
+
if (this.isNull()) {
|
|
616
|
+
if (this._nullDisplay != null)
|
|
617
|
+
return this.getNullDisplay();
|
|
618
|
+
else
|
|
619
|
+
return super.getMagicDefaultValue();
|
|
620
|
+
}
|
|
621
|
+
else
|
|
622
|
+
return this.getValue(false);
|
|
623
|
+
}
|
|
624
|
+
get ShouldCheckRangeInCompute() {
|
|
625
|
+
return this.IsLinkField || (this.IsVirtual && this._dataview.HasMainTable);
|
|
626
|
+
}
|
|
627
|
+
IsForArgument(taskHasParameters) {
|
|
628
|
+
if (taskHasParameters) {
|
|
629
|
+
if (!this.isParam()) {
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
if (!this.IsVirtual) {
|
|
635
|
+
return false;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
return true;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
Field.LEAVE_FLAGS = false;
|
|
642
|
+
Field.NUM0 = null;
|
|
643
|
+
Field.NUM1 = null;
|
|
644
|
+
Field._variableChangeEvts = new List();
|
|
645
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0SCxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsR0FBRyxFQUNILFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUcvRCxPQUFPLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsvQyxNQUFNLE9BQU8sS0FBTSxTQUFRLFNBQVM7SUE0Q2xDLFlBQVksUUFBa0IsRUFBRSxFQUFVO1FBQ3hDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQXZDSixhQUFRLEdBQWEsSUFBSSxDQUFDO1FBQzFCLGVBQVUsR0FBYyxJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6QyxVQUFLLEdBQVcsSUFBSSxDQUFDO1FBQ3JCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGFBQVEsR0FBZSxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLHNCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9CLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQ3JDLFdBQU0sR0FBYSxJQUFJLENBQUM7UUFDeEIsVUFBSyxHQUFhLElBQUksQ0FBQztRQUNmLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLHVCQUFrQixHQUFZLElBQUksQ0FBQztRQUNuQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixlQUFVLEdBQVcsSUFBSSxDQUFDO1FBQzFCLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDMUIsa0JBQWEsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUUzQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzFCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDdEIsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBQ2pDLGdCQUFXLEdBQWUsSUFBSSxDQUFDO1FBV3JDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsUUFBUSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQ2xGLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQ3BFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFDNUIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUdELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUtELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBS1MsWUFBWSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDeEQsSUFBSSxjQUFjLEdBQVksS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixJQUFJLElBQUksR0FBYSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyRCxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLFFBQVEsU0FBUyxFQUFFO2dCQUNqQixLQUFLLGNBQWMsQ0FBQyxlQUFlO29CQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDckQsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVE7d0JBRW5DLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsc0VBQXNFLENBQUMsQ0FBQztvQkFDNUUsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyw0QkFBNEI7b0JBQzlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxvQkFBb0I7d0JBRTdDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsc0ZBQXNGLENBQUMsQ0FBQztvQkFDNUYsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyx5QkFBeUI7b0JBRTNDLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLG1CQUFtQjtvQkFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGtCQUFrQjtvQkFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsRCxNQUFNO2dCQUNSLEtBQUssY0FBYyxDQUFDLGNBQWM7b0JBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3ZELE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsa0JBQWtCO29CQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQy9DLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsc0JBQXNCO29CQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2hELE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsWUFBWTtvQkFDOUIsSUFBSSxNQUFNLEdBQVcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBVSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxRCxNQUFNO2dCQUNSLEtBQUssWUFBWSxDQUFDLFlBQVk7b0JBQUU7cUJBRS9CO29CQUNDLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsc0JBQXNCO29CQUV4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0MsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxjQUFjO29CQUVoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDeEosTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUUvQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdkosTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakQsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxxQkFBcUI7b0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakQsTUFBTTtnQkFDUjtvQkFDRSxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUN2QixNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsK0JBQStCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDdkcsTUFBTTthQUNUO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBTUQsWUFBWSxDQUFDLFNBQW9CO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFNRCwwQkFBMEIsQ0FBQyxXQUFpQjtRQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQU1ELG1CQUFtQixDQUFDLFdBQWlCO1FBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFTLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQU9ELFVBQVUsQ0FBQyxJQUFtQjtRQUM1QixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBU00sS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFrQjtRQUNyQyxJQUFJLE1BQU0sR0FBcUIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksU0FBUyxHQUFzQixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxHQUFHLEdBQWMsSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsRCxJQUFJLElBQUksR0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFHekgsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7WUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtZQUNuRyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksS0FBSyxHQUFpQixZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RFLElBQUksb0JBQW9CLEdBQVksS0FBSyxDQUFDO1FBQzFDLElBQUksS0FBSyxJQUFJLElBQUk7WUFDZixvQkFBb0IsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsYUFBYSxDQUFDO1FBUXJGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksb0JBQW9CLENBQUMsQ0FBQyxJQUFJLFNBQVM7Z0JBQ3hHLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBSWpHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBZSxJQUFJLENBQUMsU0FBVSxDQUFDLGVBQWUsRUFBRTtvQkFDcEgsQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUU7b0JBQ2pELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7d0JBR3pCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDdEQ7eUJBQ0ksSUFBSSxRQUFRO3dCQUNmLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUN6QzthQUNGO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUNwQztRQUNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBUUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQXdCLEVBQUUsU0FBNEI7UUFDakYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUk7WUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1RjtnQkFDTztZQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1NBQzdCO1FBRUQsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQWlDRCxRQUFRLENBQUMsbUJBQTRCO1FBRW5DLElBQVcsS0FBSyxDQUFDLE9BQU8sRUFBRyxDQUFDLGdCQUFnQixFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTztZQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBT08sU0FBUyxDQUFDLFFBQWdCLEVBQUUsTUFBZTtRQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBS0QsY0FBYztRQUNaLElBQUksR0FBRyxHQUFzQixJQUFJLENBQUMsU0FBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFELElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsSCxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUtELGdCQUFnQjtRQUNkLElBQUksV0FBVyxHQUFzQixJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRFLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFckMsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLElBQUksV0FBVyxHQUFzQixJQUFJLENBQUMsU0FBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RFLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQU9ELGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsSUFBSSxHQUFHLEdBQXNCLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELElBQUksVUFBVSxHQUFXLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN6RSxDQUFDO0lBTUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFPRCxjQUFjLENBQUMsR0FBVztRQUN4QixJQUFJLEdBQUcsR0FBc0IsSUFBSSxDQUFDLFNBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBVUQsT0FBTyxDQUFDLE9BQWUsRUFBRSxTQUFrQixFQUFFLElBQXNCLEVBQUUsTUFBYztRQUNqRixJQUFJLEdBQUcsR0FBVyxDQUFZLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxTQUFTLEdBQVksS0FBSyxDQUFDO1FBQy9CLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNmLElBQUksVUFBVSxHQUFXLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksV0FBVyxHQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUc7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBU0QsY0FBYyxDQUFDLGFBQXNCO1FBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRCxLQUFLLENBQUMseUJBQXlCLENBQUMsR0FBVyxFQUFFLFNBQWtCLEVBQUUsU0FBa0IsRUFBRSxnQkFBeUIsRUFBRSxXQUFvQixFQUFFLHFCQUErQjtRQUNuSyxJQUFJLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDO1lBQzFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQWFPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxHQUFXLEVBQUUsU0FBa0IsRUFBRSxTQUFrQixFQUFFLGdCQUF5QixFQUFFLFdBQW9CLEVBQUUscUJBQThCO1FBQzVLLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksSUFBSSxJQUFJO1lBQ2QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWxCLElBQUksZUFBZSxHQUFZLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFJdEosSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVGLElBQUksU0FBUyxJQUFJLGVBQWU7Z0JBQzlCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBRTNDO1FBQ0QsSUFBSSxJQUFJLElBQUksSUFBSTtZQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBYU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFjLEVBQUUsU0FBa0IsRUFBRSxTQUFrQixFQUFFLGlCQUEwQixFQUFFLGVBQXdCLEVBQUUsV0FBb0IsRUFBRSxxQkFBOEI7UUFDdkwsSUFBSSxHQUFXLENBQUM7UUFDaEIsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksU0FBUyxHQUFZLEtBQUssQ0FBQztRQUMvQixJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxRQUFpQixDQUFDO1FBQ3RCLElBQUksSUFBSSxHQUFrQixJQUFJLENBQUM7UUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLElBQUksYUFBcUIsQ0FBQztRQUMxQixJQUFJLElBQWdDLENBQUM7UUFDckMsSUFBSSxXQUFXLEdBQVksS0FBSyxDQUFDO1FBQ2pDLElBQUksc0JBQXNCLEdBQVksU0FBUyxJQUFJLHFCQUFxQixDQUFDO1FBRXpFLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtZQUNyQixJQUFJLENBQUMsS0FBSyxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0QyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7WUFDakYsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ25CO1FBTUQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsRyxJQUFJLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0UsSUFBSSxJQUFJLEdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMvQjtRQUVELEdBQUcsR0FBYyxJQUFJLENBQUMsU0FBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLElBQUksR0FBRyxJQUFJLElBQUk7WUFDYixNQUFNLElBQUksb0JBQW9CLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUc1RyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDakIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7Z0JBQzNDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7bUJBQzVELEdBQUcsQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUN4QyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBRXBCLElBQUksc0JBQXNCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDdEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQ3RELENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsbUJBQW1CO2dCQUNoRCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzFCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUUsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxRQUFRLElBQUksSUFBSTtZQUNsQixRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBR3ZDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLG1CQUFtQixFQUFFLEVBQUU7WUFFcEYsSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDaEIsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Z0JBRXRELFNBQVMsR0FBRyxDQUFDLENBQUM7WUFFaEIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsV0FBVztnQkFDdkcsU0FBUyxHQUFHLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ25ELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksU0FBUyxHQUFHLENBQUM7Z0JBQzdELElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUcsU0FBUyxDQUFDLENBQUM7aUJBQ2pFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJO2dCQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzs7Z0JBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1NBQ3pCO2FBQ0k7WUFDSCxJQUFJLE1BQU0sSUFBSSxJQUFJO2dCQUNoQixTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztnQkFFdkMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUVoQixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLElBQUksU0FBUyxHQUFHLENBQUM7Z0JBQ3hILElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQztnQkFDMUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRyxTQUFTLENBQUMsQ0FBQztpQkFDbEUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLElBQUksRUFBRTtnQkFHN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUk7b0JBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2xEOztnQkFDSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztTQUN6QjtRQUVEO1lBQ0UsU0FBUyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBT3hDLElBQUksVUFBVSxHQUFZLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7Z0JBQ3JELFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxJQUFJO2dCQUNGLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsSDtZQUNELE9BQU8sU0FBUyxFQUFFO2dCQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUN4QyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ25CO1NBRUY7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQztRQUVELFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3pHLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBS3JELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztZQUNoRSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBS3JCLElBQUksc0JBQXNCLElBQUksV0FBVyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVoQyxJQUFJLGVBQWU7Z0JBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNuRCxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFELElBQUksR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDakMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxzQkFBc0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBRTVGLElBQUksS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRCxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xCO1lBS0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFZLElBQUksQ0FBQyxTQUFVLENBQUMsc0JBQXNCLEVBQUU7Z0JBQy9HLElBQUk7b0JBRUYsSUFBSSxXQUFXO3dCQUNiLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMzQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQzt3QkFFTztvQkFDTixJQUFJLFdBQVc7d0JBQ2IsR0FBRyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7aUJBQzdCO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO2dCQUN0RSxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFNakMsSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFZLElBQUksQ0FBQyxTQUFVLENBQUMsc0JBQXNCLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDeEcsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFO29CQUM1QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM5QjtZQUlELElBQUksYUFBYSxLQUFLLENBQUMsSUFBSSxzQkFBc0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtnQkFDN0UsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxHQUFHLEdBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLElBQUksSUFBSTt3QkFDMUQsR0FBRyxDQUFDLE9BQU8sQ0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt5QkFDL0I7d0JBQ0gsSUFBSSxPQUFPLEdBQVMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7d0JBSXJFLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFOzRCQUM5QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7eUJBQ3JGO3dCQUNELEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3RCO29CQUNELEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO29CQUN4RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDMUQ7YUFDRjtTQUNGO1FBR0QsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVLENBQUMsU0FBa0IsRUFBRSxHQUFXO1FBQ3hDLElBQUksU0FBUztZQUNYLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7O1lBRXhDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQVNELEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBVyxFQUFFLE1BQWMsRUFBRSxTQUFrQjtRQUNuRSxJQUFJLEdBQUcsR0FBWSxLQUFLLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtZQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQzlCLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFDdkcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUNyQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9CO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLGdCQUFnQixDQUFDLElBQUksRUFBRTtnQkFDaEQsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUMvQztZQUVELEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTFELElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBRTlCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7YUFDOUI7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQU1ELGVBQWUsQ0FBQyxHQUFXO1FBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7WUFFL0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRS9DLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLRCxhQUFhO0lBQ2IsQ0FBQztJQVlELFVBQVUsQ0FBQyxlQUF3QixFQUFFLFVBQW1CO1FBQ3RELElBQUksR0FBRyxHQUFzQixJQUFJLENBQUMsU0FBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTFELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksZUFBZSxFQUFFO1lBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxVQUFVLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUM5QixHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBS00sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtZQUN6QixPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBUU0sT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFFBQVE7WUFDZixPQUFPLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDckMsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUN0QixPQUFPLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7O1lBQ25DLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUtNLE1BQU07UUFDWCxJQUFXLEtBQUssQ0FBQyxPQUFPLEVBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQy9CLElBQUksSUFBSSxDQUFDLGFBQWE7WUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBSUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBS0QsVUFBVTtRQUNSLElBQUksT0FBTyxHQUFzQixJQUFJLENBQUMsU0FBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlELE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQU1ELFdBQVc7UUFDVCxJQUFJLEdBQUcsR0FBVyxDQUFZLElBQUksQ0FBQyxTQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRzVDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQ2hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFFcEMsQ0FBQztJQU1ELFVBQVU7UUFDUixJQUFJLE9BQU8sR0FBc0IsSUFBSSxDQUFDLFNBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5RCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBS0QsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBS0QsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBS0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUtELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQU1ELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBTUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFLTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQXFCLEVBQUUsTUFBeUI7UUFFekUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDdkIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDOztZQUUvQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBS0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUtPLGlCQUFpQjtRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUtELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFJRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQU1ELHdCQUF3QjtRQUN0QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBTUQsc0JBQXNCLENBQUMsc0JBQStCO1FBQ3BELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQztJQUN4RCxDQUFDO0lBT0QsZUFBZSxDQUFDLG1CQUE0QjtRQUMxQyxJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFFcEIsSUFBSSxtQkFBbUIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEVBQUU7Z0JBQy9GLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtpQkFDSTtnQkFDSCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2lCQUNoRDtnQkFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUN2QjtTQUNGO2FBQ0k7WUFDSCxHQUFHLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDcEM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFNTSxPQUFPO1FBQ1osSUFBSSxJQUFlLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RELElBQUksR0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDN0MsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS0QsS0FBSyxDQUFDLGFBQWE7UUFDakIsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFLTSxZQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJO2dCQUMzQixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDMUM7O1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFLRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFlLElBQUksQ0FBQyxTQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGFBQWEsQ0FBQyxpQkFBMEI7UUFFdEMsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7YUFDSTtZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBeGhDTSxpQkFBVyxHQUFZLEtBQUssQ0FBQztBQUVyQixVQUFJLEdBQWEsSUFBSSxDQUFDO0FBQ3RCLFVBQUksR0FBYSxJQUFJLENBQUM7QUFpQ3RCLHlCQUFtQixHQUErQixJQUFJLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgRGVidWcsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUElDSW50ZXJmYWNlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgQmxvYlR5cGUsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBFeHBWYWwsXHJcbiAgRmllbGREZWYsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgVmVjdG9yVHlwZVxyXG59IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5cclxuaW1wb3J0IHtZZXNOb0V4cH0gZnJvbSBcIi4uL2V4cC9ZZXNOb0V4cFwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvblwiO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3J9IGZyb20gXCIuLi9leHAvRXhwcmVzc2lvbkV2YWx1YXRvclwiO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSBcIi4uL2d1aS9NZ0Zvcm1cIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7UmVjb21wdXRlLCBSZWNvbXB1dGVfUmNtcEJ5fSBmcm9tIFwiLi4vcnQvUmVjb21wdXRlXCI7XHJcbmltcG9ydCB7Qm91bmRhcnl9IGZyb20gXCIuLi9ydC9Cb3VuZGFyeVwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi4vZXZlbnQvUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tIFwiLi9SZWNvcmRcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4vRGF0YVZpZXdcIjtcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52L0Vudmlyb25tZW50XCI7XHJcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gXCIuL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gXCIuLi9lbnYvTGFuZ3VhZ2VEYXRhXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPGZsZGggLi4uPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRmllbGQgZXh0ZW5kcyBGaWVsZEJhc2Uge1xyXG4gIHN0YXRpYyBMRUFWRV9GTEFHUzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBOVU0wOiBOVU1fVFlQRSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTlVNMTogTlVNX1RZUEUgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9saW5rRXhwOiBZZXNOb0V4cCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcmVjb21wdXRlOiBSZWNvbXB1dGUgPSBudWxsO1xyXG4gIENhY2hlVGFibGVGbGRJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2F1c2VUYWJsZUludmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlOyAvLyBjaGFuZ2UgaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByaXZhdGUgX2Zvcm06IE1nRm9ybSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzQ2hhbmdlRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSBoYW5kbGVyIHRvIHJ1biB3aGVuIHRoaXMgZmllbGQgaXMgdXBkYXRlZFxyXG4gIHByaXZhdGUgX2hhc1pvb21IYW5kbGVyOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgem9vbSBoYW5kbGVyIGZvciB0aGlzIGZpZWxkXHJcbiAgcHJpdmF0ZSBfaW5FdmFsUHJvY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2luaXRFeHA6IEV4cHJlc3Npb24gPSBudWxsO1xyXG4gIHByaXZhdGUgX2ludmFsaWRWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfaXNMaW5rRmxkOiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIGl0IG1lYW5zIHRoYXQgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rXHJcbiAgcHJpdmF0ZSBfaXNWaXJ0dWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGF0YXZpZXdIZWFkZXJJZDogbnVtYmVyID0gLTE7ICAvLyBtZW1iZXJzIHJlbGF0ZWQgdG8gdGFibGUgY2FjaGVcclxuICBwcml2YXRlIF9saW5rQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBpdCdzIGEgcmVhbCBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIGxpbmsgY3JlYXRlLlxyXG4gIExvY2F0ZTogQm91bmRhcnkgPSBudWxsO1xyXG4gIFJhbmdlOiBCb3VuZGFyeSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRXhwb3NlZFJvdXRlUGFyYW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0V4cG9zZWRUb0NsaWVudDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfcHJldklzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF90YWJsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaW5kZXhJblRhYmxlOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgcHJpdmF0ZSBfdmlyQXNSZWFsOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUgdGhlbiBhIHZpcnR1YWwgZmllbGQgaXMgY29tcHV0ZWQgYXMgcmVhbCAobmVlZGVkIGZvciBsaW5rIHJldCB2YWx1ZSlcclxuICBwcm90ZWN0ZWQgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIG1vZGlmaWVkQXRMZWFzdE9uY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jbGVhclZlY3RvclR5cGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBkbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdmVjdG9yIG9iamVjdFxyXG4gIHByaXZhdGUgX3ZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBudWxsOyAvLyB0aGUgdmVjdG9yIHJlcHJlc2VudGF0aW9uXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF92YXJpYWJsZUNoYW5nZUV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+ID0gbmV3IExpc3QoKTsgLy8gZm9yIFZhcmlhYmxlIENoYW5nZSBldmVudCBleGVjdXRpb24sIHByZXZpb3VzbHkgdXNlZCB2aWEgZ2V0UGVuZGluZ1ZhckNoYW5nZUV2ZW50c1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhdmlld1wiPmEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhdmlldzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmNvdW50ZXIgb2YgdGhlIGZpZWxkIGluIEZpZWxkVGFibGU8L3BhcmFtPlxyXG4gIGNvbnN0cnVjdG9yKGRhdGF2aWV3OiBEYXRhVmlldywgaWQ6IG51bWJlcikge1xyXG4gICAgc3VwZXIoaWQpO1xyXG4gICAgaWYgKEZpZWxkLk5VTTAgPT09IG51bGwpIHtcclxuICAgICAgRmllbGQuTlVNMCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBGaWVsZC5OVU0xID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIEZpZWxkLk5VTTAuTlVNXzRfTE9ORygwKTtcclxuICAgICAgRmllbGQuTlVNMS5OVU1fNF9MT05HKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2RhdGF2aWV3ID0gZGF0YXZpZXc7XHJcbiAgICB0aGlzLl9saW5rRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTtcclxuICAgIEZpZWxkRGVmLl9kZWZhdWx0X2RhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcoUElDSW50ZXJmYWNlLkRFRkFVTFRfREFURSxcclxuICAgICAgbmV3IFBJQyhcIjZcIiwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCBzdXBlci5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKSxcclxuICAgICAgc3VwZXIuZ2V0VGFzaygpLmdldENvbXBJZHgoKSxcclxuICAgICAgQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBWaXJBc1JlYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlyQXNSZWFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzVmlydHVhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ZpcnR1YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgSXNFeHBvc2VkUm91dGVQYXJhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0V4cG9zZWRSb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzRXhwb3NlZFRvQ2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRXhwb3NlZFRvQ2xpZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRleCBpbiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IEluZGV4SW5UYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4SW5UYWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGZpZWxkIGF0dHJpYnV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJvdGVjdGVkIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIixcIik7XHJcbiAgICAgIGlzVGFnUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVklSVFVBTDpcclxuICAgICAgICAgIHRoaXMuX2lzVmlydHVhbCA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUEFSQU06XHJcbiAgICAgICAgICB0aGlzLl9pc1BhcmFtID0gKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpICE9PSAwKTtcclxuICAgICAgICAgIGlmICghdGhpcy5faXNWaXJ0dWFsICYmIHRoaXMuX2lzUGFyYW0pXHJcbiAgICAgICAgICAvLyBwb3NzaWJsZSBlcnJvciAtIHdlIHJlbHkgb24gdGhlIG9yZGVyIG9mIFhNTCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEZpZWxkLmluaXRFbGVtZW50cygpOiBub24gdmlydHVhbCBmaWVsZCBpcyBkZWZpbmVkIGFzIGEgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfUk9VVEVfUEFSQU1TOlxyXG4gICAgICAgICAgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzUGFyYW0gJiYgdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbSlcclxuICAgICAgICAgIC8vIHBvc3NpYmxlIGVycm9yIC0gd2UgcmVseSBvbiB0aGUgb3JkZXIgb2YgWE1MIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgIFwiaW4gRmllbGQuaW5pdEVsZW1lbnRzKCk6IG5vbiBwYXJhbWV0ZXIgZmllbGQgaXMgZGVmaW5lZCBhcyBhIGV4cG9zZWQgcm91dGUgcGFyYW1ldGVyXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYUE9TRURfVE9fQ0xJRU5UOlxyXG4gICAgICAgICAgLy8gVGhlIGZsYWcgd2FzIHNlcmlhbGl6ZWQgb25seSBmb3Igc2VydmVyIHZhcmlhYmxlIChleHBvc2UgdG8gY2xpZW50ID0gMCApXHJcbiAgICAgICAgICBpZiAoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikgPT0gMClcclxuICAgICAgICAgICAgdGhpcy5faXNFeHBvc2VkVG9DbGllbnQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WSVJfQVNfUkVBTDpcclxuICAgICAgICAgIHRoaXMuX3ZpckFzUmVhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktfQ1JFQVRFOlxyXG4gICAgICAgICAgdGhpcy5fbGlua0NyZWF0ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MTktFWFA6XHJcbiAgICAgICAgICB0aGlzLl9saW5rRXhwLnNldFZhbCg8VGFzaz4odGhpcy5nZXRUYXNrKCkpLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFCTEVfTkFNRTpcclxuICAgICAgICAgIHRoaXMuX3RhYmxlTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5ERVhfSU5fVEFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9pbmRleEluVGFibGUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTklUOlxyXG4gICAgICAgICAgbGV0IGV4cE51bTogbnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9pbml0RXhwID0gKDxUYXNrPnRoaXMuZ2V0VGFzaygpKS5nZXRFeHBCeUlkKGV4cE51bSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6IHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIQUNIRURfRkxEX0lEOlxyXG4gICAgICAgICAgLy8gTUdfQVRUUl9DSEFDSEVEX0ZMRCBpcyBpbiB0aGUgZm9ybWF0IG9mIGNhY2hlZFRhYmxlSWQsZmxkXHJcbiAgICAgICAgICB0aGlzLkNhY2hlVGFibGVGbGRJZHggPSBOTnVtYmVyLlBhcnNlKGRhdGFbMV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xPQ0FURTpcclxuICAgICAgICAgIC8vIGxvY2F0ZSBpcyBpbiB0aGUgZm9ybWF0IG9mIG1heCxtaW4gZXhwcmVzc2lvbiBudW0gKC0xIGlmIG5vbiBleGlzdHMpXHJcbiAgICAgICAgICB0aGlzLkxvY2F0ZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JBTkdFOlxyXG4gICAgICAgICAgLy8gcmFuZ2UgaXMgaW4gdGhlIGZvcm1hdCBvZiBtYXgsbWluIGV4cHJlc3Npb24gbnVtICgtMSBpZiBub24gZXhpc3RzKVxyXG4gICAgICAgICAgdGhpcy5SYW5nZSA9IG5ldyBCb3VuZGFyeSg8VGFzaz50aGlzLmdldFRhc2soKSwgTk51bWJlci5QYXJzZShkYXRhWzFdKSwgTk51bWJlci5QYXJzZShkYXRhWzBdKSwgdGhpcy5nZXRUeXBlKCksIHRoaXMuZ2V0U2l6ZSgpLCB0aGlzLkNhY2hlVGFibGVGbGRJZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xJTks6XHJcbiAgICAgICAgICB0aGlzLl9kYXRhdmlld0hlYWRlcklkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSVNfTElOS19GSUVMRDpcclxuICAgICAgICAgIHRoaXMuX2lzTGlua0ZsZCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpc1RhZ1Byb2Nlc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHJlZmVyZW5jZSB0byB0aGUgUmVjb21wdXRlIE9iamVjdCBvZiB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY29tcFJlZlwiPnJlZmVyZW5jZSB0byBSZWNvbXB1dGUgT2JqZWN0PC9wYXJhbT5cclxuICBzZXRSZWNvbXB1dGUocmVjb21wUmVmOiBSZWNvbXB1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29tcHV0ZSA9IHJlY29tcFJlZjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVtb3ZlcyB0aGUgc3BlY2lmaWMgc3ViZm9ybSB0YXNrIGZyb20gdGhlIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIFJlbW92ZVN1YmZvcm1Gcm9tUmVjb21wdXRlKHN1YmZvcm1UYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5SZW1vdmVTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5zZXJ0IHRoZSBzcGVjaWZpYyBzdWJmb3JtIHRhc2sgaW50byB0aGUgZmllbGQgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgQWRkU3ViZm9ybVJlY29tcHV0ZShzdWJmb3JtVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlY29tcHV0ZSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUgPSBuZXcgUmVjb21wdXRlKCk7XHJcbiAgICAgIHRoaXMuX3JlY29tcHV0ZS5UYXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuT3duZXJGbGQgPSB0aGlzO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuUmNtcE1vZGUgPSBSZWNvbXB1dGVfUmNtcEJ5LkNMSUVOVDtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlY29tcHV0ZS5BZGRTdWJmb3JtKHN1YmZvcm1UYXNrKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCBhdHRhY2hlZCB0byB0aGlzIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50aGUgY29udHJvbCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGlzIGZpZWxkPC9wYXJhbT5cclxuICBTZXRDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHN1cGVyLlNldENvbnRyb2woY3RybCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiB0aGlzLl9pbml0RXhwID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgdGhlIGZpZWxkIGluaXQgZXhwcmVzc2lvbiBvciBnZXQgaXRzIHZhbHVlIGZyb20gdGhlIGRhdGF2aWV3LCBzZXRcclxuICAvLy8gICB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIChhbmQgdXBkYXRlIHRoZSBkaXNwbGF5KVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXB1dGVcIj50ZWxscyB0aGUgY29tcHV0ZSB0byBzdGFydCB0aGUgcmVjb21wdXRlIGNoYWluIGFuZCByZWNvbXB1dGVcclxuICAvLy8gICB0aGUgZXhwcmVzc2lvbiBvZiB0aGlzIGZpZWxkIChpZiBpdCBpcyByZWFsKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBjb21wdXRlKHJlY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbSh0aGlzLmdldFZhbHVlKGZhbHNlKSk7XHJcbiAgICBsZXQgaXNOdWxsRmxkOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbSh0aGlzLl9pc051bGwpO1xyXG4gICAgbGV0IHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+c3VwZXIuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCB6ZXJvUmVhbDogYm9vbGVhbiA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIC8vIFFDUiAjOTk5MDI0IC0gemVybyBsbmsgY3JlYXRlIHZhbHVlcyBkdXJpbmcgY29tcHV0ZVxyXG5cclxuICAgIGlmICh0aGlzLl9mb3JtID09IG51bGwpXHJcbiAgICAgIHRoaXMuX2Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgIC8vIG5vIG5lZWQgdG8gemVybyByZWFscyBpZiB3ZSBhcmUgcmVjb3ZlcmluZyBhIHJlY29yZC5cclxuICAgIGlmICgodGhpcy5fZm9ybSAhPSBudWxsICYmIHRoaXMuX2Zvcm0uSW5SZXN0b3JlKSB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICB6ZXJvUmVhbCA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgIGxldCBjb21wdXRlT25DYW5jZWxFdmVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0ICE9IG51bGwpXHJcbiAgICAgIGNvbXB1dGVPbkNhbmNlbEV2ZW50ID0gcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw7XHJcblxyXG4gICAgLy8gdmlydHVhbCBhcyByZWFsIGlzIGVzcGVjaWFsbHkgZm9yIGZpZWxkcyB3aGljaCBhcmUgdXNlZCBhcyBhIFwicmV0dXJuIHZhbHVlXCJcclxuICAgIC8vIG9mIGEgbGluay4gVGhlaXIgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIGxpbmsgcmVzdWx0IGFuZCBub3QgYnkgdGhlIGluaXQgZXhwcmVzc2lvbi5cclxuICAgIC8vIHdoZW4gdGhlIGZvcm0gaXMgcmVzdG9yaW5nIHRoZSBjdXJyIHJvdyB3ZSBzaG91bGRuJ3QgY29tcHV0ZSB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgICAvLyBidXQgdG8gdXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSByZWNvcmQgKGJ5IGdldFZhbHVlKVxyXG4gICAgLy8gUUNSIzkyNjc1ODogV2hlbiBUYXNrJ3MgbW9kZSBpcyBDcmVhdGUsIGluaXQgZm9yIHJlYWwgZmllbGQgc2hvdWxkIGJlIGV2YWx1YXRlZCBvbmx5IHdoZW4gaXQgY29tZXMgZm9yIGNhbmNlbCBldmVudChsYXN0IHJ1bnRpbWUgZXZlbnQgaXMgY2FuY2VsIGV2ZW50KS5cclxuICAgIC8vIFdoaWxlIGNyZWF0aW5nIGEgbmV3IHJlY29yZCwgaW5pdCB3aWxsIGJlIGV2YWx1YXRlZCBiZWNhdXNlIG9mIGNvbmRpdGlvbiByZWMuaXNOZXdSZWMoKS4gKEl0IGlzIHRoZSByZWZpeCBvZiBRQ1IjOTk0MDcyKVxyXG4gICAgaWYgKCF0aGlzLl92aXJBc1JlYWwgJiYgKHRoaXMuX2Zvcm0gPT0gbnVsbCB8fCAhdGhpcy5fZm9ybS5JblJlc3RvcmUpICYmXHJcbiAgICAgICgodGhpcy5faXNWaXJ0dWFsIHx8ICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgY29tcHV0ZU9uQ2FuY2VsRXZlbnQpKSB8fCByZWNvbXB1dGUgfHxcclxuICAgICAgICB6ZXJvUmVhbCB8fCByZWMuaXNOZXdSZWMoKSAmJiAhcmVjLmlzQ29tcHV0ZWQoKSkpIHtcclxuICAgICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpICYmICF0aGlzLlBhcnRPZkRhdGF2aWV3KSkge1xyXG4gICAgICAgIC8vIFFDUiAjNzc1NTA4OiBmb3IgZGF0YXZpZXdzLCB3aGljaCBhcmUgY29tcHV0ZWQgYnkgdGhlIHNlcnZlciwgcHJldmVudFxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgaW5pdCBleHByZXNzaW9uIHdoaWxlIGluIGNvbXB1dGUgb2YgdGhlIHJlY29yZCBiZWNhdXNlIHRoZVxyXG4gICAgICAgIC8vIHNlcnZlciBoYXZlIGFscmVhZHkgZG9uZSBpdFxyXG4gICAgICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuY29tcHV0ZUJ5Q2xpZW50KCkgfHxcclxuICAgICAgICAgICFyZWMuSW5Db21wdXRlIHx8IHplcm9SZWFsIHx8IHJlYy5sYXRlQ29tcHV0ZSgpKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5faW5pdEV4cCAhPSBudWxsKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUluaXRFeHByZXNzaW9uKHJlc3VsdCwgaXNOdWxsRmxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHplcm9SZWFsKVxyXG4gICAgICAgICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSkge1xyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSByZXN1bHQudmFsdWU7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSBpc051bGxGbGQudmFsdWU7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNldFZhbHVlKHJlc3VsdC52YWx1ZSwgaXNOdWxsRmxkLnZhbHVlLCByZWNvbXB1dGUsIGZhbHNlLCByZWNvbXB1dGUgJiYgIXRoaXMuX2lzVmlydHVhbCwgZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV2YWx1YXRlIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV2YWx1YXRlSW5pdEV4cHJlc3Npb24ocmVzdWx0OiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGxGbGQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5faW5pdEV4cCAhPT0gbnVsbCk7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9pbkV2YWxQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgcmVzdWx0LnZhbHVlID0gYXdhaXQgdGhpcy5faW5pdEV4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHRoaXMuX3R5cGUsIHRoaXMuX3NpemUpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2luRXZhbFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpc051bGxGbGQudmFsdWUgPSAocmVzdWx0LnZhbHVlID09PSBudWxsKTtcclxuICAgIGlmIChpc051bGxGbGQudmFsdWUgJiYgdGhpcy5OdWxsQWxsb3dlZCkge1xyXG4gICAgICByZXN1bHQudmFsdWUgPSB0aGlzLmdldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLy8vXHJcbiAgLy8vLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLy8vIDxwYXJhbSBuYW1lPVwicmVjb21wdXRlXCI+PC9wYXJhbT5cclxuICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgLy8gYm9vbCBTaG91bGRSZWNvbXB1dGUoYm9vbCByZWNvbXB1dGUpXHJcbiAgLy8ge1xyXG4gIC8vICAgaWYgKHJlY29tcHV0ZSlcclxuICAvLyAgIHtcclxuICAvLyAgICAgIGJvb2wgY29tcHV0ZWRCeUZldGNoID0gIUlzVmlydHVhbCB8fCBWaXJBc1JlYWw7XHJcbiAgLy8gICAgICBpZiAoY29tcHV0ZWRCeUZldGNoKVxyXG4gIC8vICAgICAge1xyXG4gIC8vICAgICAgICAgVGFzayB0YXNrID0gKFRhc2spZ2V0VGFzaygpO1xyXG4gIC8vICAgICAgICAgRGF0YXZpZXdIZWFkZXJCYXNlIGhlYWRlciA9IHRhc2suZ2V0RGF0YXZpZXdIZWFkZXJzKCkuZ2V0RGF0YXZpZXdIZWFkZXJCeUlkKF9kYXRhdmlld0hlYWRlcklkKTtcclxuICAvLyAgICAgICAgIC8vbG9jYWwgZGF0YXZhc2UgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVjb3JkIGFzIHNlcnZlciBkb2VzXHJcbiAgLy8gICAgICAgICBpZiAoaGVhZGVyIGlzIExvY2FsRGF0YXZpZXdIZWFkZXIpXHJcbiAgLy8gICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgdmFyIHJlYyA9ICgoRGF0YVZpZXcpX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuICFyZWMuSW5Db21wdXRlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHJlY29tcHV0ZTtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja051bGxBcml0aG1ldGljXCI+aWYgdHJ1ZSB0aGVuIHRoZSBudWxsIGFyaXRobWV0aWMgZW52aXJvbm1lbnRcclxuICAvLy8gICBzZXR0aW5nIGlzIHVzZWQgdG8gcmV0dXJuIG51bGwgd2hlbiBcIm51bGxpZnlcIiBjb21wdXRhdGlvbiBpcyBuZWVkZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICBnZXRWYWx1ZShjaGVja051bGxBcml0aG1ldGljOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgIGlmICgoPFRhc2s+c3VwZXIuZ2V0VGFzaygpKS5nZXRFdmFsT2xkVmFsdWVzKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmICh0aGlzLl9pbnZhbGlkVmFsdWUpXHJcbiAgICAgIHRoaXMudGFrZVZhbEZyb21SZWMoKTtcclxuICAgIGlmICh0aGlzLl9pc051bGwpXHJcbiAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWMpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaXNDaGFuZ2VkKG5ld1ZhbHVlOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZWYWx1ZSAhPT0gbnVsbCAmJiAoISh0aGlzLl9wcmV2VmFsdWUgPT09IG5ld1ZhbHVlKSB8fCB0aGlzLl9wcmV2SXNOdWxsICE9PSBpc051bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJ5IHRha2luZyBpdCBmcm9tIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdGFrZVZhbEZyb21SZWMoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAocmVjICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3ZhbCA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgdGhpcy5faXNOdWxsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIGlmIChyZWMgIT09IG51bGwgJiYgdGhpcy5fY2F1c2VUYWJsZUludmFsaWRhdGlvbiAmJiB0aGlzLmlzQ2hhbmdlZCh0aGlzLl92YWwsIHRoaXMuX2lzTnVsbCkgJiYgdGhpcy5fZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWUgPSB0aGlzLl92YWw7XHJcbiAgICAgIHRoaXMuX3ByZXZJc051bGwgPSB0aGlzLl9pc051bGw7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gWkVSTyBUSEUgVkVDVE9SIE9CSkVDVFxyXG4gICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZmllbGQgd2l0aG91dCB1cGRhdGluZyB0aGUgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIGxldCBvcmlnaW5hbFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0T3JpZ2luYWxSZWMoKTtcclxuXHJcbiAgICBpZiAob3JpZ2luYWxSZWMuSXNOdWxsKHRoaXMuX2lkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gb3JpZ2luYWxSZWMuR2V0RmllbGRWYWx1ZSh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaXMgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkIHdhcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc09yaWdpbmFsVmFsdWVOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG9yaWdpbmFsUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRPcmlnaW5hbFJlYygpO1xyXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIGJ5IHJlYyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRWYWx1ZUJ5UmVjSWR4KGlkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgICBsZXQgZmllbGRWYWx1ZTogc3RyaW5nID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG4gICAgcmV0dXJuIHJlYy5Jc051bGwodGhpcy5faWQpID8gdGhpcy5nZXRWYWx1ZUZvck51bGwoZmFsc2UpIDogZmllbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgbW9kaWZpZWRBdExlYXN0T25jZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1vZGlmaWVkQXRMZWFzdE9uY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllZEF0TGVhc3RPbmNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBudWxsIGlmIHZhbHVlIG9mIGZpZWxkIGZvciB0aGUgcmVjb3JkIGlzIG51bGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+cmVjb3JkIGlkeDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxCeVJlY0lkeChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgoaWR4KTtcclxuICAgIHJldHVybiByZWMuSXNOdWxsKHRoaXMuX2lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgZmllbGQncyB2YWx1ZSBmb3IgcmVjb3JkIGlkeCByZWNpZHggZXF1YWxzIHRvIG1nVmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsdWVcIj52YWx1ZSB0byBjb21wYXJlICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbEZsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPnR5cGUgb2YgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY0lkeFwiPnJlY0lkeCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRXF1YWwobWdWYWx1ZTogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHJlY0lkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVjID0gPFJlY29yZD4oKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0UmVjQnlJZHgocmVjSWR4KSk7XHJcbiAgICBsZXQgdmFsc0VxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgICAgbGV0IGZpZWxzSXNOdWxsOiBib29sZWFuID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwoZmllbGRWYWx1ZSwgZmllbHNJc051bGwsIHRoaXMuX3R5cGUsIG1nVmFsdWUsIGlzTnVsbEZsZCwgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsc0VxdWFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGluc2VydGVkIGludG8gYSBuZXcgcmVjLCB3aGVuIGl0XHJcbiAgLy8vICAgaXMgY3JlYXRlZC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZSwgdW5sZXNzIHRoZXJlIGlzIGFcclxuICAvLy8gICB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgYW4gaW5pdCBleHByZXNzaW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjdXJyZW50IHZhbHVlIHdpbGwgYmVcclxuICAvLy8gICByZXR1cm5lZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsb2JiZXJlZE9ubHlcIj5jbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBvbmx5IHRha2UgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIGdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2lzVmlydHVhbCAmJiB0aGlzLl9pbml0RXhwID09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgICByZXR1cm4gIWNsb2JiZXJlZE9ubHkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsOiBzdHJpbmcsIGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjb21wdXRlOiBib29sZWFuLCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuLCBpc0FyZ1VwZGF0ZTogYm9vbGVhbiwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGVuZm9yY2VWYXJpYWJsZUNoYW5nZSkpXHJcbiAgICAgIGVuZm9yY2VWYXJpYWJsZUNoYW5nZSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlXzEodmFsLCBpc051bGxGbGQsIHJlY29tcHV0ZSwgc2V0UmVjb3JkVXBkYXRlZCwgaXNBcmdVcGRhdGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIHRoZSBzZXQgdmFsdWUgZnVuY3Rpb24gZnJvbSB0aGUgXCJvdXRlclwiIHdvcmxkLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgcmVjb21wdXRlXHJcbiAgLy8vICAgY2hhaW4uIFdoZW4gcmVjb21wdXRlIGlzIGRvbmUgLSByZWZyZXNoIGNvbnRyb2xzIHdoaWNoIGFyZSBleHByZXNzaW9uIGRlcGVuZGVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj5pZiB0cnVlIHRoZW4gdGhlIHZhbHVlIGlzIG51bGw8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZVwiPnN0YXRlcyB3aGV0aGVyIHRvIGV4ZWN1dGUgcmVjb21wdXRlIHdoZW4gc2V0dGluZyB0aGUgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZU9ubHlXaGVuVXBkYXRlVmFsdWVcIj46IGRvIHRoZSByZWNvbXB1dGUgb25seSB3aGVuIHRoZSB2YWx1ZSB3YXMgdXBkYXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRVcGRhdGVkXCI+dGVsbHMgd2hldGhlciB0byBkZWZpbmUgdGhlIHJlY29yZCBhcyB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0FyZ1VwZGF0ZVwiPnRydWUgaWYgY2FsbGVkIGZvciBoYW5kbGVyIGFyZ3VtZW50LXBhcmFtZXRlciBjb3B5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmZvcmNlVmFyaWFibGVDaGFuZ2VcIj5leGVjdXRlIHZhaWFibGUgY2hhbmdlIGV2ZW4gd2hlbiByZWNvbXB1dGUgaXMgZmFsc2U8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZV8xKHZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYXJpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QrKztcclxuXHJcbiAgICBsZXQgdmFsdWVXYXNVcGRhdGVkOiBib29sZWFuID0gYXdhaXQgdGhpcy5zZXRWYWx1ZSh2YWwsIGlzTnVsbEZsZCwgcmVjb21wdXRlLCBzZXRSZWNvcmRVcGRhdGVkLCAhdGhpcy5faXNWaXJ0dWFsLCBpc0FyZ1VwZGF0ZSwgZW5mb3JjZVZhcmlhYmxlQ2hhbmdlKTtcclxuXHJcbiAgICAvLyBBIGZpZWxkIHRoYXQgaXMgYW4gZXZlbnQgaGFuZGxlciBmaWVsZCBjYW5ub3QgYXBwZWFyIGFzIGEgcHJvcGVydHkgaW4gZ3VpLiBubyBuZWVkIHRvIHJlZnJlc2ggYWxsXHJcbiAgICAvLyBmb3JtK2NvbnRyb2xzIHByb3BlcnRpZXMgZXhwcmVzc2lvbnMgZm9yIGl0LlxyXG4gICAgaWYgKHRhc2sgIT09IG51bGwgJiYgdGFzay5WZXdGaXJzdCA9PT0gMSAmJiB0aGlzLl9mb3JtICE9PSBudWxsICYmICF0aGlzLklzRXZlbnRIYW5kbGVyRmllbGQpIHtcclxuICAgICAgaWYgKHJlY29tcHV0ZSAmJiB2YWx1ZVdhc1VwZGF0ZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZm9ybS5yZWZyZXNoT25FeHByZXNzaW9ucygpO1xyXG5cclxuICAgIH1cclxuICAgIGlmICh0YXNrICE9IG51bGwpXHJcbiAgICAgIHRhc2suVmV3Rmlyc3QtLTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmQgYW5kIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gIC8vLyAgIHRoZSBmaWVsZCBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWwgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdWYWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsRmxkXCI+aWYgdHJ1ZSB0aGVuIHRoZSB2YWx1ZSBpcyBudWxsPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvbXB1dGVcIj5zdGF0ZXMgd2hldGhlciB0byBleGVjdXRlIHJlY29tcHV0ZSB3aGVuIHNldHRpbmcgdGhlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRSZWNvcmRNb2RpZmllZFwiPnN0YXRlcyB3aGV0aGVyIHRvIGRlZmluZSB0aGUgcmVjb3JkIGFzIG1vZGlmaWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRDcnNyTW9kaWZpZWRcIj5zdGF0ZXMgd2hldGhlciB0byBkZWZpbmUgdGhlIGN1cnNvciBvZiB0aGUgZmllbGQgYXMgbW9kaWZpZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQXJnVXBkYXRlXCI+dHJ1ZSBpZiBjYWxsZWQgZm9yIGhhbmRsZXIgYXJndW1lbnQtcGFyYW1ldGVyIGNvcHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50aGUgcmV0dXJuIHZhbHVlIHdhcyB1cGRhdGVkIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHNldFZhbHVlKG5ld1ZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkTW9kaWZpZWQ6IGJvb2xlYW4sIHNldENyc3JNb2RpZmllZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYWxpYWJsZUNoYW5nZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkO1xyXG4gICAgbGV0IHJlY0ZsZFZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHZhbHNFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlbWFpbmRlcjogbnVtYmVyO1xyXG4gICAgbGV0IHplcm9SZWFsOiBib29sZWFuO1xyXG4gICAgbGV0IGFyZ3M6IEFyZ3VtZW50c0xpc3QgPSBudWxsO1xyXG4gICAgbGV0IG1haW5DdHJsID0gdGhpcy5nZXRDdHJsKCk7XHJcbiAgICBsZXQgcGVuZGluZ0V2ZW50czogbnVtYmVyO1xyXG4gICAgbGV0IGV2dHM6IExpc3Q8RmllbGQgfCBSdW5UaW1lRXZlbnQ+O1xyXG4gICAgbGV0IGZvcmNlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY2hlY2tGb3JWYXJpYWJsZUNoYW5nZTogYm9vbGVhbiA9IHJlY29tcHV0ZSB8fCBlbmZvcmNlVmFsaWFibGVDaGFuZ2U7XHJcblxyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz50aGlzLmdldFRhc2soKTtcclxuICAgIGlmICh0aGlzLl9mb3JtID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9mb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsRmxkICYmICF0aGlzLk51bGxBbGxvd2VkICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbmV3VmFsID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgaXNOdWxsRmxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIzgwNTM2NDogRm9yIGFueSBmaWVsZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGluIGZpZWxkIGFzIGl0IGlzICh3aXRob3V0IGNoZWNraW5nIHRoZSBwaWN0dXJlKS5cclxuICAgIC8vIEJ1dCBmb3IgTnVtZXJpYyBmaWVsZCwgaWYgcGljdHVyZSBkb2VzIG5vdCBjb250YWluIGRlY2ltYWxzIHRoZW4gd2Ugc2hvdWxkIHJvdW5kIG9mZiB0aGUgdmFsdWUgYW5kIHRoZW4gc2F2ZSB0aGlzIHZhbHVlIGluIGZpZWxkXHJcbiAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBnaXZlIHdyb25nIGNhbGN1bGF0aW9uLiBTbyBhbHdheXMgcm91bmQgb2ZmIHRoZSB2YWx1ZSBkZXBlbmRpbmcgb24gcGljdHVyZSdzIGRlY2ltYWwuXHJcbiAgICAvLyBjaGVjayBpZiBuZXdWYWwgaXMgXCJsb25nXCIgc2luY2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHJvdW5kIGFuIGFscmVhZHkgd2hvbGUgbnVtYmVyXHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDICYmIG5ld1ZhbCAhPSBudWxsICYmICFOVU1fVFlQRS5udW1IZXhTdHJJc0xvbmcobmV3VmFsKSkge1xyXG4gICAgICBsZXQgbnVtVmFsID0gbmV3IE5VTV9UWVBFKG5ld1ZhbCk7XHJcbiAgICAgIGxldCBwaWMgPSBuZXcgUElDKHRoaXMuX3BpY3R1cmUsIHRoaXMuX3R5cGUsIHN1cGVyLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICBsZXQgZGVjczogbnVtYmVyID0gcGljLmdldERlYygpO1xyXG4gICAgICBudW1WYWwucm91bmQoZGVjcyk7XHJcbiAgICAgIG5ld1ZhbCA9IG51bVZhbC50b1hNTHJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlYyA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlJUX1NUUl9OT19SRUNTX0lOX1JORykpO1xyXG5cclxuICAgIC8vIGRvbid0IGFsbG93IHVwZGF0aW5nIFJFQUwgZmllbGRzLCB1bmxlc3MgJ2FsbG93IHVwZGF0ZSBpbiBxdWVyeSBtb2RlJyBpcyBzZXQgdG8gVFJVRVxyXG4gICAgaWYgKCF0aGlzLklzVmlydHVhbCAmJlxyXG4gICAgICAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSlcclxuICAgICAgICB8fCByZWMuSW5Gb3JjZVVwZGF0ZSAmJiByZWMuSW5Db21wdXRlKSlcclxuICAgICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcblxyXG4gICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheSgyKTtcclxuICAgICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgZmFsc2UsXHJcbiAgICAgICAgKG1haW5DdHJsICE9PSBudWxsICYmIG1haW5DdHJsLklzSW50ZXJhY3RpdmVVcGRhdGVcclxuICAgICAgICAgID8gRmllbGQuTlVNMC50b1hNTHJlY29yZCgpXHJcbiAgICAgICAgICA6IEZpZWxkLk5VTTEudG9YTUxyZWNvcmQoKSkpO1xyXG4gICAgICBhcmdzTGlzdFsxXSA9IG5ldyBFeHBWYWwodGhpcy5nZXRUeXBlKCksIHRoaXMuaXNOdWxsKCksIHRoaXMuZ2V0VmFsdWUoZmFsc2UpKTtcclxuICAgICAgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIH1cclxuICAgIGlmIChtYWluQ3RybCAhPSBudWxsKVxyXG4gICAgICBtYWluQ3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBmaWVsZCBpbiB0aGUgY3VycmVudCByZWNvcmRcclxuICAgIGlmICh0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBub3QgY2hhcmFjdGVycyAoSlBOOiBEQkNTIHN1cHBvcnQpXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbClcclxuICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9zaXplIC0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIobmV3VmFsKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJlbWFpbmRlciA9IDA7XHJcblxyXG4gICAgICBpZiAobmV3VmFsICE9IG51bGwgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IgJiZcclxuICAgICAgICByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihuZXdWYWwsIHRoaXMuX3NpemUpO1xyXG4gICAgICBlbHNlIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHJlbWFpbmRlciA+IDApXHJcbiAgICAgICAgdGhpcy5fdmFsID0gbmV3VmFsICsgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IEJsb2JUeXBlLmNvcHlCbG9iKHRoaXMuX3ZhbCwgbmV3VmFsKTtcclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsKVxyXG4gICAgICAgIHJlbWFpbmRlciA9IHRoaXMuX3NpemUgLSBuZXdWYWwubGVuZ3RoO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVtYWluZGVyID0gMDtcclxuXHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbCAmJiB0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUiAmJiByZW1haW5kZXIgPCAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IG5ld1ZhbC5zdWJzdHIoMCwgdGhpcy5fc2l6ZSk7XHJcbiAgICAgIGVsc2UgaWYgKCh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgJiYgcmVtYWluZGVyID4gMClcclxuICAgICAgICB0aGlzLl92YWwgPSBuZXdWYWwgKyAgTlN0cmluZy5Gcm9tQ2hhcnModGhpcy5fc3BhY2VzLCAwICwgcmVtYWluZGVyKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIF92YWwgaXMgbm90IG51bGwsIHNvIHRoYXQgdGhlIGJsb2IgY29weSB3aWxsIGJlXHJcbiAgICAgICAgLy8gZG9uZSBjb3JyZWN0bHksIGFjY29yZGluZyB0byB0aGUgZmllbGQncyBibG9iIHR5cGUuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCA9PT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl92YWwgPSBCbG9iVHlwZS5jb3B5QmxvYih0aGlzLl92YWwsIG5ld1ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB0aGlzLl92YWwgPSBuZXdWYWw7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBkb3RuZXQgdmFyIGlzIHVwZGF0ZWQgd2l0aCBuZXcgYmxvYnByZWZpeCwgdmFsc0VxdWFsIGlzIGZhbHNlLCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIHJlY29yZC5cclxuICAgIHtcclxuICAgICAgcmVjRmxkVmFsID0gcmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG5cclxuICAgICAgLy8gSW4gb3JkZXIgdG8gY29tcGFyZSwgSWYgdmlydHVhbCdzIG9sZCB2YWx1ZSBpcyB0YWtlbiBmcm9tIHJlY29yZCwgdGhlbiBvbGQgaXNOdWxsIHZhbHVlIGFsc28gc2hvdWxkIGJlIHRha2VuIGZyb20gcmVjb3JkLlxyXG4gICAgICAvLyBUaGlzIHNob3VsZCBiZSBkb25lIG9ubHkgaWYgbm90IGluIHJlLWNvbXB1dGUgLyBub3QgYXJndW1lbnQgLyBubyBpbml0RXhwLilcclxuICAgICAgLy8gTWFpbmx5ICwgdGhpcyBpcyBuZWVkZWQsIHdoZW4gY3Vyc29yIGlzIHBhcmtlZCBvbiBvbmUgcmVjb3JkIGFuZCB2aXJ0dWFsIGlzIG1vZGlmaWVkIGZyb20gbnVsbCB0byBub25udWxsIG9yIHZpY2V2ZXJzYSBhbmRcclxuICAgICAgLy8gbm93IGlmIGN1cnNvciBtb3ZlcyBmcm9tIG9uZSByZWNvcmQgdG8gbmV4dCByZWNvcmQsIFdlIG5lZWQgdG8gIGdldCB0aGUgb2xkIG51bGwgdmFsdWUgZnJvbSByZWNvcmQuXHJcblxyXG4gICAgICBsZXQgb2xkTnVsbFZhbDogYm9vbGVhbiA9IHRoaXMuX2lzTnVsbDtcclxuICAgICAgaWYgKCFyZWNvbXB1dGUgJiYgIWlzQXJnVXBkYXRlICYmIHRoaXMuX2luaXRFeHAgPT0gbnVsbClcclxuICAgICAgICBvbGROdWxsVmFsID0gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbHNFcXVhbCA9IEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwodGhpcy5fdmFsLCBpc051bGxGbGQsIHRoaXMuX3R5cGUsIHJlY0ZsZFZhbCwgb2xkTnVsbFZhbCwgdGhpcy5fdHlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgIHRoaXMuX3ZhbCA9IHRoaXMuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB2YWxzRXF1YWwgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIC8vIHplcm8gdGhlIHZlY3RvclxyXG4gICAgaWYgKHRoaXMuX2NsZWFyVmVjdG9yVHlwZSlcclxuICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICByZWMuY2xlYXJGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG4gICAgfVxyXG4gICAgLy8gZHVyaW5nIGNvbXB1dGUsIHdlIHNob3VsZCB6ZXJvIGZpZWxkcyB3aGljaCBiZWxvbmcgdG8gbGluayBjcmVhdGUuXHJcbiAgICB6ZXJvUmVhbCA9IHRoaXMuX2xpbmtDcmVhdGUgJiYgcmVjLkluQ29tcHV0ZSAmJiAhcmVjb21wdXRlICYmICh0aGlzLl9mb3JtID09IG51bGwgfHwgIXRoaXMuX2Zvcm0uSW5SZXN0b3JlKSAmJlxyXG4gICAgICAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuXHJcbiAgICAvLyBWaXJ0dWFscyB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBhcmUgY29waWVkIGZyb20gb25lIHJlY29yZCB0byBhbm90aGVyLCBldmVuIGF0XHJcbiAgICAvLyBjb21wdXRlIHRpbWUgKG5vIHJlY29tcHV0ZSkuIE5ldmVydGhlbGVzcywgaW4gY2FzZSB0aGVpciB2YWx1ZSBjaGFuZ2VzLCB3ZSBtdXN0XHJcbiAgICAvLyBwZXJmb3JtIHJlY29tcHV0ZS5cclxuICAgIGlmICgodGhpcy5faXNWaXJ0dWFsIHx8IHplcm9SZWFsKSAmJiAhcmVjLmlzTmV3UmVjKCkgJiYgIXZhbHNFcXVhbClcclxuICAgICAgZm9yY2VVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZWNvbXB1dGUgaXMgZmFsc2UgaXQgbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBzZXR0aW5nIGEgdmFsdWVcclxuICAgIC8vIHRoYXQgaXRzIHNvdXJjZSBpcyB0aGUgcmVjb3JkLCB0aHVzLCB3ZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSB0aGUgcmVjb3JkLlxyXG4gICAgLy8gaWYgdGhlIHJlY29tcHV0ZSBpcyB0cnVlLCBnbyBhaGVhZCBhbmQgdXBkYXRlIHRoZSByZWNvcmQuXHJcbiAgICBpZiAoY2hlY2tGb3JWYXJpYWJsZUNoYW5nZSB8fCBmb3JjZVVwZGF0ZSB8fCByZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICB0aGlzLlVwZGF0ZU51bGwoaXNOdWxsRmxkLCByZWMpO1xyXG5cclxuICAgICAgaWYgKHNldENyc3JNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRCk7XHJcbiAgICAgIHJlYy5zZXRGaWVsZFZhbHVlKHRoaXMuX2lkLCB0aGlzLl92YWwsIHNldFJlY29yZE1vZGlmaWVkKTtcclxuICAgICAgZXZ0cyA9IEZpZWxkLl92YXJpYWJsZUNoYW5nZUV2dHM7XHJcbiAgICAgIHBlbmRpbmdFdmVudHMgPSBldnRzLmxlbmd0aDtcclxuICAgICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpICYmICFldnRzLkNvbnRhaW5zKHRoaXMpICYmICF2YWxzRXF1YWwpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhcmlhYmxlIGNoYW5nZSBoYW5kbGVyIC0gc2F2ZSB2YWx1ZSBhbmQgcHJlcGFyZSBwYXJhbXNcclxuICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSk7XHJcbiAgICAgICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuICAgICAgICBldnRzLnB1c2godGhpcyk7XHJcbiAgICAgICAgZXZ0cy5wdXNoKHJ0RXZ0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgZm9yIHJlY29tcHV0ZSBhbmQgZXhlY3V0ZSBpdFxyXG4gICAgICAvLyBRQ1IgIzI5OTYwOSwgaWYgd2UgYXJlIGluIGxvY2FsIGRhdGF2aWV3IG1hbmFnZXIsIHdlIGNhbiBvbmx5IGNvbXB1dGUuXHJcbiAgICAgIC8vIFJlY29tcHV0ZSBpcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgd2lsbCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lc1xyXG4gICAgICBpZiAodGhpcy5fcmVjb21wdXRlICE9IG51bGwgJiYgKHJlY29tcHV0ZSB8fCBmb3JjZVVwZGF0ZSkgJiYgISg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkluTG9jYWxEYXRhdmlld0NvbW1hbmQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gaWYgZmllbGQgY2F1c2VkIHRhYmxlIGludmFsaWRhdGlvbiBhbmQgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZFxyXG4gICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKVxyXG4gICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWNvbXB1dGUuZXhlY3V0ZShyZWMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICBpZiAoZm9yY2VVcGRhdGUpXHJcbiAgICAgICAgICAgIHJlYy5JbkZvcmNlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uICYmIHRoaXMuaXNDaGFuZ2VkKHRoaXMuX3ZhbCwgaXNOdWxsRmxkKSlcclxuICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAvLyBEb24ndCB1cGRhdGUgY29udHJvbHMgd2hpbGUgZmV0Y2hpbmcgcmVjb3JkcyBmcm9tIGxvY2FsIGRhdGFiYXNlLiBJZiB0aGUgdGFzayBoYXMgYSB0YWJsZSBjb250cm9sLCB0aGVuIGFjdHVhbCBjb250cm9scyBvbiB0aGVcclxuICAgICAgLy8gcm93cyBhcmUgY3JlYXRlZCBhZnRlciBuby4gb2Ygcm93cyBpcyBrbm93biAoYW5kIHRoaXMgaXMgYWZ0ZXIgdGhlIGRhdGEgaXMgYXZhaWFsYWJsZSkuIFNvLCB3aGlsZSBmZXRjaGluZyByZWNvcmRzLCBjb250cm9scyBpblxyXG4gICAgICAvLyB0YWJsZSBhcmUgbm90IHlldCBjcmVhdGVkIGFuZCBoZW5jZSB0aGVyZSBpcyBhbiBhc3NlcnQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29udHJvbHMuIEFmdGVyIHNraXBwaW5nIHRoaXMgdXBkYXRlLCB0aGUgY29udHJvbHNcclxuICAgICAgLy8gYXJlIHVwZGF0ZWQgZnJvbSBvdGhlciBwbGFjZXMgKHJlZnJlc2hUYWJsZSwgY29tbW9uSGFuZGxlckJlZm9yZSwgaGFuZGxlUm93RGF0YUN1clBhZ2UgZXRjIGxpa2UgaXQgaGFwcGVucyBmb3Igc2VydmVyIGRhdGEpXHJcbiAgICAgIGlmICgocmVjb21wdXRlIHx8IGZvcmNlVXBkYXRlKSAmJiAhKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuSW5Mb2NhbERhdGF2aWV3Q29tbWFuZCAmJiBtYWluQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1haW5DdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJpZ2h0IGFmdGVyIHdlIGV4aXQgdGhlIHRvcG1vc3QgdXBkYXRlIC0gZXhlY3V0ZSBhbGwgdmFyaWFibGUgY2hhbmdlIGV2ZW50cy5cclxuICAgICAgLy8gbm90ZSB0aGF0IGR1cmluZyB0aGlzIGV4ZWN1dGlvbiwgbmV3IG9uZXMgbWF5IGJlIGNyZWF0ZWQuXHJcbiAgICAgIGlmIChwZW5kaW5nRXZlbnRzID09PSAwICYmIGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgJiYgdGhpcy5nZXRIYXNDaGFuZ2VFdmVudCgpKSB7XHJcbiAgICAgICAgd2hpbGUgKGV2dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGV2dCA9IDxSdW5UaW1lRXZlbnQ+ZXZ0cy5nZXRfSXRlbSgxKTtcclxuICAgICAgICAgIGV2dHMuUmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgICBldnRzLlJlbW92ZUF0KDApO1xyXG4gICAgICAgICAgaWYgKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSA9PSBudWxsKVxyXG4gICAgICAgICAgICBldnQuc2V0VGFzayg8VGFzaz50aGlzLmdldFRhc2soKSk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhc2tSZWY6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB2YXJpYWJsZSBjaGFuZ2UgZXZlbnQgYW5kIFRhc2tTdWZmaXggaXMgZXhlY3V0ZWQsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIGZyb21cclxuICAgICAgICAgICAgLy8gdXBkYXRlIGFyZ3VtZW50cyB3aGlsZSBjbG9zaW5nIHRoZSB0YXNrLiBJbiBzdWNoIGNhc2UsIHdlIHNob3VsZCBzZXQgdGhlIGV2ZW50IHRhc2sgYXMgUGF0aFBhcmVudFRhc2tcclxuICAgICAgICAgICAgLy8gYW5kIG5vdCB0aGUgdGFzayBpdHNlbGYuXHJcbiAgICAgICAgICAgIGlmICh0YXNrUmVmLlRhc2tTdWZmaXhFeGVjdXRlZCkge1xyXG4gICAgICAgICAgICAgIHRhc2tSZWYgPSAodGFza1JlZi5QYXRoUGFyZW50VGFzayAhPSBudWxsKSA/IDxUYXNrPnRhc2tSZWYuUGF0aFBhcmVudFRhc2sgOiB0YXNrUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGV2dC5zZXRUYXNrKHRhc2tSZWYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZXZ0LnNldEN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KGV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gIzc3NjAzMSAtIHRoZSBmaWVsZCBzaG91bGQgYmUgbWFya2VkIG1vZGlmaWVkIG9ubHkgaWYgdmFsIGFyZSBub3QgZXF1YWwuIE90aGVyd2lzZSwgZXZlbiBmb3IgbnVsbCBmaWVsZCBwYXJhbXRlciBwYXNzaW5nXHJcbiAgICAvLyBvciBzYW1lIHZhbHVlIHVwZGF0ZSwgaXQgaXMgbWFya2VkIGFzIG1vZGlmaWVkIGFuZCBSUyBpcyBleGVjdXRlZC5cclxuICAgIGlmIChyZWNvbXB1dGUgJiYgIXZhbHNFcXVhbClcclxuICAgICAgdGhpcy5zZXRNb2RpZmllZCgpO1xyXG4gICAgcmV0dXJuICF2YWxzRXF1YWw7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVOdWxsKGlzTnVsbEZsZDogYm9vbGVhbiwgcmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxGbGQpXHJcbiAgICAgIHJlYy5zZXRGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19OVUxMKTtcclxuICAgIGVsc2VcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTlVMTCk7XHJcbiAgICB0aGlzLl9pc051bGwgPSBpc051bGxGbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgdmVjIGNlbGxcclxuICAvLy8gICBjYW4gbm90IGJlIGV4ZWN1dGVkIHdpdGhvdXQgdGhlIGxvZ2ljIGZyb20gZXZhbF9vcF92ZWNHZXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGNlbGwgaW5kZXggaW4gdGhlIHZlY3RvciBzdHJhdHMgZnJvbSAxPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnRoZSBuZXcgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsSXNOdWxsXCI+aXMgdGhlIGJldyB2YWx1ZSBudWxsPC9wYXJhbT5cclxuICBhc3luYyBzZXRDZWxsVmVjVmFsdWUoaWR4OiBudW1iZXIsIG5ld1ZhbDogc3RyaW5nLCB2YWxJc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIC8vIGluaXRpYWxpemVkIHRoZSB2ZWN0b3Igb2JqZWN0IGlmIG5lZWRlZFxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdmVjdG9yVHlwZSA9IHRoaXMuaXNOdWxsKClcclxuICAgICAgICAgID8gbmV3IFZlY3RvclR5cGUodGhpcy5fdmVjQ2VsbHNUeXBlLCB0aGlzLl92ZWNDZWxsc0NvbnRlbnRUeXBlLCB0aGlzLkRlZmF1bHRWYWx1ZSwgdGhpcy5pc051bGxEZWZhdWx0KCksXHJcbiAgICAgICAgICB0aGlzLk51bGxBbGxvd2VkLCB0aGlzLl92ZWNDZWxsc1NpemUpXHJcbiAgICAgICAgICA6IG5ldyBWZWN0b3JUeXBlKHRoaXMuX3ZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdmVjQ2VsbHNUeXBlIGlzIEJMT0IsIGNvbnZlcnQgZGF0YSBpbnRvIGJsb2JcclxuICAgICAgaWYgKHRoaXMuX3ZlY0NlbGxzVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgbGV0IHRtcE5ld1ZhbDogc3RyaW5nID0gdGhpcy5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICAgICAgbmV3VmFsID0gQmxvYlR5cGUuY29weUJsb2IodG1wTmV3VmFsLCBuZXdWYWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXMgPSB0aGlzLl92ZWN0b3JUeXBlLnNldFZlY0NlbGwoaWR4LCBuZXdWYWwsIHZhbElzTnVsbCk7XHJcbiAgICAgIC8vIHN0YXJ0IHJlY29tcHV0ZVxyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJWZWN0b3JUeXBlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSIDk4NDU2MyBkbyBub3Qgc2V0IHRoZSByZWNvcmQgYXMgY2hhbmdlZFxyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl92ZWN0b3JUeXBlLnRvU3RyaW5nKCksIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyVmVjdG9yVHlwZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2VsbCB2YWx1ZSBvZiBhIGdpdmVuIGNlbGwgaW4gdGhlIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY2VsbCdzIHZhbHVlIGFzIHN0cmluZzwvcmV0dXJucz5cclxuICBnZXRWZWNDZWxsVmFsdWUoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgLy8gaWYgd2UgYXJlIGhlcmUgdGhhbiB0aGUgZmlsZWQgbXVzdCBoYXZlIG5vbmUgbnVsbCB2YWx1ZSBvZiBhIHZlY3RvclxyXG4gICAgICBpZiAodGhpcy5fdmVjdG9yVHlwZSA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX3ZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZSh0aGlzLl92YWwpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuX3ZlY3RvclR5cGUuZ2V0VmVjQ2VsbChpZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByZWNvbXB1dGVkIHZhcmlhYmxlIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFJlY29tcHV0ZWQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW52YWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbiBpbnZhbGlkIHZhbHVlIGZvcmNlcyB1cyB0byByZS1jYWxjdWxhdGUgdGhlIGZpZWxkJ3NcclxuICAvLy8gICB2YWx1ZSBieSBjb3B5aW5nIGl0IGZyb20gdGhlIGRhdGF2aWV3LlxyXG4gIC8vLyAgIHVzZWQgd2hlbiBzd2l0Y2hpbmcgdG8gYW5vdGhlciByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VJbnZhbGlkYXRlXCI+LSBEb250IGNoZWNrIHRoZSBmaWVsZCdzIHR5cGUgYW5kIG1ha2UgaXQgaW52YWxpZCAodXN1YWxseSBWaXJ0dWFsc1xyXG4gIC8vLyAgIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGFyZSBuZXZlciBpbnZhbGlkYXRlZCwgc2luY2UgdGhleSByZXRhaW4gdGhlaXIgdmFsdWUgd2hlbiBtb3ZpbmdcclxuICAvLy8gICBiZXR3ZWVuIHJlY29yZHMpLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNsZWFyRmxhZ3NcIj48L3BhcmFtPlxyXG4gIGludmFsaWRhdGUoZm9yY2VJbnZhbGlkYXRlOiBib29sZWFuLCBjbGVhckZsYWdzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1ZpcnR1YWwgfHwgdGhpcy5fdmlyQXNSZWFsIHx8IHRoaXMuX2luaXRFeHAgIT09IG51bGwgfHwgZm9yY2VJbnZhbGlkYXRlKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRWYWx1ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY2xlYXJGbGFncyAmJiByZWMgIT09IG51bGwpIHtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfVVBEQVRFRCk7XHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgTmFtZSBvZiB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldFRhYmxlTmFtZSgpOiBTdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGdldCBWQVJOQU1FIGZ1bmN0aW9uIHVzZVxyXG4gIC8vLyAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIHZhcmlhYmxlIG9yaWdpbmF0ZXMsXHJcbiAgLy8vICAgY29uY2F0ZW5hdGVkIHdpdGggJy4nIGFuZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlIGluIHRoYXQgdGFibGUuXHJcbiAgLy8vICAgSWYgdGhlIHZhcmlhYmxlIGlzIGEgdmlydHVhbCBvbmUsIHRoZW4gdGhlIHRhYmxlIG5hbWUgd291bGQgaW5kaWNhdGUgJ1ZpcnR1YWwnLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9pc1BhcmFtKVxyXG4gICAgICByZXR1cm4gXCJQYXJhbWV0ZXIuXCIgKyB0aGlzLmdldFZhck5hbWUoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX2lzVmlydHVhbClcclxuICAgICAgcmV0dXJuIFwiVmlydHVhbC5cIiArIHRoaXMuZ2V0VmFyTmFtZSgpO1xyXG4gICAgZWxzZSByZXR1cm4gdGhpcy5nZXRUYWJsZU5hbWUoKSArIFwiLlwiICsgdGhpcy5nZXRWYXJOYW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVzdCBmb3IgYSBudWxsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgaXNOdWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCg8VGFzaz5zdXBlci5nZXRUYXNrKCkpLmdldEV2YWxPbGRWYWx1ZXMoKSlcclxuICAgICAgcmV0dXJuIHRoaXMuaXNPcmlnaW5hbFZhbHVlTnVsbCgpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5faW52YWxpZFZhbHVlKVxyXG4gICAgICB0aGlzLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICByZXR1cm4gdGhpcy5faXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUHJldklzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2SXNOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlc3QgZm9yIGFuIG1vZGlmaWVkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgcmV0dXJuIGN1cnJSZWMuaXNGbGRNb2RpZmllZCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBtb2RpZmllZCBmbGFnXHJcbiAgLy8vICAgcGxlYXNlIG5vdGUgdGhhdCBjbGVhcmluZyB0aGUgZmxhZyBpcyBkb25lIGV4cGxpY2l0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKCg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKSk7XHJcbiAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG5cclxuICAgIC8vIFRoaXMgZmxhZyB3aWxsIGJlIHNldCBhcyBGTEFHX01PRElGSUVEIGFuZCBuZXZlciBjbGVhcmVkLiBRY3IgIzkyNjgxNVxyXG4gICAgcmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICBpZiAodGhpcy5Jc1ZpcnR1YWwpXHJcbiAgICAgIHRoaXMubW9kaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAvLyB0aGUgc2V0dGluZyBvZiB0aGUgcmVjb3JkIG1vZGlmaWVkIGZsYWcgaXMgZG9uZSBleHBsaWNpdGx5XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB1cGRhdGVkIGZsYWdcclxuICAvLy8gICBwbGVhc2Ugbm90ZSB0aGF0IGNsZWFyaW5nIHRoZSBmbGFnIGlzIGRvbmUgZXhwbGljaXRseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBjdXJyUmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gICAgY3VyclJlYy5zZXRVcGRhdGVkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgaXMgYSBwYXJhbWV0ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUGFyYW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNQYXJhbTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGlmIHRoZSBmaWVsZCBpbiBldmFsdWF0aW9uIHByb2Nlc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzSW5FdmFsUHJvY2VzcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkV2YWxQcm9jZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGFuIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaGFzSW5pdEV4cCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbml0RXhwICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlY29tcHV0ZXMgdGhpcyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTZXJ2ZXJSY21wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29tcHV0ZSAhPT0gbnVsbCAmJiB0aGlzLl9yZWNvbXB1dGUuaXNTZXJ2ZXJSY21wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcGljdHVyZSBvZiB0aGUgZmllbGQgYXMgYSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBpY3R1cmUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9waWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRoZSBpZCBvZiB0aGUgbGluayB0aGlzIGZpZWxkIGJlbG9uZyB0b1xyXG4gIC8vLyAgIGlmIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbGluayByZXR1cm4gLTFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVySWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhdmlld0hlYWRlcklkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHdoZXRoZXIgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYSBsaW5rIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IElzTGlua0ZpZWxkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTGlua0ZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBldmFsdWF0ZXMgYW5kIHJldHVybnMgdGhlIGluaXQgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGlzIGZpZWxkIChudWxsIGlmIHRoZXJlIGlzIG5vbilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbml0RXhwVmFsKHJlczogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9pbml0RXhwICE9IG51bGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVJbml0RXhwcmVzc2lvbihyZXMsIGlzTnVsbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlcy52YWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGhhc0NoYW5nZUV2ZW50IGZsYWcgdG8gVFJVRVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SGFzQ2hhbmdlRXZlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNDaGFuZ2VFdmVudCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0cmlldmVzIHRoZSBoYXNDaGFuZ2VFdmVudCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhhc0NoYW5nZUV2ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0NoYW5nZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBoYXNab29tSGFuZGxlciB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRIYXNab29tSGFuZGxlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc1pvb21IYW5kbGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRIYXNab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgYWxsIHJvd3MgaW4gdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDYXVzZVRhYmxlSW52YWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGNhdXNlIFRhYmxlIEludmFsaWRhdGlvbiBtZW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2F1c2VUYWJsZUludmFsaWRhdGlvblwiPjwvcGFyYW0+XHJcbiAgY2F1c2VUYWJsZUludmFsaWRhdGlvbihjYXVzZVRhYmxlSW52YWxpZGF0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uID0gY2F1c2VUYWJsZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB3aGVuIHZhbHVlIGlzIG51bGwsIGdldCB2YWx1ZSB0aGF0IHJlcHJlc2VudCBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrTnVsbEFyaXRobWV0aWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VmFsdWVGb3JOdWxsKGNoZWNrTnVsbEFyaXRobWV0aWM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuTnVsbEFsbG93ZWQpIHtcclxuXHJcbiAgICAgIGlmIChjaGVja051bGxBcml0aG1ldGljICYmIHN1cGVyLmdldFRhc2soKS5nZXROdWxsQXJpdGhtZXRpYygpID09PSBDb25zdGFudHMuTlVMTF9BUklUSF9OVUxMSUZZKSB7XHJcbiAgICAgICAgdmFsID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5fbnVsbFZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9udWxsVmFsdWUgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgPSB0aGlzLl9udWxsVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB2YWwgPSBzdXBlci5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjb250cm9sIHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBmaWVsZCBhbmQgcmVzaWRlcyBvbiB0aGUgc2FtZSB0YXNrXHJcbiAgLy8vICAgb2Ygb2YgdGhlIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgZ2V0Q3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbDtcclxuXHJcbiAgICBpZiAodGhpcy5fY29udHJvbHMgIT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fY29udHJvbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjdHJsID0gPE1nQ29udHJvbD50aGlzLl9jb250cm9scy5nZXRfSXRlbShpKTtcclxuICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpID09PSB0aGlzLmdldFRhc2soKSlcclxuICAgICAgICAgIHJldHVybiBjdHJsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHVwZGF0ZURpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBzdXBlci51cGRhdGVEaXNwbGF5V2l0aFZhbHVlKHRoaXMuZ2V0RGlzcFZhbHVlKCksIHRoaXMuaXNOdWxsKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldERpc3BWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaXNOdWxsKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX251bGxEaXNwbGF5ICE9IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgZWxzZSByZXR1cm4gc3VwZXIuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGVsc2UgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiByYW5nZSBjb25kaXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGllbGQgZHVyaW5nIGNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBTaG91bGRDaGVja1JhbmdlSW5Db21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNMaW5rRmllbGQgfHwgKHRoaXMuSXNWaXJ0dWFsICYmICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkhhc01haW5UYWJsZSk7XHJcbiAgfVxyXG5cclxuICBJc0ZvckFyZ3VtZW50KHRhc2tIYXNQYXJhbWV0ZXJzOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAvLyBJZiB3ZSBuZWVkIGEgcGFyYW1ldGVyIGFuZCB0aGUgZmllbGQgaXMgbm90IG9uZVxyXG4gICAgaWYgKHRhc2tIYXNQYXJhbWV0ZXJzKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhcmFtKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19
|