@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.
Files changed (293) hide show
  1. package/esm2020/index.mjs +190 -0
  2. package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
  3. package/esm2020/src/AccessHelper.mjs +3 -0
  4. package/esm2020/src/ClientManager.mjs +403 -0
  5. package/esm2020/src/CommandsProcessorBase.mjs +58 -0
  6. package/esm2020/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2020/src/CommandsTable.mjs +163 -0
  8. package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
  9. package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
  10. package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
  11. package/esm2020/src/GUIManager.mjs +63 -0
  12. package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
  13. package/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -0
  14. package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
  15. package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
  16. package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
  17. package/esm2020/src/bridge/MagicBridge.mjs +41 -0
  18. package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
  19. package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
  20. package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
  21. package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
  22. package/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
  23. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
  24. package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
  25. package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -0
  26. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
  27. package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
  28. package/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
  29. package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
  30. package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -0
  31. package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
  32. package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
  33. package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +0 -0
  34. package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
  35. package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
  36. package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
  37. package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -0
  38. package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
  39. package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
  40. package/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
  41. package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
  42. package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
  43. package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
  44. package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
  45. package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
  46. package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
  47. package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -0
  48. package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
  49. package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
  50. package/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
  51. package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
  52. package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -0
  55. package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
  56. package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
  57. package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
  58. package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
  59. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
  61. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
  64. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
  65. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
  67. package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
  68. package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
  69. package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
  70. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
  72. package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
  73. package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
  74. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
  75. package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
  76. package/esm2020/src/data/DataView.mjs +1634 -0
  77. package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
  78. package/esm2020/src/data/DataviewManager.mjs +28 -0
  79. package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
  80. package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
  81. package/esm2020/src/data/Field.mjs +645 -0
  82. package/esm2020/src/data/FieldBase.mjs +18 -0
  83. package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
  84. package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
  85. package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
  86. package/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -0
  91. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  92. package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2020/src/env/Environment.mjs +554 -0
  94. package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
  95. package/esm2020/src/env/LanguageData.mjs +222 -0
  96. package/esm2020/src/env/MirrorString.mjs +66 -0
  97. package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
  98. package/esm2020/src/event/Event.mjs +1436 -0
  99. package/esm2020/src/event/EventHandler.mjs +773 -0
  100. package/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
  103. package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -0
  104. package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
  105. package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
  106. package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
  107. package/esm2020/src/exp/Expression.mjs +200 -0
  108. package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
  110. package/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -0
  111. package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2020/src/exp/YesNoExp.mjs +41 -0
  113. package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
  114. package/esm2020/src/gui/FormsTable.mjs +66 -0
  115. package/esm2020/src/gui/MgControl.mjs +357 -0
  116. package/esm2020/src/gui/MgForm.mjs +1195 -0
  117. package/esm2020/src/http/HttpManager.mjs +97 -0
  118. package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
  119. package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
  120. package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
  121. package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
  122. package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
  123. package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
  124. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
  128. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
  131. package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
  132. package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
  133. package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
  134. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
  136. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -0
  138. package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
  139. package/esm2020/src/rt/Argument.mjs +274 -0
  140. package/esm2020/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2020/src/rt/Boundary.mjs +158 -0
  142. package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
  143. package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
  144. package/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -0
  147. package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
  148. package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
  149. package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
  150. package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
  151. package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
  152. package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
  153. package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
  154. package/esm2020/src/rt/Operation.mjs +745 -0
  155. package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
  156. package/esm2020/src/rt/Recompute.mjs +355 -0
  157. package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
  158. package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
  159. package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
  160. package/esm2020/src/rt/TableCache.mjs +177 -0
  161. package/esm2020/src/rt/TableCacheManager.mjs +67 -0
  162. package/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -0
  163. package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
  164. package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
  165. package/esm2020/src/tasks/MGData.mjs +552 -0
  166. package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
  167. package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
  168. package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
  169. package/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -0
  170. package/esm2020/src/tasks/Task.mjs +2501 -0
  171. package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
  172. package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
  173. package/esm2020/src/tasks/TasksTable.mjs +80 -0
  174. package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
  175. package/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
  178. package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
  179. package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
  180. package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
  181. package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
  182. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
  183. package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
  184. package/esm2020/src/util/ParamParseResult.mjs +8 -0
  185. package/esm2020/src/util/PrmMap.mjs +151 -0
  186. package/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
  187. package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -0
  188. package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
  189. package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
  190. package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
  191. package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
  192. package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +102 -5
  193. package/fesm2015/magic-xpa-engine.mjs.map +1 -0
  194. package/fesm2020/magic-xpa-engine.mjs +30705 -0
  195. package/fesm2020/magic-xpa-engine.mjs.map +1 -0
  196. package/index.d.ts +2 -0
  197. package/package.json +27 -13
  198. package/src/AccessHelper.d.ts +1 -1
  199. package/src/CommandsProcessorBase.d.ts +3 -3
  200. package/src/commands/DataViewCommandBase.d.ts +2 -2
  201. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  202. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  203. package/src/data/FieldBase.d.ts +3 -3
  204. package/src/env/EnvVariablesTable.d.ts +2 -15
  205. package/src/env/MirrorString.d.ts +15 -0
  206. package/src/exp/GlobalParamsTable.d.ts +2 -1
  207. package/src/http/client/HttpClientBase.d.ts +2 -2
  208. package/src/rt/DataviewHeaderBase.d.ts +1 -1
  209. package/src/tasks/TaskBase.d.ts +7 -7
  210. package/src/util/IMirrorXML.d.ts +1 -1
  211. package/src/util/ParamParseResult.d.ts +6 -0
  212. package/src/util/PrmMap.d.ts +0 -6
  213. package/bundles/magic-xpa-engine.umd.js +0 -37983
  214. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  215. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  216. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  217. package/esm2015/index.js +0 -188
  218. package/esm2015/src/AccessHelper.js +0 -3
  219. package/esm2015/src/ClientManager.js +0 -412
  220. package/esm2015/src/CommandsProcessorBase.js +0 -54
  221. package/esm2015/src/CommandsProcessorManager.js +0 -31
  222. package/esm2015/src/CommandsTable.js +0 -166
  223. package/esm2015/src/GUIManager.js +0 -72
  224. package/esm2015/src/bridge/MagicBridge.js +0 -44
  225. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  226. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  227. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  228. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  229. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  230. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  231. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  232. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  233. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  234. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  235. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  236. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  237. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  238. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  239. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  240. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  241. package/esm2015/src/data/DataView.js +0 -1692
  242. package/esm2015/src/data/DataviewManager.js +0 -31
  243. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  244. package/esm2015/src/data/Field.js +0 -671
  245. package/esm2015/src/data/FieldBase.js +0 -9
  246. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  247. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  248. package/esm2015/src/env/Environment.js +0 -557
  249. package/esm2015/src/env/LanguageData.js +0 -229
  250. package/esm2015/src/event/Event.js +0 -1441
  251. package/esm2015/src/event/EventHandler.js +0 -786
  252. package/esm2015/src/event/EventsManager.js +0 -3106
  253. package/esm2015/src/exp/Expression.js +0 -209
  254. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
  255. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  256. package/esm2015/src/exp/YesNoExp.js +0 -44
  257. package/esm2015/src/gui/FormsTable.js +0 -73
  258. package/esm2015/src/gui/MgControl.js +0 -424
  259. package/esm2015/src/gui/MgForm.js +0 -1291
  260. package/esm2015/src/http/HttpManager.js +0 -100
  261. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  262. package/esm2015/src/http/client/HttpClientBase.js +0 -147
  263. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  264. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  265. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  266. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  267. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -901
  268. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  269. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  270. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  271. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  272. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  273. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  274. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  275. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  276. package/esm2015/src/rt/Argument.js +0 -281
  277. package/esm2015/src/rt/ArgumentsList.js +0 -108
  278. package/esm2015/src/rt/Boundary.js +0 -161
  279. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  280. package/esm2015/src/rt/Operation.js +0 -772
  281. package/esm2015/src/rt/Recompute.js +0 -372
  282. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  283. package/esm2015/src/rt/TableCache.js +0 -182
  284. package/esm2015/src/rt/TableCacheManager.js +0 -70
  285. package/esm2015/src/tasks/MGData.js +0 -561
  286. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  287. package/esm2015/src/tasks/Task.js +0 -2601
  288. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  289. package/esm2015/src/tasks/TasksTable.js +0 -87
  290. package/esm2015/src/util/FlowMonitorQueue.js +0 -364
  291. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  292. package/esm2015/src/util/PrmMap.js +0 -157
  293. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -1,786 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ApplicationException, Exception, NString, RefParam, StringBuilder, isNullOrUndefined } from "@magic-xpa/mscorelib";
3
- import { BrkScope, Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttributeCheck, XMLConstants, XmlParser } from "@magic-xpa/utils";
4
- import { Event } from "./Event";
5
- import { FieldBase } from "../data/FieldBase";
6
- import { OperationTable } from "../rt/OperationTable";
7
- import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
8
- import { ServerError } from "../remote/ServerError";
9
- import { YesNoExp } from "../exp/YesNoExp";
10
- import { ConstInterface } from "../ConstInterface";
11
- import { FlowMonitorInterface } from "../FlowMonitorInterface";
12
- import { LastFocusedManager } from "../rt/LastFocusedManager";
13
- import { AccessHelper } from "../AccessHelper";
14
- import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
15
- export class EventHandler {
16
- constructor() {
17
- this._enabledExp = new YesNoExp(true);
18
- this._operationTab = null;
19
- this._propagateExp = new YesNoExp(true);
20
- this._isHandlerOnForm = false;
21
- this._ctrl = null;
22
- this._ctrlName = null;
23
- this._dvLen = 0;
24
- this._dvPos = 0;
25
- this._evt = null;
26
- this._handledByClient = false;
27
- this._handlerFld = null;
28
- this._hasParameters = false;
29
- this._id = 0;
30
- this._level = '\0';
31
- this._scope = null;
32
- this._task = null;
33
- this._taskMgdID = -1;
34
- this._operationTab = new OperationTable();
35
- }
36
- getCtrlName() {
37
- return this._ctrlName;
38
- }
39
- fillData(taskRef, parser) {
40
- if (this._task === null) {
41
- this._task = taskRef;
42
- this._taskMgdID = this._task.getMgdID();
43
- }
44
- while (this.initInnerObjects(parser, parser.getNextTag())) {
45
- }
46
- let dataView = this._task.DataView;
47
- this._hasParameters = dataView.ParametersExist(this._dvPos, this._dvLen);
48
- }
49
- initInnerObjects(parser, foundTagName) {
50
- if (foundTagName === null)
51
- return false;
52
- if (foundTagName === ConstInterface.MG_TAG_HANDLER)
53
- this.initInnerElements(parser, this._task);
54
- else if (foundTagName === ConstInterface.MG_TAG_OPER)
55
- this._operationTab.fillData(this._task, this, parser);
56
- else if (foundTagName === ConstInterface.MG_TAG_EVENT && this._evt === null) {
57
- this._evt = new Event();
58
- this._evt.fillData(parser, this._task);
59
- if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER ||
60
- (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_TIMER))
61
- this._task.getMGData().addTimerHandler(this);
62
- if (((this._evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getInternalCode() === InternalInterface.MG_ACT_ZOOM) || (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEvent() !== null && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getUserEvent().getInternalCode() === InternalInterface.MG_ACT_ZOOM)) && !this._task.getEnableZoomHandler()) {
63
- if (this._handlerFld !== null)
64
- this._handlerFld.setHasZoomHandler();
65
- else if (this._ctrl !== null)
66
- this._ctrl.HasZoomHandler = true;
67
- else
68
- this._task.setEnableZoomHandler();
69
- }
70
- }
71
- else if (foundTagName === '/' + ConstInterface.MG_TAG_HANDLER) {
72
- parser.setCurrIndex2EndOfTag();
73
- return false;
74
- }
75
- else {
76
- Logger.Instance.WriteExceptionToLogWithMsg("there is no such tag in EventHandler.initInnerObjects() " + foundTagName);
77
- return false;
78
- }
79
- return true;
80
- }
81
- initInnerElements(parser, taskRef) {
82
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
83
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
84
- let tag = parser.getXMLsubstring(endContext);
85
- parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_HANDLER) + ConstInterface.MG_TAG_HANDLER.length);
86
- let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
87
- this.initElements(tokensVector, taskRef);
88
- parser.setCurrIndex(++endContext);
89
- return;
90
- }
91
- Logger.Instance.WriteExceptionToLogWithMsg("in Handler.FillData() out of string bounds");
92
- }
93
- initElements(tokensVector, taskRef) {
94
- for (let j = 0; j < tokensVector.length; j += 2) {
95
- let attribute = (tokensVector.get_Item(j));
96
- let valueStr = (tokensVector.get_Item(j + 1));
97
- switch (attribute) {
98
- case ConstInterface.MG_ATTR_HANDLEDBY:
99
- this._handledByClient = (valueStr.toUpperCase() === "C".toUpperCase());
100
- break;
101
- case XMLConstants.MG_ATTR_ID:
102
- this._id = XmlParser.getInt(valueStr);
103
- break;
104
- case ConstInterface.MG_ATTR_LEVEL:
105
- this._level = valueStr[0];
106
- break;
107
- case ConstInterface.MG_ATTR_OBJECT:
108
- let valueStringCtrlName = XmlParser.unescape(valueStr);
109
- this._ctrlName = XmlParser.unescape(valueStringCtrlName).toUpperCase();
110
- this.calculateCtrlFromControlName(taskRef);
111
- break;
112
- case ConstInterface.MG_ATTR_VARIABLE:
113
- this._handlerFld = this._task.DataView.getField(XmlParser.getInt(valueStr));
114
- this._handlerFld.setHasChangeEvent();
115
- break;
116
- case ConstInterface.MG_ATTR_SCOPE:
117
- this._scope = valueStr[0];
118
- break;
119
- case ConstInterface.MG_ATTR_PROPAGATE:
120
- this._propagateExp.setVal(taskRef, valueStr);
121
- break;
122
- case ConstInterface.MG_ATTR_ENABLED:
123
- this._enabledExp.setVal(taskRef, valueStr);
124
- break;
125
- case ConstInterface.MG_ATTR_DVPOS:
126
- let i = valueStr.indexOf(",");
127
- if (i > -1) {
128
- this._dvLen = XmlParser.getInt(valueStr.substr(0, i));
129
- this._dvPos = XmlParser.getInt(valueStr.substr(i + 1));
130
- for (let fldIdx = this._dvPos; fldIdx < this._dvPos + this._dvLen; fldIdx++) {
131
- let field = this._task.DataView.getField(fldIdx);
132
- field.IsEventHandlerField = true;
133
- }
134
- }
135
- break;
136
- case ConstInterface.MG_ATTR_HANDLER_ONFORM:
137
- this._isHandlerOnForm = XmlParser.getBoolean(valueStr);
138
- break;
139
- default:
140
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in EventHandler class. Insert case to EventHandler.initElements for " + attribute);
141
- break;
142
- }
143
- }
144
- }
145
- calculateCtrlFromControlName(taskRef) {
146
- if (!NString.IsNullOrEmpty(this._ctrlName)) {
147
- this._ctrl = ((taskRef.getForm() !== null) ? taskRef.getForm().getCtrlByCtrlName(this._ctrlName) : null);
148
- }
149
- }
150
- isSpecificHandlerOf(rtEvt) {
151
- if (this._ctrl === null && this._ctrlName === null && this._handlerFld === null && !this._isHandlerOnForm)
152
- return false;
153
- if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask())
154
- return false;
155
- if (this._evt.equals(rtEvt)) {
156
- if (this._handlerFld !== null) {
157
- return (this._handlerFld === rtEvt.getFld());
158
- }
159
- if (rtEvt.Control !== null && !this._isHandlerOnForm) {
160
- let eventCtrlName = rtEvt.Control.getControlNameForHandlerSearch();
161
- if (eventCtrlName !== null && this._ctrlName.toLowerCase() === eventCtrlName.toLowerCase())
162
- return true;
163
- }
164
- else if (rtEvt.Control === null && this._isHandlerOnForm)
165
- return true;
166
- }
167
- return false;
168
- }
169
- isNonSpecificHandlerOf(rtEvt) {
170
- if (this._ctrl !== null || this._ctrlName !== null || this._handlerFld !== null || this._isHandlerOnForm)
171
- return false;
172
- if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask() && rtEvt.getType() !== ConstInterface.EVENT_TYPE_TIMER)
173
- return false;
174
- if (this._scope === BrkScope.Global && this._task !== rtEvt.getTask())
175
- return false;
176
- if (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_NOTINITED) {
177
- try {
178
- this._evt.findUserEvent();
179
- }
180
- catch (applicationException) {
181
- if (applicationException instanceof ApplicationException) {
182
- }
183
- else
184
- throw applicationException;
185
- }
186
- }
187
- return this._evt.equals(rtEvt);
188
- }
189
- isGlobalHandlerOf(rtEvt) {
190
- if (this._scope !== BrkScope.Global)
191
- return false;
192
- if (this._ctrl != null || this._ctrlName != null || this._handlerFld != null || this._isHandlerOnForm)
193
- return false;
194
- return this._evt.equals(rtEvt);
195
- }
196
- isGlobalSpecificHandlerOf(rtEvt) {
197
- if (this._scope !== BrkScope.Global)
198
- return false;
199
- if (this._ctrl == null && this._ctrlName == null && this._handlerFld == null)
200
- return false;
201
- return (this._ctrlName != null && this._evt.equals(rtEvt) &&
202
- NString.Equals(this._ctrlName, rtEvt.Control.Name, true));
203
- }
204
- execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue) {
205
- return __awaiter(this, void 0, void 0, function* () {
206
- let ctrl = null;
207
- let retVal;
208
- let depth = 0;
209
- let taskEnd = false;
210
- let brkLevel = this._task.getBrkLevel();
211
- let brkLevelIndex = this._task.getBrkLevelIndex();
212
- let initialLoopStackSize = 0;
213
- if (taskEnd !== null && this._evt.getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER || (this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_TIMER))) {
214
- if (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER_FUNC)
215
- this._task.setBrkLevel(rtEvt.getBrkLevel(), this._id);
216
- }
217
- else
218
- this._task.setBrkLevel(this._evt.getBrkLevel(), this._id);
219
- let args = rtEvt.getArgList();
220
- try {
221
- let flowMonitor = FlowMonitorQueue.Instance;
222
- if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_WEBCLIENT_ROUTE) {
223
- if (!this._task.IsRoute() && this._task !== AccessHelper.mgDataTable.StartupMgData.getFirstTask()) {
224
- return new RetVals(true, true);
225
- }
226
- }
227
- let nextOperIdx = -1;
228
- if (returnedFromServer) {
229
- nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(this._operationTab.getOperation(0), false);
230
- }
231
- if (nextOperIdx === -1 && !enabledCndCheckedAndTrue && !(yield this.isEnabled()))
232
- return new RetVals(true, false);
233
- if (this._scope === BrkScope.Task && (rtEvt.getType() === ConstInterface.EVENT_TYPE_TIMER || rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
234
- let currTask = LastFocusedManager.Instance.getLastFocusedTask();
235
- if (this._task !== currTask)
236
- return new RetVals(true, true);
237
- }
238
- if (!this._handledByClient) {
239
- return new RetVals(false, true);
240
- }
241
- if (rtEvt.getType() !== ConstInterface.EVENT_TYPE_USER && !(yield this._evt.dataEventIsTrue()))
242
- return new RetVals(false, true);
243
- if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_TASK_SUFFIX)
244
- taskEnd = true;
245
- if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
246
- switch (rtEvt.getInternalCode()) {
247
- case InternalInterface.MG_ACT_REC_PREFIX:
248
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
249
- break;
250
- case InternalInterface.MG_ACT_REC_SUFFIX:
251
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
252
- break;
253
- case InternalInterface.MG_ACT_CTRL_SUFFIX:
254
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
255
- break;
256
- case InternalInterface.MG_ACT_CTRL_PREFIX:
257
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
258
- break;
259
- case InternalInterface.MG_ACT_VARIABLE:
260
- flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
261
- break;
262
- case InternalInterface.MG_ACT_CTRL_VERIFICATION:
263
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
264
- break;
265
- case InternalInterface.MG_ACT_TASK_PREFIX:
266
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
267
- break;
268
- case InternalInterface.MG_ACT_TASK_SUFFIX:
269
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
270
- break;
271
- default:
272
- flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
273
- break;
274
- }
275
- }
276
- else
277
- flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
278
- try {
279
- if (taskEnd !== null)
280
- ctrl = rtEvt.Control;
281
- let mgdID = AccessHelper.mgDataTable.currMgdID;
282
- let isChangedCurrWnd = false;
283
- let isChangedCurrWndRef = new RefParam(isChangedCurrWnd);
284
- if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER && mgdID !== rtEvt.getMgdID()) {
285
- AccessHelper.mgDataTable.currMgdID = rtEvt.getMgdID();
286
- isChangedCurrWndRef.value = true;
287
- }
288
- yield this.resetLocalVariables(args);
289
- initialLoopStackSize = this._task.getLoopStackSize();
290
- let retVals = null;
291
- if (this._operationTab.getSize() > 0)
292
- retVals = yield this.executeOperations(0, this._operationTab.getSize() - 1, taskEnd, mgdID, depth, isChangedCurrWndRef, false, false, -1);
293
- isChangedCurrWnd = isChangedCurrWndRef.value;
294
- if (retVals !== null)
295
- return retVals;
296
- if (!taskEnd)
297
- yield this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE);
298
- if (isChangedCurrWnd) {
299
- let oldMgd = AccessHelper.mgDataTable.getMGData(mgdID);
300
- if (oldMgd !== null && !oldMgd.IsAborting)
301
- AccessHelper.mgDataTable.currMgdID = mgdID;
302
- }
303
- }
304
- catch (ex) {
305
- if (ex instanceof ServerError) {
306
- if (Logger.Instance.LogLevel !== Logger_LogLevels.Basic)
307
- Logger.Instance.WriteExceptionToLog(ex);
308
- throw ex;
309
- }
310
- else if (ex instanceof Exception) {
311
- Logger.Instance.WriteExceptionToLog(ex);
312
- return new RetVals(false, true);
313
- }
314
- else
315
- throw ex;
316
- }
317
- finally {
318
- retVal = yield this._propagateExp.getVal();
319
- let currLoopStackSize = this._task.getLoopStackSize();
320
- for (; currLoopStackSize > initialLoopStackSize; currLoopStackSize = currLoopStackSize--)
321
- this._task.popLoopCounter();
322
- }
323
- if (args !== null)
324
- yield this.getArgValsFromFlds(args);
325
- if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
326
- switch (rtEvt.getInternalCode()) {
327
- case InternalInterface.MG_ACT_REC_PREFIX:
328
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
329
- break;
330
- case InternalInterface.MG_ACT_REC_SUFFIX:
331
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
332
- break;
333
- case InternalInterface.MG_ACT_TASK_PREFIX:
334
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
335
- break;
336
- case InternalInterface.MG_ACT_TASK_SUFFIX:
337
- flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
338
- break;
339
- case InternalInterface.MG_ACT_CTRL_SUFFIX:
340
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
341
- break;
342
- case InternalInterface.MG_ACT_CTRL_PREFIX:
343
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
344
- break;
345
- case InternalInterface.MG_ACT_VARIABLE:
346
- flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
347
- break;
348
- case InternalInterface.MG_ACT_CTRL_VERIFICATION:
349
- flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
350
- break;
351
- default:
352
- flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
353
- break;
354
- }
355
- }
356
- else
357
- flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), 1, this._task.GetTaskDetails());
358
- }
359
- finally {
360
- this._task.setBrkLevel(brkLevel, brkLevelIndex);
361
- }
362
- return new RetVals(retVal, true);
363
- });
364
- }
365
- executeOperations(fromIdx, toIdx, taskEnd, mgdID, depth, isChangedCurrWndRef, inBlockIf, inReturnedFromServer, inNextOperIdx) {
366
- return __awaiter(this, void 0, void 0, function* () {
367
- let oper;
368
- let operType;
369
- let nextOperIdx = -1;
370
- let returnedFromServer = false;
371
- let mgd = this._task.getMGData();
372
- let execFlowIdx = fromIdx;
373
- let retvals;
374
- let blockIfReturnedFromServer = false;
375
- let executeBlock;
376
- let blockLoopExeconServer;
377
- let flowMonitor = FlowMonitorQueue.Instance;
378
- let routeOperationExecuted = false;
379
- if (!inReturnedFromServer) {
380
- oper = this._operationTab.getOperation(execFlowIdx);
381
- nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
382
- if (nextOperIdx > -1) {
383
- returnedFromServer = true;
384
- if (inBlockIf)
385
- blockIfReturnedFromServer = true;
386
- }
387
- else
388
- returnedFromServer = false;
389
- }
390
- else {
391
- returnedFromServer = inReturnedFromServer;
392
- nextOperIdx = inNextOperIdx;
393
- }
394
- for (; execFlowIdx <= toIdx &&
395
- (!AccessHelper.eventsManager.GetStopExecutionFlag()) &&
396
- !mgd.IsAborting && !routeOperationExecuted; execFlowIdx += 1) {
397
- if (inBlockIf && blockIfReturnedFromServer && this._operationTab.getOperation(toIdx).getServerId() < nextOperIdx)
398
- break;
399
- oper = this._operationTab.getOperation(execFlowIdx);
400
- operType = oper.getType();
401
- blockIfReturnedFromServer = false;
402
- if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
403
- this._task.setUseLoopStack(depth > 0);
404
- yield oper.operServer(null);
405
- break;
406
- }
407
- if (returnedFromServer && oper.getServerId() < nextOperIdx)
408
- if (operType !== ConstInterface.MG_OPER_BLOCK)
409
- continue;
410
- else if (this._operationTab.getOperation(oper.getBlockEnd()).getServerId() < nextOperIdx)
411
- continue;
412
- if (!taskEnd)
413
- yield this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE);
414
- if (this._taskMgdID !== mgdID)
415
- isChangedCurrWndRef.value = true;
416
- if (!this._task.isMainProg() && this._task.isOpenWin())
417
- AccessHelper.mgDataTable.currMgdID = this._taskMgdID;
418
- yield AccessHelper.eventsManager.CheckAndShowSpinner(true);
419
- switch (operType) {
420
- case ConstInterface.MG_OPER_VERIFY:
421
- if (yield oper.execute(returnedFromServer)) {
422
- if (!(this._task.getBrkLevel() === "TS")) {
423
- AccessHelper.eventsManager.setStopExecution(true);
424
- }
425
- if (this._task.getInRecordSuffix() && this._task.getLevel() === Constants.TASK_LEVEL_TASK)
426
- this._task.setLevel(Constants.TASK_LEVEL_RECORD);
427
- return new RetVals(false, true);
428
- }
429
- break;
430
- case ConstInterface.MG_OPER_LOOP:
431
- this._task.enterLoop();
432
- this._task.increaseLoopCounter();
433
- this._task.setUseLoopStack(true);
434
- yield flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
435
- blockLoopExeconServer = false;
436
- if (!oper.getExecOnServer()) {
437
- while (yield oper.execute(false)) {
438
- retvals = yield this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, false, false, -1);
439
- if (retvals !== null)
440
- return retvals;
441
- if ((mgd.IsAborting || AccessHelper.eventsManager.GetStopExecutionFlag()))
442
- break;
443
- this._task.increaseLoopCounter();
444
- this._task.setUseLoopStack(true);
445
- }
446
- }
447
- else {
448
- if (yield oper.execute(false))
449
- blockLoopExeconServer = true;
450
- }
451
- if (!blockLoopExeconServer)
452
- execFlowIdx = oper.getBlockEnd() - 1;
453
- this._task.leaveLoop();
454
- break;
455
- case ConstInterface.MG_OPER_BLOCK:
456
- let startBlockIdx = execFlowIdx;
457
- if (!oper.getExecOnServer() || (returnedFromServer && oper.getServerId() < nextOperIdx)) {
458
- this._task.setUseLoopStack(true);
459
- if (!returnedFromServer || oper.getServerId() >= nextOperIdx)
460
- execFlowIdx = yield this.getSignificantBlock(execFlowIdx, oper.getBlockEnd());
461
- else
462
- execFlowIdx = this.getStartBlockIfIdxByOper(execFlowIdx, nextOperIdx);
463
- }
464
- else {
465
- this._task.setUseLoopStack(depth > 0);
466
- yield oper.operServer(null);
467
- nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
468
- if (nextOperIdx > -1) {
469
- returnedFromServer = true;
470
- if (inBlockIf)
471
- blockIfReturnedFromServer = true;
472
- if (nextOperIdx < this._operationTab.getOperation(oper.getBlockEnd()).getServerId()) {
473
- while (this._operationTab.getOperation(oper.getBlockClose()).getServerId() < nextOperIdx) {
474
- execFlowIdx = oper.getBlockClose();
475
- oper = this._operationTab.getOperation(execFlowIdx);
476
- }
477
- }
478
- }
479
- else {
480
- returnedFromServer = false;
481
- execFlowIdx = -1;
482
- }
483
- }
484
- if (execFlowIdx !== -1) {
485
- executeBlock = true;
486
- oper = this._operationTab.getOperation(execFlowIdx);
487
- if (returnedFromServer) {
488
- if (this._operationTab.getOperation(oper.getBlockClose()).getServerId() <= nextOperIdx) {
489
- executeBlock = false;
490
- blockIfReturnedFromServer = true;
491
- }
492
- }
493
- if (executeBlock) {
494
- retvals = yield this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, true, returnedFromServer, nextOperIdx);
495
- if (retvals !== null)
496
- if (!retvals.ReturnedFromServer)
497
- return retvals;
498
- else {
499
- returnedFromServer = retvals.ReturnedFromServer;
500
- nextOperIdx = retvals.NextOperIdx;
501
- blockIfReturnedFromServer = retvals.BlockIfReturnedFromServer;
502
- execFlowIdx = oper.getBlockEnd() - 1;
503
- continue;
504
- }
505
- }
506
- }
507
- execFlowIdx = oper.getBlockEnd() - 1;
508
- break;
509
- case ConstInterface.MG_OPER_ENDBLOCK:
510
- yield flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
511
- break;
512
- case ConstInterface.MG_OPER_CALL:
513
- this._task.setUseLoopStack(depth > 0);
514
- routeOperationExecuted = yield oper.execute(returnedFromServer);
515
- break;
516
- default:
517
- this._task.setUseLoopStack(depth > 0);
518
- yield oper.execute(returnedFromServer);
519
- break;
520
- }
521
- if (!blockIfReturnedFromServer) {
522
- nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
523
- if (nextOperIdx > -1) {
524
- returnedFromServer = true;
525
- if (inBlockIf)
526
- blockIfReturnedFromServer = true;
527
- }
528
- else
529
- returnedFromServer = false;
530
- }
531
- }
532
- if (routeOperationExecuted)
533
- retvals = new RetVals(false, true);
534
- else if (blockIfReturnedFromServer)
535
- retvals = new RetVals(nextOperIdx, returnedFromServer, blockIfReturnedFromServer);
536
- else
537
- retvals = null;
538
- return retvals;
539
- });
540
- }
541
- getSignificantBlock(startBlockIdx, endIdx) {
542
- return __awaiter(this, void 0, void 0, function* () {
543
- let retIdx = -1;
544
- while (startBlockIdx < endIdx) {
545
- let oper = this._operationTab.getOperation(startBlockIdx);
546
- let operType = oper.getType();
547
- if (operType !== ConstInterface.MG_OPER_BLOCK && operType !== ConstInterface.MG_OPER_ELSE && operType !== ConstInterface.MG_OPER_SERVER)
548
- break;
549
- if (yield oper.execute(false)) {
550
- retIdx = startBlockIdx;
551
- break;
552
- }
553
- else
554
- startBlockIdx = oper.getBlockClose();
555
- }
556
- return retIdx;
557
- });
558
- }
559
- getStartBlockIdxByEnd(endIdx) {
560
- let retIdx = -1;
561
- let found = false;
562
- let j;
563
- for (j = endIdx - 1; j >= 0 && !found; j--) {
564
- let oper = this._operationTab.getOperation(j);
565
- let operType = oper.getType();
566
- if (operType === ConstInterface.MG_OPER_BLOCK || operType === ConstInterface.MG_OPER_LOOP) {
567
- if (oper.getBlockEnd() === endIdx) {
568
- retIdx = j;
569
- found = true;
570
- }
571
- }
572
- }
573
- return retIdx;
574
- }
575
- getStartBlockIdxByElse(elseIdx) {
576
- let retIdx = -1;
577
- let found = false;
578
- let elseBlockEnd = this._operationTab.getOperation(elseIdx).getBlockEnd();
579
- let j;
580
- for (j = elseIdx - 1; j >= 0 && !found; j--) {
581
- let oper = this._operationTab.getOperation(j);
582
- let operType = oper.getType();
583
- if (operType === ConstInterface.MG_OPER_BLOCK) {
584
- if (oper.getBlockEnd() === elseBlockEnd) {
585
- retIdx = j;
586
- found = true;
587
- }
588
- }
589
- }
590
- return retIdx;
591
- }
592
- getStartBlockIfIdxByOper(blockOperIdx, srvrOperIdx) {
593
- let retIdx = -1;
594
- let found = false;
595
- let j = this._operationTab.serverId2operIdx(srvrOperIdx, blockOperIdx) - 1;
596
- if (j === -2) {
597
- j = this._operationTab.serverId2FollowingOperIdx(srvrOperIdx, blockOperIdx) - 1;
598
- }
599
- while (j >= 0 && !found) {
600
- let oper = this._operationTab.getOperation(j);
601
- let operType = oper.getType();
602
- if (operType === ConstInterface.MG_OPER_BLOCK) {
603
- if (j === blockOperIdx) {
604
- retIdx = j;
605
- found = true;
606
- }
607
- else
608
- j--;
609
- }
610
- else if (operType === ConstInterface.MG_OPER_ELSE) {
611
- let blockStrt = this.getStartBlockIdxByElse(j);
612
- if (blockStrt === blockOperIdx) {
613
- retIdx = j;
614
- found = true;
615
- }
616
- else
617
- j = blockStrt - 1;
618
- }
619
- else if (operType === ConstInterface.MG_OPER_ENDBLOCK)
620
- j = this.getStartBlockIdxByEnd(j) - 1;
621
- else
622
- j--;
623
- }
624
- return retIdx;
625
- }
626
- getLevel() {
627
- return this._level;
628
- }
629
- getEvent() {
630
- return this._evt;
631
- }
632
- getId() {
633
- return this._id;
634
- }
635
- getStaticCtrl() {
636
- return this._ctrl;
637
- }
638
- getRunTimeCtrl() {
639
- return AccessHelper.eventsManager.getLastRtEvent().Control;
640
- }
641
- isEnabled() {
642
- return __awaiter(this, void 0, void 0, function* () {
643
- return yield this._enabledExp.getVal();
644
- });
645
- }
646
- resetLocalVariables(args) {
647
- return __awaiter(this, void 0, void 0, function* () {
648
- let dv = this._task.DataView;
649
- let argIdx = 0;
650
- try {
651
- for (let fieldIdx = this._dvPos; fieldIdx < this._dvPos + this._dvLen; fieldIdx++) {
652
- let aField = dv.getField(fieldIdx);
653
- let varIsParm = !this._hasParameters || aField.isParam();
654
- if ((args !== null && argIdx < args.getSize()) && varIsParm) {
655
- if (!args.getArg(argIdx).skipArg()) {
656
- yield args.getArg(argIdx).setValueToField(aField);
657
- }
658
- else {
659
- aField.invalidate(true, FieldBase.CLEAR_FLAGS);
660
- yield aField.compute(false);
661
- }
662
- argIdx++;
663
- }
664
- else {
665
- aField.invalidate(true, FieldBase.CLEAR_FLAGS);
666
- yield aField.compute(false);
667
- }
668
- yield aField.updateDisplay();
669
- }
670
- }
671
- catch (exception) {
672
- throw exception;
673
- }
674
- });
675
- }
676
- getArgValsFromFlds(args) {
677
- return __awaiter(this, void 0, void 0, function* () {
678
- let dv = this._task.DataView;
679
- let k = 0;
680
- let j;
681
- for (j = this._dvPos; j < this._dvPos + this._dvLen && k < args.getSize(); j++) {
682
- let aField = dv.getField(j);
683
- if (!this._hasParameters || aField.isParam()) {
684
- let arg = args.getArg(k);
685
- if (arg.getType() === ConstInterface.ARG_TYPE_FIELD) {
686
- let argFld = arg.getField();
687
- if (argFld.getTask() !== null && !argFld.getTask().isAborting()) {
688
- let val = aField.getValue(false);
689
- yield argFld.setValueAndStartRecompute(val, aField.isNull(), true, aField.isModified(), false);
690
- yield argFld.updateDisplay();
691
- }
692
- }
693
- k++;
694
- }
695
- }
696
- });
697
- }
698
- getTask() {
699
- return this._task;
700
- }
701
- argsMatch(Exp_params) {
702
- let argsMatched = true;
703
- let dv = this._task.DataView;
704
- let j = 0;
705
- let paramCount = 0;
706
- for (let i = this._dvPos; i < this._dvPos + this._dvLen; i++) {
707
- let field = dv.getField(i);
708
- if (field.isParam()) {
709
- paramCount++;
710
- if (j < Exp_params.length) {
711
- let fieldAttr = field.getType();
712
- let argAttr = Exp_params[j].Attr;
713
- if (!Exp_params[j].IsNull && !StorageAttributeCheck.isTheSameType(fieldAttr, argAttr) && !StorageAttributeCheck.StorageFldAlphaUnicodeOrBlob(fieldAttr, argAttr)) {
714
- argsMatched = false;
715
- break;
716
- }
717
- j++;
718
- }
719
- }
720
- }
721
- if (paramCount !== Exp_params.length) {
722
- argsMatched = false;
723
- }
724
- return argsMatched;
725
- }
726
- getOperationTab() {
727
- return this._operationTab;
728
- }
729
- getControlNameForControlHeader() {
730
- if (this.getEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL) {
731
- if (this.getEvent().isControlHeader() && !isNullOrUndefined(this._ctrl))
732
- return this.getCtrlName();
733
- }
734
- return NString.Empty;
735
- }
736
- getVarNameForVariableHeader() {
737
- if (this.getEvent().isVariableHeader() && !isNullOrUndefined(this._handlerFld))
738
- return this._handlerFld.getVarName().toUpperCase();
739
- return NString.Empty;
740
- }
741
- getEventHandlerInfo() {
742
- let eventDescription = new StringBuilder();
743
- this.getEvent().AppendDescription(eventDescription);
744
- let headerAdditionalInfo = this.getControlNameForControlHeader() + this.getVarNameForVariableHeader();
745
- eventDescription.Append(headerAdditionalInfo);
746
- if (!NString.IsNullOrEmpty(eventDescription.toString()))
747
- eventDescription = new StringBuilder(' ' + eventDescription.toString(), eventDescription.toString().length + 1);
748
- return NString.Format("Handler {0}{1}", this.getEvent().getEventType(), eventDescription);
749
- }
750
- checkTaskScope(isSameTask) {
751
- if (this._scope === BrkScope.Task && !isSameTask)
752
- return false;
753
- return true;
754
- }
755
- toString() {
756
- return NString.Format("(Handler for {0} on task {1}, scope {2})", this._evt, this._task, this._scope);
757
- }
758
- }
759
- export class RetVals {
760
- constructor(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer) {
761
- this.BlockIfReturnedFromServer = false;
762
- this.Enabled = false;
763
- this.NextOperIdx = 0;
764
- this.Propagate = false;
765
- this.ReturnedFromServer = false;
766
- if (arguments.length === 2)
767
- this.constructor_0(pOrOperIdx, eOrInReturnedFromServer);
768
- else
769
- this.constructor_1(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer);
770
- }
771
- constructor_0(p, e) {
772
- this.Propagate = p;
773
- this.Enabled = e;
774
- this.NextOperIdx = 0;
775
- this.ReturnedFromServer = false;
776
- this.BlockIfReturnedFromServer = false;
777
- }
778
- constructor_1(operIdx, inReturnedFromServer, inBlockIfReturnedFromServer) {
779
- this.Propagate = false;
780
- this.Enabled = true;
781
- this.NextOperIdx = operIdx;
782
- this.ReturnedFromServer = inReturnedFromServer;
783
- this.BlockIfReturnedFromServer = inBlockIfReturnedFromServer;
784
- }
785
- }
786
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxTQUFTLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoSSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUVoQixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUtwRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3pDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFFMUUsTUFBTSxPQUFPLFlBQVk7SUFzQnZCO1FBckJRLGdCQUFXLEdBQWEsSUFBSSxR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LENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQVFPLGFBQWEsQ0FBQyxPQUFlLEVBQUUsb0JBQTZCLEVBQUUsMkJBQW9DO1FBQ3hHLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsMkJBQTJCLENBQUM7SUFDL0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgRXhjZXB0aW9uLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RyaW5nQnVpbGRlciwgaXNOdWxsT3JVbmRlZmluZWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIEJya1Njb3BlLFxyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjayxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtFeHBWYWwsIE1hbmFnZXJ9IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tIFwiLi9FdmVudFwiO1xyXG5pbXBvcnQge0ZpZWxkQmFzZX0gZnJvbSBcIi4uL2RhdGEvRmllbGRCYXNlXCI7XHJcbmltcG9ydCB7T3BlcmF0aW9uVGFibGV9IGZyb20gXCIuLi9ydC9PcGVyYXRpb25UYWJsZVwiO1xyXG5pbXBvcnQge0FyZ3VtZW50fSBmcm9tIFwiLi4vcnQvQXJndW1lbnRcIjtcclxuaW1wb3J0IHtBcmd1bWVudHNMaXN0fSBmcm9tIFwiLi4vcnQvQXJndW1lbnRzTGlzdFwiO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSBcIi4uL2d1aS9NZ0NvbnRyb2xcIjtcclxuaW1wb3J0IHtPcGVyYXRpb259IGZyb20gXCIuLi9ydC9PcGVyYXRpb25cIjtcclxuaW1wb3J0IHtGbG93TW9uaXRvclF1ZXVlfSBmcm9tIFwiLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlXCI7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tIFwiLi4vdGFza3MvTUdEYXRhXCI7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gXCIuLi9yZW1vdGUvU2VydmVyRXJyb3JcIjtcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gXCIuL1J1blRpbWVFdmVudFwiO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSBcIi4uL2d1aS9NZ0Zvcm1cIjtcclxuaW1wb3J0IHtZZXNOb0V4cH0gZnJvbSBcIi4uL2V4cC9ZZXNOb0V4cFwiO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gXCIuLi90YXNrcy9UYXNrXCI7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gXCIuLi9kYXRhL0RhdGFWaWV3XCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tIFwiLi4vRmxvd01vbml0b3JJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgTGFzdEZvY3VzZWRNYW5hZ2VyIH0gZnJvbSBcIi4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBBY2Nlc3NIZWxwZXIgfSBmcm9tIFwiLi4vQWNjZXNzSGVscGVyXCI7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudEhhbmRsZXIge1xyXG4gIHByaXZhdGUgX2VuYWJsZWRFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKHRydWUpOyAvLyBkZWZhdWx0IGlzIHRydWUgYWx3YXlzXHJcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uVGFiOiBPcGVyYXRpb25UYWJsZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcHJvcGFnYXRlRXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cCh0cnVlKTtcclxuICBwcml2YXRlIF9pc0hhbmRsZXJPbkZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N0cmxOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2R2TGVuOiBudW1iZXIgPSAwOyAvLyBUaGUg4oCcZHZwb3PCgUVjb250YWlucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBzZWxlY3RlZCBpbiB0aGUgaGFuZGxlclxyXG4gIHByaXZhdGUgX2R2UG9zOiBudW1iZXIgPSAwOyAvLyBhbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmaWVsZCBvZiBpdCBpbiB0aGUgRGF0YXZpZXcuXHJcbiAgcHJpdmF0ZSBfZXZ0OiBFdmVudCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFuZGxlZEJ5Q2xpZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaGFuZGxlckZsZDogRmllbGRCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9oYXNQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfbGV2ZWw6IHN0cmluZyA9ICdcXDAnOyAvLyBDb250cm9sIHwgSGFuZGxlciB8IFJlY29yZCB8IFRhc2sgfCBWYXJpYWJsZVxyXG4gIHByaXZhdGUgX3Njb3BlOiBCcmtTY29wZSA9IG51bGw7IC8vIFRhc2t8U3VidGFza3xHbG9iYWxcclxuICBwcml2YXRlIF90YXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF90YXNrTWdkSUQ6IG51bWJlciA9IC0xO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9vcGVyYXRpb25UYWIgPSBuZXcgT3BlcmF0aW9uVGFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldEN0cmxOYW1lKCkgOiBzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5fY3RybE5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIGV2ZW50IGhhbmRsZXIgYW5kIGl0cyBzdWItc3RydWN0dXJlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbERhdGEodGFza1JlZjogVGFzaywgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YXNrID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2sgPSB0YXNrUmVmO1xyXG4gICAgICB0aGlzLl90YXNrTWdkSUQgPSB0aGlzLl90YXNrLmdldE1nZElEKCk7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIsIHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcbiAgICBsZXQgZGF0YVZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICB0aGlzLl9oYXNQYXJhbWV0ZXJzID0gZGF0YVZpZXcuUGFyYW1ldGVyc0V4aXN0KHRoaXMuX2R2UG9zLCB0aGlzLl9kdkxlbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6aW5nIG9mIGlubmVyIG9iamVjdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhwYXJzZXI6IFhtbFBhcnNlciwgZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpXHJcbiAgICAgIHRoaXMuaW5pdElubmVyRWxlbWVudHMocGFyc2VyLCB0aGlzLl90YXNrKTtcclxuXHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19PUEVSKVxyXG4gICAgICB0aGlzLl9vcGVyYXRpb25UYWIuZmlsbERhdGEodGhpcy5fdGFzaywgdGhpcywgcGFyc2VyKTtcclxuXHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVCAmJiB0aGlzLl9ldnQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZXZ0ID0gbmV3IEV2ZW50KCk7XHJcbiAgICAgIHRoaXMuX2V2dC5maWxsRGF0YShwYXJzZXIsIHRoaXMuX3Rhc2spO1xyXG4gICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiB8fFxyXG4gICAgICAgICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUikpXHJcbiAgICAgICAgdGhpcy5fdGFzay5nZXRNR0RhdGEoKS5hZGRUaW1lckhhbmRsZXIodGhpcyk7XHJcblxyXG4gICAgICAvLyBmb3IgZW5hYmxlIE1HX0FDVF9aT09NIGFjdGlvblxyXG4gICAgICAvLyAxLiBoYW5kbGVyIG9uIHpvb20gYWN0aW9uLlxyXG4gICAgICAvLyAyLiBoYW5kbGVyIG9uIGEgdXNlciBkZWZpbmVkIGhhbmRsZXIgd2l0aCBhIHRyaWdnZXIgb2Ygem9vbSBhY3Rpb24uXHJcbiAgICAgIGlmICgoKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgdGhpcy5fZXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSkgfHwgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSkgJiYgIXRoaXMuX3Rhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQuc2V0SGFzWm9vbUhhbmRsZXIoKTtcclxuXHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX2N0cmwuSGFzWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcInRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIEV2ZW50SGFuZGxlci5pbml0SW5uZXJPYmplY3RzKCkgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbml0aWFsaXppbmcgb2YgaW5uZXIgYXR0cmlidXRlcyBvZiA8aGFuZGxlcj4gdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdElubmVyRWxlbWVudHMocGFyc2VyOiBYbWxQYXJzZXIsIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZiggQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hBTkRMRVIubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yLCB0YXNrUmVmKTtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIEhhbmRsZXIuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmRcdGVsZW1lbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVEQlk6XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVkQnlDbGllbnQgPSAodmFsdWVTdHIudG9VcHBlckNhc2UoKSA9PT0gXCJDXCIudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuX2lkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0xFVkVMOlxyXG4gICAgICAgICAgdGhpcy5fbGV2ZWwgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT0JKRUNUOlxyXG4gICAgICAgICAgbGV0IHZhbHVlU3RyaW5nQ3RybE5hbWU6IHN0cmluZyA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9jdHJsTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cmluZ0N0cmxOYW1lKS50b1VwcGVyQ2FzZSgpOyAvLyByZWxldmFudCBmb3IgdXNlciBoYW5kbGVycyBvbmx5XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUN0cmxGcm9tQ29udHJvbE5hbWUodGFza1JlZik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBUklBQkxFOlxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZCA9IDxGaWVsZEJhc2U+dGhpcy5fdGFzay5EYXRhVmlldy5nZXRGaWVsZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkLnNldEhhc0NoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NDT1BFOlxyXG4gICAgICAgICAgdGhpcy5fc2NvcGUgPSA8QnJrU2NvcGU+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BST1BBR0FURTpcclxuICAgICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTkFCTEVEOlxyXG4gICAgICAgICAgdGhpcy5fZW5hYmxlZEV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPUzpcclxuICAgICAgICAgIGxldCBpOiBudW1iZXIgPSB2YWx1ZVN0ci5pbmRleE9mKFwiLFwiKTtcclxuICAgICAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHZMZW4gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyLnN1YnN0cigwLCBpKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2R2UG9zID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0ci5zdWJzdHIoaSArIDEpKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgZmxkSWR4OiBudW1iZXIgPSB0aGlzLl9kdlBvczsgZmxkSWR4IDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgZmxkSWR4KyspIHtcclxuICAgICAgICAgICAgICBsZXQgZmllbGQ6IEZpZWxkQmFzZSA9ICg8RmllbGRCYXNlPnRoaXMuX3Rhc2suRGF0YVZpZXcuZ2V0RmllbGQoZmxkSWR4KSk7XHJcbiAgICAgICAgICAgICAgZmllbGQuSXNFdmVudEhhbmRsZXJGaWVsZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFORExFUl9PTkZPUk06XHJcbiAgICAgICAgICB0aGlzLl9pc0hhbmRsZXJPbkZvcm0gPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIEV2ZW50SGFuZGxlciBjbGFzcy4gSW5zZXJ0IGNhc2UgdG8gRXZlbnRIYW5kbGVyLmluaXRFbGVtZW50cyBmb3IgXCIgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNhbGN1bGF0ZSB0aGUgY3RybCBwcm9wZXJ0eSBmcm9tIGN0cmwgbmFtZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJpbmdDdHJsTmFtZVwiPjwvcGFyYW0+XHJcblxyXG4gIGNhbGN1bGF0ZUN0cmxGcm9tQ29udHJvbE5hbWUodGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGhpcy5fY3RybE5hbWUpKSB7XHJcbiAgICAgIHRoaXMuX2N0cmwgPSAoKHRhc2tSZWYuZ2V0Rm9ybSgpICE9PSBudWxsKSA/ICg8TWdGb3JtPnRhc2tSZWYuZ2V0Rm9ybSgpKS5nZXRDdHJsQnlDdHJsTmFtZSh0aGlzLl9jdHJsTmFtZSkgOiBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBzcGVjaWZpYyBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoPC9yZXR1cm5zPlxyXG4gIGlzU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9jdHJsID09PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lID09PSBudWxsICYmIHRoaXMuX2hhbmRsZXJGbGQgPT09IG51bGwgJiYgIXRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCBhbmRcclxuICAgIC8vIHRoZSBoYW5kbGVyIGhhbmRsZXMgdGhlIGNvbnRyb2wgYXR0YWNoZWQgdG8gdGhlIGNoZWNrZWQgZXZlbnQsIHJldHVybiB0cnVlXHJcbiAgICAvLyBjb21wYXJlIGNvbnRyb2wgbmFtZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sIGluIHRoZSBldmVudFxyXG4gICAgaWYgKHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpKSB7XHJcbiAgICAgIC8vIFZhcmlhYmxlIGNoYW5nZSBoYW5kbGVycyBkbyBub3QgaGF2ZSBjb250cm9sIG5hbWVzLiBPbmx5IGZpZWxkcyBuZWVkIHRvIGJlIGNvbXBhcmVkXHJcbiAgICAgIGlmICh0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl9oYW5kbGVyRmxkID09PSBydEV2dC5nZXRGbGQoKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJ0RXZ0LkNvbnRyb2wgIT09IG51bGwgJiYgIXRoaXMuX2lzSGFuZGxlck9uRm9ybSkge1xyXG4gICAgICAgIGxldCBldmVudEN0cmxOYW1lOiBzdHJpbmcgPSBydEV2dC5Db250cm9sLmdldENvbnRyb2xOYW1lRm9ySGFuZGxlclNlYXJjaCgpO1xyXG4gICAgICAgIGlmIChldmVudEN0cmxOYW1lICE9PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGV2ZW50Q3RybE5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJ0RXZ0LkNvbnRyb2wgPT09IG51bGwgJiYgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBub24tc3BlY2lmaWMgb3IgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc05vblNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlciBoYW5kbGVzIGEgY29udHJvbCByZXR1cm4gZmFsc2VcclxuICAgIGlmICh0aGlzLl9jdHJsICE9PSBudWxsIHx8IHRoaXMuX2N0cmxOYW1lICE9PSBudWxsIHx8IHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwgfHwgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSAmJiBydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuR2xvYmFsICYmIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsIHJldHVybiB0cnVlXHJcbiAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfTk9USU5JVEVEKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5fZXZ0LmZpbmRVc2VyRXZlbnQoKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoYXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICBpZiAoYXBwbGljYXRpb25FeGNlcHRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBhcHBsaWNhdGlvbkV4Y2VwdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNHbG9iYWxIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlICE9PSBCcmtTY29wZS5HbG9iYWwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlciBoYW5kbGVzIGEgY29udHJvbCByZXR1cm4gZmFsc2VcclxuICAgIGlmICh0aGlzLl9jdHJsICE9IG51bGwgfHwgdGhpcy5fY3RybE5hbWUgIT0gbnVsbCB8fCB0aGlzLl9oYW5kbGVyRmxkICE9IG51bGwgfHwgdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0LmVxdWFscyhydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgc3BlY2lmaWMgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc0dsb2JhbFNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSAhPT0gQnJrU2NvcGUuR2xvYmFsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2N0cmwgPT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZSA9PSBudWxsICYmIHRoaXMuX2hhbmRsZXJGbGQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuICh0aGlzLl9jdHJsTmFtZSAhPSBudWxsICYmIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpICYmXHJcbiAgICAgIE5TdHJpbmcuRXF1YWxzKHRoaXMuX2N0cmxOYW1lLCBydEV2dC5Db250cm9sLk5hbWUsIHRydWUpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IG9uIHdoaWNoIHRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgYW5kXHJcbiAgLy8vICAgdGhlcmVmb3JlIG1pZ2h0IG5vdCBuZWVkIHRvIGNoZWNrIHRoZSBlbmFibGVkIGNvbmRpdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlXCI+aW5kaWNhdGVzIHRoYXQgdGhlIGVuYWJsZWQgY29uZGl0aW9uIHdhcyBhbHJlYWR5IGNoZWNrZWQgYW5kIHRoZXJlJ3Mgbm9cclxuICAvLy8gICBuZWVkIHRvIHJlLWNoZWNrIGl0IChiZWNhdXNlIGl0IG1pZ2h0IGJlIGZhbHNlIG5vdywgYnV0IHdlIHN0aWxsIG5lZWQgdG9cclxuICAvLy8gICBleGVjdXRlIHRoZSBoYW5kbGVyKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0aGlzIGlzIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgaGFuZGxlciwgaWYgdHJ1ZSB0aGVuIHRoZSBldmVudHNcclxuICAvLy8gICBtYW5hZ2VyIG11c3QgY29udGludWUgc2VhcmNoaW5nIGZvciB0aGUgbmV4dCBldmVudCBoYW5kbGVyIGZvciB0aGUgZXZlbnRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gYXN5bmMgZXhlY3V0ZShydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZTogYm9vbGVhbik6IFByb21pc2U8UmV0VmFscz4ge1xyXG5cclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHJldFZhbDogYm9vbGVhbjtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gMDtcclxuICAgIGxldCB0YXNrRW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgYnJrTGV2ZWw6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWwoKTtcclxuICAgIGxldCBicmtMZXZlbEluZGV4OiBudW1iZXIgPSB0aGlzLl90YXNrLmdldEJya0xldmVsSW5kZXgoKTtcclxuICAgIGxldCBpbml0aWFsTG9vcFN0YWNrU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzZXQgbGV2ZWwgZm9yIExFVkVMIGZ1bmN0aW9uXHJcbiAgICBpZiAodGFza0VuZCAhPT0gbnVsbCAmJiB0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiB8fCAodGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpKSkge1xyXG4gICAgICAvLyBVbmxpa2UgYSBoYW5kbGVyLCB0aGUgdXNlciBmdW5jdGlvbiBzaG91bGQgbm90IGNoYW5nZSB0aGUgbGV2ZWwgb2YgdGhlIHRhc2suXHJcbiAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVJfRlVOQylcclxuICAgICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKHJ0RXZ0LmdldEJya0xldmVsKCksIHRoaXMuX2lkKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwodGhpcy5fZXZ0LmdldEJya0xldmVsKCksIHRoaXMuX2lkKTtcclxuXHJcbiAgICBsZXQgYXJnczogQXJndW1lbnRzTGlzdCA9IHJ0RXZ0LmdldEFyZ0xpc3QoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG5cclxuICAgICAgLy8gUm91dGUgZXZlbnQgY2FuIG9ubHkgYmUgaGFuZGxlZCBpbiBhIHRhc2sgd2hpY2ggaXMgb3BlbmVkIGFzIHJvdXRlciBsaW5rIG9yIHRoZSByb290IHRhc2suXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNSb3V0ZSgpICYmIHRoaXMuX3Rhc2sgIT09IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkLiBpZiBub3QsIHJldHVybiB0cnVlIHRvIGNvbnRpbnVlIHNlYXJjaGluZ1xyXG4gICAgICAvLyBmb3IgdGhlIG5leHQgZXZlbnQgaGFuZGxlclxyXG4gICAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIC0gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbmV4dCBvcGVyYXRpb24gaXMgb24gdGhlIGN1cnJlbnRcclxuICAgICAgICAvLyBoYW5kbGVyICh1c2luZyBhIGNhbGwgdG8gZ2V0TmV4dE9wZXJJZHgoKSB3aXRoIGZhbHNlIGluIHRoZSBjbGVhcldoZW5Gb3VuZCBwYXJhbWV0ZXIpXHJcbiAgICAgICAgLy8gYW5kIGlmIGl0IGlzIC0gZG8gbm90IGNoZWNrIHRoZSBlbmFibGVkIGNvbmRpdGlvbiwgYmVjYXVzZSBpdCBtaWdodCBoYXZlIGNoYW5nZWRcclxuICAgICAgICAvLyBzaW5jZSBpdCB3YXMgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgdG8gZ28gaW50byB0aGlzIGhhbmRsZXIgZXZlbiBpZiBpdCBpcyBub3RcclxuICAgICAgICAvLyBjdXJyZW50bHkgZW5hYmxlZFxyXG4gICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbigwKSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXh0T3BlcklkeCA9PT0gLTEgJiYgIWVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSAmJiAhYXdhaXQgdGhpcy5pc0VuYWJsZWQoKSlcclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgdGhlIHNjb3BlIGZvciBFeHByZXNzaW9uIGFuZCBUaW1lciBoYW5kbGVyc1xyXG4gICAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiB8fCBydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpIHtcclxuICAgICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2sgIT09IGN1cnJUYXNrKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX2hhbmRsZWRCeUNsaWVudCkge1xyXG4gICAgICAgIC8vIHJldHVybiBmYWxzZSB0byBzdG9wIHNlYXJjaGluZyBmb3IgdGhlIG1vcmUgaGFuZGxlcnMgYmVjYXVzZVxyXG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIgaGFkIHRha2VuIGNhcmUgb2YgYWxsIG9mIHRoZW1cclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgIWF3YWl0IHRoaXMuX2V2dC5kYXRhRXZlbnRJc1RydWUoKSlcclxuICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKVxyXG4gICAgICAgIHRhc2tFbmQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCwgcnRFdnQuQ29udHJvbC5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgsIHJ0RXZ0LkNvbnRyb2wuTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0ZsZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUsIHJ0RXZ0LmdldEZsZCgpLmdldE5hbWUoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04sXHJcbiAgICAgICAgICAgICAgcnRFdnQuQ29udHJvbC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGlmICh0YXNrRW5kICE9PSBudWxsKVxyXG4gICAgICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuXHJcbiAgICAgICAgbGV0IG1nZElEOiBudW1iZXIgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWRDdXJyV25kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZEN1cnJXbmRSZWY6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGlzQ2hhbmdlZEN1cnJXbmQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZm9yIHRpbWVyIGV2ZW50cyBjaGVjayBpZiB0aGUgdGFzayBvZiB0aGUgZXZlbnQgaXMgaW4gdGhlXHJcbiAgICAgICAgLy8gY3VycmVudCB3aW5kb3cgYW5kIGlmIG5vdCB0aGVuIGNoYW5nZSB0aGUgY3VycmVudCB3aW5kb3dcclxuICAgICAgICAvLyB0ZW1wb3JhcmlseSB0aWxsIHRoZSBoYW5kbGVyIGZpbmlzaGVzXHJcbiAgICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgJiYgbWdkSUQgIT09IHJ0RXZ0LmdldE1nZElEKCkpIHtcclxuICAgICAgICAgIC8vIHNldCBudW1iZXIgb2Ygd2luZG93IGZvciB0aW1lciBldmVudFxyXG4gICAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IHJ0RXZ0LmdldE1nZElEKCk7XHJcbiAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHB1dCBpbml0aWFsIHZhbHVlcyB0byB0aGUgbG9jYWwgdmFyaWFibGVzXHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldExvY2FsVmFyaWFibGVzKGFyZ3MpO1xyXG5cclxuICAgICAgICBpbml0aWFsTG9vcFN0YWNrU2l6ZSA9IHRoaXMuX3Rhc2suZ2V0TG9vcFN0YWNrU2l6ZSgpO1xyXG4gICAgICAgIGxldCByZXRWYWxzOiBSZXRWYWxzID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldFNpemUoKSA+IDApXHJcbiAgICAgICAgICByZXRWYWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucygwLCB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0U2l6ZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoLCBpc0NoYW5nZWRDdXJyV25kUmVmLCBmYWxzZSwgZmFsc2UsIC0xKTtcclxuXHJcbiAgICAgICAgaXNDaGFuZ2VkQ3VyclduZCA9IGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChyZXRWYWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIHJldFZhbHM7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIHRoZSBlbmR0YXNrIGNvbmRpdGlvbiBvbmNlIGFnYWluIGF0IHRoZSBlbmQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICBpZiAoIXRhc2tFbmQpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl90YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIGN1cnJlbnQgd2luZG93IGJhY2sgaWYgaXQgd2FzIGNoYW5nZWQgZm9yIFRpbWVyXHJcbiAgICAgICAgaWYgKGlzQ2hhbmdlZEN1cnJXbmQpIHtcclxuICAgICAgICAgIGxldCBvbGRNZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEobWdkSUQpO1xyXG4gICAgICAgICAgaWYgKG9sZE1nZCAhPT0gbnVsbCAmJiAhb2xkTWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSBtZ2RJRDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIHdoaWxlIG9wZXJhdGlvbiBibG9ja1xyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgaWYgKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYylcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBwcm9wYWdhdGUgdmFsdWVcclxuICAgICAgICByZXRWYWwgPSBhd2FpdCB0aGlzLl9wcm9wYWdhdGVFeHAuZ2V0VmFsKCk7XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBsb29wIGNvdW50ZXJzIHRoYXQgd2VyZSBsZWZ0IHVudXNlZCBpbiB0aGUgc3RhY2sgZHVlIHRvIGxlYXZpbmdcclxuICAgICAgICAvLyB0aGUgaGFuZGxlciBvbiBcInN0b3BFeGVjdXRpb24oKSA9PSB0cnVlXCJcclxuICAgICAgICBsZXQgY3Vyckxvb3BTdGFja1NpemU6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0TG9vcFN0YWNrU2l6ZSgpO1xyXG4gICAgICAgIGZvciAoOyBjdXJyTG9vcFN0YWNrU2l6ZSA+IGluaXRpYWxMb29wU3RhY2tTaXplOyBjdXJyTG9vcFN0YWNrU2l6ZSA9IGN1cnJMb29wU3RhY2tTaXplLS0pXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFmdGVyIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyB1cGRhdGUgdGhlIGFyZ3VtZW50cyBiYWNrIGFuZCByZWNvbXB1dGVcclxuICAgICAgaWYgKGFyZ3MgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRBcmdWYWxzRnJvbUZsZHMoYXJncyk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dGbGQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFLCBydEV2dC5nZXRGbGQoKS5nZXROYW1lKCksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgMSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAvLyByZXN0b3JpbmcgIHRoZSBvcmlnaW5hbCBicmVhayBsZXZlbCBzdGF0ZSBhbmQgY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleFxyXG4gICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKGJya0xldmVsLCBicmtMZXZlbEluZGV4KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmV0VmFscyhyZXRWYWwsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgc3RhcnRpbmcgZnJvbSBmcm9tSWR4IGFuZCBlbmRpbmcgYXQgZW5kSWR4LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlT3BlcmF0aW9ucyhmcm9tSWR4OiBudW1iZXIsIHRvSWR4OiBudW1iZXIsIHRhc2tFbmQ6IGJvb2xlYW4sIG1nZElEOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmOiBSZWZQYXJhbTxib29sZWFuPiwgaW5CbG9ja0lmOiBib29sZWFuLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmV4dE9wZXJJZHg6IG51bWJlcik6IFByb21pc2UgPFJldFZhbHM+IHtcclxuICAgIGxldCBvcGVyOiBPcGVyYXRpb247XHJcbiAgICBsZXQgb3BlclR5cGU6IG51bWJlcjtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSB0aGlzLl90YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGV4ZWNGbG93SWR4OiBudW1iZXIgPSBmcm9tSWR4O1xyXG4gICAgbGV0IHJldHZhbHM6IFJldFZhbHM7XHJcbiAgICBsZXQgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGV4ZWN1dGVCbG9jazogYm9vbGVhbjtcclxuICAgIGxldCBibG9ja0xvb3BFeGVjb25TZXJ2ZXI6IGJvb2xlYW47XHJcbiAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG4gICAgbGV0IHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIWluUmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWQgcnVubmluZyB0aGlzIGhhbmRsZXJcclxuICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG4gICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gaW5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgIG5leHRPcGVySWR4ID0gaW5OZXh0T3BlcklkeDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDsgZXhlY0Zsb3dJZHggPD0gdG9JZHggJiZcclxuICAgICAgICAgICAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpICYmXHJcbiAgICAgICAgICAgIW1nZC5Jc0Fib3J0aW5nICYmICFyb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkO1xyXG4gICAgICAgICAgIGV4ZWNGbG93SWR4ICs9IDEpIHtcclxuICAgICAgaWYgKGluQmxvY2tJZiAmJiBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyICYmIHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24odG9JZHgpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuXHJcbiAgICAgIG9wZXJUeXBlID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBJZiBEZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlLCBpdCBtZWFucyB3ZSBhcmUgaGVyZSBUUyBvZiBjbG9zaW5nIHRhc2suXHJcbiAgICAgIC8vIFNvLCBzZXQgZmlyc3Qgb3BlcmF0aW9uIG9mIGhhbmRsZXIgYXMgc2VydmVyLiByZXR1cm4gYmFjay5cclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICBhd2FpdCBvcGVyLm9wZXJTZXJ2ZXIobnVsbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNraXAgdG8gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIGFmdGVyIHJldHVybmluZyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlciAmJiBvcGVyLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICBpZiAob3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tFbmQoKSkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoIXRhc2tFbmQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fdGFza01nZElEICE9PSBtZ2RJRClcclxuICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5pc01haW5Qcm9nKCkgJiYgdGhpcy5fdGFzay5pc09wZW5XaW4oKSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gdGhpcy5fdGFza01nZElEO1xyXG5cclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuQ2hlY2tBbmRTaG93U3Bpbm5lcih0cnVlKTtcclxuXHJcbiAgICAgIHN3aXRjaCAob3BlclR5cGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfVkVSSUZZOlxyXG4gICAgICAgICAgLy8gaWYgdHJ1ZSByZXR1cm5lZCB0aGVuIHRoZSB2ZXJpZnkgY29uZGl0aW9uIHdhcyB0cnVlIGFuZCB0aGUgbW9kZSBpcyBFcnJvclxyXG4gICAgICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWwoKSA9PT0gXCJUU1wiKSkge1xyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRJblJlY29yZFN1ZmZpeCgpICYmIHRoaXMuX3Rhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTk1MTA4IC0gdmVyaWZ5IGVycm9yIGluIFJTIHNob3VsZG4ndCB0cmlnZ2VyIFJQXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIGlmIHdlIGFyZSBpbiB0aGUgcmV2ZXJ0IG1vZGUsIGRvbnQgc3RvcCBpbW1lZGlhdGVseS5cclxuICAgICAgICAgICAgICogZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBvZiB0aGUgaGFuZGxlciBpbiB0aGUgcmV2ZXJzZSBvcmRlciBhbmQgdGhlbiBzdG9wLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUDpcclxuICAgICAgICAgIC8vIG9uIGdldHRpbmcgYSBCbG9ja0xvb3AsIGV4ZWN1dGUgdGhlIGxvb3AgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgaW50ZW5kZWQsXHJcbiAgICAgICAgICAvLyBhbmQgdGhlbiBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5lbnRlckxvb3AoKTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suaW5jcmVhc2VMb29wQ291bnRlcigpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKG9wZXIsIHRydWUsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgICAgICAgYmxvY2tMb29wRXhlY29uU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIW9wZXIuZ2V0RXhlY09uU2VydmVyKCkpIHtcclxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgbG9vcCBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpbnRlbmRlZFxyXG4gICAgICAgICAgICB3aGlsZSAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNhbGwgZXhlY3V0ZU9wZXJhdGlvbnMoKSB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25zIHdpdGhpbiBhIEJsb2NrTG9vcFxyXG4gICAgICAgICAgICAgIHJldHZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKGV4ZWNGbG93SWR4ICsgMSwgb3Blci5nZXRCbG9ja0Nsb3NlKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGggKyAxLFxyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZiwgZmFsc2UsIGZhbHNlLCAtMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFscztcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IGEgcmV2ZXJ0IGluc2lkZSBhIGxvb3AsIGJyZWFrIHRoZSBsb29wXHJcbiAgICAgICAgICAgICAgaWYgKChtZ2QuSXNBYm9ydGluZyB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLmluY3JlYXNlTG9vcENvdW50ZXIoKTtcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKVxyXG4gICAgICAgICAgICAgIGJsb2NrTG9vcEV4ZWNvblNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWJsb2NrTG9vcEV4ZWNvblNlcnZlcilcclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgKiBPbmNlIHdlIGZpbmlzaCBleGVjdXRpbmcgdGhlIGxvb3AsXHJcbiAgICAgICAgICAgKiBpZiB3ZSBhcmUgbW92aW5nIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLmxlYXZlTG9vcCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSzpcclxuICAgICAgICAgIC8vIG9uIGdldHRpbmcgYSBCbG9jayBJRiwgZXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBibG9jayAoaWYgb3IgZWxzZSlcclxuICAgICAgICAgIC8vIGFuZCB0aGVuIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICBsZXQgc3RhcnRCbG9ja0lkeDogbnVtYmVyID0gZXhlY0Zsb3dJZHg7XHJcbiAgICAgICAgICBpZiAoIW9wZXIuZ2V0RXhlY09uU2VydmVyKCkgfHwgKHJldHVybmVkRnJvbVNlcnZlciAmJiBvcGVyLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmICghcmV0dXJuZWRGcm9tU2VydmVyIHx8IG9wZXIuZ2V0U2VydmVySWQoKSA+PSBuZXh0T3BlcklkeClcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBleGVjdXRhYmxlIGJsb2NrIGJldHdlZW4gQmxvY2sgSUYgYW5kIEJsb2NrIEVORFxyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gYXdhaXQgdGhpcy5nZXRTaWduaWZpY2FudEJsb2NrKGV4ZWNGbG93SWR4LCBvcGVyLmdldEJsb2NrRW5kKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSB0aGlzLmdldFN0YXJ0QmxvY2tJZklkeEJ5T3BlcihleGVjRmxvd0lkeCwgbmV4dE9wZXJJZHgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICAgIGF3YWl0IG9wZXIub3BlclNlcnZlcihudWxsKTtcclxuICAgICAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG5leHRPcGVySWR4IDwgdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrRW5kKCkpLmdldFNlcnZlcklkKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNpZ25pZmljYW50IGJsb2NrIGluIHdoaWNoIHRoZSBuZXh0IG9wZXJhdGlvbiBpc1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0Nsb3NlKCkpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeCkge1xyXG4gICAgICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tDbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChleGVjRmxvd0lkeCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgZXhlY3V0ZUJsb2NrID0gdHJ1ZTtcclxuICAgICAgICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tDbG9zZSgpKS5nZXRTZXJ2ZXJJZCgpIDw9IG5leHRPcGVySWR4KSB7XHJcbiAgICAgICAgICAgICAgICBleGVjdXRlQmxvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVCbG9jaykge1xyXG4gICAgICAgICAgICAgIC8vIGNhbGwgZXhlY3V0ZU9wZXJhdGlvbnMoKSB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25zIGluIHRoZSBleGVjdXRhYmxlIGJsb2NrXHJcbiAgICAgICAgICAgICAgcmV0dmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoZXhlY0Zsb3dJZHggKyAxLCBvcGVyLmdldEJsb2NrQ2xvc2UoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCArIDEsXHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLCB0cnVlLCByZXR1cm5lZEZyb21TZXJ2ZXIsIG5leHRPcGVySWR4KTtcclxuICAgICAgICAgICAgICBpZiAocmV0dmFscyAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGlmICghcmV0dmFscy5SZXR1cm5lZEZyb21TZXJ2ZXIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxzO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHJldHZhbHMuUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICAgICAgICAgICAgICBuZXh0T3BlcklkeCA9IHJldHZhbHMuTmV4dE9wZXJJZHg7XHJcbiAgICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSByZXR2YWxzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgICogT25jZSB3ZSBmaW5pc2ggZXhlY3V0aW5nIHRoZSBibG9jayxcclxuICAgICAgICAgICAqIGlmIHdlIGFyZSBtb3ZpbmcgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLCBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgICogb3RoZXJ3aXNlLCBtb3ZlIHRvIEJsb2NrIElGXHJcbiAgICAgICAgICAgKi9cclxuICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0s6XHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24ob3BlciwgdHJ1ZSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQ0FMTDpcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICAvLyBpZiBmYWxzZSBpcyByZXR1cm5lZCwgaXQgbWVhbnMgdGhhdCBhIHJvdXRlIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQuXHJcbiAgICAgICAgICByb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkID0gYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb25zICh0aG9zZSB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGZsb3cpXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIHNlcnZlciBoYXZlIGV4ZWN1dGVkIGEgYmxvY2sgb2Ygb3BlcmF0aW9ucyB0aGVuIGdldCB0aGUgbmV4dFxyXG4gICAgICAvLyBvcGVyYXRpb24gaW5kZXhcclxuICAgICAgaWYgKCFibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkKVxyXG4gICAgICByZXR2YWxzID0gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgZWxzZSBpZiAoYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcilcclxuICAgICAgcmV0dmFscyA9IG5ldyBSZXRWYWxzKG5leHRPcGVySWR4LCByZXR1cm5lZEZyb21TZXJ2ZXIsIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR2YWxzID0gbnVsbDtcclxuICAgIHJldHVybiByZXR2YWxzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZXhlY3V0YWJsZSBCbG9jayAoSUYgb3IgRUxTRSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhcnRCbG9ja0lkeFwiPnRoZSBpbmRleCBvZiB0aGUgQmxvY2sgSUY8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kSWR4XCI+dGhlIEJsb2NrIEVuZCBJbmRleCBvZiB0aGUgQmxvY2sgSUY8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgaW5kZXggb2YgdGhlIGJsb2NrIChJRiBvciBFTFNFIG9yIG5leHQgRUxTRSAuLi4pdGhhdCBjYW4gYmUgZXhlY3V0ZWQuXHJcbiAgLy8vICAgSWYgbm8gYmxvY2tzIGNhbiBiZSBleGVjdXRlZCwgcmV0dXJuIC0xXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGdldFNpZ25pZmljYW50QmxvY2soc3RhcnRCbG9ja0lkeDogbnVtYmVyLCBlbmRJZHg6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnRCbG9ja0lkeCA8IGVuZElkeCkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihzdGFydEJsb2NrSWR4KTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSyAmJiBvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFICYmIG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX1NFUlZFUilcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKSB7XHJcbiAgICAgICAgcmV0SWR4ID0gc3RhcnRCbG9ja0lkeDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc3RhcnRCbG9ja0lkeCA9IG9wZXIuZ2V0QmxvY2tDbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGlkeCBvZiB0aGUgQmxvY2sgSUZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kSWR4XCI+LS0tIHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgRW5kXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiB3aG9zZSBCbG9ja0VuZCBJZHggbWF0Y2hlcyB3aXRoIHRoZSBlbmRJZHhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lkeEJ5RW5kKGVuZElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgZm9yIChqID0gZW5kSWR4IC0gMTsgaiA+PSAwICYmICFmb3VuZDsgai0tKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLIHx8IG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1ApIHtcclxuICAgICAgICBpZiAob3Blci5nZXRCbG9ja0VuZCgpID09PSBlbmRJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGlkeCBvZiB0aGUgQmxvY2sgSUZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZWxzZUlkeFwiPi0tLSB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIEVsc2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIHdob3NlIEJsb2NrRW5kIElkeCBtYXRjaGVzIHdpdGggdGhlIGVuZElkeFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWR4QnlFbHNlKGVsc2VJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVsc2VCbG9ja0VuZDogbnVtYmVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihlbHNlSWR4KS5nZXRCbG9ja0VuZCgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGZvciAoaiA9IGVsc2VJZHggLSAxOyBqID49IDAgJiYgIWZvdW5kOyBqLS0pIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spIHtcclxuICAgICAgICBpZiAob3Blci5nZXRCbG9ja0VuZCgpID09PSBlbHNlQmxvY2tFbmQpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIElGIG9yIEVsc2UgYWNjb3JkaW5nIHRvIHRoZSBpbmRleCBvZiBvbmUgb2YgdGhlIG9mIG9wZXJhdGlvbnMgaW4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvY2tPcGVySWR4XCI+LS0tIGluZGV4IG9mIHRoZSBpZiBibG9jayBmb3Igd2hpY2ggd2UgaGF2ZSB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBibG9jayB0byBleGVjdXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzcnZyT3BlcklkeFwiPi0tLSB0aGUgc2VydmVyIGlkIG9mIHRoZSBuZXh0IG9wZXJhdGlvbiB3aGljaCB0aGUgY2xpZW50IHNob3VsZCBleGVjdXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiBvciBFbHNlIHdoaWNoIGhvbGQgdGhlIG9wZXJhdGlvbiB3aGljaCBvcGVySWR4IGlzIGl0cyBpbmRleFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWZJZHhCeU9wZXIoYmxvY2tPcGVySWR4OiBudW1iZXIsIHNydnJPcGVySWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBqOiBudW1iZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuc2VydmVySWQyb3BlcklkeChzcnZyT3BlcklkeCwgYmxvY2tPcGVySWR4KSAtIDE7XHJcblxyXG4gICAgaWYgKGogPT09IC0yKSB7XHJcbiAgICAgIGogPSB0aGlzLl9vcGVyYXRpb25UYWIuc2VydmVySWQyRm9sbG93aW5nT3BlcklkeChzcnZyT3BlcklkeCwgYmxvY2tPcGVySWR4KSAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKGogPj0gMCAmJiAhZm91bmQpIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgIGlmIChqID09PSBibG9ja09wZXJJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGotLTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFKSB7XHJcbiAgICAgICAgbGV0IGJsb2NrU3RydDogbnVtYmVyID0gdGhpcy5nZXRTdGFydEJsb2NrSWR4QnlFbHNlKGopO1xyXG4gICAgICAgIGlmIChibG9ja1N0cnQgPT09IGJsb2NrT3BlcklkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaiA9IGJsb2NrU3RydCAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0spXHJcbiAgICAgICAgaiA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lkeEJ5RW5kKGopIC0gMTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGotLTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExldmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBldmVudCBvZiB0aGlzIGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEV2ZW50KCk6IEV2ZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9ldnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBJZCBvZiB0aGUgZXZlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGNvbnRyb2wgb2YgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFN0YXRpY0N0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdHJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0UnVuVGltZUN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiA8TWdDb250cm9sPkFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkuQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNFbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VuYWJsZWRFeHAuZ2V0VmFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIHVzaW5nIHRoZSBhcmd1bWVudCB2YWx1ZXMgb3IgdGhlIGRlZmF1bHRcclxuICAvLy8gICB2YWx1ZXMgb3IgdGhlIGluaXQgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhcmdzXCI+dGhlIGFyZ3VtZW50cyBsaXN0IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyByZXNldExvY2FsVmFyaWFibGVzKGFyZ3M6IEFyZ3VtZW50c0xpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBhcmdJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgZmllbGRJZHg6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBmaWVsZElkeCA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGZpZWxkSWR4KyspIHtcclxuICAgICAgICBsZXQgYUZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGZpZWxkSWR4KTtcclxuICAgICAgICBsZXQgdmFySXNQYXJtOiBib29sZWFuID0gIXRoaXMuX2hhc1BhcmFtZXRlcnMgfHwgYUZpZWxkLmlzUGFyYW0oKTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGZpZWxkIHNob3VsZCBnZXQgaXRzIHZhbHVlIGZyb20gYW4gYXJndW1lbnRcclxuICAgICAgICBpZiAoKGFyZ3MgIT09IG51bGwgJiYgYXJnSWR4IDwgYXJncy5nZXRTaXplKCkpICYmIHZhcklzUGFybSkge1xyXG4gICAgICAgICAgaWYgKCFhcmdzLmdldEFyZyhhcmdJZHgpLnNraXBBcmcoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdzLmdldEFyZyhhcmdJZHgpLnNldFZhbHVlVG9GaWVsZChhRmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFGaWVsZC5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFGaWVsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyZ0lkeCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGFGaWVsZC5pbnZhbGlkYXRlKHRydWUsIEZpZWxkQmFzZS5DTEVBUl9GTEFHUyk7XHJcbiAgICAgICAgICBhd2FpdCBhRmllbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IGFGaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgdGhyb3cgZXhjZXB0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVzdWx0IHZhbHVlcyB0byB0aGUgZmllbGQgYXJndW1lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFyZ3NcIj50aGUgYXJndW1lbnRzIGxpc3QgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdldEFyZ1ZhbHNGcm9tRmxkcyhhcmdzOiBBcmd1bWVudHNMaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgazogbnVtYmVyID0gMDtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gdGhpcy5fZHZQb3M7IGogPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuICYmIGsgPCBhcmdzLmdldFNpemUoKTsgaisrKSB7XHJcbiAgICAgIGxldCBhRmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoaik7XHJcbiAgICAgIGlmICghdGhpcy5faGFzUGFyYW1ldGVycyB8fCBhRmllbGQuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgbGV0IGFyZzogQXJndW1lbnQgPSBhcmdzLmdldEFyZyhrKTtcclxuICAgICAgICBpZiAoYXJnLmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuQVJHX1RZUEVfRklFTEQpIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmllbGQgdmFsdWUgZnJvbSB0aGUgdGhlIFBhcmFtXHJcbiAgICAgICAgICBsZXQgYXJnRmxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmFyZy5nZXRGaWVsZCgpO1xyXG5cclxuICAgICAgICAgIC8vIEEgaGFuZGxlciBjYW4gYmUgY2FsbGVkIGVpdGhlciBmcm9tIHRoZSBzYW1lIHRhc2sgKG9mIHRoZSBoYW5kbGVyKSBvciBmcm9tIGFcclxuICAgICAgICAgIC8vIHRhc2sgbG93ZXIgZG93biBpbiB0aGUgaGllcmFyY2h5LlxyXG4gICAgICAgICAgLy8gSGVyZSB3ZSBhcmUgY29weWluZyB2YWx1ZSBmcm9tIHRoZSBoYW5kbGVyIHRhc2sgdG8gdGhlIGludm9rZXIgdGFzay5cclxuICAgICAgICAgIC8vIENvcHlpbmcgc2hvdWxkIG5vdCBiZSBkb25lIGlmIGFueSBvbmUgb2YgdGhlIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICAvLyBCdXQgY2hlY2tpbmcgb25seSB0aGUgaW52b2tlciB0YXNrJ3MgaXNBYm9ydGluZyBpcyBzdWZmaWNpZW50IGhlcmUgYmVjYXVzZSxcclxuICAgICAgICAgIC8vIGl0IHdpbGwgYmUgdHJ1ZSBldmVuIGlmIHRoZSBoYW5kbGVyIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICBpZiAoYXJnRmxkLmdldFRhc2soKSAhPT0gbnVsbCAmJiAhKDxUYXNrPmFyZ0ZsZC5nZXRUYXNrKCkpLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBhRmllbGQuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdGbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWwsIGFGaWVsZC5pc051bGwoKSwgdHJ1ZSwgYUZpZWxkLmlzTW9kaWZpZWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCBhcmdGbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBrKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBoYW5kbGVyJ3MgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkIGJ5IHRoZSBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhcmdzTWF0Y2goRXhwX3BhcmFtczogRXhwVmFsW10pOiBib29sZWFuIHtcclxuICAgIGxldCBhcmdzTWF0Y2hlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBwYXJhbUNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBpIDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgaSsrKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKGZpZWxkLmlzUGFyYW0oKSkge1xyXG4gICAgICAgIHBhcmFtQ291bnQrKztcclxuICAgICAgICBpZiAoaiA8IEV4cF9wYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgZmllbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmllbGQuZ2V0VHlwZSgpO1xyXG4gICAgICAgICAgbGV0IGFyZ0F0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBFeHBfcGFyYW1zW2pdLkF0dHI7XHJcblxyXG5cclxuICAgICAgICAgIC8vIGFyZ3VtZW50IGFuZCBwYXJhbWV0ZXIgd2lsbCBub3QgbWF0Y2ggaWYgOlxyXG4gICAgICAgICAgLy8gMS4gVGhleSBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGVcclxuICAgICAgICAgIC8vIDIuIFRoZXkgQ2Fubm90IGJlIGNhc3QgKGFscGhhIGNhbiBiZSBjYXN0IHRvIHVuaWNvZGUpXHJcbiAgICAgICAgICAvLyAzLiBBbGwgdGhvc2UgYXBwbHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbC4gaWYgdGhlIHBhcmFtIHZhbCBpcyBudWxsIGl0IGNhbiBnbyBpbnRvIGFueSB0eXBlIG9mIHBhcmFtZXRlci5cclxuICAgICAgICAgIGlmICghRXhwX3BhcmFtc1tqXS5Jc051bGwgJiYgIVN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1RoZVNhbWVUeXBlKGZpZWxkQXR0ciwgYXJnQXR0cikgJiYgIVN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5TdG9yYWdlRmxkQWxwaGFVbmljb2RlT3JCbG9iKGZpZWxkQXR0ciwgYXJnQXR0cikpIHtcclxuICAgICAgICAgICAgYXJnc01hdGNoZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBqKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhcmFtQ291bnQgIT09IEV4cF9wYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgIGFyZ3NNYXRjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJnc01hdGNoZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgT3BlcmF0aW9uVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9wZXJhdGlvblRhYigpOiBPcGVyYXRpb25UYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9uVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbiBjYXNlIG9mIENvbnRyb2wgaGVhZGVycywgcmV0dXJuIGNvbnRyb2wgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29udHJvbE5hbWVGb3JDb250cm9sSGVhZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZih0aGlzLmdldEV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuXHJcbiAgICAgIC8vIFJldHVybiB0aGUgY29udHJvbCBuYW1lIGZvciBDb250cm9sIEhlYWRlcnNcclxuICAgICAgaWYgKHRoaXMuZ2V0RXZlbnQoKS5pc0NvbnRyb2xIZWFkZXIoKSAmJiAhaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fY3RybCkpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3RybE5hbWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbiBjYXNlIG9mIFZhcmlhYmxlIGhlYWRlcnMsIHJldHVybiBmaWVsZCBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRWYXJOYW1lRm9yVmFyaWFibGVIZWFkZXIoKTogc3RyaW5nIHtcclxuICAgIC8vIFJldHVybiB0aGUgRmllbGQgbmFtZSBmb3IgVmFyaWFibGUgSGVhZGVyc1xyXG4gICBpZiAodGhpcy5nZXRFdmVudCgpLmlzVmFyaWFibGVIZWFkZXIoKSAmJiAhaXNOdWxsT3JVbmRlZmluZWQodGhpcy5faGFuZGxlckZsZCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyRmxkLmdldFZhck5hbWUoKS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybiB0aGUgZXZlbnQgaGFuZGxlciBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gY2FzZSBvZiAnUmVxdWVzdEluZm8nIGxvZyBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXZlbnRIYW5kbGVySW5mbygpOiBzdHJpbmcge1xyXG4gICAgbGV0IGV2ZW50RGVzY3JpcHRpb246IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIHRoaXMuZ2V0RXZlbnQoKS5BcHBlbmREZXNjcmlwdGlvbihldmVudERlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAvLyBBcHBlbmQgY29udHJvbC92YXJpYWJsZSBuYW1lIGluIENvbnRyb2wvVmFyaWFibGUgaGVhZGVyc1xyXG4gICAgbGV0IGhlYWRlckFkZGl0aW9uYWxJbmZvOiBzdHJpbmcgPSB0aGlzLmdldENvbnRyb2xOYW1lRm9yQ29udHJvbEhlYWRlcigpICsgdGhpcy5nZXRWYXJOYW1lRm9yVmFyaWFibGVIZWFkZXIoKTtcclxuXHJcbiAgICBldmVudERlc2NyaXB0aW9uLkFwcGVuZChoZWFkZXJBZGRpdGlvbmFsSW5mbyk7XHJcblxyXG4gICAgLy8gRm9yIHNvbWUgaGVhZGVycyBsaWtlIFJQL1RQLCB0aGUgZXZlbnQgZGVzY3JpcHRpb24gaXMgZW1wdHkuXHJcbiAgICAvLyBGb3Igb3RoZXJzIGVtcHR5IHNwYWNlIHNob3VsZCBiZSBhZGRlZCBiZXR3ZWVuIGV2ZW50IHR5cGUgYW5kIGRlc2NyaXB0aW9uLlxyXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJsYW5rIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGhhbmRsZXIgdHlwZVxyXG4gICAgaWYoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCkpKVxyXG4gICAgICBldmVudERlc2NyaXB0aW9uID0gbmV3IFN0cmluZ0J1aWxkZXIoJyAnICsgZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpLCBldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCkubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiSGFuZGxlciB7MH17MX1cIiwgdGhpcy5nZXRFdmVudCgpLmdldEV2ZW50VHlwZSgpLCBldmVudERlc2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpcyB0YXNrIHNjb3BlIGlzIGFwcHJvcHJpYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzU2FtZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2hlY2tUYXNrU2NvcGUoaXNTYW1lVGFzazogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmICFpc1NhbWVUYXNrKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIoSGFuZGxlciBmb3IgezB9IG9uIHRhc2sgezF9LCBzY29wZSB7Mn0pXCIsIHRoaXMuX2V2dCwgdGhpcy5fdGFzaywgdGhpcy5fc2NvcGUpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB1c2VkIHRvIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgZXhlY3V0ZSgpIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUmV0VmFscyAge1xyXG4gIEJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTmV4dE9wZXJJZHg6IG51bWJlciA9IDA7XHJcbiAgUHJvcGFnYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKG9wZXJJZHg6IG51bWJlciwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IocE9yT3BlcklkeDogYW55LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlciwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBcIj5wcm9wYWdhdGUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVcIj5lbmFibGVkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gcDtcclxuICAgIHRoaXMuRW5hYmxlZCA9IGU7XHJcbiAgICB0aGlzLk5leHRPcGVySWR4ID0gMDtcclxuICAgIHRoaXMuUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICB0aGlzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wZXJJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IG9wZXJJZHg7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGluUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gIH1cclxufVxyXG5cclxuIl19