@magic-xpa/engine 4.800.0 → 4.801.0-dev000.0

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 (379) 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/esm2020/src/GuiEventsProcessor.mjs +171 -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/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
  23. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
  24. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -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/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
  29. package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
  30. package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -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} +2 -2
  34. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
  35. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -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/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
  41. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
  43. package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
  44. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -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/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
  51. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -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/esm2020/src/data/Record.mjs +846 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/esm2020/src/data/RecordsTable.mjs +267 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -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/esm2020/src/event/EventHandlerPosition.mjs +201 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/esm2020/src/event/IEventsManager.mjs +7 -0
  103. package/esm2020/src/event/RunTimeEvent.mjs +406 -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/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -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/esm2020/src/remote/ServerError.mjs +44 -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/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -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/esm2020/src/rt/Transaction.mjs +54 -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/esm2020/src/tasks/RemoteTaskService.mjs +45 -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/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
  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/esm2020/src/util/Process.mjs +7 -0
  187. package/esm2020/src/util/ReturnResult.mjs +46 -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} +267 -254
  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/GuiEventsProcessor.d.ts +1 -1
  201. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
  202. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
  203. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
  204. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
  205. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
  206. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
  207. package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
  208. package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
  209. package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
  210. package/src/commands/ClientToServer/ExecOperCommand.d.ts +1 -2
  211. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
  212. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
  213. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
  214. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
  215. package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
  216. package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
  217. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
  218. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
  219. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
  220. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
  221. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
  222. package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
  223. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
  224. package/src/commands/DataViewCommandBase.d.ts +2 -2
  225. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  226. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  227. package/src/data/FieldBase.d.ts +3 -3
  228. package/src/data/Record.d.ts +2 -9
  229. package/src/data/RecordsTable.d.ts +1 -2
  230. package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
  231. package/src/env/EnvVariablesTable.d.ts +2 -15
  232. package/src/env/Environment.d.ts +0 -3
  233. package/src/env/MirrorString.d.ts +15 -0
  234. package/src/event/Event.d.ts +0 -3
  235. package/src/event/EventsManager.d.ts +7 -8
  236. package/src/event/IEventsManager.d.ts +5 -6
  237. package/src/exp/ExpressionEvaluator.d.ts +2 -2
  238. package/src/exp/ExpressionLocalJpn.d.ts +2 -2
  239. package/src/exp/GlobalParamsTable.d.ts +2 -1
  240. package/src/gui/MgControl.d.ts +0 -2
  241. package/src/gui/MgForm.d.ts +4 -4
  242. package/src/http/client/HttpClientAsync.d.ts +2 -2
  243. package/src/http/client/HttpClientBase.d.ts +3 -3
  244. package/src/http/client/HttpClientSync.d.ts +2 -2
  245. package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
  246. package/src/rt/DataviewHeaderBase.d.ts +2 -2
  247. package/src/rt/DataviewHeaderFactory.d.ts +1 -1
  248. package/src/rt/Operation.d.ts +3 -1
  249. package/src/rt/RemoteDataviewHeader.d.ts +1 -2
  250. package/src/rt/Transaction.d.ts +1 -1
  251. package/src/tasks/RemoteTaskService.d.ts +2 -3
  252. package/src/tasks/Task.d.ts +1 -1
  253. package/src/tasks/TaskBase.d.ts +7 -7
  254. package/src/tasks/TaskServiceBase.d.ts +2 -4
  255. package/src/tasks/sort/SortCollection.d.ts +2 -3
  256. package/src/util/FlowMonitorQueue.d.ts +1 -1
  257. package/src/util/IMirrorXML.d.ts +1 -1
  258. package/src/util/ParamParseResult.d.ts +6 -0
  259. package/src/util/PrmMap.d.ts +0 -6
  260. package/src/util/Process.d.ts +1 -1
  261. package/bundles/magic-xpa-engine.umd.js +0 -38066
  262. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  263. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  264. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  265. package/esm2015/index.js +0 -188
  266. package/esm2015/src/AccessHelper.js +0 -3
  267. package/esm2015/src/ClientManager.js +0 -412
  268. package/esm2015/src/CommandsProcessorBase.js +0 -54
  269. package/esm2015/src/CommandsProcessorManager.js +0 -31
  270. package/esm2015/src/CommandsTable.js +0 -166
  271. package/esm2015/src/GUIManager.js +0 -72
  272. package/esm2015/src/GuiEventsProcessor.js +0 -171
  273. package/esm2015/src/bridge/MagicBridge.js +0 -44
  274. package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
  275. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
  276. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
  277. package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
  278. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  279. package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
  280. package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
  281. package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
  282. package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
  283. package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
  284. package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -67
  285. package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
  286. package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
  287. package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
  288. package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
  289. package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
  290. package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
  291. package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
  292. package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
  293. package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
  294. package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
  295. package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
  296. package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
  297. package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
  298. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  299. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  300. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  301. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  302. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  303. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  304. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  305. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  306. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  307. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  308. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  309. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  310. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  311. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  312. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  313. package/esm2015/src/data/DataView.js +0 -1693
  314. package/esm2015/src/data/DataviewManager.js +0 -31
  315. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  316. package/esm2015/src/data/Field.js +0 -672
  317. package/esm2015/src/data/FieldBase.js +0 -9
  318. package/esm2015/src/data/Record.js +0 -914
  319. package/esm2015/src/data/RecordsTable.js +0 -267
  320. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  321. package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
  322. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  323. package/esm2015/src/env/Environment.js +0 -563
  324. package/esm2015/src/env/LanguageData.js +0 -230
  325. package/esm2015/src/event/Event.js +0 -1449
  326. package/esm2015/src/event/EventHandler.js +0 -787
  327. package/esm2015/src/event/EventHandlerPosition.js +0 -201
  328. package/esm2015/src/event/EventsManager.js +0 -3107
  329. package/esm2015/src/event/IEventsManager.js +0 -7
  330. package/esm2015/src/event/RunTimeEvent.js +0 -406
  331. package/esm2015/src/exp/Expression.js +0 -209
  332. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4441
  333. package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
  334. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  335. package/esm2015/src/exp/YesNoExp.js +0 -44
  336. package/esm2015/src/gui/FormsTable.js +0 -73
  337. package/esm2015/src/gui/MgControl.js +0 -438
  338. package/esm2015/src/gui/MgForm.js +0 -1292
  339. package/esm2015/src/http/HttpManager.js +0 -100
  340. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  341. package/esm2015/src/http/client/HttpClientBase.js +0 -148
  342. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  343. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  344. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  345. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  346. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -903
  347. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  348. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  349. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  350. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  351. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  352. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  353. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  354. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  355. package/esm2015/src/remote/ServerError.js +0 -45
  356. package/esm2015/src/rt/Argument.js +0 -281
  357. package/esm2015/src/rt/ArgumentsList.js +0 -108
  358. package/esm2015/src/rt/Boundary.js +0 -161
  359. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  360. package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
  361. package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
  362. package/esm2015/src/rt/Operation.js +0 -769
  363. package/esm2015/src/rt/Recompute.js +0 -372
  364. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  365. package/esm2015/src/rt/TableCache.js +0 -182
  366. package/esm2015/src/rt/TableCacheManager.js +0 -70
  367. package/esm2015/src/rt/Transaction.js +0 -54
  368. package/esm2015/src/tasks/MGData.js +0 -561
  369. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  370. package/esm2015/src/tasks/RemoteTaskService.js +0 -45
  371. package/esm2015/src/tasks/Task.js +0 -2593
  372. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  373. package/esm2015/src/tasks/TasksTable.js +0 -87
  374. package/esm2015/src/tasks/sort/SortCollection.js +0 -72
  375. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  376. package/esm2015/src/util/PrmMap.js +0 -157
  377. package/esm2015/src/util/Process.js +0 -7
  378. package/esm2015/src/util/ReturnResult.js +0 -46
  379. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -1,769 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ApplicationException, Debug, Int32, NNumber, NString, Thread } from '@magic-xpa/mscorelib';
3
- import { CallOsShow, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
- import { Commands, NUM_TYPE, PropInterface, Styles, TaskDefinitionIdTableSaxHandler, VectorType } from '@magic-xpa/gui';
5
- import { YesNoExp } from '../exp/YesNoExp';
6
- import { ArgumentsList } from './ArgumentsList';
7
- import { RunTimeEvent } from '../event/RunTimeEvent';
8
- import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
9
- import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
10
- import { ExecOperCommand } from '../commands/ClientToServer/ExecOperCommand';
11
- import { ConstInterface } from '../ConstInterface';
12
- import { FlowMonitorInterface } from '../FlowMonitorInterface';
13
- import { LanguageData } from '../env/LanguageData';
14
- import { LastFocusedManager } from './LastFocusedManager';
15
- import { AccessHelper } from '../AccessHelper';
16
- import { GUIManager } from "../GUIManager";
17
- export class Operation {
18
- constructor() {
19
- this._condExp = new YesNoExp(true);
20
- this._retainFocus = new YesNoExp(false);
21
- this._waitExp = new YesNoExp(false);
22
- this._syncData = new YesNoExp(false);
23
- this._argList = null;
24
- this._blockClose = 0;
25
- this._blockEnd = 0;
26
- this._buttons = '\0';
27
- this._checkByServer = false;
28
- this._cmdToServer = null;
29
- this._display = 'S';
30
- this._errLogAppend = false;
31
- this._evtHandler = null;
32
- this._execOnServer = false;
33
- this._execOnClient = false;
34
- this._exp = null;
35
- this._field = null;
36
- this._globalParamsShouldBeCopied = false;
37
- this._image = '\0';
38
- this._incremental = false;
39
- this._methodNameSnippet = null;
40
- this._mode = '\0';
41
- this._prgDescription = null;
42
- this._publicName = null;
43
- this._returnVal = null;
44
- this._rtEvt = null;
45
- this._serverId = -1;
46
- this.calledTaskDefinitionId = null;
47
- this._show = CallOsShow.Normal;
48
- this._subformCtrlName = null;
49
- this._subtype = '\0';
50
- this._task = null;
51
- this._text = null;
52
- this._title = null;
53
- this._titleExp = null;
54
- this._type = 0;
55
- this._undo = true;
56
- this._isRoute = false;
57
- this._routerPath = null;
58
- this._originalRouterOutletName = null;
59
- this._routeParams = null;
60
- this.OperCallMode = 0;
61
- }
62
- get CalledTaskDefinitionId() {
63
- return this.calledTaskDefinitionId;
64
- }
65
- set Task(value) {
66
- this._task = value;
67
- }
68
- get Task() {
69
- return this._task;
70
- }
71
- Immediate() {
72
- return __awaiter(this, void 0, void 0, function* () {
73
- return yield this._waitExp.getVal();
74
- });
75
- }
76
- fillData(taskRef, evtHandler, parser) {
77
- this._task = taskRef;
78
- this._evtHandler = evtHandler;
79
- while (this.initInnerObjects(parser, parser.getNextTag(), taskRef)) {
80
- }
81
- }
82
- initInnerObjects(parser, foundTagName, taskRef) {
83
- if (foundTagName === null)
84
- return false;
85
- if (foundTagName === ConstInterface.MG_TAG_EVENT) {
86
- this._rtEvt = new RunTimeEvent(taskRef);
87
- this._rtEvt.fillData(parser, taskRef);
88
- }
89
- else if (foundTagName === ConstInterface.MG_TAG_OPER) {
90
- this.fillAttributes(parser, taskRef);
91
- }
92
- else if (foundTagName === "/" + ConstInterface.MG_TAG_OPER) {
93
- parser.setCurrIndex2EndOfTag();
94
- return false;
95
- }
96
- else if (foundTagName === XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY) {
97
- this.InitTaskDefinitionID(parser);
98
- }
99
- else {
100
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Operation. Insert else if to Operation.initInnerObjects for " + foundTagName);
101
- return false;
102
- }
103
- return true;
104
- }
105
- fillAttributes(parser, taskRef) {
106
- let tokensVector;
107
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
108
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
109
- let tag = parser.getXMLsubstring(endContext);
110
- parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_OPER) + ConstInterface.MG_TAG_OPER.length);
111
- tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
112
- this.initElements(tokensVector, taskRef);
113
- parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
114
- return;
115
- }
116
- Logger.Instance.WriteExceptionToLogWithMsg("in Command.FillData() out of string bounds");
117
- }
118
- initElements(tokensVector, taskRef) {
119
- let attribute, valueStr;
120
- let expId;
121
- let isGuiThreadExecution = false;
122
- for (let j = 0; j < tokensVector.length; j += 2) {
123
- attribute = (tokensVector.get_Item(j));
124
- valueStr = (tokensVector.get_Item(j + 1));
125
- switch (attribute) {
126
- case XMLConstants.MG_ATTR_TYPE:
127
- this._type = XmlParser.getInt(valueStr);
128
- break;
129
- case ConstInterface.MG_ATTR_FLD:
130
- this._field = Operation.InitField(valueStr, this._task);
131
- break;
132
- case XMLConstants.MG_ATTR_EXP:
133
- expId = XmlParser.getInt(valueStr);
134
- this._exp = taskRef.getExpById(expId);
135
- break;
136
- case ConstInterface.MG_ATTR_TEXT:
137
- this._text = XmlParser.unescape(valueStr);
138
- break;
139
- case ConstInterface.MG_ATTR_MODE:
140
- this._mode = valueStr[0];
141
- break;
142
- case ConstInterface.MG_ATTR_SUBTYPE:
143
- this._subtype = valueStr[0];
144
- if (this._type === ConstInterface.MG_OPER_BLOCK) {
145
- if (this._subtype === 'E')
146
- this._type = ConstInterface.MG_OPER_ELSE;
147
- else if (this._subtype === 'L')
148
- this._type = ConstInterface.MG_OPER_LOOP;
149
- }
150
- break;
151
- case ConstInterface.MG_ATTR_CLOSE:
152
- this._blockClose = XmlParser.getInt(valueStr);
153
- break;
154
- case ConstInterface.MG_ATTR_END:
155
- this._blockEnd = XmlParser.getInt(valueStr);
156
- break;
157
- case ConstInterface.MG_ATTR_HOW:
158
- this._incremental = (valueStr === "I");
159
- break;
160
- case ConstInterface.MG_ATTR_UNDO:
161
- if (valueStr[0] === 'N')
162
- this._undo = false;
163
- else if (valueStr[0] === 'Y')
164
- this._undo = true;
165
- else
166
- Logger.Instance.WriteExceptionToLogWithMsg("in Operation.initElements(): No such value to the MG_ATTR_UNDO for " + valueStr);
167
- break;
168
- case ConstInterface.MG_ATTR_DISPLAY:
169
- this._display = valueStr[0];
170
- break;
171
- case ConstInterface.MG_ATTR_WAIT:
172
- this._waitExp.setVal(taskRef, valueStr);
173
- break;
174
- case ConstInterface.MG_ATTR_RETAIN_FOCUS:
175
- this._retainFocus.setVal(taskRef, valueStr);
176
- break;
177
- case ConstInterface.MG_ATTR_SYNC_DATA:
178
- this._syncData.setVal(taskRef, valueStr);
179
- break;
180
- case ConstInterface.MG_ATTR_SHOW:
181
- this._show = XmlParser.getInt(valueStr);
182
- break;
183
- case ConstInterface.MG_ATTR_CND:
184
- this._condExp.setVal(taskRef, valueStr);
185
- break;
186
- case ConstInterface.MG_ATTR_ARGLIST:
187
- this._argList = new ArgumentsList();
188
- this._argList.fillList(valueStr, this._task);
189
- break;
190
- case ConstInterface.MG_ATTR_REFRESHON:
191
- this._argList.RefreshOnString = valueStr.Trim();
192
- break;
193
- case ConstInterface.MG_ATTR_SERVER_ID:
194
- this._serverId = XmlParser.getInt(valueStr);
195
- break;
196
- case ConstInterface.MG_ATTR_OPER_CALLMODE:
197
- this.OperCallMode = valueStr[0];
198
- break;
199
- case ConstInterface.MG_ATTR_SUBFORM_CTRL:
200
- this._subformCtrlName = XmlParser.unescape(valueStr);
201
- break;
202
- case ConstInterface.MG_ATTR_CHECK_BY_SERVER:
203
- this._checkByServer = XmlParser.getBoolean(valueStr);
204
- break;
205
- case ConstInterface.MG_ATTR_PUBLIC:
206
- this._publicName = valueStr;
207
- break;
208
- case ConstInterface.MG_ATTR_PRG_DESCRIPTION:
209
- this._prgDescription = valueStr;
210
- break;
211
- case ConstInterface.MG_ATTR_CPY_GLB_PRMS:
212
- this._globalParamsShouldBeCopied = XmlParser.getBoolean(valueStr);
213
- break;
214
- case ConstInterface.MG_ATTR_EXEC_ON_SERVER:
215
- this._execOnServer = XmlParser.getBoolean(valueStr);
216
- break;
217
- case ConstInterface.MG_ATTR_EXEC_ON_CLIENT:
218
- this._execOnClient = XmlParser.getBoolean(valueStr);
219
- break;
220
- case ConstInterface.MG_ATTR_TITLE:
221
- this._title = XmlParser.unescape(valueStr);
222
- break;
223
- case ConstInterface.MG_ATTR_TITLE_EXP:
224
- expId = XmlParser.getInt(valueStr);
225
- this._titleExp = taskRef.getExpById(expId);
226
- break;
227
- case ConstInterface.MG_ATTR_IMAGE:
228
- this._image = valueStr[0];
229
- break;
230
- case ConstInterface.MG_ATTR_BUTTONS:
231
- this._buttons = valueStr[0];
232
- break;
233
- case ConstInterface.MG_ATTR_RETURN_VAL:
234
- this._returnVal = Operation.InitField(valueStr, this._task);
235
- break;
236
- case ConstInterface.MG_ATTR_ERR_LOG_APPEND:
237
- this._errLogAppend = XmlParser.getBoolean(valueStr);
238
- break;
239
- case ConstInterface.MG_ATTR_OPER_METHODNAME:
240
- this._methodNameSnippet = valueStr;
241
- break;
242
- case ConstInterface.MG_ATTR_IS_GUI_THREAD_EXECUTION:
243
- isGuiThreadExecution = XmlParser.getBoolean(valueStr);
244
- break;
245
- case ConstInterface.MG_ATTR_IS_ROUTE:
246
- this._isRoute = XmlParser.getBoolean(valueStr);
247
- break;
248
- case XMLConstants.MG_ATTR_ROUTER_PATH:
249
- this._routerPath = XmlParser.unescape(valueStr);
250
- break;
251
- default:
252
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Operation class. Insert case to Operation.initElements for " + attribute);
253
- break;
254
- }
255
- }
256
- if (this._serverId > -1)
257
- this._cmdToServer = CommandFactory.CreateExecOperCommand(this._task.getTaskTag(), "" + this._evtHandler.getId(), this._serverId, Int32.MinValue, null);
258
- if (this._isRoute) {
259
- this._originalRouterOutletName = this._subformCtrlName !== null ? this._subformCtrlName : "";
260
- if (this._subformCtrlName == null) {
261
- let defaultRouterOutlet = this._task.getForm().DefaultRouterOutlet;
262
- this._subformCtrlName = defaultRouterOutlet !== null ? defaultRouterOutlet.Name : "";
263
- }
264
- }
265
- }
266
- InitTaskDefinitionID(parser) {
267
- let xmlBuffer = parser.ReadToEndOfCurrentElement();
268
- let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
269
- taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
270
- }
271
- SetTaskDefinitionId(taskDefinitionId) {
272
- this.calledTaskDefinitionId = taskDefinitionId;
273
- }
274
- static InitField(valueStr, task) {
275
- let TaskField = XmlParser.getTokens(valueStr, ',');
276
- if (TaskField.length === 2) {
277
- let parent = NNumber.Parse(TaskField.get_Item(0));
278
- let fldID = NNumber.Parse(TaskField.get_Item(1));
279
- let field = task.getFieldDef(parent, fldID);
280
- return field;
281
- }
282
- Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unknown field: '{0}'", valueStr));
283
- return null;
284
- }
285
- execute(returnedFromServer) {
286
- return __awaiter(this, void 0, void 0, function* () {
287
- let lastRtEvent = AccessHelper.eventsManager.getLastRtEvent();
288
- let mprgCreator = null;
289
- let flowMonitor = FlowMonitorQueue.Instance;
290
- if (lastRtEvent !== null)
291
- mprgCreator = lastRtEvent.getMainPrgCreator();
292
- if (returnedFromServer ||
293
- (!returnedFromServer && (this._type !== ConstInterface.MG_OPER_SERVER || !this._condExp.isServerExp()))) {
294
- if (!(yield this.canExecute())) {
295
- if (this._type !== ConstInterface.MG_OPER_LOOP)
296
- yield flowMonitor.addFlowFieldOperation(this, false, this._task.GetTaskDetails());
297
- return false;
298
- }
299
- }
300
- if (this._type !== ConstInterface.MG_OPER_LOOP && this._type !== ConstInterface.MG_OPER_ENDBLOCK)
301
- yield flowMonitor.addFlowFieldOperation(this, true, this._task.GetTaskDetails());
302
- try {
303
- switch (this._type) {
304
- case ConstInterface.MG_OPER_VERIFY:
305
- return yield this.operVerify();
306
- case ConstInterface.MG_OPER_BLOCK:
307
- return this.operBlock();
308
- case ConstInterface.MG_OPER_LOOP:
309
- if (!this.getExecOnServer())
310
- return this.operBlock();
311
- else {
312
- yield this.operServer(mprgCreator);
313
- break;
314
- }
315
- case ConstInterface.MG_OPER_ELSE:
316
- return this.operElse();
317
- case ConstInterface.MG_OPER_EVALUATE:
318
- yield this.operEvaluate();
319
- break;
320
- case ConstInterface.MG_OPER_UPDATE:
321
- yield this.operUpdate(mprgCreator);
322
- break;
323
- case ConstInterface.MG_OPER_RAISE_EVENT:
324
- yield this.operRaiseEvent(mprgCreator, returnedFromServer);
325
- break;
326
- case ConstInterface.MG_OPER_SERVER:
327
- yield this.operServer(mprgCreator);
328
- break;
329
- case ConstInterface.MG_OPER_CALL:
330
- if (this._publicName != null) {
331
- this.operCallParallel();
332
- }
333
- else if (this._subformCtrlName == null)
334
- yield this.operCall(mprgCreator);
335
- else {
336
- let subformTask;
337
- let isEndProg = true;
338
- if (this._checkByServer) {
339
- if (!(this._cmdToServer instanceof ExecOperCommand))
340
- Debug.Assert(false);
341
- let command = this._cmdToServer;
342
- command.CheckOnly = true;
343
- yield this.operCall(mprgCreator);
344
- command.CheckOnly = false;
345
- if (AccessHelper.eventsManager.getNextOperIdx(this, true) > -1)
346
- isEndProg = false;
347
- }
348
- if (isEndProg) {
349
- let destSubForm = this._task.getForm().getSubFormCtrlByName(this._subformCtrlName);
350
- if (this._isRoute && (destSubForm === null || !destSubForm.IsRouterOutlet()))
351
- return false;
352
- if (destSubForm != null) {
353
- if (this._isRoute) {
354
- let canRoute = false;
355
- let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
356
- if (rtEvnt !== null) {
357
- this._routeParams = rtEvnt.getRouteParamList();
358
- if ((yield rtEvnt.getArgList().getArg(0).getValue(StorageAttribute.ALPHA, 0)).trim() === this._routerPath &&
359
- ((rtEvnt.getArgList().getArg(1).skipArg()) ||
360
- (yield rtEvnt.getArgList().getArg(1).getValue(StorageAttribute.ALPHA, 0)).trim() === this._originalRouterOutletName))
361
- canRoute = true;
362
- if (!canRoute)
363
- return false;
364
- }
365
- }
366
- subformTask = destSubForm.getSubformTask();
367
- if (subformTask != null) {
368
- let terminateTaskGracefully = true;
369
- let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
370
- if (this._isRoute && rtEvnt !== null && rtEvnt.isGuiTriggeredEvent()) {
371
- terminateTaskGracefully = false;
372
- AccessHelper.eventsManager.setStopExecution(true);
373
- }
374
- if (yield subformTask.endTask(true, false, !terminateTaskGracefully, true)) {
375
- let parentTask = destSubForm.getForm().getTask();
376
- parentTask.TaskService.RemoveRecomputes(parentTask, subformTask);
377
- }
378
- else
379
- break;
380
- }
381
- if (LastFocusedManager.getLastFocusedControl() != null &&
382
- LastFocusedManager.getLastFocusedControl().isDescendentOfControl(destSubForm))
383
- this._task.RetainFocus = false;
384
- else
385
- this._task.RetainFocus = yield this._retainFocus.getVal();
386
- }
387
- yield this.operCall(mprgCreator);
388
- }
389
- }
390
- return this._isRoute;
391
- default:
392
- Logger.Instance.WriteExceptionToLogWithMsg("There is no such type of operation " + this._type);
393
- break;
394
- }
395
- }
396
- catch (ex) {
397
- throw ex;
398
- }
399
- return true;
400
- });
401
- }
402
- operCallParallel() {
403
- Operation.callParallel(this._task, this._publicName, this._argList, this._globalParamsShouldBeCopied, this._prgDescription);
404
- }
405
- static callParallel(task, publicName, argList, globalParamsShouldBeCopied, prgDescription) {
406
- }
407
- getCondVal() {
408
- return __awaiter(this, void 0, void 0, function* () {
409
- return yield this._condExp.getVal();
410
- });
411
- }
412
- getType() {
413
- return this._type;
414
- }
415
- getRouteParams() {
416
- return this._routeParams;
417
- }
418
- getServerId() {
419
- return this._serverId;
420
- }
421
- operVerify() {
422
- return __awaiter(this, void 0, void 0, function* () {
423
- let isError = (this._mode === ConstInterface.FLW_VERIFY_MODE_ERROR);
424
- let textToDisplay = this._exp === null ? this._text : yield this._exp.evaluateWithResultTypeAndLength(StorageAttribute.UNICODE, 255);
425
- let titleToDisplay = this._titleExp === null ? this._title : yield this._titleExp.evaluateWithResultTypeAndLength(StorageAttribute.UNICODE, 255);
426
- textToDisplay = textToDisplay === null ? "" : StrUtil.rtrim(textToDisplay);
427
- titleToDisplay = titleToDisplay === null ? "" : StrUtil.rtrim(titleToDisplay);
428
- if (this._errLogAppend) {
429
- let prgDescription = this._task.GetContextTask().GetComputedProperty(PropInterface.PROP_TYPE_NAME).GetComputedValue();
430
- Logger.Instance.WriteExceptionToLogWithMsg(textToDisplay + ", program : " + prgDescription);
431
- }
432
- if (this._display === ConstInterface.DISPLAY_STATUS) {
433
- if (!NString.IsNullOrEmpty(textToDisplay)) {
434
- FlowMonitorQueue.Instance.addFlowVerifyInfo(textToDisplay, this._task.GetTaskDetails());
435
- this._task.GetContextTask().WriteToMessagePane(textToDisplay, false);
436
- }
437
- }
438
- else {
439
- if (!NString.IsNullOrEmpty(textToDisplay)) {
440
- let mlsTransTextToDisplay = LanguageData.Instance.translate(textToDisplay);
441
- let mlsTransTitleToDisplay = LanguageData.Instance.translate(titleToDisplay);
442
- let verifyMode = Operation.getButtons(this._buttons);
443
- verifyMode = verifyMode || Operation.getImage(this._image);
444
- verifyMode = verifyMode;
445
- if (UtilStrByteMode.isLocaleDefLangJPN()) {
446
- let delimPos = mlsTransTextToDisplay.indexOf('|');
447
- if (0 <= delimPos && delimPos < mlsTransTextToDisplay.length) {
448
- mlsTransTitleToDisplay = mlsTransTextToDisplay.substr(delimPos + 1);
449
- mlsTransTextToDisplay = mlsTransTextToDisplay.substr(0, delimPos);
450
- }
451
- }
452
- let mgForm = null;
453
- if (!this._task.GetContextTask().getMGData().IsAborting)
454
- mgForm = this._task.GetContextTask().getTopMostForm();
455
- if (mgForm == null && LastFocusedManager.Instance.getLastFocusedTask() != null)
456
- mgForm = LastFocusedManager.Instance.getLastFocusedTask().getTopMostForm();
457
- if (mgForm != null) {
458
- mgForm.RefreshUI();
459
- Commands.invoke();
460
- yield Thread.Sleep(10);
461
- }
462
- let returnValue = yield GUIManager.Instance.MessageBox(mlsTransTitleToDisplay, mlsTransTextToDisplay, verifyMode);
463
- yield Operation.setoperVerifyReturnValue(returnValue, this._returnVal);
464
- }
465
- }
466
- return isError;
467
- });
468
- }
469
- static getButtons(buttonsID) {
470
- let tmpbuttons = 0;
471
- switch (buttonsID) {
472
- case ConstInterface.BUTTONS_OK:
473
- tmpbuttons = Styles.MSGBOX_BUTTON_OK;
474
- break;
475
- case ConstInterface.BUTTONS_OK_CANCEL:
476
- tmpbuttons = Styles.MSGBOX_BUTTON_OK_CANCEL;
477
- break;
478
- case ConstInterface.BUTTONS_ABORT_RETRY_IGNORE:
479
- tmpbuttons = Styles.MSGBOX_BUTTON_ABORT_RETRY_IGNORE;
480
- break;
481
- case ConstInterface.BUTTONS_YES_NO_CANCEL:
482
- tmpbuttons = Styles.MSGBOX_BUTTON_YES_NO_CANCEL;
483
- break;
484
- case ConstInterface.BUTTONS_YES_NO:
485
- tmpbuttons = Styles.MSGBOX_BUTTON_YES_NO;
486
- break;
487
- case ConstInterface.BUTTONS_RETRY_CANCEL:
488
- tmpbuttons = Styles.MSGBOX_BUTTON_RETRY_CANCEL;
489
- break;
490
- default:
491
- break;
492
- }
493
- return tmpbuttons;
494
- }
495
- static getImage(imageID) {
496
- let tmpImage = 0;
497
- switch (imageID) {
498
- case ConstInterface.IMAGE_EXCLAMATION:
499
- tmpImage = Styles.MSGBOX_ICON_EXCLAMATION;
500
- break;
501
- case ConstInterface.IMAGE_CRITICAL:
502
- tmpImage = Styles.MSGBOX_ICON_ERROR;
503
- break;
504
- case ConstInterface.IMAGE_QUESTION:
505
- tmpImage = Styles.MSGBOX_ICON_QUESTION;
506
- break;
507
- case ConstInterface.IMAGE_INFORMATION:
508
- tmpImage = Styles.MSGBOX_ICON_INFORMATION;
509
- break;
510
- default:
511
- break;
512
- }
513
- return tmpImage;
514
- }
515
- static setoperVerifyReturnValue(returnValue, returnVal) {
516
- return __awaiter(this, void 0, void 0, function* () {
517
- if (returnVal !== null) {
518
- let retValueNum = new NUM_TYPE();
519
- retValueNum.NUM_4_LONG(returnValue);
520
- let returnValueStr = retValueNum.toXMLrecord();
521
- yield returnVal.setValueAndStartRecompute(returnValueStr, false, true, true, false);
522
- yield returnVal.updateDisplay();
523
- }
524
- });
525
- }
526
- operBlock() {
527
- return true;
528
- }
529
- operElse() {
530
- return true;
531
- }
532
- operEvaluate() {
533
- return __awaiter(this, void 0, void 0, function* () {
534
- let result = '\0';
535
- if (this._field !== null) {
536
- result = yield this._exp.evaluateWithResultTypeAndLength(this._field.getType(), this._field.getSize());
537
- yield this._field.setValueAndStartRecompute(result, result === null, true, true, false);
538
- yield this._field.updateDisplay();
539
- }
540
- else
541
- result = yield this._exp.evaluateWithResultTypeAndLength(StorageAttribute.BOOLEAN, 0);
542
- });
543
- }
544
- operUpdate(mprgCreator) {
545
- return __awaiter(this, void 0, void 0, function* () {
546
- let result, oldVal, newVal, fieldVal;
547
- let setRecordUpdated;
548
- let recompute;
549
- let nOld, nNew, nResult;
550
- let flowMonitor = FlowMonitorQueue.Instance;
551
- flowMonitor.addFlowOperationUpdate(FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
552
- if (!this._field.DbModifiable && (this._task.getMode() !== Constants.TASK_MODE_CREATE)) {
553
- if (!(yield this.CanModify(mprgCreator)))
554
- return;
555
- }
556
- let fieldType = this._field.getType();
557
- if (this._incremental) {
558
- if (!this._field.IsLinkField) {
559
- fieldVal = this._field.getValue(true);
560
- nResult = (fieldVal != null
561
- ? new NUM_TYPE(fieldVal)
562
- : null);
563
- if (this._task.getMode() !== Constants.TASK_MODE_CREATE) {
564
- this._task.setEvalOldValues(true);
565
- oldVal = (this._field.isNull()
566
- ? this._field.getMagicDefaultValue()
567
- : yield this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize()));
568
- this._task.setEvalOldValues(false);
569
- nOld = new NUM_TYPE(oldVal);
570
- nResult = NUM_TYPE.sub(nResult, nOld);
571
- }
572
- if (this._task.getMode() !== Constants.TASK_MODE_DELETE) {
573
- newVal = yield this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize());
574
- if (newVal != null) {
575
- nNew = new NUM_TYPE(newVal);
576
- nResult = NUM_TYPE.add(nResult, nNew);
577
- }
578
- else
579
- nNew = nResult = null;
580
- }
581
- if (nResult != null)
582
- result = nResult.toXMLrecord();
583
- else
584
- result = this._field.getMagicDefaultValue();
585
- }
586
- else {
587
- yield this.operServer(mprgCreator);
588
- return;
589
- }
590
- }
591
- else
592
- result = yield this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize());
593
- if (fieldType === StorageAttribute.BLOB_VECTOR)
594
- if (result != null)
595
- result = Operation.operUpdateVectors(this._field, result);
596
- recompute = (this._field.getTask() === this._task);
597
- setRecordUpdated = (!recompute || !this._undo);
598
- yield this._field.setValueAndStartRecompute(result, result == null, true, setRecordUpdated, false);
599
- if (!this._undo)
600
- this._field.setUpdated();
601
- this._field.setModified();
602
- yield this._field.updateDisplay();
603
- flowMonitor.addFlowOperationUpdate(FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
604
- });
605
- }
606
- CanModify(mprgCreator) {
607
- return __awaiter(this, void 0, void 0, function* () {
608
- let execOperCommand = ((this._cmdToServer instanceof ExecOperCommand) ? this._cmdToServer : null);
609
- execOperCommand.Operation = this;
610
- execOperCommand.MprgCreator = mprgCreator;
611
- return (yield this.Task.DataviewManager.Execute(this._cmdToServer)).Success;
612
- });
613
- }
614
- static operUpdateVectors(field, vec) {
615
- let result = null;
616
- if (field.getType() === StorageAttribute.BLOB_VECTOR) {
617
- let cellsAttr = VectorType.getCellsAttr(vec);
618
- let cellsType = field.getCellsType();
619
- if (StorageAttributeCheck.isTheSameType(cellsAttr, cellsType)) {
620
- let newVec = new VectorType(vec);
621
- newVec.adjustToFit(field);
622
- return newVec.toString();
623
- }
624
- return result;
625
- }
626
- throw new ApplicationException("in operUpdateVectors " + field.getName() + " is not of type vector");
627
- }
628
- operRaiseEvent(mprgCreator, returnedFromServer) {
629
- return __awaiter(this, void 0, void 0, function* () {
630
- let immediate = yield this.Immediate();
631
- let aRtEvt = this._rtEvt.replicate();
632
- yield aRtEvt.setPublicName();
633
- aRtEvt.setImmediate(immediate);
634
- aRtEvt.setMainPrgCreator(null);
635
- if (immediate) {
636
- aRtEvt.setCtrl(this._task.getLastParkedCtrl());
637
- aRtEvt.setArgList(this._argList);
638
- if (aRtEvt.getTask().isMainProg())
639
- aRtEvt.setMainPrgCreator(mprgCreator);
640
- AccessHelper.eventsManager.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
641
- AccessHelper.eventsManager.pushExecStack(this._task.getTaskTag(), this._evtHandler.getId().toString(), this._serverId);
642
- yield AccessHelper.eventsManager.handleEvent(aRtEvt, returnedFromServer);
643
- AccessHelper.eventsManager.popExecStack();
644
- }
645
- else {
646
- let arglist = new ArgumentsList();
647
- yield arglist.Initialize(this._argList);
648
- aRtEvt.setArgList(arglist);
649
- aRtEvt.setTask(null);
650
- AccessHelper.eventsManager.addToTail(aRtEvt);
651
- AccessHelper.eventsManager.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
652
- }
653
- });
654
- }
655
- operCall(mprgCreator) {
656
- return __awaiter(this, void 0, void 0, function* () {
657
- yield this.operServer(mprgCreator);
658
- });
659
- }
660
- operServer(mprgCreator) {
661
- return __awaiter(this, void 0, void 0, function* () {
662
- let command = ((this._cmdToServer instanceof ExecOperCommand) ? this._cmdToServer : null);
663
- Debug.Assert(command !== null);
664
- if (this._task.isMainProg())
665
- command.MprgCreator = mprgCreator;
666
- else
667
- command.MprgCreator = null;
668
- command.SetExecutionStack(AccessHelper.eventsManager.getExecStack());
669
- command.Operation = this;
670
- yield AccessHelper.mgDataTable.execRequestWithSubformRecordCycle(this._task.getMGData().CmdsToServer, this._cmdToServer, null);
671
- });
672
- }
673
- getBlockEnd() {
674
- return this._blockEnd;
675
- }
676
- setBlockEnd(val) {
677
- this._blockEnd = val;
678
- }
679
- getBlockClose() {
680
- return this._blockClose;
681
- }
682
- setBlockClose(val) {
683
- this._blockClose = val;
684
- }
685
- getTaskTag() {
686
- return this._task.getTaskTag();
687
- }
688
- getHandlerId() {
689
- return this._evtHandler.getId().toString();
690
- }
691
- getEventHandler() {
692
- return this._evtHandler;
693
- }
694
- getExecOnServer() {
695
- return this._execOnServer;
696
- }
697
- setExecOnServer(val) {
698
- this._execOnServer = val;
699
- }
700
- getExecOnClient() {
701
- return this._execOnClient;
702
- }
703
- canExecute() {
704
- return __awaiter(this, void 0, void 0, function* () {
705
- return yield this.getCondVal();
706
- });
707
- }
708
- AddFlowDescription(buffer) {
709
- return __awaiter(this, void 0, void 0, function* () {
710
- switch (this._type) {
711
- case ConstInterface.MG_OPER_VERIFY:
712
- buffer.Append("Verify: ");
713
- if (this._exp == null)
714
- buffer.Append(this._text);
715
- else
716
- buffer.Append("Exp #").Append(this._exp.getId());
717
- break;
718
- case ConstInterface.MG_OPER_BLOCK:
719
- buffer.Append("Block If");
720
- break;
721
- case ConstInterface.MG_OPER_LOOP:
722
- buffer.Append("Block Loop");
723
- break;
724
- case ConstInterface.MG_OPER_ELSE:
725
- buffer.Append("Block Else");
726
- break;
727
- case ConstInterface.MG_OPER_EVALUATE:
728
- buffer.Append("Evaluate Exp #").Append(this._exp.getId());
729
- break;
730
- case ConstInterface.MG_OPER_UPDATE:
731
- buffer.AppendFormat("Update {0} with Exp #{1}", this._field.getVarName(), this._exp.getId());
732
- break;
733
- case ConstInterface.MG_OPER_ENDBLOCK:
734
- buffer.Append("End Block");
735
- break;
736
- case ConstInterface.MG_OPER_USR_EXIT:
737
- buffer.Append("Invoke OS");
738
- break;
739
- case ConstInterface.MG_OPER_RAISE_EVENT:
740
- buffer.Append("Raise Event:");
741
- this._rtEvt.AppendDescription(buffer);
742
- buffer.AppendFormat(" (Wait={0})", ((yield this.Immediate()) ? 'Y' : 'N'));
743
- break;
744
- case ConstInterface.MG_OPER_SERVER:
745
- buffer.Append("Run server-side operation");
746
- break;
747
- case ConstInterface.MG_OPER_CALL:
748
- buffer.Append("Call program");
749
- break;
750
- default:
751
- buffer.AppendFormat("<<Unknown Operation Code {0}>>", this._type);
752
- break;
753
- }
754
- });
755
- }
756
- GetArgList() {
757
- return this._argList;
758
- }
759
- GetReturnValueField() {
760
- return this._field;
761
- }
762
- GetSubformControlName() {
763
- return this._subformCtrlName;
764
- }
765
- toString() {
766
- return NString.Format("Executing operation number {0}", this._serverId + 1);
767
- }
768
- }
769
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ydC9PcGVyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLEtBQUssRUFFTCxPQUFPLEVBQ1AsT0FBTyxFQUVQLE1BQU0sRUFDUCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFFTCxVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFDTCxRQUFRLEVBRVIsUUFBUSxFQUNSLGFBQWEsRUFDYixNQUFNLEVBRU4sK0JBQStCLEVBQy9CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztB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bnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBTdHJpbmdCdWlsZGVyLFxyXG4gIFRocmVhZFxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2FsbE9wZXJhdGlvbk1vZGUsXHJcbiAgQ2FsbE9zU2hvdyxcclxuICBDb25zdGFudHMsIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjayxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxTdHJCeXRlTW9kZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTlVNX1RZUEUsXHJcbiAgUHJvcEludGVyZmFjZSwgUnVudGltZUNvbnRleHRCYXNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIsXHJcbiAgVmVjdG9yVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuXHJcbmltcG9ydCB7IFllc05vRXhwIH0gZnJvbSAnLi4vZXhwL1llc05vRXhwJztcclxuaW1wb3J0IHsgQXJndW1lbnRzTGlzdCB9IGZyb20gJy4vQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7IElDbGllbnRDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb24nO1xyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQgeyBSdW5UaW1lRXZlbnQgfSBmcm9tICcuLi9ldmVudC9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQgeyBNZ0Zvcm0gfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHsgQ29tbWFuZEZhY3RvcnkgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7IEZsb3dNb25pdG9yUXVldWUgfSBmcm9tICcuLi91dGlsL0Zsb3dNb25pdG9yUXVldWUnO1xyXG5pbXBvcnQgeyBFeGVjT3BlckNvbW1hbmQgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9FeGVjT3BlckNvbW1hbmQnO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2wgfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHsgRmxvd01vbml0b3JJbnRlcmZhY2UgfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7IExhbmd1YWdlRGF0YSB9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tICcuL0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbW1hbmRzVGFibGUgfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tIFwiLi4vR1VJTWFuYWdlclwiO1xyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgZGF0YSBmb3IgPG9wZXI+IHRhZ1xyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uIHtcclxuICBwcml2YXRlIF9jb25kRXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cCh0cnVlKTtcclxuICBwcml2YXRlIF9yZXRhaW5Gb2N1czogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAoZmFsc2UpO1xyXG4gIHByaXZhdGUgX3dhaXRFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTtcclxuICBwcml2YXRlIF9zeW5jRGF0YTogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAoZmFsc2UpOyAvLyBjYWxsIG9wZXJhdGlvbjogU3luYyBkYXRhXHJcbiAgcHJpdmF0ZSBfYXJnTGlzdDogQXJndW1lbnRzTGlzdCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYmxvY2tDbG9zZTogbnVtYmVyID0gMDtcclxuICAvLyBpbiBCbG9jayBCZWdpbi9FbHNlL0xvb3Agb3BlcmF0aW9uOiB0aGUgb3BlcmF0aW9uIGlkIHdoaWNoIGlzIHRoZSBlbmQgb2YgdGhlIGV4ZWN1dGlvbiBibG9jayAoZWxzZS9lbmQpXHJcbiAgcHJpdmF0ZSBfYmxvY2tFbmQ6IG51bWJlciA9IDA7ICAvLyBpbiBCbG9jayBCZWdpbi9FbHNlL0xvb3Agb3BlcmF0aW9uOiB0aGUgQmxvY2sgRW5kIG9wZXJhdGlvbiB0aGF0IGVuZHMgdGhlIG5lc3RpbmcgbGV2ZWxcclxuICBwcml2YXRlIF9idXR0b25zOiBzdHJpbmcgPSAnXFwwJzsgLy8gYnV0dG9ucyBvZiB2ZXJpZnkgb3ByXHJcbiAgcHJpdmF0ZSBfY2hlY2tCeVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgQ2FsbCBvcGVyYXRpb24gd2l0aCBzdWJmb3JtIGRlc3RpbmF0aW9uXHJcbiAgcHJpdmF0ZSBfY21kVG9TZXJ2ZXI6IElDbGllbnRDb21tYW5kID0gbnVsbDsgLy8gZGVmYXVsdCBidXR0b24gb2YgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX2Rpc3BsYXk6IHN0cmluZyA9ICdTJzsgLy8gU3RhdHVzIGxpbmUgfCBtZXNzYWdlIEJveFxyXG4gIHByaXZhdGUgX2VyckxvZ0FwcGVuZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBhcHBlbmQgdG8gZXJyb3IgbG9nIGZvciB2ZXJpZnkgb3ByXHJcbiAgcHJpdmF0ZSBfZXZ0SGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICBwcml2YXRlIF9leGVjT25TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gZm9yIGJsb2NrIGlmIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBvbiB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfZXhlY09uQ2xpZW50OiBib29sZWFuID0gZmFsc2U7IC8vIGZvciBibG9jayBpZiB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIG9uIHRoZSBjbGllbnRcclxuICBwcml2YXRlIF9leHA6IEV4cHJlc3Npb24gPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGRcclxuICBwcml2YXRlIF9nbG9iYWxQYXJhbXNTaG91bGRCZUNvcGllZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ltYWdlOiBzdHJpbmcgPSAnXFwwJzsgLy8gaW1hZ2Ugb2YgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX2luY3JlbWVudGFsOiBib29sZWFuID0gZmFsc2U7ICAvLyBJTkNSLT50cnVlLCBOT1JNQUwtPmZhbHNlIChob3cgYXR0cmlidXRlKVxyXG4gIHByaXZhdGUgX21ldGhvZE5hbWVTbmlwcGV0OiBzdHJpbmcgPSBudWxsOyAvLyBFbnRyeSBwb2ludCBtZXRob2ROYW1lIGZvciBzbmlwcGV0XHJcbiAgcHJpdmF0ZSBfbW9kZTogc3RyaW5nID0gJ1xcMCc7IC8vIEVycm9yfFdhcm5pbmdcclxuICAvLyBidXQgd2Ugc3RpbGwgbmVlZCB0byBza2lwIHRoZSBibG9jayBvcGVyYXRpb25zIGluIHRoZSBjbGllbnRcclxuICBwcml2YXRlIF9wcmdEZXNjcmlwdGlvbjogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9wdWJsaWNOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JldHVyblZhbDogRmllbGQgPSBudWxsOyAvLyByZXR1cm4gdmFsdWUgb2YgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX3J0RXZ0OiBSdW5UaW1lRXZlbnQgPSBudWxsOyAvLyBmb3IgUmFpc2UgZXZlbnRcclxuICBwcml2YXRlIF9zZXJ2ZXJJZDogbnVtYmVyID0gLTE7XHJcbiAgLy8gdGhlIGluZGV4IG9mIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBzZXJ2ZXIncyBmbG93ICgwIG1lYW5zIGl0J3MgdGhlIGZpcnN0IG9wZXJhdGlvbiBpbiB0aGUgaGFuZGxlciwgMSBmb3IgdGhlIHNlY29uZCBldGMuKS4gVmFsaWQgZm9yOiBTZXJ2ZXJcclxuICBwcml2YXRlIGNhbGxlZFRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9zaG93OiBDYWxsT3NTaG93ID0gQ2FsbE9zU2hvdy5Ob3JtYWw7XHJcbiAgcHJpdmF0ZSBfc3ViZm9ybUN0cmxOYW1lOiBzdHJpbmcgPSBudWxsOyAvLyBmb3IgQ2FsbCBvcGVyYXRpb24gd2l0aCBzdWJmb3JtIGRlc3RpbmF0aW9uXHJcbiAgcHJpdmF0ZSBfc3VidHlwZTogc3RyaW5nID0gJ1xcMCc7IC8vIElmfEVsc2V8TG9vcFxyXG4gIHByaXZhdGUgX3Rhc2s6IFRhc2sgPSBudWxsOyAvLyB0aGUgdGFzayBvZiB0aGUgb3BlcmF0aW9uXHJcbiAgcHJpdmF0ZSBfdGV4dDogc3RyaW5nID0gbnVsbDsgLy8gdGhlIHZlcmlmeSBtZXNzYWdlXHJcbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyA9IG51bGw7IC8vIHRpdGxlIG9mIHZlcmlmeSBvcHJcclxuICBwcml2YXRlIF90aXRsZUV4cDogRXhwcmVzc2lvbiA9IG51bGw7IC8vIGV4cHJlc3Npb24gYXR0YWNoZWQgdG8gdGl0bGUgb2YgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX3R5cGU6IG51bWJlciA9IDA7IC8vIG9wZXJhdGlvbiBudW1iZXIgKGxpa2UgaW4gTWFnaWMpXHJcbiAgcHJpdmF0ZSBfdW5kbzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX2lzUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yb3V0ZXJQYXRoOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX29yaWdpbmFsUm91dGVyT3V0bGV0TmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9yb3V0ZVBhcmFtczogTGlzdDxhbnk+ID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKXtcclxuICB9XHJcblxyXG4gIGdldCBDYWxsZWRUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsbGVkVGFza0RlZmluaXRpb25JZDtcclxuICB9XHJcblxyXG4gIE9wZXJDYWxsTW9kZTogQ2FsbE9wZXJhdGlvbk1vZGUgPSAwO1xyXG5cclxuICBzZXQgVGFzayh2YWx1ZTogVGFzaykge1xyXG4gICAgdGhpcy5fdGFzayA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2soKTogVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzaztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSW1tZWRpYXRlKCk6ICBQcm9taXNlPGJvb2xlYW4+ICB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2FpdEV4cC5nZXRWYWwoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgYW4gb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBUYXNrLCBldnRIYW5kbGVyOiBFdmVudEhhbmRsZXIsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrID0gdGFza1JlZjtcclxuICAgIHRoaXMuX2V2dEhhbmRsZXIgPSBldnRIYW5kbGVyO1xyXG5cclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpLCB0YXNrUmVmKSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXQgaW5uZXIgYXR0cmlidXRlcyBvZiBPcGVyYXRpb24gb2JqZWN0IG9uIHBhcnNpbmcgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZywgdGFza1JlZjogVGFzayk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19FVkVOVCkge1xyXG4gICAgICB0aGlzLl9ydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFza1JlZik7XHJcbiAgICAgIHRoaXMuX3J0RXZ0LmZpbGxEYXRhKHBhcnNlciwgdGFza1JlZik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19PUEVSKSB7XHJcbiAgICAgIHRoaXMuZmlsbEF0dHJpYnV0ZXMocGFyc2VyLCB0YXNrUmVmKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUikge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7IC8vIHNldEN1cnJJbmRleChYbWxQYXJzZXIuaXNOZXh0VGFnQ2xvc2VkKE1HX1RBR19DT05UUk9MKSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLREVGSU5JVElPTklEX0VOVFJZKSB7XHJcbiAgICAgIHRoaXMuSW5pdFRhc2tEZWZpbml0aW9uSUQocGFyc2VyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBPcGVyYXRpb24uIEluc2VydCBlbHNlIGlmIHRvIE9wZXJhdGlvbi5pbml0SW5uZXJPYmplY3RzIGZvciBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+dGhlIHRhc2sgb2YgdGhlIGhhbmRsZXIgY3VycmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmaWxsQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlciwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuXHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBTdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUikgKyBDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUi5sZW5ndGgpO1xyXG5cclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IsIHRhc2tSZWYpO1xyXG5cclxuICAgICAgLy8gaW5pdCBpbm5lciByZWZlcmVuY2U6XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gQ29tbWFuZC5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZFx0ZWxlbWVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+Y3VycmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PFN0cmluZz4sIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGU6IFN0cmluZywgdmFsdWVTdHI7XHJcbiAgICBsZXQgZXhwSWQ6IG51bWJlcjtcclxuICAgIGxldCBpc0d1aVRocmVhZEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RZUEU6XHJcbiAgICAgICAgICB0aGlzLl90eXBlID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRkxEOlxyXG4gICAgICAgICAgdGhpcy5fZmllbGQgPSBPcGVyYXRpb24uSW5pdEZpZWxkKHZhbHVlU3RyLCB0aGlzLl90YXNrKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVhQOlxyXG4gICAgICAgICAgZXhwSWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIHRoaXMuX2V4cCA9IHRhc2tSZWYuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEVYVDpcclxuICAgICAgICAgIHRoaXMuX3RleHQgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX01PREU6XHJcbiAgICAgICAgICB0aGlzLl9tb2RlID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU1VCVFlQRTpcclxuICAgICAgICAgIHRoaXMuX3N1YnR5cGUgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGlmICh0aGlzLl90eXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdWJ0eXBlID09PSAnRScpXHJcbiAgICAgICAgICAgICAgdGhpcy5fdHlwZSA9IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRUxTRTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fc3VidHlwZSA9PT0gJ0wnKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1A7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ0xPU0U6XHJcbiAgICAgICAgICB0aGlzLl9ibG9ja0Nsb3NlID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRU5EOlxyXG4gICAgICAgICAgdGhpcy5fYmxvY2tFbmQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IT1c6XHJcbiAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRhbCA9ICh2YWx1ZVN0ciA9PT0gXCJJXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1VORE86XHJcbiAgICAgICAgICBpZiAodmFsdWVTdHJbMF0gPT09ICdOJylcclxuICAgICAgICAgICAgdGhpcy5fdW5kbyA9IGZhbHNlO1xyXG4gICAgICAgICAgZWxzZSBpZiAodmFsdWVTdHJbMF0gPT09ICdZJylcclxuICAgICAgICAgICAgdGhpcy5fdW5kbyA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIE9wZXJhdGlvbi5pbml0RWxlbWVudHMoKTogTm8gc3VjaCB2YWx1ZSB0byB0aGUgTUdfQVRUUl9VTkRPIGZvciBcIiArIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9ESVNQTEFZOlxyXG4gICAgICAgICAgdGhpcy5fZGlzcGxheSA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1dBSVQ6XHJcbiAgICAgICAgICB0aGlzLl93YWl0RXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICAgICAgdGhpcy5fcmV0YWluRm9jdXMuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TWU5DX0RBVEE6XHJcbiAgICAgICAgICB0aGlzLl9zeW5jRGF0YS5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NIT1c6XHJcbiAgICAgICAgICB0aGlzLl9zaG93ID0gPENhbGxPc1Nob3c+WG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ05EOlxyXG4gICAgICAgICAgdGhpcy5fY29uZEV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0FSR0xJU1Q6XHJcbiAgICAgICAgICB0aGlzLl9hcmdMaXN0ID0gbmV3IEFyZ3VtZW50c0xpc3QoKTtcclxuICAgICAgICAgIHRoaXMuX2FyZ0xpc3QuZmlsbExpc3QodmFsdWVTdHIsIHRoaXMuX3Rhc2spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIHRoaXMuX2FyZ0xpc3QuUmVmcmVzaE9uU3RyaW5nID0gdmFsdWVTdHIuVHJpbSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NFUlZFUl9JRDpcclxuICAgICAgICAgIHRoaXMuX3NlcnZlcklkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT1BFUl9DQUxMTU9ERTpcclxuICAgICAgICAgIHRoaXMuT3BlckNhbGxNb2RlID0gPENhbGxPcGVyYXRpb25Nb2RlPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TVUJGT1JNX0NUUkw6XHJcbiAgICAgICAgICB0aGlzLl9zdWJmb3JtQ3RybE5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIRUNLX0JZX1NFUlZFUjpcclxuICAgICAgICAgIHRoaXMuX2NoZWNrQnlTZXJ2ZXIgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUFVCTElDOlxyXG4gICAgICAgICAgdGhpcy5fcHVibGljTmFtZSA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BSR19ERVNDUklQVElPTjpcclxuICAgICAgICAgIHRoaXMuX3ByZ0Rlc2NyaXB0aW9uID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1BZX0dMQl9QUk1TOlxyXG4gICAgICAgICAgdGhpcy5fZ2xvYmFsUGFyYW1zU2hvdWxkQmVDb3BpZWQgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRVhFQ19PTl9TRVJWRVI6XHJcbiAgICAgICAgICB0aGlzLl9leGVjT25TZXJ2ZXIgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHRcdGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FWEVDX09OX0NMSUVOVDpcclxuICAgICAgICAgIHRoaXMuX2V4ZWNPbkNsaWVudCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9USVRMRTpcclxuICAgICAgICAgIHRoaXMuX3RpdGxlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9USVRMRV9FWFA6XHJcbiAgICAgICAgICBleHBJZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgdGhpcy5fdGl0bGVFeHAgPSB0YXNrUmVmLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lNQUdFOlxyXG4gICAgICAgICAgdGhpcy5faW1hZ2UgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9CVVRUT05TOlxyXG4gICAgICAgICAgdGhpcy5fYnV0dG9ucyA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFVFVSTl9WQUw6XHJcbiAgICAgICAgICB0aGlzLl9yZXR1cm5WYWwgPSBPcGVyYXRpb24uSW5pdEZpZWxkKHZhbHVlU3RyLCB0aGlzLl90YXNrKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FUlJfTE9HX0FQUEVORDpcclxuICAgICAgICAgIHRoaXMuX2VyckxvZ0FwcGVuZCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PUEVSX01FVEhPRE5BTUU6XHJcbiAgICAgICAgICB0aGlzLl9tZXRob2ROYW1lU25pcHBldCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX0dVSV9USFJFQURfRVhFQ1VUSU9OOlxyXG4gICAgICAgICAgaXNHdWlUaHJlYWRFeGVjdXRpb24gPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSVNfUk9VVEU6XHJcbiAgICAgICAgICB0aGlzLl9pc1JvdXRlID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9ST1VURVJfUEFUSDpcclxuICAgICAgICAgIHRoaXMuX3JvdXRlclBhdGggPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIE9wZXJhdGlvbiBjbGFzcy4gSW5zZXJ0IGNhc2UgdG8gT3BlcmF0aW9uLmluaXRFbGVtZW50cyBmb3IgXCIgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJJZCA+IC0xKVxyXG4gICAgICB0aGlzLl9jbWRUb1NlcnZlciA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV4ZWNPcGVyQ29tbWFuZCh0aGlzLl90YXNrLmdldFRhc2tUYWcoKSwgXCJcIiArIHRoaXMuX2V2dEhhbmRsZXIuZ2V0SWQoKSwgdGhpcy5fc2VydmVySWQsIEludDMyLk1pblZhbHVlLCBudWxsKTtcclxuXHJcbiAgICBpZiAodGhpcy5faXNSb3V0ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFJvdXRlck91dGxldE5hbWUgPSB0aGlzLl9zdWJmb3JtQ3RybE5hbWUgIT09IG51bGwgPyB0aGlzLl9zdWJmb3JtQ3RybE5hbWUgOiBcIlwiO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3N1YmZvcm1DdHJsTmFtZSA9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRSb3V0ZXJPdXRsZXQ6IE1nQ29udHJvbEJhc2UgPSB0aGlzLl90YXNrLmdldEZvcm0oKS5EZWZhdWx0Um91dGVyT3V0bGV0O1xyXG4gICAgICAgIHRoaXMuX3N1YmZvcm1DdHJsTmFtZSA9IGRlZmF1bHRSb3V0ZXJPdXRsZXQgIT09IG51bGwgPyBkZWZhdWx0Um91dGVyT3V0bGV0Lk5hbWUgOiBcIlwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJzZXJcIj48L3BhcmFtPlxyXG4gIEluaXRUYXNrRGVmaW5pdGlvbklEKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgeG1sQnVmZmVyOiBzdHJpbmcgPSBwYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgbGV0IHRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXI6IFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIgPSBuZXcgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlcih0aGlzLlNldFRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgdGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlci5wYXJzZSh4bWxCdWZmZXIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYWxsYmFjayBmb3IgdGhlIHNheCBwYXJzZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tEZWZpbml0aW9uSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInhtbElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWZhdWx0VGFnTGlzdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRUYXNrRGVmaW5pdGlvbklkKHRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FsbGVkVGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5pdGlhbGl6ZSB0aGUgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj5hIHJlZmVyZW5jZSB0byB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEluaXRGaWVsZCh2YWx1ZVN0cjogc3RyaW5nLCB0YXNrOiBUYXNrKTogRmllbGQge1xyXG4gICAgbGV0IFRhc2tGaWVsZDogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2Vucyh2YWx1ZVN0ciwgJywnKS8qJywnKi87XHJcbiAgICBpZiAoVGFza0ZpZWxkLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICBsZXQgcGFyZW50OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKFRhc2tGaWVsZC5nZXRfSXRlbSgwKSk7XHJcbiAgICAgIGxldCBmbGRJRDogbnVtYmVyID0gTk51bWJlci5QYXJzZShUYXNrRmllbGQuZ2V0X0l0ZW0oMSkpO1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRhc2suZ2V0RmllbGREZWYocGFyZW50LCBmbGRJRCk7XHJcbiAgICAgIHJldHVybiBmaWVsZDtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVua25vd24gZmllbGQ6ICd7MH0nXCIsIHZhbHVlU3RyKSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIHRoZSBvcGVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXByZ0NyZWF0b3JcIj5yZWxldmFudCBvbmx5IHdoZW4gdGhlIG9wZXJhdGlvbiBiZWxvbmdzIHRvIGEgbWFpbiBwcm9ncmFtLlxyXG4gIC8vLyAgIEl0IGlkZW50aWZpZXMgdGhlIHRhc2sgd2hpY2ggY2F1c2VkIHRoaXMgbWFpbiBwcm9ncmFtIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBydW50aW1lXHJcbiAgLy8vICAgZmxvdyAoaS5lLiB3aGVuIHJ1bm5pbmcgYSB0YXNrIGZyb20gYSBkaWZmZXJlbnQgY29tcG9uZW50LCB3ZSBpbnN0YW50aWF0ZSBoaXMgbWFpbiBwcm9ncmFtXHJcbiAgLy8vICAgcmlnaHQgYWJvdmUgaXQuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+dGhlIGZvY3VzIG5lZWQgdG8gYmUgcmV0dXJuZWQgYWZ0ZXIgdGhlIFZFUklGWSBvcGVyYXRpb24gaW4gTWVzc2FnZSBCb3ggbmVlZHMgb25seVxyXG4gIC8vLyAgIGFsbCBhbm90aGVyIG9wZXJhdGlvbnMgY2FuIHVzZSBudWxsXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj50cnVlIGlmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgdGhlIGV4ZWN1dGlvbiB0byB0aGlzIG9wZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGZvciB2ZXJpZnkgYW5kIGJsb2NrIG9wZXJhdGlvbnM8L3JldHVybnM+XHJcbiAgYXN5bmMgZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UnRFdmVudDogUnVuVGltZUV2ZW50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgIGxldCBtcHJnQ3JlYXRvcjogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG5cclxuICAgIGlmIChsYXN0UnRFdmVudCAhPT0gbnVsbClcclxuICAgICAgbXByZ0NyZWF0b3IgPSA8VGFzaz5sYXN0UnRFdmVudC5nZXRNYWluUHJnQ3JlYXRvcigpO1xyXG5cclxuICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIgfHxcclxuICAgICAgKCFyZXR1cm5lZEZyb21TZXJ2ZXIgJiYgKHRoaXMuX3R5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSIHx8ICF0aGlzLl9jb25kRXhwLmlzU2VydmVyRXhwKCkpKSkge1xyXG4gICAgICBpZiAoISBhd2FpdCB0aGlzLmNhbkV4ZWN1dGUoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLl90eXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1ApXHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24odGhpcywgZmFsc2UsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QICYmIHRoaXMuX3R5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0spXHJcbiAgICAvLyBXZSBjYWxsIGFkZEZsb3dPcGVyYXRpb25TZWxlY3Qgb25seSBhdCB0aGUgYmVnaW5pbmcgYW5kIGVuZCBvZiB0aGUgbG9vcCBhdCBFdmVudEhhbmRsZXI6OmV4ZWN1dGVcclxuICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKHRoaXMsIHRydWUsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgc3dpdGNoICh0aGlzLl90eXBlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1ZFUklGWTpcclxuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9wZXJWZXJpZnkoKTtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0s6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcGVyQmxvY2soKTtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUDpcclxuICAgICAgICAgIGlmICghdGhpcy5nZXRFeGVjT25TZXJ2ZXIoKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlckJsb2NrKCk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vcGVyU2VydmVyKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0U6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcGVyRWxzZSgpO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FVkFMVUFURTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub3BlckV2YWx1YXRlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfVVBEQVRFOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vcGVyVXBkYXRlKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub3BlclJhaXNlRXZlbnQobXByZ0NyZWF0b3IsIHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5vcGVyU2VydmVyKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9DQUxMOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX3B1YmxpY05hbWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZXJDYWxsUGFyYWxsZWwoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3N1YmZvcm1DdHJsTmFtZSA9PSBudWxsKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJDYWxsKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICAgIC8vIFN1YmZvcm0gRGVzdGluYXRpb24gQ2FsbCBvUiBDYWxsIFJvdXRlXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrO1xyXG4gICAgICAgICAgICBsZXQgaXNFbmRQcm9nOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja0J5U2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCEodGhpcy5fY21kVG9TZXJ2ZXIgaW5zdGFuY2VvZiBFeGVjT3BlckNvbW1hbmQpKVxyXG4gICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGNvbW1hbmQ6IEV4ZWNPcGVyQ29tbWFuZCA9IDxFeGVjT3BlckNvbW1hbmQ+dGhpcy5fY21kVG9TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgY29tbWFuZC5DaGVja09ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3BlckNhbGwobXByZ0NyZWF0b3IpO1xyXG4gICAgICAgICAgICAgIGNvbW1hbmQuQ2hlY2tPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KHRoaXMsIHRydWUpID4gLTEpXHJcbiAgICAgICAgICAgICAgICBpc0VuZFByb2cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNFbmRQcm9nKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuZ2V0U3ViRm9ybUN0cmxCeU5hbWUodGhpcy5fc3ViZm9ybUN0cmxOYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gQSBjYWxsIHJvdXRlIG9wZXJhdGlvbiBuZWVkcyBhbiBvdXRsZXQuIElmIGEgbWF0Y2hpbmcgb3V0bGV0IGlzIG5vdCBmb3VuZCwgQ2FsbCByb3V0ZSBjYW5ub3QgZXhlY3V0ZS5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5faXNSb3V0ZSAmJiAoZGVzdFN1YkZvcm0gPT09IG51bGwgfHwgIWRlc3RTdWJGb3JtLklzUm91dGVyT3V0bGV0KCkpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZGVzdFN1YkZvcm0gIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1JvdXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjYW5Sb3V0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdm50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJ0RXZudCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlUGFyYW1zID0gcnRFdm50LmdldFJvdXRlUGFyYW1MaXN0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgcnRFdm50LmdldEFyZ0xpc3QoKS5nZXRBcmcoMCkuZ2V0VmFsdWUoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCkpLnRyaW0oKSA9PT0gdGhpcy5fcm91dGVyUGF0aCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgKChydEV2bnQuZ2V0QXJnTGlzdCgpLmdldEFyZygxKS5za2lwQXJnKCkpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBydEV2bnQuZ2V0QXJnTGlzdCgpLmdldEFyZygxKS5nZXRWYWx1ZShTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKSkudHJpbSgpID09PSB0aGlzLl9vcmlnaW5hbFJvdXRlck91dGxldE5hbWUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FuUm91dGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhblJvdXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3ViZm9ybVRhc2sgPSA8VGFzaz5kZXN0U3ViRm9ybS5nZXRTdWJmb3JtVGFzaygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hdGVUYXNrR3JhY2VmdWxseSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBydEV2bnQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNSb3V0ZSAmJiBydEV2bnQgIT09IG51bGwgJiYgcnRFdm50LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVRhc2tHcmFjZWZ1bGx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc3ViZm9ybVRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgIXRlcm1pbmF0ZVRhc2tHcmFjZWZ1bGx5LCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrID0gPFRhc2s+ZGVzdFN1YkZvcm0uZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXMocGFyZW50VGFzaywgc3ViZm9ybVRhc2spO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhc2sgZmFpbGVkIHRvIHRlcm1pbmF0ZSwgZG8gbm8gcHJvY2VlZCB0byBjYWxsIHRoZSBuZXcgdGFzay5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkuaXNEZXNjZW5kZW50T2ZDb250cm9sKGRlc3RTdWJGb3JtKSlcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5SZXRhaW5Gb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLl90YXNrLlJldGFpbkZvY3VzID0gYXdhaXQgdGhpcy5fcmV0YWluRm9jdXMuZ2V0VmFsKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJDYWxsKG1wcmdDcmVhdG9yKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIENhbGwgb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gd2hldGhlciBpdCBleGVjdXRlZCBhIENhbGwgUm91dGUgb3Igbm90LlxyXG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYnkgdGhlIGNhbGxlciBiZWNhdXNlLCBpdCBoYXMgdG8gc3RvcCBleGVjdXRpbmcgc3Vic2VxdWVudFxyXG4gICAgICAgICAgLy8gb3BlcmF0aW9ucyBpbiBjYXNlIGEgY2FsbCByb3V0ZSBnZXRzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUm91dGU7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdHlwZSBvZiBvcGVyYXRpb24gXCIgKyB0aGlzLl90eXBlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIGEgcGFyYWxsZWwgcmljaC1jbGllbnQgcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvcGVyQ2FsbFBhcmFsbGVsKCk6IHZvaWQge1xyXG4gICAgT3BlcmF0aW9uLmNhbGxQYXJhbGxlbCh0aGlzLl90YXNrLCB0aGlzLl9wdWJsaWNOYW1lLCB0aGlzLl9hcmdMaXN0LCB0aGlzLl9nbG9iYWxQYXJhbXNTaG91bGRCZUNvcGllZCwgdGhpcy5fcHJnRGVzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGxQYXJhbGxlbCh0YXNrOiBUYXNrLCBwdWJsaWNOYW1lOiBzdHJpbmcsIGFyZ0xpc3Q6IEFyZ3VtZW50c0xpc3QsIGdsb2JhbFBhcmFtc1Nob3VsZEJlQ29waWVkOiBib29sZWFuLCBwcmdEZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAodGFzay5Jc09mZmxpbmUpIHtcclxuICAvLyAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiQ2FuJ3QgcnVuIGEgcGFyYWxsZWwgcHJvZ3JhbSBmcm9tIGFuIG9mZmxpbmUgdGFza1wiKTtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICAvLyAgVGhlIHJpY2gtY2xpZW50IHdpbGwgcXVlcnkgdGhlIHJ1bnRpbWUtZW5naW5lIGZvciB0aGUgdXAtdG8tZGF0ZSBsaXN0IG9mIGdsb2JhbCBwYXJhbXNcclxuICAvLyAgIC8vICBvZiB0aGUgY3VycmVudCBjb250ZXh0IG9ubHkgaWYgdGhlIGNhbGxFRCAocGFyYWxsZWwpIHByb2dyYW0gcmVxdWVzdHMgY29weWluZyBvZiBnbG9iYWwgcGFyYW1zLFxyXG4gIC8vICAgLy8gIHRoZSBjYWxsRVIgcHJvZ3JhbSBzaG91bGQgcXVlcnkgdGhlbSBmcm9tIHRoZSBydW50aW1lLWVuZ2luZVxyXG4gIC8vICAgaWYgKGdsb2JhbFBhcmFtc1Nob3VsZEJlQ29waWVkKSB7XHJcbiAgLy8gICAgIGxldCBtZ0RhdGE6IE1HRGF0YSA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgLy8gICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlUXVlcnlHbG9iYWxQYXJhbXNDb21tYW5kKCk7XHJcbiAgLy8gICAgIG1nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgLy8gICAgIENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuICAvLyAgIH1cclxuICAvLyAgIC8vIGNsb25lIHRoZSBleGVjdXRpb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBjbGllbnRcclxuICAvLyAgIExvZ2dlci5pbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coXCJjYWxsUGFyYWxsZWwgY2FsbGVkXCIpO1xyXG4gIC8vICAgbGV0IGNhbGxlZFByb2dyYW1Qcm9wczogYW55ID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5jb3B5RXhlY3V0aW9uUHJvcHMoKTtcclxuICAvLyAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRHbG9iYWxQYXJhbXMobnVsbCk7XHJcbiAgLy9cclxuICAvLyAgIC8vIHNldCB0aGUgY2FsbGVkIHByb2dyYW0ncyBpbnRlcm5hbCBuYW1lXHJcbiAgLy8gICBjYWxsZWRQcm9ncmFtUHJvcHMuc2V0X0l0ZW0oQ29uc3RJbnRlcmZhY2UuUkVRX1BSR19OQU1FLCBwdWJsaWNOYW1lKTtcclxuICAvL1xyXG4gIC8vICAgLy8gU2VydmVyIHNlbmRzIHByZ0Rlc2NpcHJ0aW9uIG9ubHkgd2hlbiBQdWJsaWNOYW1lIGlzIG5vdCBzcGVjaWZpZWQuXHJcbiAgLy8gICAvLyBPdGhlcndpc2Ugc2VydmVyIHNlbmRzIGEgZmljdGl2ZSBwcmdEZXNjcmlwdGlvbiBsaWtlIDogX1Byb2dyYW1fSWRfPElTTj4uXHJcbiAgLy8gICAvLyBXaGVuIHB1YmxpYyBuYW1lIGlzIHNwZWNpZmllZCBwcmdEZXNjcmlwdGlvbiBpcyBub3QgdXNlZCBhbmQgaXQgd2lsbCBiZSBudWxsLlxyXG4gIC8vICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkocHJnRGVzY3JpcHRpb24pKSB7XHJcbiAgLy8gICAgIGNhbGxlZFByb2dyYW1Qcm9wcy5zZXRfSXRlbShDb25zdEludGVyZmFjZS5SRVFfUFJHX0RFU0NSSVBUSU9OLCBwcmdEZXNjcmlwdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjYWxsZWRQcm9ncmFtUHJvcHMuc2V0X0l0ZW0oQ29uc3RJbnRlcmZhY2UuUEFSQUxMRUxfRVhFQ1VUSU9OLCBcIllcIik7XHJcbiAgLy9cclxuICAvLyAgIC8vIGFyZ3VtZW50cyB0byB0aGUgcGFyYWxsZWwgcHJvZ3JhbVxyXG4gIC8vICAgaWYgKGFyZ0xpc3QgIT09IG51bGwpIHtcclxuICAvLyAgICAgbGV0IHByZ0FyZ3M6IHN0cmluZyA9IGFyZ0xpc3QudG9VUkwodHJ1ZSk7XHJcbiAgLy8gICAgIGNhbGxlZFByb2dyYW1Qcm9wcy5zZXRfSXRlbShDb25zdEludGVyZmFjZS5SRVFfQVJHUywgcHJnQXJncyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgWE1MZGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBjYWxsZWRQcm9ncmFtUHJvcHMuc3RvcmVUb1hNTChYTUxkYXRhKTtcclxuICAvL1xyXG4gIC8vICAgICAvLyBJZiBlbmNvZGluZyB3YXMgZGlzYWJsZWQsIGVuYWJsZSBpdCB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbW1hbmQgbGluZSBmb3IgdGhlIHBhcmFsbGVsIHByb2dyYW1cclxuICAvLyAgICAgbGV0IGVuY29kaW5nRW5hYmxlZDogYm9vbGVhbiA9IEh0dHBVdGlsaXR5LkVuY29kaW5nRW5hYmxlZDtcclxuICAvLyAgICAgaWYgKCFlbmNvZGluZ0VuYWJsZWQpXHJcbiAgLy8gICAgICAgSHR0cFV0aWxpdHkuRW5jb2RpbmdFbmFibGVkID0gdHJ1ZTtcclxuICAvL1xyXG4gIC8vICAgICBsZXQgc3Bhd25pbmdBcmd1bWVudHM6IHN0cmluZyA9IEh0dHBVdGlsaXR5LlVybEVuY29kZShYTUxkYXRhLlRvU3RyaW5nKCksIEVuY29kaW5nLlVURjgpO1xyXG4gIC8vICAgICBpZiAoIWVuY29kaW5nRW5hYmxlZClcclxuICAvLyAgICAgICBIdHRwVXRpbGl0eS5FbmNvZGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuICAvL1xyXG4gIC8vICAgICAvLyBzcGF3biBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYXNzZW1ibHkgaW5zaWRlIHRoZSBjdXJyZW50IHByb2Nlc3NcclxuICAvLyAgICAgUHJvY2Vzcy5TdGFydEN1cnJlbnRFeGVjdXRhYmxlKHNwYXduaW5nQXJndW1lbnRzKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNhdGNoIChleCkge1xyXG4gIC8vICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAvLyAgICAgICBPcGVyYXRpb24uY2FsbE9wclNob3dFcnJvcih0YXNrLCBleC50b1N0cmluZygpKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBlbHNlXHJcbiAgLy8gICAgICAgdGhyb3cgZXg7XHJcbiAgLy8gICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY29uZGl0aW9uIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGdldENvbmRWYWwoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZEV4cC5nZXRWYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9wZXJhdGlvbiB0eXBlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUeXBlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9wZXJhdGlvbiB0eXBlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSb3V0ZVBhcmFtcygpOiBMaXN0PGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHNlcnZlciBJRCBvZiB0aGlzIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U2VydmVySWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFZlcmlmeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgbW9kZT09ZXJyb3I8L3JldHVybnM+XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb3BlclZlcmlmeSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpc0Vycm9yOiBib29sZWFuID0gKHRoaXMuX21vZGUgPT09IENvbnN0SW50ZXJmYWNlLkZMV19WRVJJRllfTU9ERV9FUlJPUik7XHJcblxyXG4gICAgbGV0IHRleHRUb0Rpc3BsYXk6IHN0cmluZyA9IHRoaXMuX2V4cCA9PT0gbnVsbCA/IHRoaXMuX3RleHQgOiBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUsIDI1NSk7XHJcblxyXG4gICAgbGV0IHRpdGxlVG9EaXNwbGF5OiBzdHJpbmcgPSB0aGlzLl90aXRsZUV4cCA9PT0gbnVsbCA/IHRoaXMuX3RpdGxlIDogYXdhaXQgdGhpcy5fdGl0bGVFeHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUsIDI1NSk7XHJcblxyXG4gICAgdGV4dFRvRGlzcGxheSA9IHRleHRUb0Rpc3BsYXkgPT09IG51bGwgPyBcIlwiIDogU3RyVXRpbC5ydHJpbSh0ZXh0VG9EaXNwbGF5KTtcclxuICAgIHRpdGxlVG9EaXNwbGF5ID0gdGl0bGVUb0Rpc3BsYXkgPT09IG51bGwgPyBcIlwiIDogU3RyVXRpbC5ydHJpbSh0aXRsZVRvRGlzcGxheSk7XHJcblxyXG4gICAgLy8gSW5PcmRlciB0byBrZWVwIHRoZSBiZWhhdmlvciBzYW1lIGFzIGluIE9ubGluZSwgVmVyaWZ5IE9wZXJhdGlvbiBXYXJuaW5nIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlblxyXG4gICAgLy8gYXMgRXJyb3IgbWVzc2FnZXMgaW4gQ2xpZW50IGxvZyAoUUNSICM5MTUxMjIpXHJcbiAgICBpZiAodGhpcy5fZXJyTG9nQXBwZW5kKSB7XHJcbiAgICAgIGxldCBwcmdEZXNjcmlwdGlvbiA9ICg8VGFzaz4gdGhpcy5fdGFzay5HZXRDb250ZXh0VGFzaygpKS5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKHRleHRUb0Rpc3BsYXkgKyBcIiwgcHJvZ3JhbSA6IFwiICsgcHJnRGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gICAgLy8gU3RhdHVzIGxpbmVcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5ID09PSBDb25zdEludGVyZmFjZS5ESVNQTEFZX1NUQVRVUykge1xyXG4gICAgICAvLyBCbGFuayBNZXNzYWdlIHdpbGwgbm90IGJlIHNob3duLCBzYW1lIGFzIGluIE9ubGluZVxyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0VG9EaXNwbGF5KSkge1xyXG5cclxuICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZEZsb3dWZXJpZnlJbmZvKHRleHRUb0Rpc3BsYXksIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgLy8gUHJvZHVjdCAjMTc4LCBUb3BpYyAjNjE6IGJlZXAgb24gdGhlIGNsaWVudCBzaWRlIG9ubHkgdXBvbiB1c2VyIGVycm9ycyAoZS5nLiBkdXBsaWNhdGUgcmVjb3JkKSxcclxuICAgICAgICAvLyBvdGhlcndpc2Ugb25seSBpZiBzdGFydGVkIGZyb20gdGhlIHN0dWRpbyAoRjcpXHJcbiAgICAgICAgKDxUYXNrPiB0aGlzLl90YXNrLkdldENvbnRleHRUYXNrKCkpLldyaXRlVG9NZXNzYWdlUGFuZSh0ZXh0VG9EaXNwbGF5LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE1lc3NhZ2UgQm94XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gQmxhbmsgTWVzc2FnZSB3aWxsIG5vdCBiZSBzaG93biwgc2FtZSBhcyBpbiBPbmxpbmVcclxuICAgICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dFRvRGlzcGxheSkpIHtcclxuICAgICAgICAvLyBtbHMgdHJhbnNsYXRpb24gd2hlbiBkaXNwbGF5aW5nIHRvIGJveC4gZm9yIHN0YXR1cyB0aGUgcmFucyBpcyBpIHRoZSBjb250cm9sIHByb3BlcnR5LlxyXG4gICAgICAgIGxldCBtbHNUcmFuc1RleHRUb0Rpc3BsYXk6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUodGV4dFRvRGlzcGxheSk7XHJcbiAgICAgICAgbGV0IG1sc1RyYW5zVGl0bGVUb0Rpc3BsYXk6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUodGl0bGVUb0Rpc3BsYXkpO1xyXG5cclxuXHJcbiAgICAgICAgbGV0IHZlcmlmeU1vZGU6IG51bWJlciA9IE9wZXJhdGlvbi5nZXRCdXR0b25zKHRoaXMuX2J1dHRvbnMpO1xyXG4gICAgICAgIHZlcmlmeU1vZGUgPSB2ZXJpZnlNb2RlIHx8IE9wZXJhdGlvbi5nZXRJbWFnZSh0aGlzLl9pbWFnZSk7XHJcbiAgICAgICAgdmVyaWZ5TW9kZSA9IHZlcmlmeU1vZGUgO1xyXG5cclxuICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICBsZXQgZGVsaW1Qb3M6IG51bWJlciA9IG1sc1RyYW5zVGV4dFRvRGlzcGxheS5pbmRleE9mKCd8Jyk7XHJcbiAgICAgICAgICBpZiAoMCA8PSBkZWxpbVBvcyAmJiBkZWxpbVBvcyA8IG1sc1RyYW5zVGV4dFRvRGlzcGxheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbWxzVHJhbnNUaXRsZVRvRGlzcGxheSA9IG1sc1RyYW5zVGV4dFRvRGlzcGxheS5zdWJzdHIoZGVsaW1Qb3MgKyAxKTtcclxuICAgICAgICAgICAgbWxzVHJhbnNUZXh0VG9EaXNwbGF5ID0gbWxzVHJhbnNUZXh0VG9EaXNwbGF5LnN1YnN0cigwLCBkZWxpbVBvcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSBudWxsO1xyXG4gICAgICAgIC8vIGdldCB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGUgbWVzc2FnZWJveCB3aWxsIGJlIGRpc3BsYXllZFxyXG4gICAgICAgIGlmICghKDxUYXNrPiB0aGlzLl90YXNrLkdldENvbnRleHRUYXNrKCkpLmdldE1HRGF0YSgpLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICBtZ0Zvcm0gPSA8TWdGb3JtPig8VGFzaz4gdGhpcy5fdGFzay5HZXRDb250ZXh0VGFzaygpKS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG5cclxuICAgICAgICAvLyBpZiB0aGUgZm9ybSBvZiB0aGUgY3VycmVudCB0YXNrIGlzIG51bGwgKG1haW4gcHJvZ3JhbSkgdGhlbiB1c2UgdGhlIGZvcm1cclxuICAgICAgICAvLyBvZiBsYXN0IGZvY3VzZWQgdGFza1xyXG4gICAgICAgIGlmIChtZ0Zvcm0gPT0gbnVsbCAmJiBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgIG1nRm9ybSA9IDxNZ0Zvcm0+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLmdldFRvcE1vc3RGb3JtKCk7XHJcbiAgICAgICAgaWYgKG1nRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBtZ0Zvcm0uUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICBDb21tYW5kcy5pbnZva2UoKTtcclxuICAgICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXR1cm5WYWx1ZTogbnVtYmVyID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1sc1RyYW5zVGl0bGVUb0Rpc3BsYXksIG1sc1RyYW5zVGV4dFRvRGlzcGxheSwgdmVyaWZ5TW9kZSk7XHJcbiAgICAgICAgYXdhaXQgT3BlcmF0aW9uLnNldG9wZXJWZXJpZnlSZXR1cm5WYWx1ZShyZXR1cm5WYWx1ZSwgdGhpcy5fcmV0dXJuVmFsKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFcnJvcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGNvZGUgYXNzaWduZWQgdG8gY29ycmVzcG9uZGluZyBidXR0b25zSURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEJ1dHRvbnMoYnV0dG9uc0lEOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcGJ1dHRvbnM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgc3dpdGNoIChidXR0b25zSUQpIHtcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5CVVRUT05TX09LOlxyXG4gICAgICAgIHRtcGJ1dHRvbnMgPSBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5CVVRUT05TX09LX0NBTkNFTDpcclxuICAgICAgICB0bXBidXR0b25zID0gU3R5bGVzLk1TR0JPWF9CVVRUT05fT0tfQ0FOQ0VMO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkJVVFRPTlNfQUJPUlRfUkVUUllfSUdOT1JFOlxyXG4gICAgICAgIHRtcGJ1dHRvbnMgPSBTdHlsZXMuTVNHQk9YX0JVVFRPTl9BQk9SVF9SRVRSWV9JR05PUkU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuQlVUVE9OU19ZRVNfTk9fQ0FOQ0VMOlxyXG4gICAgICAgIHRtcGJ1dHRvbnMgPSBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkJVVFRPTlNfWUVTX05POlxyXG4gICAgICAgIHRtcGJ1dHRvbnMgPSBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk87XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuQlVUVE9OU19SRVRSWV9DQU5DRUw6XHJcbiAgICAgICAgdG1wYnV0dG9ucyA9IFN0eWxlcy5NU0dCT1hfQlVUVE9OX1JFVFJZX0NBTkNFTDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0bXBidXR0b25zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgY29kZSBhc3NpZ25lZCB0byBjb3JyZXNwb25kaW5nIGltYWdlSURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2UoaW1hZ2VJRDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBJbWFnZTogbnVtYmVyID0gMDtcclxuICAgIHN3aXRjaCAoaW1hZ2VJRCkge1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLklNQUdFX0VYQ0xBTUFUSU9OOlxyXG4gICAgICAgIHRtcEltYWdlID0gU3R5bGVzLk1TR0JPWF9JQ09OX0VYQ0xBTUFUSU9OO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLklNQUdFX0NSSVRJQ0FMOlxyXG4gICAgICAgIHRtcEltYWdlID0gU3R5bGVzLk1TR0JPWF9JQ09OX0VSUk9SO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLklNQUdFX1FVRVNUSU9OOlxyXG4gICAgICAgIHRtcEltYWdlID0gU3R5bGVzLk1TR0JPWF9JQ09OX1FVRVNUSU9OO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLklNQUdFX0lORk9STUFUSU9OOlxyXG4gICAgICAgIHRtcEltYWdlID0gU3R5bGVzLk1TR0JPWF9JQ09OX0lORk9STUFUSU9OO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRtcEltYWdlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgVmVyaWZ5IE9wZXJhdGlvbiBSZXR1cm4gVmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBzZXRvcGVyVmVyaWZ5UmV0dXJuVmFsdWUocmV0dXJuVmFsdWU6IG51bWJlciwgcmV0dXJuVmFsOiBGaWVsZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHJldHVyblZhbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcmV0VmFsdWVOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcblxyXG4gICAgICByZXRWYWx1ZU51bS5OVU1fNF9MT05HKHJldHVyblZhbHVlKTtcclxuICAgICAgbGV0IHJldHVyblZhbHVlU3RyOiBzdHJpbmcgPSByZXRWYWx1ZU51bS50b1hNTHJlY29yZCgpO1xyXG5cclxuICAgICAgYXdhaXQgcmV0dXJuVmFsLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUocmV0dXJuVmFsdWVTdHIsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgIGF3YWl0IHJldHVyblZhbC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBCbG9ja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgb3BlckJsb2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBlbHNlIC8gZWxzZWlmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBvcGVyRWxzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgRXZhbHVhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb3BlckV2YWx1YXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gJ1xcMCc7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2V4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKHRoaXMuX2ZpZWxkLmdldFR5cGUoKSwgdGhpcy5fZmllbGQuZ2V0U2l6ZSgpKTtcclxuICAgICAgYXdhaXQgdGhpcy5fZmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZShyZXN1bHQsIHJlc3VsdCA9PT0gbnVsbCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9maWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2V4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFVwZGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVyVXBkYXRlKG1wcmdDcmVhdG9yOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcsIG9sZFZhbCwgbmV3VmFsLCBmaWVsZFZhbDtcclxuICAgIGxldCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuO1xyXG4gICAgbGV0IHJlY29tcHV0ZTogYm9vbGVhbjtcclxuICAgIGxldCBuT2xkOiBOVU1fVFlQRSwgbk5ldywgblJlc3VsdDtcclxuXHJcbiAgICBsZXQgZmxvd01vbml0b3I6IEZsb3dNb25pdG9yUXVldWUgPSBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlO1xyXG4gICAgZmxvd01vbml0b3IuYWRkRmxvd09wZXJhdGlvblVwZGF0ZShGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgLy8gZm9yIG5vbi1tb2RpZmlhYmxlIGZpZWxkIGdvIHRvIHRoZSBzZXJ2ZXIsIGkuZS4gc2VydmVyIGNhbiBhYm9ydCB0aGUgdGFza1xyXG4gICAgaWYgKCF0aGlzLl9maWVsZC5EYk1vZGlmaWFibGUgJiYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpIHtcclxuICAgICAgaWYgKCFhd2FpdCB0aGlzLkNhbk1vZGlmeShtcHJnQ3JlYXRvcikpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGZpZWxkVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuX2ZpZWxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsIHVwZGF0ZVxyXG4gICAgaWYgKHRoaXMuX2luY3JlbWVudGFsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fZmllbGQuSXNMaW5rRmllbGQpIHtcclxuICAgICAgICBmaWVsZFZhbCA9IHRoaXMuX2ZpZWxkLmdldFZhbHVlKHRydWUpO1xyXG4gICAgICAgIG5SZXN1bHQgPSAoZmllbGRWYWwgIT0gbnVsbFxyXG4gICAgICAgICAgPyBuZXcgTlVNX1RZUEUoZmllbGRWYWwpXHJcbiAgICAgICAgICA6IG51bGwpO1xyXG5cclxuICAgICAgICAvLyBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlIGlmIG5vdCBpbiBjcmVhdGUgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuXHJcbiAgICAgICAgICAvLyBpbmRpY2F0ZSB3ZSBhcmUgZXZhbHVhdGluZyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBmaWVsZHNcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0RXZhbE9sZFZhbHVlcyh0cnVlKTtcclxuICAgICAgICAgIG9sZFZhbCA9ICh0aGlzLl9maWVsZC5pc051bGwoKVxyXG4gICAgICAgICAgICA/IHRoaXMuX2ZpZWxkLmdldE1hZ2ljRGVmYXVsdFZhbHVlKClcclxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChmaWVsZFR5cGUsIHRoaXMuX2ZpZWxkLmdldFNpemUoKSkpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRFdmFsT2xkVmFsdWVzKGZhbHNlKTtcclxuICAgICAgICAgIG5PbGQgPSBuZXcgTlVNX1RZUEUob2xkVmFsKTtcclxuICAgICAgICAgIG5SZXN1bHQgPSBOVU1fVFlQRS5zdWIoblJlc3VsdCwgbk9sZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSB7XHJcbiAgICAgICAgICBuZXdWYWwgPSBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChmaWVsZFR5cGUsIHRoaXMuX2ZpZWxkLmdldFNpemUoKSk7XHJcbiAgICAgICAgICBpZiAobmV3VmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbk5ldyA9IG5ldyBOVU1fVFlQRShuZXdWYWwpO1xyXG4gICAgICAgICAgICBuUmVzdWx0ID0gTlVNX1RZUEUuYWRkKG5SZXN1bHQsIG5OZXcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBuTmV3ID0gblJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuUmVzdWx0ICE9IG51bGwpXHJcbiAgICAgICAgICByZXN1bHQgPSBuUmVzdWx0LnRvWE1McmVjb3JkKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fZmllbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvKiBJZiB0aGUgaW5jcmVtZW50YWwgdXBkYXRlIGlzIGZvciBhIGxpbmsgZmllbGQsIGdvIHRvIHNlcnZlci4gKi9cclxuICAgICAgICAvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGJlIGRvbmUgb24gc2VydmVyIGJlY2F1c2Ugb24gY2xpZW50LCB3ZSBkbyAqL1xyXG4gICAgICAgIC8qIG5vdCBoYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9sZCBsaW5rIHJlY29yZC4gKi9cclxuICAgICAgICAvKiBBbmQgZm9yIGluY3JlbWVudGFsIHVwZGF0ZSwgd2UgbmVlZCB0byB3b3JrIG9uIDIgcmVjb3JkcyBhcyBpbiAqL1xyXG4gICAgICAgIC8qIGNhc2Ugb2YgUUNSIyA5MDA3MzguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgYXdhaXQgdGhpcy5vcGVyU2VydmVyKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGVuZCBvZiAgaW5jcmVtZW50YWwgdXBkYXRlXHJcbiAgICBlbHNlXHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2V4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKGZpZWxkVHlwZSwgdGhpcy5fZmllbGQuZ2V0U2l6ZSgpKTtcclxuXHJcbiAgICAvLyBRQ1IgNzQ2MDUzIGlmIHRoZSBjZWxscyB0eXBlIGRvbid0IG1hdGNoIHRocm93IGVycm9yXHJcbiAgICBpZiAoZmllbGRUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICBpZiAocmVzdWx0ICE9IG51bGwpXHJcbiAgICAgICAgcmVzdWx0ID0gT3BlcmF0aW9uLm9wZXJVcGRhdGVWZWN0b3JzKHRoaXMuX2ZpZWxkLCByZXN1bHQpO1xyXG5cclxuICAgIHJlY29tcHV0ZSA9ICh0aGlzLl9maWVsZC5nZXRUYXNrKCkgPT09IHRoaXMuX3Rhc2spO1xyXG4gICAgc2V0UmVjb3JkVXBkYXRlZCA9ICghcmVjb21wdXRlIHx8ICF0aGlzLl91bmRvKTtcclxuICAgIGF3YWl0IHRoaXMuX2ZpZWxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUocmVzdWx0LCByZXN1bHQgPT0gbnVsbCwgdHJ1ZSwgc2V0UmVjb3JkVXBkYXRlZCwgZmFsc2UpO1xyXG4gICAgaWYgKCF0aGlzLl91bmRvKVxyXG4gICAgICB0aGlzLl9maWVsZC5zZXRVcGRhdGVkKCk7XHJcblxyXG4gICAgLy8gUUNSICMgMjcwOTQ5IDogSWYgZmllbGQgaXMgdXBkYXRlZCB3aXRoIHVwZGF0ZSBvcGVyYXRpb24sIG1vZGlmaWVkIGZsYWcgc2hvdWxkIGJlIHNldCBpbiBvcmRlciB0byBjYXVzZSByZS1jb21wdXRlLlxyXG4gICAgdGhpcy5fZmllbGQuc2V0TW9kaWZpZWQoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLl9maWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICBmbG93TW9uaXRvci5hZGRGbG93T3BlcmF0aW9uVXBkYXRlKEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNhbiBhIG5vbi1tb2RpZmlhYmxlIGZpZWxkIGJlIG1vZGlmaWVkLiB0aGUgd2F5IHRvIGdldCB0aGUgYW5zd2VyIGRlcGVuZHMgb24gdGhlIGxvY2FsL3JlbW90ZSBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXByZ0NyZWF0b3JcIj50cnVlIGlmIHRoZSBmaWVsZCBtYXkgYmUgbW9kaWZpZWQgYW5kIHRoZSBjYWxsaW5nIG1ldGhvZCBzaG91bGQgY29udGludWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBDYW5Nb2RpZnkobXByZ0NyZWF0b3I6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBleGVjT3BlckNvbW1hbmQ6IEV4ZWNPcGVyQ29tbWFuZCA9ICgodGhpcy5fY21kVG9TZXJ2ZXIgaW5zdGFuY2VvZiBFeGVjT3BlckNvbW1hbmQpID8gPEV4ZWNPcGVyQ29tbWFuZD50aGlzLl9jbWRUb1NlcnZlciA6IG51bGwpO1xyXG5cclxuICAgIGV4ZWNPcGVyQ29tbWFuZC5PcGVyYXRpb24gPSB0aGlzO1xyXG4gICAgZXhlY09wZXJDb21tYW5kLk1wcmdDcmVhdG9yID0gbXByZ0NyZWF0b3I7XHJcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuVGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZSh0aGlzLl9jbWRUb1NlcnZlcikpLlN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlcyB0aGUgZGF0YSBjb250ZW50IG9mIGEgdmVjdG9yIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGhlYWRlciBkYXRhXHJcbiAgLy8vICAgc3VjaCBhcyBjZWxsIHR5cGUgYW5kIHNpemUgLSBpcyB1c2VkIG9ubHkgaW4gdXBkYXRlIG9wZXJhdGlvbnMgYmV0d2VlbiB2ZWN0b3JzXHJcbiAgLy8vICAgZm9yIGV4YW1wbGUgdmVjdG9ycyBvZiBhbHBoYSB3aXRoIGNlbGwgc2l6ZSB0aGUgZGlmZmVyIG9yIHZlY3RvciBvZiBtZW1vIHdpdGggdmVjdG9yIG9mIGFscGhhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZlY1wiPnRoZSBmbGF0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aGUgbmV3IHZlY3RvclxyXG4gIC8vLyAgIGZpZWxkIHRoZSBmaWVsZCB0byBiZSB1cGRhdGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIGZsYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHVwZGF0ZWQgdmVjdG9yIGFmdGVyIHRoZSBVcGRhdGU8L3JldHVybnM+XHJcbiAgc3RhdGljIG9wZXJVcGRhdGVWZWN0b3JzKGZpZWxkOiBGaWVsZCwgdmVjOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbGV0IGNlbGxzQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFZlY3RvclR5cGUuZ2V0Q2VsbHNBdHRyKHZlYyk7XHJcbiAgICAgIGxldCBjZWxsc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUaGVTYW1lVHlwZShjZWxsc0F0dHIsIGNlbGxzVHlwZSkpIHtcclxuICAgICAgICBsZXQgbmV3VmVjOiBWZWN0b3JUeXBlID0gbmV3IFZlY3RvclR5cGUodmVjKTtcclxuICAgICAgICBuZXdWZWMuYWRqdXN0VG9GaXQoZmllbGQpO1xyXG4gICAgICAgIHJldHVybiBuZXdWZWMudG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gb3BlclVwZGF0ZVZlY3RvcnMgXCIgKyBmaWVsZC5nZXROYW1lKCkgKyBcIiBpcyBub3Qgb2YgdHlwZSB2ZWN0b3JcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBSYWlzZSBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtcHJnQ3JlYXRvclwiPmlmIHRoZSBvcGVyYXRpb24gYmVsb25ncyB0byBhIG1haW4gcHJvZ3JhbSBpdCBwb2ludHMgdG8gdGhlIHRhc2sgd2hpY2hcclxuICAvLy8gICBjYXVzZWQgdGhlIG1haW4gcHJvZ3JhbSB0byBiZWNvbWUgYWN0aXZlLiBPdGhlcndpc2UgaXQncyBmYWxzZS5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIGp1c3QgY2FtZSBiYWNrIGZyb20gdGhlIHNlcnZlciB0byBiZSBwYXNzZWQgdG8gRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5oYW5kbGVFdmVudCgpPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9wZXJSYWlzZUV2ZW50KG1wcmdDcmVhdG9yOiBUYXNrLCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgaW1tZWRpYXRlOiBib29sZWFuID0gYXdhaXQgdGhpcy5JbW1lZGlhdGUoKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBuZXcgcnVuIHRpbWUgZXZlbnQgdXNpbmcgdGhlIG9yaWdpbmFsIGFzIHRlbXBsYXRlXHJcbiAgICBsZXQgYVJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSB0aGlzLl9ydEV2dC5yZXBsaWNhdGUoKTtcclxuICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcblxyXG4gICAgYVJ0RXZ0LnNldEltbWVkaWF0ZShpbW1lZGlhdGUpO1xyXG4gICAgYVJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKG51bGwpO1xyXG5cclxuICAgIGlmIChpbW1lZGlhdGUpIHtcclxuICAgICAgYVJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBhUnRFdnQuc2V0QXJnTGlzdCh0aGlzLl9hcmdMaXN0KTtcclxuXHJcbiAgICAgIGlmIChhUnRFdnQuZ2V0VGFzaygpLmlzTWFpblByb2coKSlcclxuICAgICAgICBhUnRFdnQuc2V0TWFpblByZ0NyZWF0b3IobXByZ0NyZWF0b3IpO1xyXG5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyIChhUnRFdnQpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoRXhlY1N0YWNrKHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpICwgdGhpcy5fZXZ0SGFuZGxlci5nZXRJZCgpLnRvU3RyaW5nKCkgLCB0aGlzLl9zZXJ2ZXJJZCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KGFSdEV2dCwgcmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wRXhlY1N0YWNrKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gc2VuZCBhcmd1bWVudHMgYnkgdmFsdWVcclxuICAgICAgbGV0IGFyZ2xpc3QgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICBhd2FpdCBhcmdsaXN0LkluaXRpYWxpemUodGhpcy5fYXJnTGlzdClcclxuICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoYXJnbGlzdCk7XHJcbiAgICAgIGFSdEV2dC5zZXRUYXNrKG51bGwpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyIChhUnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBicm93c2VyIENhbGwgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1wcmdDcmVhdG9yXCI+aWYgdGhlIG9wZXJhdGlvbiBiZWxvbmdzIHRvIGEgbWFpbiBwcm9ncmFtIGl0IHBvaW50cyB0byB0aGUgdGFzayB3aGljaFxyXG4gIC8vLyAgIGNhdXNlZCB0aGUgbWFpbiBwcm9ncmFtIHRvIGJlY29tZSBhY3RpdmUuIE90aGVyd2lzZSBpdCdzIGZhbHNlLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgb3BlckNhbGwobXByZ0NyZWF0b3I6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMub3BlclNlcnZlcihtcHJnQ3JlYXRvcik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBTZXJ2ZXIgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1wcmdDcmVhdG9yXCI+aWYgdGhlIG9wZXJhdGlvbiBiZWxvbmdzIHRvIGEgbWFpbiBwcm9ncmFtIGl0IHBvaW50cyB0byB0aGUgdGFzayB3aGljaFxyXG4gIC8vLyAgIGNhdXNlZCB0aGUgbWFpbiBwcm9ncmFtIHRvIGJlY29tZSBhY3RpdmUuIE90aGVyd2lzZSBpdCdzIGZhbHNlLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFzeW5jIG9wZXJTZXJ2ZXIobXByZ0NyZWF0b3I6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb21tYW5kOiBFeGVjT3BlckNvbW1hbmQgPSAoKHRoaXMuX2NtZFRvU2VydmVyIGluc3RhbmNlb2YgRXhlY09wZXJDb21tYW5kKSA/IDxFeGVjT3BlckNvbW1hbmQ+dGhpcy5fY21kVG9TZXJ2ZXIgOiBudWxsKTtcclxuICAgIERlYnVnLkFzc2VydChjb21tYW5kICE9PSBudWxsKTtcclxuICAgIGlmICh0aGlzLl90YXNrLmlzTWFpblByb2coKSlcclxuICAgICAgY29tbWFuZC5NcHJnQ3JlYXRvciA9IG1wcmdDcmVhdG9yO1xyXG4gICAgZWxzZVxyXG4gICAgICBjb21tYW5kLk1wcmdDcmVhdG9yID0gbnVsbDtcclxuXHJcbiAgICBjb21tYW5kLlNldEV4ZWN1dGlvblN0YWNrKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEV4ZWNTdGFjaygpKTtcclxuICAgIGNvbW1hbmQuT3BlcmF0aW9uID0gdGhpcztcclxuICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5leGVjUmVxdWVzdFdpdGhTdWJmb3JtUmVjb3JkQ3ljbGUoPENvbW1hbmRzVGFibGU+dGhpcy5fdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIsIHRoaXMuX2NtZFRvU2VydmVyLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgQmxvY2sgRW5kIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRCbG9ja0VuZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jsb2NrRW5kO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBCbG9jayBFbmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEJsb2NrRW5kKHZhbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ibG9ja0VuZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgQmxvY2sgQ2xvc2UgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEJsb2NrQ2xvc2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ibG9ja0Nsb3NlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBCbG9jayBDbG9zZSBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0QmxvY2tDbG9zZSh2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fYmxvY2tDbG9zZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG4gIGdldEhhbmRsZXJJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2dEhhbmRsZXIuZ2V0SWQoKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXZlbnRIYW5kbGVyKCk6IEV2ZW50SGFuZGxlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0SGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGdldEV4ZWNPblNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9leGVjT25TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBzZXRFeGVjT25TZXJ2ZXIodmFsIDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZXhlY09uU2VydmVyID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXhlY09uQ2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4ZWNPbkNsaWVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZXhlY3V0ZWQgb3Igbm90XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgY2FuRXhlY3V0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbmRWYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnVmZmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBhc3luYyBBZGRGbG93RGVzY3JpcHRpb24oYnVmZmVyOiBTdHJpbmdCdWlsZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3R5cGUpIHtcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1ZFUklGWTpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiVmVyaWZ5OiBcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cCA9PSBudWxsKVxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl90ZXh0KTtcclxuICAgICAgICBlbHNlIGJ1ZmZlci5BcHBlbmQoXCJFeHAgI1wiKS5BcHBlbmQodGhpcy5fZXhwLmdldElkKCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0s6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIkJsb2NrIElmXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUDpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiQmxvY2sgTG9vcFwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0U6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIkJsb2NrIEVsc2VcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FVkFMVUFURTpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiRXZhbHVhdGUgRXhwICNcIikuQXBwZW5kKHRoaXMuX2V4cC5nZXRJZCgpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1VQREFURTpcclxuICAgICAgICBidWZmZXIuQXBwZW5kRm9ybWF0KFwiVXBkYXRlIHswfSB3aXRoIEV4cCAjezF9XCIsIHRoaXMuX2ZpZWxkLmdldFZhck5hbWUoKSwgdGhpcy5fZXhwLmdldElkKCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRU5EQkxPQ0s6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIkVuZCBCbG9ja1wiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1VTUl9FWElUOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJJbnZva2UgT1NcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVDpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiUmFpc2UgRXZlbnQ6XCIpO1xyXG4gICAgICAgIHRoaXMuX3J0RXZ0LkFwcGVuZERlc2NyaXB0aW9uKGJ1ZmZlcik7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZEZvcm1hdChcIiAoV2FpdD17MH0pXCIsIChhd2FpdCB0aGlzLkltbWVkaWF0ZSgpID8gJ1knIDogJ04nKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9TRVJWRVI6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIlJ1biBzZXJ2ZXItc2lkZSBvcGVyYXRpb25cIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9DQUxMOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJDYWxsIHByb2dyYW1cIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZEZvcm1hdChcIjw8VW5rbm93biBPcGVyYXRpb24gQ29kZSB7MH0+PlwiLCB0aGlzLl90eXBlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0QXJnTGlzdCgpOiBBcmd1bWVudHNMaXN0IHtcclxuICAgIHJldHVybiB0aGlzLl9hcmdMaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZXR1cm5WYWx1ZUZpZWxkKCk6IEZpZWxkIHtcclxuICAgIHJldHVybiB0aGlzLl9maWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHJldHVybnMgc3ViZm9ybSBjb250cm9sIG5hbWUgZm9yIGNhbGwgd2l0aCBkZXN0aW5hdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRTdWJmb3JtQ29udHJvbE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJmb3JtQ3RybE5hbWU7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiRXhlY3V0aW5nIG9wZXJhdGlvbiBudW1iZXIgezB9XCIsIHRoaXMuX3NlcnZlcklkICsgMSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==