@magic-xpa/engine 4.1100.0-dev4110.19 → 4.1100.0-dev4110.191

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