@magic-xpa/engine 4.1100.0-dev4110.18 → 4.1100.0-dev4110.181

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +1611 -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 +29711 -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,1611 @@
1
+ import { ApplicationException, Debug, Int32, Int64, isNullOrUndefined, List, NNumber } from '@magic-xpa/mscorelib';
2
+ import { Constants, InternalInterface, Logger, Misc, StorageAttribute, XMLConstants, XmlParser } from '@magic-xpa/utils';
3
+ import { DataModificationTypes, DisplayConvertor, PIC, PropInterface } from '@magic-xpa/gui';
4
+ import { ConstInterface } from '../ConstInterface';
5
+ import { RecordsTable } from './RecordsTable';
6
+ import { Record } from './Record';
7
+ import { TaskBase } from '../tasks/TaskBase';
8
+ import { FieldsTableExt as FieldsTable } from './FieldsTable';
9
+ import { RecordOutOfDataViewException, RecordOutOfDataViewException_ExceptionType } from './RecordOutOfDataViewException';
10
+ import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
11
+ import { XMLBasedDcValuesBuilder } from './XMLBasedDcValuesBuilder';
12
+ import { Field } from './Field';
13
+ import { EventSubType } from '../enums';
14
+ import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
15
+ import { FieldBase } from './FieldBase';
16
+ import { CommandsProcessorManager } from '../CommandsProcessorManager';
17
+ import { DataViewBase } from './DataViewBase';
18
+ import { AccessHelper, ClearEventsOnStopExecution } from '../AccessHelper';
19
+ import { MGDataCollection } from '../tasks/MGDataCollection';
20
+ export const SET_DISPLAYLINE_BY_DV = Int32.MinValue;
21
+ const COMPUTE_NEWREC_ON_CLIENT = 'C';
22
+ const UNKNOWN_RCMPS_NOT_INITED = 'M';
23
+ const UNKNOWN_RCMPS_FOUND = 'Y';
24
+ const INVOKED_FROM_OFFLINE_TASK = '-99999';
25
+ const CHUNK_CACHE_NEXT = 'N';
26
+ const CHUNK_CACHE_PREV = 'P';
27
+ const CHUNK_DV_BOTTOM = 'B';
28
+ const CHUNK_DV_TOP = 'T';
29
+ const COMPUTE_FLUSH_UPDATES = 'H';
30
+ const COMPUTE_NEWREC_ON_SERVER = 'S';
31
+ const END_DV_TAG = '</' + ConstInterface.MG_TAG_DATAVIEW + '>';
32
+ const RECOVERY_ACT_BEGIN_SCREEN = 'S';
33
+ const RECOVERY_ACT_BEGIN_TABLE = 'T';
34
+ const RECOVERY_ACT_CANCEL = 'C';
35
+ const RECOVERY_ACT_MOVE_DIRECTION_BEGIN = 'B';
36
+ const RECOVERY_ACT_NONE = 'N';
37
+ const TRANS_STAT_CLOSED = 'C';
38
+ const TRANS_STAT_OPENED = 'O';
39
+ export class DataView extends DataViewBase {
40
+ _cacheLruTimeStamp = 0;
41
+ _changed = false;
42
+ _chunkSize = 30;
43
+ _computeBy = '\0';
44
+ _currRecId = 0;
45
+ _currRecIdx = 0;
46
+ _dvPosValue = 0;
47
+ _firstDv = true;
48
+ _flushUpdates = false;
49
+ _hasMainTable = true;
50
+ _insertAt = ' ';
51
+ set InsertAt(value) {
52
+ this._insertAt = value;
53
+ }
54
+ get InsertAt() {
55
+ return this._insertAt;
56
+ }
57
+ InLocalDataviewCommand = false;
58
+ _lastCreatedRecId = 0;
59
+ _lastSessionCounter = Int64.MinValue;
60
+ _locateFirstRec = -1;
61
+ _modifiedRecordsTab = null;
62
+ _oldTopRecIdx = Int32.MinValue;
63
+ _original = null;
64
+ _pendingRecovery = RECOVERY_ACT_NONE;
65
+ _prevCurrRec = null;
66
+ _recordsTab = null;
67
+ _recovery = ConstInterface.RECOVERY_NONE;
68
+ _rmIdx = 0;
69
+ _rmSize = 0;
70
+ _skipParsing = false;
71
+ _topRecId = 0;
72
+ _topRecIdx = Int32.MinValue;
73
+ _topRecIdxModified = false;
74
+ _transCleared = false;
75
+ _unknownRcmp = UNKNOWN_RCMPS_NOT_INITED;
76
+ IsOneWayKey = false;
77
+ _includesFirst = false;
78
+ _includesLast = false;
79
+ _serverTransCacheEmpty = true;
80
+ _currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = null;
81
+ get CurrRec() {
82
+ return this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER;
83
+ }
84
+ set CurrRec(value) {
85
+ if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null && value === null) {
86
+ this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.resetDcValueId();
87
+ }
88
+ this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = value;
89
+ if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null) {
90
+ this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.SetDcValueId();
91
+ }
92
+ }
93
+ get FlushUpdates() {
94
+ return this._flushUpdates;
95
+ }
96
+ get HasMainTable() {
97
+ return this._hasMainTable;
98
+ }
99
+ DBViewSize = 0;
100
+ taskModeFromCache;
101
+ get CurrentRecId() {
102
+ return this._currRecId;
103
+ }
104
+ Dvcount = 0;
105
+ TotalRecordsCount = 0;
106
+ RecordsBeforeCurrentView = 0;
107
+ get FirstRecord() {
108
+ return this._recordsTab.getRecByIdx(0);
109
+ }
110
+ get LastRecord() {
111
+ return this._recordsTab.getRecByIdx(this._recordsTab.getSize() - 1);
112
+ }
113
+ constructor(taskOrDataView) {
114
+ super();
115
+ if (taskOrDataView instanceof TaskBase) {
116
+ this._task = taskOrDataView;
117
+ this._fieldsTab = new FieldsTable();
118
+ this._recordsTab = new RecordsTable(true);
119
+ this._modifiedRecordsTab = new RecordsTable(false);
120
+ }
121
+ else {
122
+ Object.assign(this, taskOrDataView);
123
+ }
124
+ }
125
+ Init() {
126
+ this.init();
127
+ }
128
+ IncludesFirst() {
129
+ return this._includesFirst;
130
+ }
131
+ get ServerTransactionCacheEmpty() {
132
+ return this._serverTransCacheEmpty;
133
+ }
134
+ IncludesLast() {
135
+ return this._includesLast;
136
+ }
137
+ fillHeaderData(parser) {
138
+ while (this.initHeaderInnerObjects(parser, parser.getNextTag())) {
139
+ }
140
+ this.Dvcount = this._task.ctl_itm_4_parent_vee(0, 1);
141
+ }
142
+ initHeaderInnerObjects(parser, foundTagName) {
143
+ if (foundTagName === null)
144
+ return false;
145
+ if (foundTagName === XMLConstants.MG_TAG_DVHEADER) {
146
+ Logger.Instance.WriteDevToLog('dvheader found');
147
+ this.getHeaderAttributes(parser);
148
+ this._fieldsTab.fillData(parser, this);
149
+ this._fieldsTab.setRMPos(this._rmSize, this._rmIdx);
150
+ }
151
+ else if (foundTagName === ('/' + XMLConstants.MG_TAG_DVHEADER)) {
152
+ parser.setCurrIndex2EndOfTag();
153
+ return false;
154
+ }
155
+ else
156
+ return false;
157
+ return true;
158
+ }
159
+ getHeaderAttributes(parser) {
160
+ let tokensVector;
161
+ let tag;
162
+ let attribute;
163
+ let valueStr;
164
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
165
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
166
+ tag = parser.getXMLsubstring(endContext);
167
+ parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_DVHEADER) + XMLConstants.MG_TAG_DVHEADER.length);
168
+ tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
169
+ for (let j = 0; j < tokensVector.length; j += 2) {
170
+ attribute = (tokensVector.get_Item(j));
171
+ valueStr = (tokensVector.get_Item(j + 1));
172
+ switch (attribute) {
173
+ case ConstInterface.MG_ATTR_RMPOS: {
174
+ let i = valueStr.indexOf(',');
175
+ if (i > -1) {
176
+ this._rmSize = NNumber.Parse(valueStr.substr(0, i));
177
+ this._rmIdx = NNumber.Parse(valueStr.substr(i + 1));
178
+ }
179
+ break;
180
+ }
181
+ case ConstInterface.MG_ATTR_COMPUTE_BY:
182
+ this._computeBy = valueStr[0];
183
+ if (this._computeBy === COMPUTE_FLUSH_UPDATES) {
184
+ this._computeBy = COMPUTE_NEWREC_ON_SERVER;
185
+ this._flushUpdates = true;
186
+ }
187
+ else
188
+ this._flushUpdates = false;
189
+ break;
190
+ case ConstInterface.MG_ATTR_HAS_MAIN_TBL:
191
+ this._hasMainTable = XmlParser.getBoolean(valueStr);
192
+ break;
193
+ case ConstInterface.MG_ATTR_CHUNK_SIZE:
194
+ this._chunkSize = XmlParser.getInt(valueStr);
195
+ break;
196
+ case ConstInterface.MG_ATTR_CHUNK_SIZE_EXPRESSION:
197
+ break;
198
+ default:
199
+ Logger.Instance.WriteExceptionToLogWithMsg('Unknown attribute for <' + XMLConstants.MG_TAG_DVHEADER + '> tag: ' +
200
+ attribute);
201
+ break;
202
+ }
203
+ }
204
+ parser.setCurrIndex(++endContext);
205
+ return;
206
+ }
207
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getHeaderAttributes(): out of bounds');
208
+ }
209
+ async fillData(parser) {
210
+ this._skipParsing = false;
211
+ while (await this.initInnerObjects(parser, parser.getNextTag())) {
212
+ }
213
+ this.ResetFirstDv();
214
+ }
215
+ GetTransactionBegin() {
216
+ let transBegin = '\0';
217
+ let transBeginProp = this._task.getProp(PropInterface.PROP_TYPE_TRASACTION_BEGIN);
218
+ if (transBeginProp !== null) {
219
+ transBegin = (transBeginProp.GetComputedValue()).charAt(0);
220
+ }
221
+ return transBegin;
222
+ }
223
+ async initInnerObjects(parser, foundTagName) {
224
+ let form = this._task.getForm();
225
+ if (foundTagName == null)
226
+ return false;
227
+ if (foundTagName === (ConstInterface.MG_TAG_DATAVIEW)) {
228
+ let invalidate = await this.getAttributes(parser);
229
+ if (this._skipParsing) {
230
+ let endContext = parser.getXMLdata().indexOf(END_DV_TAG, parser.getCurrIndex());
231
+ parser.setCurrIndex(endContext + END_DV_TAG.length);
232
+ }
233
+ else {
234
+ this.fillExecStack(parser);
235
+ this.fillDataDc(parser);
236
+ if (invalidate && form != null)
237
+ form.SetTableItemsCount(0, true);
238
+ let taskRefreshType = this._recordsTab.fillData(this, this._insertAt, parser);
239
+ if (form != null) {
240
+ if (form.Opened) {
241
+ if (this._insertAt === 'B' && (invalidate || this._recordsTab.InsertedRecordsCount > 0)) {
242
+ if (invalidate || !this._task.getForm().isTableWithPagination()) {
243
+ form.SetTableItemsCount(0, true);
244
+ form.setTableItemsCount(false);
245
+ }
246
+ else
247
+ form.InsertTableItems(0, this._recordsTab.InsertedRecordsCount);
248
+ }
249
+ else
250
+ form.setTableItemsCount(false);
251
+ }
252
+ }
253
+ if (this.CurrRec != null && this.CurrRec.InRecompute && taskRefreshType === Constants.TASK_REFRESH_NONE)
254
+ taskRefreshType = Constants.TASK_REFRESH_CURR_REC;
255
+ if (invalidate) {
256
+ taskRefreshType = Constants.TASK_REFRESH_FORM;
257
+ if (this._task.IsSubForm)
258
+ this.getTask().DoSubformPrefixSuffix = true;
259
+ }
260
+ this.getTask().SetRefreshType(taskRefreshType);
261
+ this.UpdateDataviewAfterInsert();
262
+ let newRecId = this._recordsTab.getInitialCurrRecId();
263
+ if (newRecId !== Int32.MinValue && (this._recovery === ConstInterface.RECOVERY_NONE || this._firstDv)) {
264
+ if (this._firstDv && this._recovery === ConstInterface.RECOVERY_NONE &&
265
+ (this._task.getLevel().charCodeAt(0) === 0 || this._task.getLevel() === Constants.TASK_LEVEL_TASK))
266
+ this._task.setLevel(Constants.TASK_LEVEL_TASK);
267
+ this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
268
+ if (newRecId !== this._currRecId) {
269
+ await this.setCurrRec(newRecId, !this._firstDv);
270
+ this._original = this.CurrRec.replicate();
271
+ if (this._firstDv)
272
+ this.takeFldValsFromCurrRec();
273
+ if (this._task.getForm() != null)
274
+ (this._task.getForm()).updateDisplayLineByDV();
275
+ }
276
+ else
277
+ this.takeFldValsFromCurrRec();
278
+ }
279
+ else if (invalidate && this._recordsTab.getSize() > 0) {
280
+ if (form == null || form.isScreenMode()) {
281
+ try {
282
+ await this.setCurrRecByIdx(0, false, true, false, 0);
283
+ }
284
+ catch (exception) {
285
+ if (exception instanceof RecordOutOfDataViewException) {
286
+ }
287
+ else
288
+ throw exception;
289
+ }
290
+ }
291
+ else {
292
+ this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
293
+ this.setTopRecIdx(0);
294
+ if (this._task.getForm() != null)
295
+ this._task.getForm().SetTableTopIndex();
296
+ try {
297
+ await this.setCurrRecByIdx(0, false, true, true, 0);
298
+ if (this._task.getForm() != null)
299
+ (this._task.getForm()).updateDisplayLineByDV();
300
+ }
301
+ catch (exception) {
302
+ if (exception instanceof RecordOutOfDataViewException) {
303
+ }
304
+ else
305
+ throw exception;
306
+ }
307
+ if (this._task.getLevel() === Constants.TASK_LEVEL_CONTROL && this._task.getLastParkedCtrl() != null)
308
+ this._task.getLastParkedCtrl().resetPrevVal();
309
+ }
310
+ this.saveOriginal();
311
+ this._fieldsTab.invalidate(true, FieldBase.CLEAR_FLAGS);
312
+ }
313
+ if (this._firstDv)
314
+ this.setPrevCurrRec();
315
+ if (invalidate && this._task.IsSubForm)
316
+ this._task.getForm().getSubFormCtrl().RefreshOnVisible = false;
317
+ if (this._recovery === ConstInterface.RECOVERY_NONE) {
318
+ if (this.getTask().getAfterRetry(ConstInterface.RECOVERY_RETRY) &&
319
+ !this.getTask().IsAfterRetryBeforeBuildXML)
320
+ this._task.setLevel(Constants.TASK_LEVEL_RECORD);
321
+ }
322
+ else {
323
+ let transBegin = this.GetTransactionBegin();
324
+ let stopExecution = true;
325
+ switch (this._recovery) {
326
+ case ConstInterface.RECOVERY_ROLLBACK:
327
+ if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
328
+ if (this._task.getMode() === Constants.TASK_MODE_DELETE ||
329
+ !this._task.IsInteractive)
330
+ stopExecution = false;
331
+ else {
332
+ this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
333
+ this.CurrRec.restart(this.CurrRec.getMode());
334
+ this.CurrRec.resetModified();
335
+ this._original = this.CurrRec.replicate();
336
+ this._pendingRecovery = RECOVERY_ACT_CANCEL;
337
+ }
338
+ }
339
+ else if (transBegin !== ConstInterface.TRANS_NONE) {
340
+ this._task.setLevel(Constants.TASK_LEVEL_TASK);
341
+ this._pendingRecovery = RECOVERY_ACT_BEGIN_TABLE;
342
+ this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
343
+ }
344
+ break;
345
+ case ConstInterface.RECOVERY_RETRY:
346
+ this.RecoveryRetry(transBegin);
347
+ break;
348
+ }
349
+ if (stopExecution) {
350
+ AccessHelper.eventsManager.setStopExecution(true);
351
+ this.getTask().TaskSuffixExecuted = false;
352
+ }
353
+ }
354
+ }
355
+ }
356
+ else if (foundTagName === '/' + ConstInterface.MG_TAG_DATAVIEW) {
357
+ if (this._includesFirst && this._includesLast && this.isEmpty()) {
358
+ this._currRecId = Int32.MinValue;
359
+ this._currRecIdx = Int32.MinValue;
360
+ this.CurrRec = null;
361
+ this.setTopRecIdx(Int32.MinValue);
362
+ }
363
+ parser.setCurrIndex2EndOfTag();
364
+ return false;
365
+ }
366
+ else
367
+ return false;
368
+ return true;
369
+ }
370
+ RecoveryRetry(transBegin) {
371
+ if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
372
+ this._task.setLevel(Constants.TASK_LEVEL_RECORD);
373
+ this.getTask().setTransactionFailed(true);
374
+ this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
375
+ this.CurrRec.restart(this.CurrRec.getMode());
376
+ if (!this._firstDv) {
377
+ this.takeFldValsFromCurrRec();
378
+ this._pendingRecovery = RECOVERY_ACT_MOVE_DIRECTION_BEGIN;
379
+ }
380
+ }
381
+ else if (transBegin !== ConstInterface.TRANS_NONE) {
382
+ this._task.setLevel(Constants.TASK_LEVEL_TASK);
383
+ this._pendingRecovery = RECOVERY_ACT_BEGIN_SCREEN;
384
+ this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
385
+ this.getTask().setTransactionFailed(true);
386
+ }
387
+ }
388
+ UpdateDataviewAfterInsert() {
389
+ if (this._insertAt === 'B') {
390
+ let newRecs = this._recordsTab.InsertedRecordsCount;
391
+ if (this._currRecIdx !== Int32.MinValue)
392
+ this._currRecIdx += newRecs;
393
+ if (this._topRecIdx !== Int32.MinValue)
394
+ this._topRecIdx += newRecs;
395
+ if (this._oldTopRecIdx !== Int32.MinValue)
396
+ this._oldTopRecIdx += newRecs;
397
+ }
398
+ }
399
+ async getAttributes(parser) {
400
+ let tokensVector;
401
+ let tag;
402
+ let boolVal;
403
+ let dataViewCommand = null;
404
+ let isEmptyDataview = false;
405
+ this._recovery = ConstInterface.RECOVERY_NONE;
406
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
407
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
408
+ tag = parser.getXMLsubstring(endContext);
409
+ parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_DATAVIEW) + ConstInterface.MG_TAG_DATAVIEW.length);
410
+ tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
411
+ this._insertAt = ' ';
412
+ let invalidate = this.peekInvalidate(tokensVector);
413
+ this._locateFirstRec = 0;
414
+ for (let j = 0; j < tokensVector.length; j += 2) {
415
+ let attribute = (tokensVector.get_Item(j));
416
+ let valueStr = (tokensVector.get_Item(j + 1));
417
+ switch (attribute) {
418
+ case ConstInterface.MG_ATTR_INSERT_AT:
419
+ this._insertAt = valueStr[0];
420
+ break;
421
+ case ConstInterface.MG_ATTR_INCLUDE_FIRST:
422
+ boolVal = XmlParser.getBoolean(valueStr);
423
+ this.SetIncludesFirst(boolVal);
424
+ break;
425
+ case ConstInterface.MG_ATTR_INCLUDE_LAST:
426
+ boolVal = XmlParser.getBoolean(valueStr);
427
+ this.SetIncludesLast(boolVal);
428
+ break;
429
+ case ConstInterface.MG_ATTR_IS_ONEWAY_KEY:
430
+ boolVal = XmlParser.getBoolean(valueStr);
431
+ this.SetOneWayKey(boolVal);
432
+ break;
433
+ case ConstInterface.MG_ATTR_DBVIEWSIZE:
434
+ this.DBViewSize = XmlParser.getInt(valueStr);
435
+ break;
436
+ case ConstInterface.MG_ATTR_INVALIDATE:
437
+ {
438
+ }
439
+ break;
440
+ case ConstInterface.MG_ATTR_TOP_REC_ID:
441
+ this._topRecId = NNumber.Parse(valueStr);
442
+ break;
443
+ case ConstInterface.MG_ATTR_TASKMODE:
444
+ if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_NONE || invalidate)
445
+ this._task.setOriginalTaskMode(valueStr);
446
+ this._task.setProp(PropInterface.PROP_TYPE_TASK_MODE, valueStr);
447
+ break;
448
+ case ConstInterface.MG_ATTR_EMPTY_DATAVIEW:
449
+ isEmptyDataview = true;
450
+ break;
451
+ case XMLConstants.MG_ATTR_TASKID:
452
+ continue;
453
+ case ConstInterface.MG_ATTR_LOW_ID:
454
+ this._lastCreatedRecId = NNumber.Parse(valueStr);
455
+ break;
456
+ case ConstInterface.MG_ATTR_TRANS_STAT:
457
+ let transStat = valueStr[0];
458
+ switch (transStat) {
459
+ case TRANS_STAT_OPENED:
460
+ dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
461
+ await this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
462
+ break;
463
+ case TRANS_STAT_CLOSED:
464
+ dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), false);
465
+ await this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
466
+ this.getTask().setTransactionFailed(false);
467
+ break;
468
+ default:
469
+ break;
470
+ }
471
+ break;
472
+ case ConstInterface.MG_ATTR_RECOVERY:
473
+ if (this._task.IsTryingToStop)
474
+ this.getTask().setTryingToStop(false);
475
+ this.getTask().resetExecEndTask();
476
+ this._recovery = valueStr[0];
477
+ break;
478
+ case ConstInterface.MG_ATTR_DVPOS_VALUE:
479
+ this._dvPosValue = NNumber.Parse(valueStr);
480
+ break;
481
+ case ConstInterface.MG_ATTR_LOCATE_FIRST_ID:
482
+ this._locateFirstRec = NNumber.Parse(valueStr);
483
+ break;
484
+ case ConstInterface.MG_ATTR_OFFSET:
485
+ break;
486
+ case ConstInterface.MG_ATTR_USER_SORT:
487
+ let form = this._task.getForm();
488
+ form.clearTableColumnSortMark(XmlParser.getBoolean(valueStr));
489
+ break;
490
+ case ConstInterface.MG_ATTR_VAL_TOTAL_RECORDS_COUNT:
491
+ this.TotalRecordsCount = XmlParser.getInt(valueStr);
492
+ break;
493
+ case ConstInterface.MG_ATTR_VAL_RECORDS_BEFORE_CURRENT_VIEW:
494
+ this.RecordsBeforeCurrentView = XmlParser.getInt(valueStr);
495
+ break;
496
+ case ConstInterface.MG_ATTR_VAL_SERVER_TRANS_CACHE_EMPTY:
497
+ this._serverTransCacheEmpty = XmlParser.getBoolean(valueStr);
498
+ break;
499
+ default:
500
+ Logger.Instance.WriteExceptionToLogWithMsg('Unknown attribute for <' + ConstInterface.MG_TAG_DATAVIEW + '> tag: ' + attribute);
501
+ break;
502
+ }
503
+ }
504
+ this.setEmptyDataview(isEmptyDataview);
505
+ parser.setCurrIndex(++endContext);
506
+ return invalidate;
507
+ }
508
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getAttributes(): out of bounds');
509
+ return false;
510
+ }
511
+ SetOneWayKey(val) {
512
+ this.IsOneWayKey = val;
513
+ }
514
+ SetIncludesLast(val) {
515
+ this._includesLast = val;
516
+ }
517
+ SetIncludesFirst(val) {
518
+ let prevIncludeFirst = this._includesFirst;
519
+ this._includesFirst = val;
520
+ if (this._includesFirst !== prevIncludeFirst) {
521
+ let form = this._task.getForm();
522
+ if (form !== null) {
523
+ form.SetTableItemsCount(0, true);
524
+ }
525
+ }
526
+ }
527
+ fillDataDc(parser) {
528
+ let dcvBuilder = new XMLBasedDcValuesBuilder();
529
+ let foundTagName = parser.getNextTag();
530
+ while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_DC_VALS) {
531
+ let dcValsPosition = parser.getCurrIndex();
532
+ dcvBuilder.SerializedDCVals = parser.ReadToEndOfCurrentElement();
533
+ let dcv = dcvBuilder.Build();
534
+ if (dcv !== null)
535
+ this.AddDcValues(dcv);
536
+ else
537
+ Logger.Instance.WriteExceptionToLogWithMsg('Error while parsing DC values at position ' + dcValsPosition);
538
+ foundTagName = parser.getNextTag();
539
+ }
540
+ }
541
+ AddDcValues(dcv) {
542
+ this._dcValsCollection.Add(dcv.getId().toString(), dcv);
543
+ }
544
+ fillExecStack(parser) {
545
+ let foundTagName = parser.getNextTag();
546
+ let execStackTagExists = false;
547
+ while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_EXEC_STACK_ENTRY) {
548
+ this.fillInnerExecStack(parser);
549
+ foundTagName = parser.getNextTag();
550
+ execStackTagExists = true;
551
+ }
552
+ if (execStackTagExists) {
553
+ AccessHelper.eventsManager.reverseServerExecStack();
554
+ }
555
+ }
556
+ fillInnerExecStack(parser) {
557
+ let tokensVector;
558
+ const endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
559
+ let attribute;
560
+ let taskId = '';
561
+ let handlerId = '';
562
+ let operIdx = 0;
563
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
564
+ let tag = parser.getXMLsubstring(endContext);
565
+ parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_EXEC_STACK_ENTRY) + ConstInterface.MG_TAG_EXEC_STACK_ENTRY.length);
566
+ tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
567
+ for (let j = 0; j < tokensVector.length; j += 2) {
568
+ attribute = (tokensVector.get_Item(j));
569
+ let valueStr = (tokensVector.get_Item(j + 1));
570
+ switch (attribute) {
571
+ case XMLConstants.MG_ATTR_TASKID:
572
+ taskId = valueStr;
573
+ break;
574
+ case ConstInterface.MG_ATTR_HANDLERID:
575
+ handlerId = valueStr;
576
+ break;
577
+ case ConstInterface.MG_ATTR_OPER_IDX:
578
+ operIdx = XmlParser.getInt(valueStr);
579
+ break;
580
+ }
581
+ }
582
+ AccessHelper.eventsManager.pushServerExecStack(taskId, handlerId, operIdx);
583
+ parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
584
+ }
585
+ else
586
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fillInnerExecStack() out of bounds');
587
+ }
588
+ peekInvalidate(tokensVector) {
589
+ let sessionCounter = CommandsProcessorManager.GetCommandsProcessor().GetSessionCounter();
590
+ for (let j = 0; j < tokensVector.length; j += 2) {
591
+ let attribute = tokensVector.get_Item(j);
592
+ if (attribute === (ConstInterface.MG_ATTR_INVALIDATE)) {
593
+ let valueStr = tokensVector.get_Item(j + 1);
594
+ if (XmlParser.getBoolean(valueStr)) {
595
+ if (sessionCounter < this._lastSessionCounter)
596
+ this._skipParsing = true;
597
+ else {
598
+ this._lastSessionCounter = sessionCounter;
599
+ this.clear();
600
+ return true;
601
+ }
602
+ }
603
+ return false;
604
+ }
605
+ }
606
+ return false;
607
+ }
608
+ getFieldByName(fldName) {
609
+ if (this._fieldsTab !== null)
610
+ return this._fieldsTab.getField(fldName);
611
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getField(String): There is no fieldsTab object');
612
+ return null;
613
+ }
614
+ async buildXML(message) {
615
+ let dcv;
616
+ let taskTag = this._task.getTaskTag();
617
+ let brkLevelIndex = this._task.getBrkLevelIndex();
618
+ let currRecDeleted = false;
619
+ let serverParent;
620
+ let contextTask = (this.getTask().GetContextTask());
621
+ let invokingTaskTag = contextTask.IsOffline ? INVOKED_FROM_OFFLINE_TASK : contextTask.getTaskTag();
622
+ message.Append('\n <' + ConstInterface.MG_TAG_DATAVIEW + ' ' + XMLConstants.MG_ATTR_TASKID + '="' +
623
+ taskTag + '"');
624
+ message.Append(' ' + ConstInterface.MG_ATTR_TASKLEVEL + '="' + brkLevelIndex + '"');
625
+ serverParent = '0';
626
+ let triggeringTask = this.getTask().getTriggeringTask();
627
+ if (triggeringTask != null) {
628
+ if (triggeringTask.IsOffline) {
629
+ let ctlIdx = triggeringTask.getCtlIdx();
630
+ let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
631
+ serverParent = mainPrg.getTaskTag();
632
+ }
633
+ else
634
+ serverParent = triggeringTask.getTaskTag();
635
+ }
636
+ if (this._currRecId > Int32.MinValue) {
637
+ if (this.CurrRec != null)
638
+ message.Append(' ' + ConstInterface.MG_ATTR_CURR_REC + '="' + this._currRecId + '"');
639
+ message.Append(' ' + ConstInterface.MG_ATTR_TASKMODE + '="' + this._task.getMode() + '"');
640
+ if (this._transCleared && !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI)) {
641
+ message.Append(' ' + ConstInterface.MG_ATTR_TRANS_CLEARED + '="1"');
642
+ this._transCleared = false;
643
+ }
644
+ message.Append(' ' + ConstInterface.MG_ATTR_INVOKER_ID + '="' + invokingTaskTag + ',' + serverParent + '"');
645
+ if (await this.getTask().isCached())
646
+ message.Append(' ' + ConstInterface.MG_ATTR_DVPOS_VALUE + '="' + this._dvPosValue + '"');
647
+ message.Append(' ' + ConstInterface.MG_ATTR_LOOP_COUNTER + '="' + this.getTask().getLoopCounter() + '"');
648
+ if (this._task.IsSubForm) {
649
+ let subformCtrl = this._task.getForm().getSubFormCtrl();
650
+ if (!subformCtrl.isVisible() &&
651
+ !await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))
652
+ message.Append(' ' + ConstInterface.MG_ATTR_SUBFORM_VISIBLE + '="0"');
653
+ }
654
+ if (!this._task.IsInteractive)
655
+ message.Append(' ' + ConstInterface.MG_ATTR_TASK_COUNTER + '="' + this.getTask().getCounter() + '"');
656
+ if (this._task != null && this._task.GetComputedProperty(PropInterface.PROP_TYPE_PRELOAD_VIEW).GetComputedValueBoolean()) {
657
+ message.Append(' ' + ConstInterface.MG_ATTR_LAST_REC_ID + '="' +
658
+ (this._recordsTab.getRecByIdx(this.getSize() - 1).getId()) + '"');
659
+ message.Append(' ' + ConstInterface.MG_ATTR_OLD_FIRST_REC_ID + '="' +
660
+ this._recordsTab.getRecByIdx(0).getId() + '"');
661
+ }
662
+ if (this._task.IsInteractive) {
663
+ let form = this._task.getForm();
664
+ if (form != null && this._recordsTab.getSize() > 1) {
665
+ message.Append(' ' + ConstInterface.MG_ATTR_CURR_REC_POS_IN_FORM + '="' +
666
+ form.getCurrRecPosInForm() + '"');
667
+ }
668
+ }
669
+ message.Append(XMLConstants.TAG_CLOSE);
670
+ if (this.getTask().ResetRange || this.getTask().UserRngs != null) {
671
+ message.Append(XMLConstants.START_TAG + ConstInterface.USER_RANGES);
672
+ if (this.getTask().ResetRange) {
673
+ message.Append(' ' + ConstInterface.CLEAR_RANGE + '="1"');
674
+ this.getTask().ResetRange = false;
675
+ }
676
+ if (this.getTask().UserRngs != null) {
677
+ this.getTask().buildXMLForRngs(message, this.getTask().UserRngs, false);
678
+ this.getTask().UserRngs.Clear();
679
+ this.getTask().UserRngs = null;
680
+ }
681
+ else
682
+ message.Append(XMLConstants.TAG_TERM);
683
+ }
684
+ if (this.getTask().ResetLocate || this.getTask().UserLocs != null) {
685
+ message.Append(XMLConstants.START_TAG + ConstInterface.USER_LOCATES);
686
+ if (this.getTask().ResetLocate) {
687
+ message.Append(' ' + ConstInterface.CLEAR_LOCATES + '="1"');
688
+ this.getTask().ResetLocate = false;
689
+ }
690
+ if (this.getTask().UserLocs != null) {
691
+ this.getTask().buildXMLForRngs(message, this.getTask().UserLocs, true);
692
+ this.getTask().UserLocs.Clear();
693
+ this.getTask().UserLocs = null;
694
+ }
695
+ else
696
+ message.Append(XMLConstants.TAG_TERM);
697
+ }
698
+ if (this.getTask().ResetSort || this.getTask().UserSorts != null) {
699
+ message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_SORTS);
700
+ if (this.getTask().ResetSort) {
701
+ message.Append(' ' + ConstInterface.CLEAR_SORTS + '="1"');
702
+ this.getTask().ResetSort = false;
703
+ }
704
+ if (this.getTask().UserSorts != null)
705
+ this.getTask().buildXMLForSorts(message);
706
+ else
707
+ message.Append(XMLConstants.TAG_TERM);
708
+ }
709
+ if (await this.getTask().isCached()) {
710
+ let delList = this.getTask().getTaskCache().getDeletedListToXML();
711
+ if (delList !== '') {
712
+ message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DEL_LIST);
713
+ message.Append(' ' + XMLConstants.MG_ATTR_ID + '="' + this._task.getTaskTag() + '"');
714
+ message.Append(' ' + ConstInterface.MG_ATTR_REMOVE + '="' + delList + '"');
715
+ message.Append(XMLConstants.TAG_TERM);
716
+ if (this.getTask().getTaskCache().isDeleted(this._dvPosValue))
717
+ this.setChanged(true);
718
+ this.getTask().getTaskCache().clearDeletedList();
719
+ }
720
+ }
721
+ let dcValKeys = this._dcValsCollection.Keys;
722
+ dcValKeys.forEach((dcValKey) => {
723
+ dcv = this._dcValsCollection.get_Item(dcValKey);
724
+ if (!dcv.HasReferences) {
725
+ message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DC_VALS);
726
+ message.Append(' ' + XMLConstants.MG_ATTR_ID + '="' + dcv.getId() + '"');
727
+ message.Append(' ' + ConstInterface.MG_ATTR_REMOVE + '="1"');
728
+ message.Append(XMLConstants.TAG_TERM);
729
+ this._dcValsCollection.Remove(dcValKey);
730
+ }
731
+ });
732
+ if (this.CurrRec != null)
733
+ currRecDeleted = (this.CurrRec.getMode() === DataModificationTypes.Delete
734
+ && this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null && this.CurrRec.SendToServer);
735
+ let skipCurrRec = false;
736
+ if (this.CurrRec != null && this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null)
737
+ skipCurrRec = AccessHelper.eventsManager.isForceExitPreRecordUpdate(this.getTask());
738
+ this._modifiedRecordsTab.buildXML(message, skipCurrRec, this.CurrRec.getId());
739
+ if (this._original != null)
740
+ this._original.clearMode();
741
+ for (let i = this._modifiedRecordsTab.getSize() - 1; i >= 0; i--) {
742
+ if (skipCurrRec && this._modifiedRecordsTab.getRecByIdx(i).getId() === this.CurrRec.getId())
743
+ continue;
744
+ this._modifiedRecordsTab.getRecByIdx(i).clearFlagsHistory();
745
+ this._modifiedRecordsTab.removeRecord(i);
746
+ }
747
+ if (this.CurrRec != null && !currRecDeleted) {
748
+ let forceBuild = (this._task.isMainProg() && (RemoteCommandsProcessor.IsSessionReInitializing));
749
+ this.CurrRec.buildXML(message, true, forceBuild);
750
+ }
751
+ }
752
+ else {
753
+ message.Append(' ' + ConstInterface.MG_ATTR_INVOKER_ID + '="' + invokingTaskTag + ',' + serverParent + '"' +
754
+ XMLConstants.TAG_CLOSE);
755
+ }
756
+ message.Append('\n </' + ConstInterface.MG_TAG_DATAVIEW + XMLConstants.TAG_CLOSE);
757
+ }
758
+ getCurrRec() {
759
+ if (this.CurrRec === null && this._currRecId > Int32.MinValue) {
760
+ Logger.Instance.WriteExceptionToLogWithMsg('DataView.getCurrRec(): record ' + this._currRecId + ' not found');
761
+ }
762
+ return this.CurrRec;
763
+ }
764
+ getPrevCurrRec() {
765
+ return this._prevCurrRec;
766
+ }
767
+ getOriginalRec() {
768
+ if (this._original === null || this._original.getId() !== this.CurrRec.getId())
769
+ return this.CurrRec;
770
+ return this._original;
771
+ }
772
+ async setCurrRec(id, compute) {
773
+ let oldRecId = this._currRecId;
774
+ if (id > Int32.MinValue) {
775
+ let newIdx = this._recordsTab.getRecIdx(id);
776
+ if (newIdx === -1)
777
+ this._original = null;
778
+ else {
779
+ try {
780
+ let ignoreCurrRec = this._currRecId === Int32.MinValue;
781
+ await this.setCurrRecByIdx(newIdx, !ignoreCurrRec, ignoreCurrRec, compute, Int32.MinValue);
782
+ if (id !== oldRecId)
783
+ this.saveOriginal();
784
+ return true;
785
+ }
786
+ catch (exception) {
787
+ if (exception instanceof RecordOutOfDataViewException) {
788
+ }
789
+ else
790
+ throw exception;
791
+ }
792
+ }
793
+ }
794
+ else {
795
+ this.CurrRec = null;
796
+ this._original = null;
797
+ this._currRecId = Int32.MinValue;
798
+ }
799
+ return false;
800
+ }
801
+ async setCurrRecByIdx(newIdx, doSuffix, ignoreCurrRec, compute, newDisplayLine) {
802
+ let lastRecIdx = this._recordsTab.getSize() - 1;
803
+ let oldFirstRec, nextRec;
804
+ let recordSuff = false;
805
+ if (newIdx === Constants.MG_DATAVIEW_FIRST_RECORD) {
806
+ if (this.getTask().isTableWithAbsolutesScrollbar()) {
807
+ this.RecordsBeforeCurrentView = 0;
808
+ }
809
+ if (this._includesFirst) {
810
+ if (this._currRecIdx >= 0 || this._currRecIdx === Int32.MinValue) {
811
+ newIdx = 0;
812
+ recordSuff = true;
813
+ }
814
+ else
815
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
816
+ }
817
+ else {
818
+ await this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
819
+ await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
820
+ return;
821
+ }
822
+ }
823
+ else if (newIdx === Constants.MG_DATAVIEW_LAST_RECORD) {
824
+ if (this._includesLast) {
825
+ if (this._currRecIdx <= lastRecIdx) {
826
+ newIdx = lastRecIdx;
827
+ recordSuff = true;
828
+ }
829
+ else
830
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
831
+ }
832
+ else {
833
+ if (this.getTask().isTableWithAbsolutesScrollbar())
834
+ this.RecordsBeforeCurrentView = this.TotalRecordsCount;
835
+ await this.fetchChunkFromServer(CHUNK_DV_BOTTOM, doSuffix);
836
+ if (!this._includesLast)
837
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
838
+ let form = this._task.getForm();
839
+ if (form != null) {
840
+ while (!this._includesFirst && form.getRowsInPage() >= this.getSize()) {
841
+ await this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
842
+ }
843
+ }
844
+ await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
845
+ return;
846
+ }
847
+ }
848
+ else if (newIdx < 0) {
849
+ if (this._includesFirst)
850
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
851
+ oldFirstRec = this._recordsTab.getRecByIdx(0);
852
+ if (this._recordsTab.getSize() > 0 || this.IncludesLast())
853
+ await this.fetchChunkFromServer(CHUNK_CACHE_PREV, doSuffix);
854
+ else if (this._recordsTab.getSize() === 0 && this.IncludesFirst())
855
+ await this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
856
+ else
857
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fetchChunkFromServer() wrong option');
858
+ let oldFirstNewIdx = oldFirstRec != null
859
+ ? this._recordsTab.getRecIdx(oldFirstRec.getId())
860
+ : this._recordsTab.getSize();
861
+ if (oldFirstNewIdx !== 0)
862
+ await this.setCurrRecByIdx(oldFirstNewIdx + newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
863
+ return;
864
+ }
865
+ else if (newIdx > lastRecIdx) {
866
+ if (this._includesLast)
867
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
868
+ if (this.getForm().isRowCreated(newIdx))
869
+ this.getForm().markRowNOTCreated(newIdx);
870
+ await this.fetchChunkFromServer(CHUNK_CACHE_NEXT, doSuffix);
871
+ await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
872
+ return;
873
+ }
874
+ let isCreateLineAboveAct = false;
875
+ let lastEvent = isNullOrUndefined(AccessHelper.eventsManager.getLastRtEvent()) ? 0 :
876
+ AccessHelper.eventsManager.getLastRtEvent().getInternalCode();
877
+ if (newIdx >= 0 && !this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) &&
878
+ lastEvent === InternalInterface.MG_ACT_CRELINE_ABOVE) {
879
+ if ((this.getTask().getInCreateLine()) && newIdx == this._currRecIdx) {
880
+ let newRec = this._recordsTab.getRecByIdx(newIdx);
881
+ if (newRec.getMode() == DataModificationTypes.Insert)
882
+ isCreateLineAboveAct = true;
883
+ }
884
+ }
885
+ if (recordSuff || isCreateLineAboveAct || newIdx !== this._currRecIdx || ignoreCurrRec && compute) {
886
+ if (!ignoreCurrRec && doSuffix && this.CurrRec != null) {
887
+ let oldRecTabSize = this._recordsTab.getSize();
888
+ nextRec = this._recordsTab.getRecByIdx(newIdx);
889
+ if (nextRec.isNewRec()) {
890
+ if (this._task.getMode() !== Constants.TASK_MODE_CREATE &&
891
+ !await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true))
892
+ AccessHelper.eventsManager.setStopExecution(true);
893
+ }
894
+ if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
895
+ let orgTopRecIdx = 0;
896
+ if (this._topRecIdxModified) {
897
+ orgTopRecIdx = this.getTopRecIdx();
898
+ this.restoreTopRecIdx();
899
+ }
900
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
901
+ if (this._topRecIdxModified)
902
+ this.setTopRecIdx(orgTopRecIdx);
903
+ }
904
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
905
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
906
+ if (nextRec !== this.CurrRec && this.getTask().getAfterRetry())
907
+ this._task.setLevel(Constants.TASK_LEVEL_TASK);
908
+ if (oldRecTabSize - 1 === this._recordsTab.getSize() && this._currRecIdx < newIdx)
909
+ newIdx--;
910
+ if (newIdx === this._currRecIdx) {
911
+ if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
912
+ !this._task.getForm().inRefreshDisplay())
913
+ this._task.setMode(Constants.TASK_MODE_MODIFY);
914
+ return;
915
+ }
916
+ }
917
+ this.CurrRec = this._recordsTab.getRecByIdx(newIdx);
918
+ if (this.CurrRec == null)
919
+ throw new ApplicationException('in DataView.setCurrRecByIdx() current record not found!');
920
+ this._currRecId = this.CurrRec.getId();
921
+ this._currRecIdx = newIdx;
922
+ if (this._task.getForm() != null) {
923
+ if (newDisplayLine === SET_DISPLAYLINE_BY_DV) {
924
+ (this._task.getForm()).updateDisplayLineByDV();
925
+ }
926
+ else
927
+ this._task.getForm().DisplayLine = newDisplayLine;
928
+ }
929
+ if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
930
+ !this._task.getForm().inRefreshDisplay())
931
+ this._task.setMode(Constants.TASK_MODE_MODIFY);
932
+ if (compute)
933
+ await this.currRecCompute(false);
934
+ }
935
+ }
936
+ async currRecCompute(forceClientCompute) {
937
+ this._fieldsTab.invalidate(false, true);
938
+ await this.compute(false, forceClientCompute);
939
+ }
940
+ saveOriginal() {
941
+ if (!this.CurrRec.Modified)
942
+ this._original = this.CurrRec.replicate();
943
+ }
944
+ async fetchChunkFromServer(chunkId, doSuffix) {
945
+ this._task.getForm().FormRefreshed = true;
946
+ if (doSuffix && this.CurrRec != null) {
947
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
948
+ if (AccessHelper.eventsManager.GetStopExecutionFlag() || this._task.isAborting())
949
+ throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
950
+ this._task.getForm().setSuffixDone();
951
+ }
952
+ let eventCode;
953
+ let clientRecId = this._currRecId;
954
+ switch (chunkId) {
955
+ case CHUNK_DV_TOP:
956
+ eventCode = InternalInterface.MG_ACT_DATAVIEW_TOP;
957
+ break;
958
+ case CHUNK_DV_BOTTOM:
959
+ eventCode = InternalInterface.MG_ACT_DATAVIEW_BOTTOM;
960
+ break;
961
+ case CHUNK_CACHE_PREV:
962
+ clientRecId = this.FirstRecord == null ? 0 : this.FirstRecord.getId();
963
+ eventCode = InternalInterface.MG_ACT_CACHE_PREV;
964
+ break;
965
+ case CHUNK_CACHE_NEXT:
966
+ eventCode = InternalInterface.MG_ACT_CACHE_NEXT;
967
+ clientRecId = this.LastRecord == null ? 0 : this.LastRecord.getId();
968
+ break;
969
+ default:
970
+ Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fetchChunkFromServer() unknown chunk id: ' + chunkId);
971
+ return;
972
+ }
973
+ let cmd = CommandFactory.CreateEventCommand(this._task.getTaskTag(), eventCode);
974
+ cmd.ClientRecId = clientRecId;
975
+ await this.getTask().DataviewManager.Execute(cmd);
976
+ }
977
+ async FetchRecordsAheadFromServer() {
978
+ if (!this._includesLast)
979
+ await this.fetchChunkFromServer(CHUNK_CACHE_NEXT, false);
980
+ else if (!this._includesFirst)
981
+ await this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
982
+ }
983
+ recExists(recIdx) {
984
+ let lastRecIdx = this._recordsTab.getSize() - 1;
985
+ return recIdx >= 0 && recIdx <= lastRecIdx;
986
+ }
987
+ checkFirst(locateFirst) {
988
+ return this._recordsTab.getRecord(locateFirst) !== null;
989
+ }
990
+ getCurrRecIdx() {
991
+ if (this._currRecIdx === Int32.MinValue) {
992
+ if (!this.setCurrRec(this._currRecId, true)) {
993
+ Logger.Instance.WriteWarningToLogWithMsg('DataView.getCurrRecIdx(): _task ' +
994
+ (this.getTask()).PreviouslyActiveTaskId +
995
+ ', record ' + this._currRecId + ' not found');
996
+ }
997
+ }
998
+ return this._currRecIdx;
999
+ }
1000
+ getCurrDBViewRowIdx() {
1001
+ return this.CurrRec.getDBViewRowIdx();
1002
+ }
1003
+ setTopRecIdx(newTopRecIdx) {
1004
+ this._oldTopRecIdx = this.getTopRecIdx();
1005
+ this._topRecIdx = newTopRecIdx;
1006
+ }
1007
+ getTopRecIdx() {
1008
+ return this._topRecIdx;
1009
+ }
1010
+ setTopRecIdxModified(val) {
1011
+ this._topRecIdxModified = val;
1012
+ }
1013
+ getChunkSize() {
1014
+ return this._chunkSize;
1015
+ }
1016
+ restoreTopRecIdx() {
1017
+ this._topRecIdx = this._oldTopRecIdx;
1018
+ }
1019
+ clear() {
1020
+ this._recordsTab.removeAll();
1021
+ this._original = null;
1022
+ let mgForm = this._task.getForm();
1023
+ if (mgForm !== null) {
1024
+ this._task.getForm().SetTableItemsCount(0, true);
1025
+ }
1026
+ this._modifiedRecordsTab.removeAll();
1027
+ this.init();
1028
+ }
1029
+ init() {
1030
+ this._currRecId = Int32.MinValue;
1031
+ this._currRecIdx = Int32.MinValue;
1032
+ this.CurrRec = null;
1033
+ this._prevCurrRec = null;
1034
+ this._includesFirst = false;
1035
+ this._includesLast = false;
1036
+ this.IsOneWayKey = false;
1037
+ this.setTopRecIdx(Int32.MinValue);
1038
+ this._fieldsTab.invalidate(false, true);
1039
+ }
1040
+ async computeSubForms() {
1041
+ if (await this.getTask().prepareCache(true)) {
1042
+ if (!await this.getTask().testAndSet(true))
1043
+ await this.compute(true, false);
1044
+ }
1045
+ else
1046
+ await this.compute(true, false);
1047
+ }
1048
+ async compute(subForms, forceClientCompute) {
1049
+ let tmpRec = null;
1050
+ let computeByServer = !this.computeByClient();
1051
+ let orgComputeBy = this._computeBy;
1052
+ if (forceClientCompute)
1053
+ this._computeBy = COMPUTE_NEWREC_ON_CLIENT;
1054
+ try {
1055
+ this.CurrRec.setInCompute(true);
1056
+ if (!subForms) {
1057
+ if (this.CurrRec.isNewRec()) {
1058
+ if (this._task.getMode() !== Constants.TASK_MODE_CREATE && !super.isEmptyDataview()) {
1059
+ this._task.setMode(Constants.TASK_MODE_CREATE);
1060
+ }
1061
+ }
1062
+ else if (this._task.getMode() === Constants.TASK_MODE_CREATE) {
1063
+ this._task.setMode(Constants.TASK_MODE_MODIFY);
1064
+ }
1065
+ }
1066
+ let getRecordData = computeByServer;
1067
+ if (subForms || (getRecordData && !this.CurrRec.isComputed() && !forceClientCompute)) {
1068
+ let command = CommandFactory.CreateComputeEventCommand(this._task.getTaskTag(), subForms, this._currRecId);
1069
+ await this._task.DataviewManager.Execute(command);
1070
+ }
1071
+ else {
1072
+ if (getRecordData) {
1073
+ tmpRec = new Record(this.CurrRec.getId(), this);
1074
+ tmpRec.Initialize();
1075
+ tmpRec.setInitialFldVals(true, true);
1076
+ }
1077
+ this._fieldsTab.setServerRcmp(false);
1078
+ let from = this._fieldsTab.getRMIdx();
1079
+ let size = this._fieldsTab.getRMSize();
1080
+ for (let i = from; i < from + size; i = i + 1) {
1081
+ let fld = this._fieldsTab.getField(i);
1082
+ if (getRecordData && this._fieldsTab.serverRcmpDone() && fld.IsVirtual && !fld.VirAsReal && !fld.hasInitExp()) {
1083
+ let currRec2 = this.CurrRec;
1084
+ this.CurrRec = tmpRec;
1085
+ try {
1086
+ fld.takeValFromRec();
1087
+ }
1088
+ finally {
1089
+ this.CurrRec = currRec2;
1090
+ }
1091
+ }
1092
+ if (!this._task.getForm().TransferringDataToGUI)
1093
+ await fld.compute(false);
1094
+ }
1095
+ }
1096
+ }
1097
+ finally {
1098
+ this.CurrRec.setInCompute(false);
1099
+ this.CurrRec.setLateCompute(false);
1100
+ this._computeBy = orgComputeBy;
1101
+ }
1102
+ }
1103
+ async addRecord(doSuffix, ignoreCurrRec, isCrelineAbove) {
1104
+ let newCurrRecId = (--this._lastCreatedRecId);
1105
+ let mode = DataModificationTypes.Insert;
1106
+ return await this.addRecord_1(doSuffix, ignoreCurrRec, false, newCurrRecId, mode, isCrelineAbove);
1107
+ }
1108
+ async addRecord_1(doSuffix, ignoreCurrRec, isFirstRecord, newCurrRecId, mode, isCrelineAbove) {
1109
+ let rec = new Record(newCurrRecId, this);
1110
+ rec.Initialize();
1111
+ rec.setInitialFldVals(false, !isFirstRecord);
1112
+ let newCurrRecIdx = 0;
1113
+ if (isCrelineAbove) {
1114
+ newCurrRecIdx = (this._currRecIdx >= 0
1115
+ ? this._currRecIdx
1116
+ : 0);
1117
+ }
1118
+ else
1119
+ newCurrRecIdx = (this._currRecIdx != Int32.MinValue
1120
+ ? this._currRecIdx + 1
1121
+ : 0);
1122
+ this._recordsTab.insertRecord(rec, newCurrRecIdx);
1123
+ rec.setMode(mode);
1124
+ try {
1125
+ let compute = !isFirstRecord;
1126
+ await this.setCurrRecByIdx(newCurrRecIdx, doSuffix, ignoreCurrRec, compute, Int32.MinValue);
1127
+ if (isFirstRecord && this.getTask().getMode() !== Constants.TASK_MODE_CREATE)
1128
+ rec.setOldRec();
1129
+ }
1130
+ catch (execption) {
1131
+ if (execption instanceof RecordOutOfDataViewException) {
1132
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
1133
+ newCurrRecIdx = -1;
1134
+ else
1135
+ throw new ApplicationException('in DataView.addRecord() invalid exception');
1136
+ }
1137
+ else
1138
+ throw execption;
1139
+ }
1140
+ return newCurrRecIdx;
1141
+ }
1142
+ async removeCurrRec() {
1143
+ let mgForm = this._task.getForm();
1144
+ let onDelete;
1145
+ if (this.CurrRec.getMode() === DataModificationTypes.Insert &&
1146
+ !this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
1147
+ this._modifiedRecordsTab.removeRecord(this.CurrRec);
1148
+ onDelete = false;
1149
+ }
1150
+ else {
1151
+ this.CurrRec.clearMode();
1152
+ this.CurrRec.setMode(DataModificationTypes.Delete);
1153
+ onDelete = true;
1154
+ }
1155
+ this.CurrRec.removeRecFromDc();
1156
+ this._recordsTab.removeRecord(this._currRecIdx);
1157
+ this.setChanged(true);
1158
+ if (this.isEmpty() && !this._task.IsTryingToStop) {
1159
+ await this.MoveToEmptyDataviewIfAllowed();
1160
+ }
1161
+ let newDisplayLine = this.calcLineToMove(onDelete);
1162
+ try {
1163
+ if (mgForm.isScreenMode()) {
1164
+ await this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
1165
+ }
1166
+ else {
1167
+ await mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
1168
+ }
1169
+ }
1170
+ catch (exception) {
1171
+ if (exception instanceof RecordOutOfDataViewException) {
1172
+ try {
1173
+ if (!super.isEmptyDataview())
1174
+ newDisplayLine = mgForm.getPrevLine(newDisplayLine);
1175
+ if (mgForm.isScreenMode())
1176
+ await this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
1177
+ else
1178
+ await mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
1179
+ }
1180
+ catch (exception) {
1181
+ if (exception instanceof RecordOutOfDataViewException) {
1182
+ this.reset();
1183
+ }
1184
+ else
1185
+ throw exception;
1186
+ }
1187
+ }
1188
+ else
1189
+ throw exception;
1190
+ }
1191
+ }
1192
+ RemoveRecord(record) {
1193
+ let recIdx = this._recordsTab.getRecIdx(record.getId());
1194
+ if (this._topRecIdx > recIdx)
1195
+ this._topRecIdx--;
1196
+ if (this._oldTopRecIdx > recIdx)
1197
+ this._oldTopRecIdx--;
1198
+ if (this._currRecIdx > recIdx)
1199
+ this._currRecIdx--;
1200
+ this._recordsTab.removeRecord(record);
1201
+ }
1202
+ async MoveToEmptyDataviewIfAllowed() {
1203
+ if (!super.isEmptyDataview() && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
1204
+ if (await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true))
1205
+ super.setEmptyDataview(true);
1206
+ }
1207
+ else {
1208
+ if (this._task.getMode() === Constants.TASK_MODE_CREATE && super.isEmptyDataview())
1209
+ super.setEmptyDataview(false);
1210
+ }
1211
+ }
1212
+ calcLineToMove(onDelete) {
1213
+ let newDisplayLine;
1214
+ if (onDelete)
1215
+ newDisplayLine = this._currRecIdx;
1216
+ else {
1217
+ if (this._currRecIdx > 0)
1218
+ newDisplayLine = this._currRecIdx - 1;
1219
+ else
1220
+ newDisplayLine = this._currRecIdx;
1221
+ }
1222
+ return newDisplayLine;
1223
+ }
1224
+ reset() {
1225
+ this._currRecId = Int32.MinValue;
1226
+ this._currRecIdx = Int32.MinValue;
1227
+ this.CurrRec = null;
1228
+ this.setTopRecIdx(Int32.MinValue);
1229
+ this.SetIncludesFirst(true);
1230
+ this.SetIncludesLast(true);
1231
+ }
1232
+ async cancelEdit(onlyReal, recomputeUnknowns) {
1233
+ let tempCurrRec = null;
1234
+ let recRemoved = false;
1235
+ let inEndTask = this._task.InEndTask;
1236
+ if (inEndTask)
1237
+ onlyReal = true;
1238
+ if (this.CurrRec.getMode() === DataModificationTypes.Insert && this.CurrRec.isNewRec()) {
1239
+ if ((this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 1)) || !this.HasMainTable) {
1240
+ if (this._original !== null) {
1241
+ this.CurrRec.setSameAs(this._original, onlyReal);
1242
+ }
1243
+ }
1244
+ else {
1245
+ await this.removeCurrRec();
1246
+ recRemoved = true;
1247
+ this._original = this.CurrRec.replicate();
1248
+ }
1249
+ }
1250
+ else {
1251
+ if (!this.CurrRec.Modified) {
1252
+ let currCtrl = this._task.getLastParkedCtrl();
1253
+ if (currCtrl !== null)
1254
+ currCtrl.resetPrevVal();
1255
+ }
1256
+ if (recomputeUnknowns)
1257
+ tempCurrRec = this.CurrRec.replicate();
1258
+ if (this._original !== null)
1259
+ this.CurrRec.setSameAs(this._original, onlyReal);
1260
+ if ((this._original !== null && recomputeUnknowns) && !this.CurrRec.isSameRecData(tempCurrRec, false, false))
1261
+ await this.execUnknownRcmps(this._original);
1262
+ this.takeFldValsFromCurrRec();
1263
+ this._original = this.CurrRec.replicate();
1264
+ }
1265
+ return recRemoved;
1266
+ }
1267
+ isEmpty() {
1268
+ return this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 0);
1269
+ }
1270
+ async addCurrToModified(setRecToOld) {
1271
+ if (isNullOrUndefined(setRecToOld)) {
1272
+ await this.addCurrToModified_0();
1273
+ return;
1274
+ }
1275
+ await this.addCurrToModified_1(setRecToOld);
1276
+ }
1277
+ async addCurrToModified_0() {
1278
+ await this.addCurrToModified(true);
1279
+ }
1280
+ async addCurrToModified_1(setRecToOld) {
1281
+ this._modifiedRecordsTab.addRecord(this.CurrRec);
1282
+ if (setRecToOld) {
1283
+ this.CurrRec.setOldRec();
1284
+ }
1285
+ let command = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
1286
+ await this.getTask().DataviewManager.RemoteDataviewManager.Execute(command);
1287
+ }
1288
+ takeFldValsFromCurrRec() {
1289
+ this._fieldsTab.takeValsFromRec();
1290
+ }
1291
+ currEqualsPrev(fldList) {
1292
+ if (this.CurrRec !== null && this._prevCurrRec !== null) {
1293
+ if (this.CurrRec === this._prevCurrRec)
1294
+ return true;
1295
+ for (let i = 0; i < fldList.length; i = i + 1) {
1296
+ if (!this.CurrRec.fldValsEqual(this._prevCurrRec, fldList[i]))
1297
+ return false;
1298
+ }
1299
+ }
1300
+ else if (this.CurrRec !== this._prevCurrRec)
1301
+ return false;
1302
+ return true;
1303
+ }
1304
+ getTask() {
1305
+ Debug.Assert(this._task instanceof TaskBase);
1306
+ return this._task;
1307
+ }
1308
+ getForm() {
1309
+ return this._task.getForm();
1310
+ }
1311
+ modifiedRecordsNumber() {
1312
+ return this._modifiedRecordsTab.getSize();
1313
+ }
1314
+ getSize() {
1315
+ return this._recordsTab.getSize();
1316
+ }
1317
+ computeByClient() {
1318
+ return this._computeBy === COMPUTE_NEWREC_ON_CLIENT;
1319
+ }
1320
+ recExistsById(id) {
1321
+ return this._recordsTab.getRecord(id) !== null;
1322
+ }
1323
+ ParametersExist(iPos, iLen) {
1324
+ if (arguments.length === 2)
1325
+ return this.ParametersExist_0(iPos, iLen);
1326
+ return this.ParametersExist_1();
1327
+ }
1328
+ ParametersExist_0(iPos, iLen) {
1329
+ for (let i = iPos; i < iPos + iLen; i = i + 1) {
1330
+ if (super.getField(i).isParam())
1331
+ return true;
1332
+ }
1333
+ return false;
1334
+ }
1335
+ ParametersExist_1() {
1336
+ return this.ParametersExist(this._rmIdx, this._rmSize);
1337
+ }
1338
+ recInModifiedTab(id) {
1339
+ let record = this._modifiedRecordsTab.getRecord(id);
1340
+ return record !== null;
1341
+ }
1342
+ setPrevCurrRec(rec) {
1343
+ if (arguments.length === 0) {
1344
+ this.setPrevCurrRec_0();
1345
+ return;
1346
+ }
1347
+ this.setPrevCurrRec_1(rec);
1348
+ }
1349
+ setPrevCurrRec_0() {
1350
+ this._prevCurrRec = this.CurrRec;
1351
+ }
1352
+ setPrevCurrRec_1(rec) {
1353
+ this._prevCurrRec = rec;
1354
+ }
1355
+ isPrevCurrRecNull() {
1356
+ return this._prevCurrRec === null;
1357
+ }
1358
+ async execUnknownRcmps(orgRec) {
1359
+ let i;
1360
+ let from = this._fieldsTab.getRMIdx();
1361
+ let size = this._fieldsTab.getRMSize();
1362
+ let rec = this.getCurrRec();
1363
+ if (this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED) {
1364
+ for (i = from; i < from + size && this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED; i++) {
1365
+ let field = this._fieldsTab.getField(i);
1366
+ if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp())
1367
+ this._unknownRcmp = UNKNOWN_RCMPS_FOUND;
1368
+ }
1369
+ }
1370
+ if (this._unknownRcmp === UNKNOWN_RCMPS_FOUND && rec !== null) {
1371
+ for (i = from; i < from + size; i = i + 1) {
1372
+ let field = this._fieldsTab.getField(i);
1373
+ if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp() && !rec.fldValsEqual(orgRec, i)) {
1374
+ let fieldValue = rec.GetFieldValue(i);
1375
+ let isNullFld = rec.IsNull(i);
1376
+ rec.setFieldValue(i, orgRec.GetFieldValue(i), false);
1377
+ await field.setValueAndStartRecompute(fieldValue, isNullFld, false, false, false);
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+ setTransCleared() {
1383
+ this._transCleared = true;
1384
+ }
1385
+ async processRecovery() {
1386
+ if (!this._task.isAborting()) {
1387
+ let orgAction = this._pendingRecovery;
1388
+ let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
1389
+ this._pendingRecovery = RECOVERY_ACT_NONE;
1390
+ if (orgStopExecution)
1391
+ AccessHelper.eventsManager.setStopExecution(false);
1392
+ let temporaryResetInCtrlPrefix = this._task.InCtrlPrefix;
1393
+ if (temporaryResetInCtrlPrefix)
1394
+ this._task.InCtrlPrefix = false;
1395
+ switch (orgAction) {
1396
+ case RECOVERY_ACT_CANCEL:
1397
+ (this._task.DataView.getCurrRec()).resetUpdated();
1398
+ this.getTask().getTaskCache().clearCache();
1399
+ if (this.getSize() === 1 && this._task.getMode() === Constants.TASK_MODE_CREATE) {
1400
+ this.CurrRec.resetModified();
1401
+ this.CurrRec.clearMode();
1402
+ this.CurrRec.setMode(DataModificationTypes.Insert);
1403
+ this.CurrRec.setNewRec();
1404
+ this._original.setSameAs(this.CurrRec, false);
1405
+ }
1406
+ await AccessHelper.eventsManager.handleInternalEventWithTaskAndEventSubtype(this.getTask(), InternalInterface.MG_ACT_CANCEL, EventSubType.CancelWithNoRollback);
1407
+ break;
1408
+ case RECOVERY_ACT_MOVE_DIRECTION_BEGIN:
1409
+ let lastParkedControl = this._task.getLastParkedCtrl();
1410
+ if (lastParkedControl !== null)
1411
+ await lastParkedControl.invoke();
1412
+ break;
1413
+ case RECOVERY_ACT_BEGIN_SCREEN:
1414
+ this.getTask().setPreventRecordSuffix(true);
1415
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGPAGE);
1416
+ this.getTask().setPreventRecordSuffix(false);
1417
+ break;
1418
+ case RECOVERY_ACT_BEGIN_TABLE:
1419
+ this._task.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1420
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGTBL);
1421
+ this.getTask().getTaskCache().clearCache();
1422
+ break;
1423
+ default:
1424
+ AccessHelper.eventsManager.setStopExecution(orgStopExecution);
1425
+ break;
1426
+ }
1427
+ if (temporaryResetInCtrlPrefix)
1428
+ this._task.InCtrlPrefix = true;
1429
+ if (orgAction !== RECOVERY_ACT_NONE)
1430
+ AccessHelper.eventsManager.setStopExecution(true, orgAction !== RECOVERY_ACT_BEGIN_TABLE ? ClearEventsOnStopExecution.ALL : ClearEventsOnStopExecution.SERVER);
1431
+ }
1432
+ }
1433
+ replicate() {
1434
+ let rep = new DataView(this);
1435
+ rep._recordsTab = this._recordsTab.replicate();
1436
+ rep._currRecId = rep._recordsTab.getRecByIdx(0).getId();
1437
+ rep._currRecIdx = 0;
1438
+ rep.CurrRec = rep._recordsTab.getRecByIdx(0);
1439
+ rep._prevCurrRec = rep._recordsTab.getRecByIdx(0);
1440
+ rep._original = rep._recordsTab.getRecByIdx(0);
1441
+ rep.setTopRecIdx(Int32.MinValue);
1442
+ return rep;
1443
+ }
1444
+ getDvPosValue() {
1445
+ return this._dvPosValue;
1446
+ }
1447
+ getFirstDv() {
1448
+ return this._firstDv;
1449
+ }
1450
+ ResetFirstDv() {
1451
+ this._firstDv = false;
1452
+ }
1453
+ getCacheLRU() {
1454
+ return this._cacheLruTimeStamp;
1455
+ }
1456
+ setCacheLRU() {
1457
+ this._cacheLruTimeStamp = Misc.getSystemMilliseconds();
1458
+ }
1459
+ async setSameAs(newDv) {
1460
+ this._rmSize = newDv._rmSize;
1461
+ this._rmIdx = newDv._rmIdx;
1462
+ this._computeBy = newDv._computeBy;
1463
+ this._flushUpdates = newDv._flushUpdates;
1464
+ this._currRecId = newDv._currRecId;
1465
+ this._currRecIdx = newDv._currRecIdx;
1466
+ this._topRecId = newDv._topRecId;
1467
+ this.CurrRec = newDv.CurrRec;
1468
+ this._original = newDv._original;
1469
+ this._prevCurrRec = null;
1470
+ this._fieldsTab = newDv._fieldsTab;
1471
+ this._recordsTab = newDv._recordsTab;
1472
+ this._modifiedRecordsTab = newDv._modifiedRecordsTab;
1473
+ this._includesFirst = newDv._includesFirst;
1474
+ this._includesLast = newDv._includesLast;
1475
+ this._insertAt = newDv._insertAt;
1476
+ this._lastCreatedRecId = newDv._lastCreatedRecId;
1477
+ this._task = newDv._task;
1478
+ this._dcValsCollection = newDv._dcValsCollection;
1479
+ this._recovery = newDv._recovery;
1480
+ this._pendingRecovery = newDv._pendingRecovery;
1481
+ this._hasMainTable = newDv._hasMainTable;
1482
+ this._chunkSize = newDv._chunkSize;
1483
+ this._firstDv = newDv._firstDv;
1484
+ this._lastSessionCounter = newDv._lastSessionCounter;
1485
+ this._skipParsing = newDv._skipParsing;
1486
+ this._unknownRcmp = newDv._unknownRcmp;
1487
+ this._transCleared = newDv._transCleared;
1488
+ this._dvPosValue = newDv._dvPosValue;
1489
+ this._cacheLruTimeStamp = newDv._cacheLruTimeStamp;
1490
+ this._changed = newDv._changed;
1491
+ this._locateFirstRec = newDv._locateFirstRec;
1492
+ super.setEmptyDataview(newDv.isEmptyDataview());
1493
+ this._task.setMode(newDv.taskModeFromCache);
1494
+ try {
1495
+ if (this.getTask().HasLoacte()) {
1496
+ await this.setCurrRec(this._locateFirstRec, true);
1497
+ this.setTopRecIdx(this._recordsTab.getRecIdx(this._locateFirstRec));
1498
+ }
1499
+ else {
1500
+ this.getTask().setPreventRecordSuffix(true);
1501
+ await this.setCurrRecByIdx(Int32.MinValue, true, false, true, Int32.MinValue);
1502
+ this.getTask().setPreventRecordSuffix(false);
1503
+ this.setTopRecIdx(0);
1504
+ }
1505
+ if (!this._task.getForm().isScreenMode()) {
1506
+ if (this._task.getForm().isTableWithPagination()) {
1507
+ this.TotalRecordsCount = newDv.TotalRecordsCount;
1508
+ this.RecordsBeforeCurrentView = newDv.RecordsBeforeCurrentView;
1509
+ }
1510
+ await this.setCurrRecByIdx(this._topRecIdx, true, false, true, Int32.MinValue);
1511
+ }
1512
+ if (this._task.getForm() !== null)
1513
+ this._task.getForm().updateDisplayLineByDV();
1514
+ }
1515
+ catch (ex) {
1516
+ if (ex instanceof RecordOutOfDataViewException) {
1517
+ Logger.Instance.WriteDevToLog('wrong top record idx in DataView.setSameAs' + ex.Message);
1518
+ }
1519
+ else
1520
+ throw ex;
1521
+ }
1522
+ }
1523
+ setChanged(val) {
1524
+ this._changed = val;
1525
+ }
1526
+ getChanged() {
1527
+ return this._changed;
1528
+ }
1529
+ getLocateFirstRec() {
1530
+ return this._locateFirstRec;
1531
+ }
1532
+ setLocateFirstRec(newFirst) {
1533
+ this._locateFirstRec = newFirst;
1534
+ }
1535
+ getRecByIdx(idx) {
1536
+ return this._recordsTab.getRecByIdx(idx);
1537
+ }
1538
+ getServerCurrRec() {
1539
+ return this._recordsTab.getServerCurrRec();
1540
+ }
1541
+ zeroServerCurrRec() {
1542
+ this._recordsTab.zeroServerCurrRec();
1543
+ }
1544
+ inRollback() {
1545
+ let inRollback = false;
1546
+ if (this._recovery === ConstInterface.RECOVERY_ROLLBACK && this.getTask().isTransactionOwner()) {
1547
+ inRollback = true;
1548
+ }
1549
+ return inRollback;
1550
+ }
1551
+ getRecIdx(id) {
1552
+ return this._recordsTab.getRecIdx(id);
1553
+ }
1554
+ backupCurrent() {
1555
+ return this.CurrRec.replicate();
1556
+ }
1557
+ restoreCurrent(recBackup) {
1558
+ Debug.Assert(recBackup !== null);
1559
+ this._currRecId = recBackup.getId();
1560
+ this._currRecIdx = this._recordsTab.getRecIdx(this._currRecId);
1561
+ this.CurrRec = this._recordsTab.getRecByIdx(this._currRecIdx);
1562
+ this.CurrRec.setSameAs(recBackup, false);
1563
+ this.takeFldValsFromCurrRec();
1564
+ }
1565
+ GetCurrentRecId() {
1566
+ return this._currRecId;
1567
+ }
1568
+ DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast) {
1569
+ return orgIncludesFirst !== this.IncludesFirst() || orgIncludesLast !== this.IncludesLast();
1570
+ }
1571
+ GetRouteParams() {
1572
+ let params = new List();
1573
+ for (let i = 0; i < this._fieldsTab.getSize(); i++) {
1574
+ let field = this._fieldsTab.getField(i);
1575
+ let val;
1576
+ if (field.IsExposedRouteParam && !field.isNull()) {
1577
+ switch (field.getType()) {
1578
+ case StorageAttribute.ALPHA:
1579
+ case StorageAttribute.UNICODE:
1580
+ {
1581
+ val = field.getDispValue();
1582
+ if (field.isNull())
1583
+ val = field.getNullDisplay();
1584
+ val = val.trim();
1585
+ params.push(val.length === 0 ? ' ' : val);
1586
+ }
1587
+ break;
1588
+ case StorageAttribute.BOOLEAN:
1589
+ {
1590
+ if (field.isNull())
1591
+ params.push(false);
1592
+ else
1593
+ params.push((field.getDispValue()).charAt(0) === '1');
1594
+ }
1595
+ break;
1596
+ case StorageAttribute.NUMERIC: {
1597
+ val = field.getDispValue();
1598
+ if (field.isNull())
1599
+ val = field.getNullDisplay();
1600
+ let pic = new PIC(field.getPicture(), field.getType(), this.getTask().getCompIdx());
1601
+ val = DisplayConvertor.Instance.mg2disp(val, '', pic, true, 0, false);
1602
+ params.push(val);
1603
+ break;
1604
+ }
1605
+ }
1606
+ }
1607
+ }
1608
+ return (params.length > 0) ? params : null;
1609
+ }
1610
+ }
1611
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRGF0YVZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLE9BQU8sRUFFUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdCQUFnQixFQUloQixHQUFHLEVBRUgsYUFBYSxFQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxJQUFJLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDBDQUEwQyxFQUMzQyxNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxF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LEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQzFELENBQUM7d0JBQ0MsTUFBTTtvQkFFUixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQzNCLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDaEIsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxHQUFHLEdBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzt3QkFDekYsR0FBRyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEludDMyLFxyXG4gIEludDY0LFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWlzYyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGNWYWx1ZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBJUmVjb3JkLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJlY29yZHNUYWJsZSB9IGZyb20gJy4vUmVjb3Jkc1RhYmxlJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi9SZWNvcmQnO1xyXG5pbXBvcnQgeyBUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHsgTWdGb3JtIH0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7IEZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlIH0gZnJvbSAnLi9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbixcclxuICBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGVcclxufSBmcm9tICcuL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBJQ2xpZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ29tbWFuZEZhY3RvcnkgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7IFhNTEJhc2VkRGNWYWx1ZXNCdWlsZGVyIH0gZnJvbSAnLi9YTUxCYXNlZERjVmFsdWVzQnVpbGRlcic7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBFdmVudFN1YlR5cGUgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IEV2ZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIH0gZnJvbSAnLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yJztcclxuaW1wb3J0IHsgRmllbGRCYXNlIH0gZnJvbSAnLi9GaWVsZEJhc2UnO1xyXG5pbXBvcnQgeyBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIgfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhVmlld0Jhc2UgfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciwgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5pbXBvcnQgeyBNR0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi4vdGFza3MvTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuXHJcblxyXG4vLyBDT05TVEFOVFNcclxuZXhwb3J0IGNvbnN0IFNFVF9ESVNQTEFZTElORV9CWV9EVjogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbmNvbnN0IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ6IHN0cmluZyA9ICdNJztcclxuY29uc3QgVU5LTk9XTl9SQ01QU19GT1VORDogc3RyaW5nID0gJ1knO1xyXG5cclxuY29uc3QgSU5WT0tFRF9GUk9NX09GRkxJTkVfVEFTSzogc3RyaW5nID0gJy05OTk5OSc7XHJcblxyXG5jb25zdCBDSFVOS19DQUNIRV9ORVhUOiBzdHJpbmcgPSAnTic7XHJcbmNvbnN0IENIVU5LX0NBQ0hFX1BSRVY6IHN0cmluZyA9ICdQJztcclxuY29uc3QgQ0hVTktfRFZfQk9UVE9NOiBzdHJpbmcgPSAnQic7XHJcbmNvbnN0IENIVU5LX0RWX1RPUDogc3RyaW5nID0gJ1QnO1xyXG5cclxuY29uc3QgQ09NUFVURV9GTFVTSF9VUERBVEVTOiBzdHJpbmcgPSAnSCc7XHJcblxyXG5jb25zdCBDT01QVVRFX05FV1JFQ19PTl9TRVJWRVI6IHN0cmluZyA9ICdTJztcclxuY29uc3QgRU5EX0RWX1RBRzogc3RyaW5nID0gJzwvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArICc+JztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjogc3RyaW5nID0gJ1MnO1xyXG5cclxuLy8gcmVjb3ZlcnkgYWN0aW9uIHRha2VuIGJ5IHRoZSBjbGllbnQgaW4gcmVzcG9uc2UgdG8gcmVjb3ZlcnkgdHlwZVxyXG5jb25zdCBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEU6IHN0cmluZyA9ICdUJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0NBTkNFTDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU46IHN0cmluZyA9ICdCJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX05PTkU6IHN0cmluZyA9ICdOJztcclxuY29uc3QgVFJBTlNfU1RBVF9DTE9TRUQ6IHN0cmluZyA9ICdDJztcclxuY29uc3QgVFJBTlNfU1RBVF9PUEVORUQ6IHN0cmluZyA9ICdPJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBkYXRhdmlldyBvZiBhIHRhc2tcclxuZXhwb3J0IGNsYXNzIERhdGFWaWV3IGV4dGVuZHMgRGF0YVZpZXdCYXNlIHtcclxuICBwcml2YXRlIF9jYWNoZUxydVRpbWVTdGFtcDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9jaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2h1bmtTaXplOiBudW1iZXIgPSAzMDtcclxuICBwcml2YXRlIF9jb21wdXRlQnk6IHN0cmluZyA9ICdcXDAnOyAvLyB0ZWxscyB0aGUgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIGNvbXB1dGUgb2YgbmV3IHJlY29yZHMgb24gdGhlIGNsaWVudCBvciBvbiB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfY3VyclJlY0lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2N1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZHZQb3NWYWx1ZTogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9maXJzdER2OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9mbHVzaFVwZGF0ZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSBtZWFucyB0aGF0IHdoZW5ldmVyIGEgcmVjb3JkIGlzIGNoYW5nZWQgd2UgbXVzdCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXJcclxuICBwcml2YXRlIF9oYXNNYWluVGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnNlcnRBdDogc3RyaW5nID0gJyAnO1xyXG5cclxuICBzZXQgSW5zZXJ0QXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5faW5zZXJ0QXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBJbnNlcnRBdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luc2VydEF0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiB3ZSBhcmUgZXhlY3V0aW5nIGxvY2FsIGRhdGF2aWV3IGNvbW1hbmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluTG9jYWxEYXRhdmlld0NvbW1hbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9sYXN0Q3JlYXRlZFJlY0lkOiBudW1iZXIgPSAwOyAvLyB0aGUgcmVjb3JkIGlkIG9mIHRoZSBsYXN0IGNyZWF0ZWQgcmVjb3JkIGlkXHJcbiAgcHJpdmF0ZSBfbGFzdFNlc3Npb25Db3VudGVyOiBudW1iZXIgPSBJbnQ2NC5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF9sb2NhdGVGaXJzdFJlYzogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfbW9kaWZpZWRSZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyBhZnRlciBzZW5kaW5nIHRoZXNlIHJlY29yZHMgdG8gdGhlIHNlcnZlciB0aGUgbGlzdCBpcyBjbGVhcmVkXHJcblxyXG4gIHByaXZhdGUgX29sZFRvcFJlY0lkeDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWw6IFJlY29yZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlY292ZXJ5OiBzdHJpbmcgPSBSRUNPVkVSWV9BQ1RfTk9ORTsgLy8gd2hlbiBkaWZmZXJlbnQgdGhhbiBOT05FLCBtZWFucyB0aGUgc2VydmVyIG9yZGVyIGZvciByZWNvdmVyeSB3YXMgbm90IHBlcmZvcm1lZCAoeWV0KS5cclxuICBwcml2YXRlIF9wcmV2Q3VyclJlYzogUmVjb3JkID0gbnVsbDtcclxuICBwcml2YXRlIF9yZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyA8ZGF0YXZpZXc+IC4uLjwvZGF0YXZpZXc+IHRhZ1xyXG4gIHByaXZhdGUgX3JlY292ZXJ5OiBzdHJpbmcgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FOyAvLyByZWNvdmVyeSBhY3Rpb24gcmVxdWVzdCwgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfcm1JZHg6IG51bWJlciA9IDA7IC8vIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfcm1TaXplOiBudW1iZXIgPSAwOyAvLyBudW1iZXIgb2YgXCJzZWxlY3RcInMgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfc2tpcFBhcnNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90b3BSZWNJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90b3BSZWNJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX3RvcFJlY0lkeE1vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdHJhbnNDbGVhcmVkOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUsIF90YXNrIGlzIHRoZSBvd25lciBvZiBhIFJlYyBsZXZlbCB0cmFuc2FjdGlvbiBhbmQgdGhlIF90YXNrIGlzIGluIF90YXNrIHN1ZmZpeFxyXG4gIHByaXZhdGUgX3Vua25vd25SY21wOiBzdHJpbmcgPSBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ7IC8vIHNpZ25hbHMgaWYgYSB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGhhcyBzZXJ2ZXIgcmNtcCBhY3Rpb25cclxuXHJcbiAgSXNPbmVXYXlLZXk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfaW5jbHVkZXNMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTogYm9vbGVhbiA9IHRydWU7IC8vIGluZGljYXRpb24gd2hldGhlciB0aGUgc2VydmVyIHNpZGUgdHJhbnNhY3Rpb24gY2FjaGUgaXMgZW1wdHlcclxuXHJcbiAgcHJpdmF0ZSBfY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSOiBSZWNvcmQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdldCBDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgQ3VyclJlYyh2YWx1ZTogUmVjb3JkKSB7XHJcbiAgICAvLyByZXNldCB0aGUgcHJldiBkY1ZhbElkcyBpbiBtZ2NvbnRyb2xcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgIT09IG51bGwgJiYgdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSLnJlc2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgPSB2YWx1ZTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRjVmFsSWRzIGluIG1nY29udHJvbFxyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUiAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIuU2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgRmx1c2hVcGRhdGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZsdXNoVXBkYXRlcztcclxuICB9XHJcblxyXG4gIGdldCBIYXNNYWluVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzTWFpblRhYmxlO1xyXG4gIH1cclxuXHJcbiAgREJWaWV3U2l6ZTogbnVtYmVyID0gMDtcclxuICB0YXNrTW9kZUZyb21DYWNoZTogc3RyaW5nO1xyXG5cclxuICBnZXQgQ3VycmVudFJlY0lkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkO1xyXG4gIH1cclxuXHJcbiAgRHZjb3VudDogbnVtYmVyID0gMDtcclxuICBUb3RhbFJlY29yZHNDb3VudDogbnVtYmVyID0gMDtcclxuICBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmlyc3QgRGF0YXZpZXcgUmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgRmlyc3RSZWNvcmQoKTogSVJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbGFzdCBkYXRhdmlldyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMYXN0UmVjb3JkKCk6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3Rvcih0YXNrOiBUYXNrQmFzZSk7XHJcbiAgY29uc3RydWN0b3IoRGF0YVZpZXc6IERhdGFWaWV3KTtcclxuICBjb25zdHJ1Y3Rvcih0YXNrT3JEYXRhVmlldzogRGF0YVZpZXcgfCBUYXNrQmFzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmICh0YXNrT3JEYXRhVmlldyBpbnN0YW5jZW9mIFRhc2tCYXNlKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2sgPSA8VGFza0Jhc2U+dGFza09yRGF0YVZpZXc7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYiA9IG5ldyBGaWVsZHNUYWJsZSgpO1xyXG4gICAgICB0aGlzLl9yZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZSh0cnVlKTtcclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRhc2tPckRhdGFWaWV3KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBleGlzdHMgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlzIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgY2xpZW50IDwvcmV0dXJucz5cclxuICBJbmNsdWRlc0ZpcnN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgU2VydmVyVHJhbnNhY3Rpb25DYWNoZUVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGxhc3Qgcm93IG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSBsYXN0IHJvdyBvZiBkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQncyBkYXRhIHZpZXcgPC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVzTGFzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0xhc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERWSEVBREVSIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEhlYWRlckRhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5EdmNvdW50ID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jdGxfaXRtXzRfcGFyZW50X3ZlZSgwLCAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgRFZIRUFERVIgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogU3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUikge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnZHZoZWFkZXIgZm91bmQnKTtcclxuICAgICAgdGhpcy5nZXRIZWFkZXJBdHRyaWJ1dGVzKHBhcnNlcik7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYi5maWxsRGF0YShwYXJzZXIsIHRoaXMpO1xyXG4gICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2V0Uk1Qb3ModGhpcy5fcm1TaXplLCB0aGlzLl9ybUlkeCk7XHJcbiAgICB9IGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgRFZIRUFERVIgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhlYWRlckF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCB0YWc6IHN0cmluZztcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUi5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUk1QT1M6IHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoJywnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9ybVNpemUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cigwLCBpKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm1JZHggPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NPTVBVVEVfQlk6XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IHZhbHVlU3RyWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXB1dGVCeSA9PT0gQ09NUFVURV9GTFVTSF9VUERBVEVTKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gQ09NUFVURV9ORVdSRUNfT05fU0VSVkVSO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFTX01BSU5fVEJMOlxyXG4gICAgICAgICAgICB0aGlzLl9oYXNNYWluVGFibGUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIVU5LX1NJWkU6XHJcbiAgICAgICAgICAgIHRoaXMuX2NodW5rU2l6ZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSFVOS19TSVpFX0VYUFJFU1NJT046XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdVbmtub3duIGF0dHJpYnV0ZSBmb3IgPCcgKyBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSICsgJz4gdGFnOiAnICtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGUpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZ2V0SGVhZGVyQXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERBVEFWSUVXIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NraXBQYXJzaW5nID0gZmFsc2U7XHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIHRoaXMuUmVzZXRGaXJzdER2KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0cmFuc2FjdGlvbiBiZWdpbiBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIEdldFRyYW5zYWN0aW9uQmVnaW4oKTogc3RyaW5nIHtcclxuICAgIGxldCB0cmFuc0JlZ2luOiBzdHJpbmcgPSAnXFwwJztcclxuICAgIGxldCB0cmFuc0JlZ2luUHJvcDogUHJvcGVydHkgPSB0aGlzLl90YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBU0FDVElPTl9CRUdJTik7XHJcbiAgICBpZiAodHJhbnNCZWdpblByb3AgIT09IG51bGwpIHtcclxuICAgICAgdHJhbnNCZWdpbiA9ICh0cmFuc0JlZ2luUHJvcC5HZXRDb21wdXRlZFZhbHVlKCkpLmNoYXJBdCgwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJhbnNCZWdpbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgREFUQVZJRVcgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSkge1xyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3NraXBQYXJzaW5nKSB7XHJcbiAgICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihFTkRfRFZfVEFHLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIEVORF9EVl9UQUcubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBwYXJzZSB0aGUgZXhlYyBzdGFjayBlbnRyaWVzIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuZmlsbEV4ZWNTdGFjayhwYXJzZXIpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgZGF0YSBjb250cm9scyB2YWx1ZXNcclxuICAgICAgICB0aGlzLmZpbGxEYXRhRGMocGFyc2VyKTtcclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiBmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgZm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGxldCB0YXNrUmVmcmVzaFR5cGU6IHN0cmluZyA9IHRoaXMuX3JlY29yZHNUYWIuZmlsbERhdGEodGhpcywgdGhpcy5faW5zZXJ0QXQsIHBhcnNlcik7XHJcblxyXG4gICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSwgYXMgdGhlIHRhYmxlIGNvbnRyb2wgaXMgbm90IHlldCBjcmVhdGVkLCBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgdGFibGUgaXRlbSdzIGNvdW50LlxyXG4gICAgICAgICAgLy8gU2V0IHRoZSB1cGRhdGVkIHRhYmxlIGl0ZW1zIGNvdW50IG9ubHkgd2hlbiBmb3JtIGlzIGFscmVhZHkgb3BlbmVkLlxyXG4gICAgICAgICAgaWYgKGZvcm0uT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnNlcnRBdCA9PT0gJ0InICYmIChpbnZhbGlkYXRlIHx8IHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQgPiAwKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlmIChpbnZhbGlkYXRlIHx8ICEoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgZm9ybS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBmb3JtLkluc2VydFRhYmxlSXRlbXMoMCwgdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGZvcm0uc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsICYmIHRoaXMuQ3VyclJlYy5JblJlY29tcHV0ZSAmJiB0YXNrUmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSlcclxuICAgICAgICAgIHRhc2tSZWZyZXNoVHlwZSA9IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUM7XHJcblxyXG4gICAgICAgIGlmIChpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICB0YXNrUmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk07XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldFRhc2soKS5TZXRSZWZyZXNoVHlwZSh0YXNrUmVmcmVzaFR5cGUpO1xyXG4gICAgICAgIHRoaXMuVXBkYXRlRGF0YXZpZXdBZnRlckluc2VydCgpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiB0aGUgcmVjb3JkcyB0YWJsZSBtaWdodCBzZXQgYSBuZXcgY3VycmVudCByZWNvcmQuIEl0XHJcbiAgICAgICAgICAgICAqIGFjdHVhbGx5IGJlY29tZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGJ5IGNhbGxpbmcgc2V0Q3VyclJlYygpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIGxldCBuZXdSZWNJZDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRJbml0aWFsQ3VyclJlY0lkKCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdSZWNJZCAhPT0gSW50MzIuTWluVmFsdWUgJiYgKHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FIHx8IHRoaXMuX2ZpcnN0RHYpKSB7XHJcblxyXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjbGllbnQgcGVyZm9ybXMgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXhcclxuICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2ICYmIHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FICYmXHJcbiAgICAgICAgICAgICh0aGlzLl90YXNrLmdldExldmVsKCkuY2hhckNvZGVBdCgwKSA9PT0gMCB8fCB0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCB1cyBhbiB1cGRhdGVkIGN1cnJSZWMgdGhlbiBpbnZhbGlkYXRlIGFsbCBjdXJyZW50IHZhbHVlcy5cclxuICAgICAgICAgIC8vIHRoaXMgd2lsbCBmb3JjZSBhbGwgbmV3IHZhbHVlcyB0byBiZSBjb3BpZWQgZnJvbSB0aGUgY3VyclJlYyB0byB0aGUgZGF0YXZpZXcsXHJcbiAgICAgICAgICAvLyBlc3BlY2lhbGx5IHZpcnR1YWwgZmllbGRzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uLlxyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGQuTEVBVkVfRkxBR1MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXdSZWNJZCAhPT0gdGhpcy5fY3VyclJlY0lkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlYyhuZXdSZWNJZCwgIXRoaXMuX2ZpcnN0RHYpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZpeCBidWcgIzc3OTg1ODogZm9yY2UgY29tcHV0ZSBmb3IgdGhlIGZpcnN0IHJlY29yZCBpbiBhIHNjcmVlbiBtb2RlIF90YXNrXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2KVxyXG4gICAgICAgICAgICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM5ODEzMjA6IG1ha2Ugc3VyZSB0aGF0IHZpcnR1YWxzIHdpdGggbm8gaW5pdCBvciBjb250cm9sIGFyZSBpbml0aWFsaXplZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAoPE1nRm9ybT4odGhpcy5fdGFzay5nZXRGb3JtKCkpKS51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGludmFsaWRhdGUgJiYgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsIHx8IGZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeCgwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM0MzE2MzA6IEZvciBmb3JtcyBpbiBsaW5lIG1vZGUgdGhlcmUgd2FzIGEgc2l0dWF0aW9uIGluIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGFmdGVyIGludmFsaWRhdGlvbiwgdGhlIGN1cnJlbnQgcmVjb3JkIHdhcyBzZXQgdG8gYmUgdGhlIGZpcnN0IG9mXHJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRhdmlldyBidXQgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgZm9ybSB3YXMgZ3JlYXRlciB0aGFuIDAuXHJcbiAgICAgICAgICAgIC8vIEl0IGNhdXNlZCBzYXZpbmcgYW4gb3JpZ2luYWwgcmVjb3JkIHdoaWNoIGlzIGRpZmZlcmVudCB0aGFuIHRoZVxyXG4gICAgICAgICAgICAvLyBvcmlnaW5hbCBvZiB0aGUgY3VycmVudCBmb3JtIGxpbmUuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSB3ZSBmaXJzdFxyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY3Vyc29yIHBhcmtzIG9uIHRoZSBmaXJzdCByb3cgb2YgdGhlIGRhdGF2aWV3LlxyXG4gICAgICAgICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZC5MRUFWRV9GTEFHUyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoMCwgZmFsc2UsIHRydWUsIHRydWUsIDApO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIC8vIHRvIHVwZGF0ZSB0cmVlIHdlIG5lZWQgdG8gbG9hZCBub2RlcyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCAmJiB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNhdmVPcmlnaW5hbCgpOyAvLyBBZnRlciBpbnZhbGlkYXRpb24sIHdlIG11c3Qgc2F2ZSB0aGUgb3JpZ2luYWwgcmVjb3JkIHRvb1xyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFFDUiAjNzYxODQ4IHByZXZDdXJyUmVjIHNob3VsZCBzZXQgdGhlIGZpcnN0IHRpbWUgdGhlIGRhdGF2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0RHYpXHJcbiAgICAgICAgICB0aGlzLnNldFByZXZDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdWIgZm9ybXMgYXJlIG5vdCB1bm5lY2Vzc2FyaWx5IHJlZnJlc2hlZDpcclxuICAgICAgICAvLyBBZnRlciBzZXR0aW5nIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgYmVmb3JlIGV4ZWN1dGluZyByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgY3VycmVudCByZWNvcmQgYXMgdGhlIHByZXZpb3VzIHJlY29yZCBzbyB3aGVuIHRoZSByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gaXMgZXhlY3V0ZWQgaXQgd2lsbCBza2lwIHJlZnJlc2hpbmcgdGhlIHN1YiBmb3Jtcy4gV2UgZG8gdGhhdCBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBhbHJlYWR5IHBhc3NlcyBiYWNrIHRvIHRoZSBjbGllbnQgYWxsIHRoZSBkYXRhdmlld3Mgb2YgdGhlXHJcbiAgICAgICAgLy8gc3ViIGZvcm1zIGluIGEgc2luZ2xlIGl0ZXJhdGlvbi5cclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiB0aGlzLl90YXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICg8TWdDb250cm9sQmFzZT50aGlzLl90YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKS5SZWZyZXNoT25WaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSkge1xyXG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBwZXJmb3JtIHJlY29yZCBwcmVmaXggYWZ0ZXIgYSByZWNvcmQgbGV2ZWwgdHJhbnNhY3Rpb24gcmV0cnlcclxuICAgICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5nZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JFVFJZKSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5nZXRUYXNrKCkuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdHJhbnNCZWdpbiA9IDxzdHJpbmc+IHRoaXMuR2V0VHJhbnNhY3Rpb25CZWdpbigpO1xyXG5cclxuICAgICAgICAgIGxldCBzdG9wRXhlY3V0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3JlY292ZXJ5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0s6XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IgIzc0NzMxNiBjYW4ndCByb2xsYmFjayBhIGxvc3QgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAvLyBBbHNvLCBpbiBjYXNlIG9mIG5vbiBpbnRlcmFjdGl2ZSBfdGFzaywgc2tpcCB0byB0aGUgbmV4dCByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgICAgICF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgICAgICAgICAgIHN0b3BFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnJlc3RhcnQodGhpcy5DdXJyUmVjLmdldE1vZGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfQ0FOQ0VMO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0cmFuc0JlZ2luICE9PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgX3Rhc2sgY2xvc2UgYWN0aW9uIGlzIHN0b3BwZWQgKHRhc2tFbmQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWTpcclxuICAgICAgICAgICAgICB0aGlzLlJlY292ZXJ5UmV0cnkodHJhbnNCZWdpbik7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSB0YXNrIHN1ZmZpeCB3YXMgYWxyZWFkeSBleGVjdXRlZCwgbmVlZCB0byBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlIGluIG9yZGVyIHRvIGVuYWJsZSBpdCB0byBleGVjdXRlIFRTIGFnYWluLlxyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiB0aGlzLmlzRW1wdHkoKSkge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRyYW5zQmVnaW5cIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgUmVjb3ZlcnlSZXRyeSh0cmFuc0JlZ2luOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmUtcGVyZm9ybSByZWNvcmQgcHJlZml4IGR1cmluZyByZXRyeS5cclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHJlY29yZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIGFmdGVyIGNvcnJlY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBlbnN1cmUgcmVjb3JkIHByZWZpeCBpcyBub3QgZXhlY3V0ZWQgZm9yIGFsbCB0YXNrcyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzQ3OTY4Njogbm8gbmVlZCB0byBhZGQgdGhlIGN1cnIgcmVjIHRvIHRoZSBsaXN0IGFueW1vcmVcclxuICAgICAgLy8gYmVjYXVzZSB0aGUgaW5zZXJ0L21vZGlmeSBtYXkgYmUgY2FuY2VsZWQgYW5kIGEgcm9sbGJhY2sgZXZlbnRcclxuICAgICAgLy8gd291bGQgYmUgc2VudCB0byB0aGUgc2VydmVyXHJcbiAgICAgIHRoaXMuQ3VyclJlYy5yZXN0YXJ0KHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkpO1xyXG5cclxuICAgICAgLy8gQW4gZXJyb3Igd2hlbiBpbml0aWFsaXppbmcgdGhlIF90YXNrIG5lZWRzIG5vIG1vdmVtZW50IChlcnJvciBpbiByZWMtcHJlZml4KVxyXG4gICAgICBpZiAoIXRoaXMuX2ZpcnN0RHYpIHtcclxuICAgICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRyYW5zQmVnaW4gIT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUpIHtcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjtcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcbiAgICAgIC8vIGVuc3VyZSBfdGFzayBjbG9zZSBhY3Rpb24gaXMgc3RvcHBlZCAodGFza0VuZClcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIERhdGF2aWV3IEFmdGVyIGluc2VydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBVcGRhdGVEYXRhdmlld0FmdGVySW5zZXJ0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luc2VydEF0ID09PSAnQicvKidCJyovKSB7XHJcblxyXG4gICAgICBsZXQgbmV3UmVjczogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudDtcclxuICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggKz0gbmV3UmVjcztcclxuXHJcbiAgICAgIGlmICh0aGlzLl90b3BSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX3RvcFJlY0lkeCArPSBuZXdSZWNzO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29sZFRvcFJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgdGhpcy5fb2xkVG9wUmVjSWR4ICs9IG5ld1JlY3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBEQVRBVklFVyB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgbGV0IHRhZzogU3RyaW5nO1xyXG4gICAgbGV0IGJvb2xWYWw6IGJvb2xlYW47XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcbiAgICBsZXQgaXNFbXB0eURhdGF2aWV3ID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcubGVuZ3RoKTtcclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgdGhpcy5faW5zZXJ0QXQgPSAnICc7XHJcbiAgICAgIC8vIGZpbmQgYW5kIGV4ZWN1dGUgaW52YWxpZGF0ZSBpbW1lZGlhdGVseVxyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IHRoaXMucGVla0ludmFsaWRhdGUodG9rZW5zVmVjdG9yKTtcclxuXHJcblxyXG5cclxuICAgICAgLy8gbG9jYXRlRmlyc3RSZWMgaXMgc2VudCBieSBzZXJ2ZXIgb25seSBpZiByZWNvcmRzIGFyZSBsb2NhdGVkIGZvciB0aGUgc3ViZm9ybS5cclxuICAgICAgLy8gU28sIGl0IHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAwLlxyXG4gICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IDA7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5TRVJUX0FUOlxyXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnRBdCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTkNMVURFX0ZJUlNUOlxyXG4gICAgICAgICAgICBib29sVmFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLlNldEluY2x1ZGVzRmlyc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOQ0xVREVfTEFTVDpcclxuICAgICAgICAgICAgYm9vbFZhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRJbmNsdWRlc0xhc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX09ORVdBWV9LRVk6XHJcbiAgICAgICAgICAgIGJvb2xWYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0T25lV2F5S2V5KGJvb2xWYWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlZJRVdTSVpFOlxyXG4gICAgICAgICAgICB0aGlzLkRCVmlld1NpemUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURToge1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVE9QX1JFQ19JRDpcclxuICAgICAgICAgICAgdGhpcy5fdG9wUmVjSWQgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS01PREU6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9OT05FIHx8IGludmFsaWRhdGUpXHJcbiAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRPcmlnaW5hbFRhc2tNb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTVBUWV9EQVRBVklFVzpcclxuICAgICAgICAgICAgaXNFbXB0eURhdGF2aWV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9XX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sYXN0Q3JlYXRlZFJlY0lkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX1NUQVQ6XHJcbiAgICAgICAgICAgIGxldCB0cmFuc1N0YXQ6IHN0cmluZyA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRyYW5zU3RhdCkge1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9PUEVORUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9DTE9TRUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRUcmFuc2FjdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVDT1ZFUlk6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnJlc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfVkFMVUU6XHJcbiAgICAgICAgICAgIHRoaXMuX2R2UG9zVmFsdWUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9DQVRFX0ZJUlNUX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PRkZTRVQ6XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9VU0VSX1NPUlQ6XHJcbiAgICAgICAgICAgIC8vIFFDUiAjIDkyMzM4MDpHZXR0aW5nIHRoZSB2YWx1ZSBvZiB1c2VyU29ydCBmcm9tIHRoZSBkYXRhdmlldyBoZWFkZXIuSWYgdHJ1ZSB0aGVuIHNvcnQgc2lnbiB3aWxsIGJlIHJlbW92ZWQgb3IgZWxzZSBzaG93bi5cclxuICAgICAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgIGZvcm0uY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9UT1RBTF9SRUNPUkRTX0NPVU5UOlxyXG4gICAgICAgICAgICB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVc6XHJcbiAgICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQUxfU0VSVkVSX1RSQU5TX0NBQ0hFX0VNUFRZOlxyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHkgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnVW5rbm93biBhdHRyaWJ1dGUgZm9yIDwnICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgJz4gdGFnOiAnICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldEVtcHR5RGF0YXZpZXcoaXNFbXB0eURhdGF2aWV3KTtcclxuXHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgcmV0dXJuIGludmFsaWRhdGU7XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmdldEF0dHJpYnV0ZXMoKTogb3V0IG9mIGJvdW5kcycpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIFNldE9uZVdheUtleSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuSXNPbmVXYXlLZXkgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0xhc3QodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0ZpcnN0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHByZXZJbmNsdWRlRmlyc3Q6IGJvb2xlYW4gPSB0aGlzLl9pbmNsdWRlc0ZpcnN0O1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IHZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCAhPT0gcHJldkluY2x1ZGVGaXJzdCkge1xyXG4gICAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IHRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICBmb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuZCBmaWxsIGlubmVyIGRhdGEgZm9yIGFsbCA8ZGNfdmFsPiB0YWdzIGFyZSBjb250YWluZWQgaW50byB0aGUgPGRhdGF2aWV3PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsRGF0YURjKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgREMgdmFsdWVzIGJ1aWxkZXIuXHJcbiAgICBsZXQgZGN2QnVpbGRlcjogWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIgPSBuZXcgWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIoKTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIFwiZGNfdmFsc1wiIHRhZ3MuXHJcbiAgICBsZXQgZm91bmRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIHdoaWxlIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRENfVkFMUykge1xyXG5cclxuICAgICAgLy8gU2F2ZSBjdXJyZW50IGluZGV4IGZvciBmdXR1cmUgcmVmZXJlbmNlLCBpbiBjYXNlIG9mIGFuIGVycm9yLlxyXG4gICAgICBsZXQgZGNWYWxzUG9zaXRpb246IG51bWJlciA9IHBhcnNlci5nZXRDdXJySW5kZXgoKTtcclxuXHJcbiAgICAgIGRjdkJ1aWxkZXIuU2VyaWFsaXplZERDVmFscyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGN2QnVpbGRlci5CdWlsZCgpO1xyXG5cclxuICAgICAgaWYgKGRjdiAhPT0gbnVsbClcclxuICAgICAgICB0aGlzLkFkZERjVmFsdWVzKGRjdik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ0Vycm9yIHdoaWxlIHBhcnNpbmcgREMgdmFsdWVzIGF0IHBvc2l0aW9uICcgKyBkY1ZhbHNQb3NpdGlvbik7XHJcblxyXG4gICAgICBmb3VuZFRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQWRkRGNWYWx1ZXMoZGN2OiBEY1ZhbHVlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5BZGQoZGN2LmdldElkKCkudG9TdHJpbmcoKSwgZGN2KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBhbmQgZmlsbCBpbm5lciBkYXRhIGZvciBhbGwgPGV4ZWNzdGFja2VudHJ5PiB0YWdzIGFyZSBjb250YWluZWQgaW50byB0aGUgPGRhdGF2aWV3PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsRXhlY1N0YWNrKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgZm91bmRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgbGV0IGV4ZWNTdGFja1RhZ0V4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHdoaWxlIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWSkge1xyXG4gICAgICB0aGlzLmZpbGxJbm5lckV4ZWNTdGFjayhwYXJzZXIpO1xyXG4gICAgICBmb3VuZFRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgICBleGVjU3RhY2tUYWdFeGlzdHMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4ZWNTdGFja1RhZ0V4aXN0cykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5yZXZlcnNlU2VydmVyRXhlY1N0YWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBpbm5lciBvYmplY3RzIG9mIDxleGVjc3RhY2tlbnRyeT4gdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxJbm5lckV4ZWNTdGFjayhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgY29uc3QgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfVEVSTSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB0YXNrSWQ6IHN0cmluZyA9ICcnO1xyXG4gICAgbGV0IGhhbmRsZXJJZDogc3RyaW5nID0gJyc7XHJcbiAgICBsZXQgb3BlcklkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWSkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWS5sZW5ndGgpO1xyXG5cclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQ6XHJcbiAgICAgICAgICAgIHRhc2tJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSSUQ6XHJcbiAgICAgICAgICAgIGhhbmRsZXJJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PUEVSX0lEWDpcclxuICAgICAgICAgICAgb3BlcklkeCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaFNlcnZlckV4ZWNTdGFjayh0YXNrSWQsIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmZpbGxJbm5lckV4ZWNTdGFjaygpIG91dCBvZiBib3VuZHMnKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZWFyY2ggZm9yIHRoZSBpbnZhbGlkYXRlIGF0dHJpYnV0ZSBhbmQgaWYgaXQgaXMgdHJ1ZSB0aGVuIGl0IGFsc28gY2xlYXJzIHRoZSBkYXRhdmlld1xyXG4gIC8vLyAgIGV4ZWN1dGUgdGhpcyBtZXRob2QgQkVGT1JFIHBhcnNpbmcgdGhlIHJlY29yZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+b2YgYWxsIGF0dHJpYnV0ZXMgYW5kIHZhbHVlczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBwZWVrSW52YWxpZGF0ZSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNlc3Npb25Db3VudGVyOiBudW1iZXIgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5HZXRTZXNzaW9uQ291bnRlcigpO1xyXG5cclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gKENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURSkpIHtcclxuICAgICAgICBsZXQgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgICBpZiAoWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpKSB7XHJcblxyXG4gICAgICAgICAgLy8gUUNSICMyODYzOiBXaGVuIGV4ZWN1dGluZyBSRUNVUlNJVkUgY2FsbHMgdG8gdGhlIHNlcnZlciB0aGVyZSB3ZXJlIGNhc2VzXHJcbiAgICAgICAgICAvLyBpbiB3aGljaCBhbiBvbGRlciBkYXRhdmlldyBzdXBlcnNlZHMgYSBuZXcgb25lIGJlY2F1c2UgaXRzIHBhcnNpbmcgY29tZXNcclxuICAgICAgICAgIC8vIGFmdGVyIHRoZSBwYXJzaW5nIG9mIHRoZSBuZXcgZGF0YXZpZXcuIFRoZSBzb2x1dGlvbiBpcyB0byBza2lwIHRoZVxyXG4gICAgICAgICAgLy8gcGFyc2luZyBvZiB0aGUgb2xkZXIgZGF0YXZpZXcgaWYgdGhlIG5ld2VyIGRhdGF2aWV3IGhhcyBpbnZhbGlkYXRlPXRydWVcclxuICAgICAgICAgIGlmIChzZXNzaW9uQ291bnRlciA8IHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlcilcclxuICAgICAgICAgICAgdGhpcy5fc2tpcFBhcnNpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlciA9IHNlc3Npb25Db3VudGVyO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+b2YgdGhlIGZpZWxkIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiByZXF1aXJlZCBmaWVsZCAob3IgbnVsbCBpZiBub3QgZm91bmQpIDwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkc1RhYiAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoZmxkTmFtZSk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5nZXRGaWVsZChTdHJpbmcpOiBUaGVyZSBpcyBubyBmaWVsZHNUYWIgb2JqZWN0Jyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1lc3NhZ2VcIj50aGUgbWVzc2FnZSBidWZmZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXM7XHJcbiAgICBsZXQgdGFza1RhZzogU3RyaW5nID0gdGhpcy5fdGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgICBsZXQgYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbEluZGV4KCk7XHJcbiAgICBsZXQgY3VyclJlY0RlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzZXJ2ZXJQYXJlbnQ6IFN0cmluZztcclxuXHJcbiAgICBsZXQgY29udGV4dFRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPih0aGlzLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpKTtcclxuICAgIGxldCBpbnZva2luZ1Rhc2tUYWc6IHN0cmluZyA9IGNvbnRleHRUYXNrLklzT2ZmbGluZSA/IElOVk9LRURfRlJPTV9PRkZMSU5FX1RBU0sgOiBjb250ZXh0VGFzay5nZXRUYXNrVGFnKCk7XHJcblxyXG4gICAgLy8gcHV0IHRoZSBkYXRhdmlldyB0YWcgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbW9kaWZpZWQgcmVjb3JkcyBqdXN0IHRvIGxldFxyXG4gICAgLy8gdGhlIHNlcnZlciBrbm93IHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgbWVzc2FnZS5BcHBlbmQoJ1xcbiAgICAgIDwnICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgJyAnICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEICsgJz1cIicgK1xyXG4gICAgICB0YXNrVGFnICsgJ1wiJyk7XHJcblxyXG4gICAgLy8gUUNSIDQyMzA2NCBwdXRzIHRoZSBjdXJyZW50IGV4ZWN1dGluZyBoYW5kbGVyIGluZGV4XHJcbiAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tMRVZFTCArICc9XCInICsgYnJrTGV2ZWxJbmRleCArICdcIicpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0cmlnZ2VyIHRhc2sgaXMgYW4gT2ZmbGluZSBwcm9ncmFtLCB0aGUgcGFyZW50IG9uIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlXHJcbiAgICAvLyB0aGUgTWFpbiBQcm9ncmFtIG9mIHRoZSBjdXJyZW50IENUTC5cclxuICAgIHNlcnZlclBhcmVudCA9ICcwJztcclxuICAgIGxldCB0cmlnZ2VyaW5nVGFzazogVGFza0Jhc2UgPSB0aGlzLmdldFRhc2soKS5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRyaWdnZXJpbmdUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRyaWdnZXJpbmdUYXNrLklzT2ZmbGluZSkge1xyXG4gICAgICAgIGxldCBjdGxJZHg6IG51bWJlciA9IHRyaWdnZXJpbmdUYXNrLmdldEN0bElkeCgpO1xyXG4gICAgICAgIGxldCBtYWluUHJnOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT4gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGN0bElkeCk7XHJcbiAgICAgICAgc2VydmVyUGFyZW50ID0gbWFpblByZy5nZXRUYXNrVGFnKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcnZlclBhcmVudCA9IHRyaWdnZXJpbmdUYXNrLmdldFRhc2tUYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUMgKyAnPVwiJyArIHRoaXMuX2N1cnJSZWNJZCArICdcIicpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tNT0RFICsgJz1cIicgKyB0aGlzLl90YXNrLmdldE1vZGUoKSArICdcIicpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3RyYW5zQ2xlYXJlZCAmJiAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19DTEVBUkVEICsgJz1cIjFcIicpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zQ2xlYXJlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBRQ1IgNzc5OTgyIHB1dHMgdGhlIGludm9raW5nIF90YXNrIGlkIGFuZCB0aGUgZGlyZWN0IHBhcmVudCBfdGFzayBpZFxyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOVk9LRVJfSUQgKyAnPVwiJyArIGludm9raW5nVGFza1RhZyArICcsJyArIHNlcnZlclBhcmVudCArICdcIicpO1xyXG5cclxuLy8gcHV0IHRoZSBjdXJyZW50ICgoRGF0YVZpZXcpZGF0YVZpZXcpIGR2UG9zIHZhbHVlXHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5pc0NhY2hlZCgpKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfVkFMVUUgKyAnPVwiJyArIHRoaXMuX2R2UG9zVmFsdWUgKyAnXCInKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9PUF9DT1VOVEVSICsgJz1cIicgKyB0aGlzLmdldFRhc2soKS5nZXRMb29wQ291bnRlcigpICsgJ1wiJyk7XHJcblxyXG4gICAgICAvLyBzZW5kIHN1YmZvcm0gdmlzaWJpbGl0eSBvbmx5IGlmIHRoZSBzdWJmb3JtIHdpdGggcHJvcGVydHkgXCJSZWZyZXNoV2hlbkhpZGRlbj1OXCIgYW5kIGl0IGlzIG5vdCB2aXNpYmxlLFxyXG4gICAgICAvLyBpLmUuIG5vdCBuZWVkZWQgcmVmcmVzaCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgISBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TVUJGT1JNX1ZJU0lCTEUgKyAnPVwiMFwiJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19DT1VOVEVSICsgJz1cIicgKyB0aGlzLmdldFRhc2soKS5nZXRDb3VudGVyKCkgKyAnXCInKTtcclxuXHJcbiAgICAgIC8vIFFDUiM1OTE5NzM6IGxhc3RSZWNpZCBhbmQgb2xkRmlyc3RSZWNJRCBzaG91bGQgYmUgc2VudCBieSBjbGllbnQuXHJcbiAgICAgIC8vIEluIGNhc2Ugb2YgbW91c2Ugc2Nyb2xsaW5nLCB3ZSBwYXJrIG9uIHRoZSBzYW1lIHJlY29yZCAoZG9uJ3QgbGVhdmUgdGhlIGN1cnJlbnQgcmVjb3JkKS4gU28gb24gc2VydmVyIHdlIGdldCBjdXJyIHJlY29yZCBvbiB3aGljaFxyXG4gICAgICAvLyB3ZSB3ZXJlIHBhcmtlZCBiZWZvcmUgc2Nyb2xsaW5nLiBTbyB3ZSBjYW4gbm90IHVzZSB0aGlzIGluZGV4IHRvIGZldGNoIHRoZSByZWNvcmQuXHJcbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBzZW5kIHRoZSBsYXN0IGZldGNoZWQgcmVjb3JkJ3MgaWR4IGZyb20gY2xpZW50IGluIGNhc2Ugb2Ygc2Nyb2xsIGRvd25cclxuICAgICAgLy8gYW5kIG9sZEZpcnN0UmVjSUQgKGZpcnN0IHJlY29yZCBvZiBsYXN0IHNlbnQgY2h1bmspIGluIGNhc2Ugb2Ygc2Nyb2xsIHVwLCBmcm9tIHdoaWNoIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIGNodW5rIG9mIHJlY29yZHMuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrICE9IG51bGwgJiYgIHRoaXMuX3Rhc2suR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkVMT0FEX1ZJRVcpLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0xBU1RfUkVDX0lEICsgJz1cIicgK1xyXG4gICAgICAgICAgKHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5nZXRTaXplKCkgLSAxKS5nZXRJZCgpKSArICdcIicpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT0xEX0ZJUlNUX1JFQ19JRCArICc9XCInICtcclxuICAgICAgICAgIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCkuZ2V0SWQoKSArICdcIicpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gc2VuZCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCByZWMgaW4gdGhlIGZvcm1zIHRhYmxlLlxyXG4gICAgICAvLyBpdCBjYW4gYmUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGtlZXAgdGhlIHJlY29yZCBpbiB0aGlzIHBvc2l0aW9uIGFmdGVyIHRoZSB2aWV3IHJlZnJlc2guXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMSkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQ19QT1NfSU5fRk9STSArICc9XCInICtcclxuICAgICAgICAgICAgZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCkgKyAnXCInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcblxyXG4gICAgICAvLyBBZGQgVXNlciBSYW5nZXNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0UmFuZ2UgfHwgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JBTkdFUyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0UmFuZ2UpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLkNMRUFSX1JBTkdFICsgJz1cIjFcIicpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuUmVzZXRSYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2UsIHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzLCBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncy5DbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIExvY2F0ZXNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlIHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRMb2NhdGUpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLkNMRUFSX0xPQ0FURVMgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5SZXNldExvY2F0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlckxvY3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2UsIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzLkNsZWFyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyTG9jcyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIFNvcnRzXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFNvcnQgfHwgdGhpcy5nZXRUYXNrKCkuVXNlclNvcnRzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRTb3J0KSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5DTEVBUl9TT1JUUyArICc9XCIxXCInKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlJlc2V0U29ydCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlclNvcnRzICE9IG51bGwpXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5idWlsZFhNTEZvclNvcnRzKG1lc3NhZ2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNlbmQgZGVsZXRlZCBjYWNoZSBlbnRyaWVzXHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgbGV0IGRlbExpc3Q6IFN0cmluZyA9IHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmdldERlbGV0ZWRMaXN0VG9YTUwoKTtcclxuICAgICAgICBpZiAoZGVsTGlzdCAhPT0gJycpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREVMX0xJU1QpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQgKyAnPVwiJyArIHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpICsgJ1wiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFTU9WRSArICc9XCInICsgZGVsTGlzdCArICdcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBhY3RpdmUgZGF0YXZpZXcgaXMgaW4gdGhlIGRlbHRlZGUgbGlzdCBtYXJrIGl0IGFzIHVuLXZhbGlkIHNvXHJcbiAgICAgICAgICAvLyBpdCB3b250IGVudGVyIHRoZSBjYWNoZSBvbiByZXR1cm4gZnJvbSBzZXJ2ZXJcclxuICAgICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5pc0RlbGV0ZWQodGhpcy5fZHZQb3NWYWx1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyRGVsZXRlZExpc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBkYXRhIGNvbnRyb2wgdmFsdWVzXHJcbiAgICAgIGxldCBkY1ZhbEtleXM6IHN0cmluZ1tdID0gdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5LZXlzO1xyXG5cclxuICAgICAgZGNWYWxLZXlzLmZvckVhY2goKGRjVmFsS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBkY3YgPSB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLmdldF9JdGVtKGRjVmFsS2V5KTtcclxuXHJcbiAgICAgICAgaWYgKCFkY3YuSGFzUmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQ19WQUxTKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgJz1cIicgKyBkY3YuZ2V0SWQoKSArICdcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRU1PVkUgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uUmVtb3ZlKGRjVmFsS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsKVxyXG4gICAgICAgIGN1cnJSZWNEZWxldGVkID0gKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGVcclxuICAgICAgICAgICYmIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNvcmQodGhpcy5DdXJyUmVjLmdldElkKCkpICE9IG51bGwgJiYgdGhpcy5DdXJyUmVjLlNlbmRUb1NlcnZlcik7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgY3VycmVudCB1c2VyIGV2ZW50IGJlaW5nIGhhbmRsZWQgaGFzIEZvcmNlIGV4aXQgPSAnUHJlIFJlY29yZCBVcGRhdGUnLCB0aGVuXHJcbiAgICAgIC8vIGRvIG5vdCBhZGQgY3VycmVudCByZWNvcmQgdG8gdGhlIG1vZGlmaWVkIHJlY29yZHMgbGlzdC4gV2UgYW55d2F5IHNlbmQgY3VycmVudFxyXG4gICAgICAvLyByZWNvcmQgc2VwYXJhdGVseS5cclxuICAgICAgbGV0IHNraXBDdXJyUmVjOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSkgIT0gbnVsbClcclxuICAgICAgICBza2lwQ3VyclJlYyA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRoaXMuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5idWlsZFhNTCggbWVzc2FnZSwgc2tpcEN1cnJSZWMsIHRoaXMuQ3VyclJlYy5nZXRJZCgpKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsLmNsZWFyTW9kZSgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHNraXBDdXJyUmVjICYmIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChpKS5nZXRJZCgpID09PSB0aGlzLkN1cnJSZWMuZ2V0SWQoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjQnlJZHgoaSkuY2xlYXJGbGFnc0hpc3RvcnkoKTtcclxuICAgICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIucmVtb3ZlUmVjb3JkKGkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwgJiYgIWN1cnJSZWNEZWxldGVkKSB7XHJcblxyXG4gICAgICAgIC8vIFdoZW4gd2UgcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgb25jZSBpdCBpcyBkaXNjb25uZWN0ZWQsIHNlcnZlciB3aWxsIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGFuZFxyXG4gICAgICAgIC8vIHRoZXJlZm9yZSBNUCB2YXJpYWJsZXMgYXJlIHdpdGggdGhlaXIgaW50aWFsIChlbXB0eSkgdmFsdWUgYW5kIG5vdCB3aXRoIHRoZWlyIHJlYWwgdmFsdWVzLlxyXG4gICAgICAgIC8vIFNvLCB3ZSBtdXN0IGFsd2F5cyBzZW5kIE1haW4gcHJvZ3JhbSdzIGZpZWxkJ3MgbGF0ZXN0ICB2YWx1ZXMgdG8gdGhlIHNlcnZlci5cclxuICAgICAgICBsZXQgZm9yY2VCdWlsZDogYm9vbGVhbiA9ICh0aGlzLl90YXNrLmlzTWFpblByb2coKSAmJiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpKTtcclxuICAgICAgICB0aGlzLkN1cnJSZWMuYnVpbGRYTUwobWVzc2FnZSwgdHJ1ZSwgZm9yY2VCdWlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgNzc5OTgyIGlmIHdlIGhhdmUgbWFpbiBwcm9nIHdpdGggbm8gc2VsZWN0J3Mgc2VuZCB0aGUgaW52b2tlciBhbmQgcGFyZW50IF90YXNrXHJcbiAgICBlbHNlIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZPS0VSX0lEICsgJz1cIicgKyBpbnZva2luZ1Rhc2tUYWcgKyAnLCcgKyBzZXJ2ZXJQYXJlbnQgKyAnXCInICtcclxuICAgICAgICBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICAgIG1lc3NhZ2UuQXBwZW5kKCdcXG4gICAgICA8LycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFJlY29yZCBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlY29yZCA8L3JldHVybnM+XHJcbiAgZ2V0Q3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgaWYgKHRoaXMuQ3VyclJlYyA9PT0gbnVsbCAmJiB0aGlzLl9jdXJyUmVjSWQgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnRGF0YVZpZXcuZ2V0Q3VyclJlYygpOiByZWNvcmQgJyArIHRoaXMuX2N1cnJSZWNJZCArICcgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUmVjb3JkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIDwvcmV0dXJucz5cclxuICBnZXRQcmV2Q3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFJlY29yZCBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE9yaWdpbmFsUmVjKCk6IFJlY29yZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuX29yaWdpbmFsID09PSBudWxsIHx8IHRoaXMuX29yaWdpbmFsLmdldElkKCkgIT09IHRoaXMuQ3VyclJlYy5nZXRJZCgpKVxyXG4gICAgICByZXR1cm4gdGhpcy5DdXJyUmVjO1xyXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByZWNvcmQgLSByZXR1cm5zIHRydWUgb24gc3VjY2Vzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPnRoZSByZWNvcmQgaWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbXB1dGVcIj5pZiB0cnVlIHRoZW4gZXhlY3V0ZSBjb21wdXRlIGZvciB0aGUgbmV3IHJlY29yZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFzeW5jIHNldEN1cnJSZWMoaWQ6IG51bWJlciwgY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgICBpZiAoaWQgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBsZXQgbmV3SWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChpZCk7XHJcblxyXG4gICAgICBpZiAobmV3SWR4ID09PSAtMSlcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IG51bGw7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgaWdub3JlQ3VyclJlYzogYm9vbGVhbiA9IHRoaXMuX2N1cnJSZWNJZCA9PT0gSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsICFpZ25vcmVDdXJyUmVjLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaWQgIT09IG9sZFJlY0lkKVxyXG4gICAgICAgICAgICB0aGlzLnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBkbyBub3QgcG9pbnQgdG8gYW55IGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIHRoaXMuQ3VyclJlYyA9IG51bGw7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy5fY3VyclJlY0lkID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBjdXJyZW50IHJlY29yZCBpbmRleCBhbmQgcmV0dXJucyB0cnVlIGZvciBzdWNjZXNzXHJcbiAgLy8vICAgVXNlIHRoZSBNR19EQVRBVklFV19GSVJTVF9SRUNPUkQgYW5kIE1HX0RBVEFWSUVXX0xBU1RfUkVDT1JEIGNvbnN0YW50c1xyXG4gIC8vLyAgIHRvIHJldHJpZXZlIHRoZSBmaXJzdCBvciB0aGUgbGFzdCByZWNvcmQgcmVzcGVjdGl2ZWx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld0lkeFwiPnRoZSBuZXcgaW5kZXggPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+aWYgdHJ1ZSB0aGVuIGRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkIHdoZW4gdGhlIHJlY29yZCB3YXMgY2hhbmdlZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmlmIHRydWUgYWxsIHRoZSBvcGVyYXRpb25zIGFyZSBkb25lIGlzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21wdXRlXCI+aWYgdHJ1ZSB0aGVuIGV4ZWN1dGUgY29tcHV0ZSBmb3IgdGhlIG5ldyByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld0Rpc3BsYXlMaW5lXCI+dG8gdXBkYXRlIGZvcm0gPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUmVjQnlJZHgobmV3SWR4OiBudW1iZXIsIGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBjb21wdXRlOiBib29sZWFuLCBuZXdEaXNwbGF5TGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFJlY0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxO1xyXG4gICAgbGV0IG9sZEZpcnN0UmVjOiBSZWNvcmQsIG5leHRSZWM6IFJlY29yZDtcclxuXHJcbiAgICAvLyBRQ1IgIzk4NDk2MDogdGhlIHZhcmlhYmxlIHJlY29yZFN1ZmYgaXMgdXNlZCB0byByZWNvZ25pemUgaWYgd2UgaGF2ZSBwcmVzc2VkXHJcbiAgICAvLyBjdHJsK2hvbWUgb3IgY3RybCtlbmQgaW4gdGhlc2UgY2FzZXMgd2UgbXVzdCBpbml0aWF0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAvLyB0aGUgY29ycmVjdCB3YXkgdG8gZG8gdGhpcyBpcyB1c2luZyB0aGUgZG9TdWZmaXggcGFyYW1ldGVyIGJ1dCBzaW5jZSBpdCBpcyB1c2VkXHJcbiAgICAvLyBpbiBhIGxvdCBvZiBjYXNlcyBzb21ldGltZSBub3QgaW4gYSBjb3JyZWN0IHdheSwgZm9yY2luZyByZWNvcmQgc3VmZml4XHJcbiAgICAvLyB1c2luZyBkb1N1ZmZpeCB3aWxsIGNhdXNlIG1hbnkgY2hhbmdlcyBpbiB0aGUgY29kZS5cclxuICAgIGxldCByZWNvcmRTdWZmOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5ld0lkeCA9PT0gQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCkge1xyXG5cclxuICAgICAgLy8gQXMgbW92aW5nIHRvIGZpcnN0IHJlY29yZCBpbiB0aGUgdmlldywgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3IHNob3VsZCBiZSAwLlxyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKSkge1xyXG4gICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzRmlyc3QpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgYWxyZWFkeSB0aGUgZmlyc3QgcmVjb3JkIG9mIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+PSAwIHx8IHRoaXMuX2N1cnJSZWNJZHggPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICBuZXdJZHggPSAwO1xyXG5cclxuICAgICAgICAgIC8vIGN0cmwraG9tZSB3YXNlIHByZXNzZWRcclxuICAgICAgICAgIHJlY29yZFN1ZmYgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuVE9QKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX1RPUCwgZG9TdWZmaXgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuZXdJZHggPT09IENvbnN0YW50cy5NR19EQVRBVklFV19MQVNUX1JFQ09SRCkge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNMYXN0KSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIGFscmVhZHkgdGhlIGxhc3QgcmVjb3JkIG9mIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA8PSBsYXN0UmVjSWR4KSB7XHJcbiAgICAgICAgICBuZXdJZHggPSBsYXN0UmVjSWR4O1xyXG4gICAgICAgICAgLy8gY3RybCtlbmQgd2FzIHByZXNzZWRcclxuICAgICAgICAgIHJlY29yZFN1ZmYgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmIGxhc3QgcmVjb3JkIGlzIG5vdCBpbiB0aGUgdmlldywgYW5kIGJlaW5nIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLCBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSBUb3RhbFJlY29yZHNDb3VudC4gQW5kIGFzIHRoaXMgY2h1bmsgZ2V0IGFkZGVkXHJcbiAgICAgICAgLy8gaW50byByZWNvcmRzIHRhYmxlLCB0aGUgUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3IHdpbGwgYmUgZGVjcmVtZW50ZWQgYnkgbm8gb2Ygcm93cyBpbiB2aWV3LlxyXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSwgd2Ugb3BlbiB0aGUgY3Vyc29yIHdpdGggcmV2ZXJzZSBkaXJlY3Rpb24gZm9yIHdoaWNoIGRvIG5vdCBicmluZyB0aGUgY291bnRzIGZyb20gZ2F0ZXdheS5cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKSlcclxuICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gdGhpcy5Ub3RhbFJlY29yZHNDb3VudDtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19EVl9CT1RUT00sIGRvU3VmZml4KTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbmNsdWRlc0xhc3QpXHJcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuQk9UVE9NKTtcclxuXHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgd2hpbGUgKCF0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIGZvcm0uZ2V0Um93c0luUGFnZSgpID49IHRoaXMuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcmVjb3JkIHdhcyBub3QgZm91bmQgYmV5b25kIHRoZSBUT1AgZW5kXHJcbiAgICBlbHNlIGlmIChuZXdJZHggPCAwKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0KVxyXG4gICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5UT1ApO1xyXG5cclxuICAgICAgb2xkRmlyc3RSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMCB8fCB0aGlzLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZG9TdWZmaXgpO1xyXG4gICAgICAvLyBpZiBubyByZWNvcmRzIGFuZCBpdHMgZmlyc3Qgc2ltdWxhdGUgc3RhcnQgdGFibGVcclxuICAgICAgZWxzZSBpZiAodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDAgJiYgdGhpcy5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19EVl9UT1AsIGRvU3VmZml4KTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoKSB3cm9uZyBvcHRpb24nKTtcclxuXHJcbiAgICAgIC8vIGdldCB0aGUgbmV3IGluZGV4IG9mIHRoZSByZWNvcmQgd2hpY2ggd2FzIGZpcnN0IGJlZm9yZSB0aGUgZmV0Y2hcclxuICAgICAgbGV0IG9sZEZpcnN0TmV3SWR4OiBudW1iZXIgPSBvbGRGaXJzdFJlYyAhPSBudWxsXHJcbiAgICAgICAgPyB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChvbGRGaXJzdFJlYy5nZXRJZCgpKVxyXG4gICAgICAgIDogdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcbiAgICAgIGlmIChvbGRGaXJzdE5ld0lkeCAhPT0gMClcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChvbGRGaXJzdE5ld0lkeCArIG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgbm90IGZvdW5kIGJleW9uZCB0aGUgQk9UVE9NIGVuZFxyXG4gICAgZWxzZSBpZiAobmV3SWR4ID4gbGFzdFJlY0lkeCkge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNMYXN0KVxyXG4gICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG4gICAgICAvL3RoZSByb3cgaXMgYWN0dWFsbHkgbm90IGNyZWF0ZWQgeWV0IGluIFVJLCBpdCB3aWxsIGJlIGNyZWF0ZWQgb25seSBhZnRlciB3ZSBicmluZyB0aGUgbmV3IGNodW5rXHJcbiAgICAgIGlmICh0aGlzLmdldEZvcm0oKS5pc1Jvd0NyZWF0ZWQobmV3SWR4KSlcclxuICAgICAgICB0aGlzLmdldEZvcm0oKS5tYXJrUm93Tk9UQ3JlYXRlZChuZXdJZHgpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9ORVhULCBkb1N1ZmZpeCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgIGlzQ3JlYXRlTGluZUFib3ZlQWN0IDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGxhc3RFdmVudCA6IG51bWJlciA9IGlzTnVsbE9yVW5kZWZpbmVkKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkpID8gMCA6XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgaWYgKG5ld0lkeCA+PSAwICYmICF0aGlzLmdldFRhc2soKS50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJlxyXG4gICAgbGFzdEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSkge1xyXG4gICAgICBpZiAoKCg8VGFzaz50aGlzLmdldFRhc2soKSkuZ2V0SW5DcmVhdGVMaW5lKCkpICYmIG5ld0lkeCA9PSB0aGlzLl9jdXJyUmVjSWR4KSB7XHJcbiAgICAgICAgbGV0IG5ld1JlYzogUmVjb3JkID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChuZXdJZHgpO1xyXG4gICAgICAgIGlmIChuZXdSZWMuZ2V0TW9kZSgpID09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICBpc0NyZWF0ZUxpbmVBYm92ZUFjdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIyA5ODQ5NjAgLSBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlhYmxlIHJlY29yZFN1ZmYgaW4gdGhlIHRvcCBvZiB0aGlzIG1ldGhvZFxyXG4gICAgaWYgKHJlY29yZFN1ZmYgfHwgaXNDcmVhdGVMaW5lQWJvdmVBY3QgfHwgbmV3SWR4ICE9PSB0aGlzLl9jdXJyUmVjSWR4IHx8IGlnbm9yZUN1cnJSZWMgJiYgY29tcHV0ZSkge1xyXG4gICAgICBpZiAoIWlnbm9yZUN1cnJSZWMgJiYgZG9TdWZmaXggJiYgdGhpcy5DdXJyUmVjICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgb2xkUmVjVGFiU2l6ZTogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIG5leHRSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KG5ld0lkeCk7XHJcbiAgICAgICAgaWYgKG5leHRSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSlcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgbGV0IG9yZ1RvcFJlY0lkeDogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICh0aGlzLl90b3BSZWNJZHhNb2RpZmllZCkge1xyXG4gICAgICAgICAgICBvcmdUb3BSZWNJZHggPSB0aGlzLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdG9wUmVjSWR4TW9kaWZpZWQpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KG9yZ1RvcFJlY0lkeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlJFQ19TVUZGSVhfRkFJTEVEKTtcclxuXHJcbiAgICAgICAgLy8gUUNSICMyMDQ2OiB3aGVuIHRoZSBuZXh0IHJlY29yZCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBvbmUgd2Ugc2hvdWxkXHJcbiAgICAgICAgLy8gYWxsb3cgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVjb3JkIHByZWZpeCBieSBzZXR0aW5nIHRoZSBfdGFzayBsZXZlbCB0byBUQVNLLlxyXG4gICAgICAgIGlmIChuZXh0UmVjICE9PSB0aGlzLkN1cnJSZWMgJiYgdGhpcy5nZXRUYXNrKCkuZ2V0QWZ0ZXJSZXRyeSgpKVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHJlY29yZHMgdGFibGUgc2l6ZSB3YXMgZGVjcmVhc2VkIGR1cmluZyBoYW5kbGluZyB0aGVcclxuICAgICAgICAvLyByZWNvcmQgc3VmZml4IChlLmcuIGNhbmNlbCBlZGl0KSBhbmQgdGhlIHVzZXIgdHJpZXMgdG8gbW92ZSB0b1xyXG4gICAgICAgIC8vIGEgcmVjb3JkIHdpdGggYSBoaWdoZXIgaW5kZXggdGhlbiB3ZSBzaG91bGQgYWxzbyBkZWNyZWFzZSB0aGVcclxuICAgICAgICAvLyBuZXdJZHggdG8gcmVmbGVjdCB0aGUgY2hhbmdlXHJcbiAgICAgICAgaWYgKG9sZFJlY1RhYlNpemUgLSAxID09PSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAmJiB0aGlzLl9jdXJyUmVjSWR4IDwgbmV3SWR4KVxyXG4gICAgICAgICAgbmV3SWR4LS07XHJcblxyXG4gICAgICAgIC8vIHRoZSBuZXcgY3VyciByZWMgbWF5IGJlIGFscmVhZHkgc2V0IGJ5IHRoZSBldmVudHMgY2hhaW4gdHJpZ2dlcmVkIGJ5IHRoZVxyXG4gICAgICAgIC8vIHJlY29yZCBzdWZmaXggYWJvdmUgLSBpbiB0aGF0IGNhc2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjb250aW51ZVxyXG4gICAgICAgIGlmIChuZXdJZHggPT09IHRoaXMuX2N1cnJSZWNJZHgpIHtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgOTE4OTgzIGNoYW5nZXMgdG8gdGhlIF90YXNrIG1vZGUgbXVzdCBiZSBkb25lIGJlZm9yZSByZWNvbXB1dGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuQ3VyclJlYy5pc05ld1JlYygpICYmXHJcbiAgICAgICAgICAgICF0aGlzLl90YXNrLmdldEZvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQ3VyclJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgobmV3SWR4KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIERhdGFWaWV3LnNldEN1cnJSZWNCeUlkeCgpIGN1cnJlbnQgcmVjb3JkIG5vdCBmb3VuZCEnKTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IHRoaXMuQ3VyclJlYy5nZXRJZCgpO1xyXG4gICAgICB0aGlzLl9jdXJyUmVjSWR4ID0gbmV3SWR4O1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gUUNSICMxMDc5MjYsIHdlIG11c3QgdXBkYXRlIGRpc3BsYXkgbGluZSBoZXJlLCBzaW5jZSBjdXJyUmVjQ29tcHV0ZSB3aGljaCBpcyBhY3RpdmF0ZWQgbGF0ZXJcclxuICAgICAgICAvLyBtYXkgZ28gdG8gc2VydmVyIGFuZCBjYXVzZSByZWZyZXNoIGRpc3BsYXkuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhZGRpbmcgbmV3IG5vZGUgdG8gdGhlIHRyZWUsIHRoZSBub2RlIG11c3QgYmUgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHRyZWUuXHJcbiAgICAgICAgaWYgKG5ld0Rpc3BsYXlMaW5lID09PSBTRVRfRElTUExBWUxJTkVfQllfRFYpIHtcclxuICAgICAgICAgICg8TWdGb3JtPih0aGlzLl90YXNrLmdldEZvcm0oKSkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZSA9IG5ld0Rpc3BsYXlMaW5lO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFFDUiA5MTg5ODMgY2hhbmdlcyB0byB0aGUgX3Rhc2sgbW9kZSBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlY29tcHV0ZVxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSAmJlxyXG4gICAgICAgICF0aGlzLl90YXNrLmdldEZvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgIGlmIChjb21wdXRlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY29tcHV0ZSBBTEwgdGhlIGluaXQgZXhwcmVzc2lvbnMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIC0gY2FsbCB0aGlzIG1ldGhvZCB3aGVuXHJcbiAgLy8vICAgZW50ZXJpbmcgYSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VDbGllbnRDb21wdXRlXCI+aWYgVFJVRSBmb3JjZXMgdGhlIGNsaWVudCB0byBjb21wdXRlIHRoZSByZWNvcmQgZXZlbiBpZiBpdCBpcyBmbGFnZ2VkXHJcbiAgLy8vICAgYXMgXCJzZXJ2ZXIgY29tcHV0ZWRcIi5cclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBjdXJyUmVjQ29tcHV0ZShmb3JjZUNsaWVudENvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKGZhbHNlLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZShmYWxzZSwgZm9yY2VDbGllbnRDb21wdXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlcyBhIHJlcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2F2ZU9yaWdpbmFsKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLkN1cnJSZWMuTW9kaWZpZWQpXHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZldGNoIGEgY2h1bmsgb2YgcmVjb3JkcyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoY2h1bmtJZDogc3RyaW5nLCBkb1N1ZmZpeDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vIFFDUiAjNDMwMTM0OiBpZiB0aGUgc2VydmVyIHNlbnQgdXMgcmVjb3JkcyBmZXdlciB0aGFuIHRoZSBudW1iZXIgdGhhdCBmaXRzIGludG8gYSB0YWJsZVxyXG4gICAgLy8gdGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBzZXJ2ZXIgYW5kIG11c3QgcmVmcmVzaCB0aGUgc2NyZWVuLlxyXG4gICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChkb1N1ZmZpeCAmJiB0aGlzLkN1cnJSZWMgIT0gbnVsbCkge1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0aGlzLl90YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuUkVDX1NVRkZJWF9GQUlMRUQpO1xyXG4gICAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuc2V0U3VmZml4RG9uZSgpOyAvLyBRQ1IgNzU4NjM5XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGV2ZW50Q29kZTogbnVtYmVyO1xyXG4gICAgbGV0IGNsaWVudFJlY0lkOiBudW1iZXIgPSB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgICBzd2l0Y2ggKGNodW5rSWQpIHtcclxuICAgICAgY2FzZSBDSFVOS19EVl9UT1A6XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX1RPUDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19EVl9CT1RUT006XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX0JPVFRPTTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9QUkVWOlxyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5GaXJzdFJlY29yZCA9PSBudWxsID8gMCA6IHRoaXMuRmlyc3RSZWNvcmQuZ2V0SWQoKTtcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FDSEVfUFJFVjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9ORVhUOlxyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQUNIRV9ORVhUO1xyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5MYXN0UmVjb3JkID09IG51bGwgPyAwIDogdGhpcy5MYXN0UmVjb3JkLmdldElkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5mZXRjaENodW5rRnJvbVNlcnZlcigpIHVua25vd24gY2h1bmsgaWQ6ICcgKyBjaHVua0lkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgY21kOiBFdmVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGhpcy5fdGFzay5nZXRUYXNrVGFnKCksIGV2ZW50Q29kZSk7XHJcbiAgICBjbWQuQ2xpZW50UmVjSWQgPSBjbGllbnRSZWNJZDtcclxuICAgIGF3YWl0IHRoaXMuZ2V0VGFzaygpLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pbmNsdWRlc0xhc3QpXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfTkVYVCwgZmFsc2UpO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuX2luY2x1ZGVzRmlyc3QpXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggZXhpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjSWR4XCI+aW5kZXggdG8gY2hlY2sgPC9wYXJhbT5cclxuICByZWNFeGlzdHMocmVjSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBsYXN0UmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7XHJcbiAgICByZXR1cm4gcmVjSWR4ID49IDAgJiYgcmVjSWR4IDw9IGxhc3RSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBpZiB0aGUgY3VycmVudCBmaXJzdCByZWNvcmQgZXhpc3RcclxuICAvLy8gICBpbiBjYXNlIHRoZXJlIGlzIG5vIGxvY2F0ZSBjaGVjayBpbmNsdWRlIGZpcnN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjaGVja0ZpcnN0KGxvY2F0ZUZpcnN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY29yZChsb2NhdGVGaXJzdCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjdXJyZW50IHJlY29yZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVjb3JkIGluZGV4IDwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjSWR4KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKCF0aGlzLnNldEN1cnJSZWModGhpcy5fY3VyclJlY0lkLCB0cnVlKSkge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coJ0RhdGFWaWV3LmdldEN1cnJSZWNJZHgoKTogX3Rhc2sgJyArXHJcbiAgICAgICAgICAodGhpcy5nZXRUYXNrKCkpLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgK1xyXG4gICAgICAgICAgJywgcmVjb3JkICcgKyB0aGlzLl9jdXJyUmVjSWQgKyAnIG5vdCBmb3VuZCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBkYnZpZXdyb3dpZCBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyREJWaWV3Um93SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjLmdldERCVmlld1Jvd0lkeCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRvcCByZWNvcmQgaW5kZXggYW5kIHNhdmVzIHRoZSBvbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VG9wUmVjSWR4XCI+dGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHRvcCByZWNvcmQgaW5kZXggPC9wYXJhbT5cclxuICBzZXRUb3BSZWNJZHgobmV3VG9wUmVjSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX29sZFRvcFJlY0lkeCA9IHRoaXMuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICB0aGlzLl90b3BSZWNJZHggPSBuZXdUb3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0b3AgcmVjb3JkIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BSZWNJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0b3AgcmVjb3JkIGluZGV4IG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgZm9yIHRvcFJlY0lkeE1vZGlmaWVkIDwvcGFyYW0+XHJcbiAgc2V0VG9wUmVjSWR4TW9kaWZpZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl90b3BSZWNJZHhNb2RpZmllZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGNodW5rIHNpemUgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENodW5rU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NodW5rU2l6ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgc2F2ZWQgdmFsdWUgb2YgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc3RvcmVUb3BSZWNJZHgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90b3BSZWNJZHggPSB0aGlzLl9vbGRUb3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlcyBhbGwgdGhlIHJlY29yZHMgZnJvbSB0aGUgRGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5yZW1vdmVBbGwoKTtcclxuICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICBpZiAobWdGb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICB0aGlzLl90YXNrLmdldEZvcm0oKS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIucmVtb3ZlQWxsKCk7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplIHRoZSBjbGFzcyBtZW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0ZpcnN0ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNPbmVXYXlLZXkgPSBmYWxzZTtcclxuICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKGZhbHNlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgdGhlIHN1YkZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAgYXN5bmMgY29tcHV0ZVN1YkZvcm1zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgZHVlIHRvIHVwZGF0ZXNcclxuICAgICBpZiAoYXdhaXQgdGhpcy5nZXRUYXNrKCkucHJlcGFyZUNhY2hlKHRydWUpKSB7XHJcblxyXG4gICAgICAgLy8gb25lIG9mIHRoZSBuZWVkZWQgZC52IHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlXHJcbiAgICAgICBpZiAoIWF3YWl0IHRoaXMuZ2V0VGFzaygpLnRlc3RBbmRTZXQodHJ1ZSkpXHJcbiAgICAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgICAgfVxyXG4gICAgIGVsc2VcclxuICAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViRm9ybXNcIj5pZiB0cnVlIHRoZSBhIHN1YkZvcm1zIGNvbXB1dGUgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNsaWVudENvbXB1dGVcIj5pZiBUUlVFIGZvcmNlcyB0aGUgY2xpZW50IHRvIGNvbXB1dGUgdGhlIHJlY29yZCBldmVuIGlmIGl0IGlzIGZsYWdnZWRcclxuICAvLy8gICBhcyBcInNlcnZlciBjb21wdXRlZFwiLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZShzdWJGb3JtczogYm9vbGVhbiwgZm9yY2VDbGllbnRDb21wdXRlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG1wUmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IGNvbXB1dGVCeVNlcnZlcjogYm9vbGVhbiA9ICF0aGlzLmNvbXB1dGVCeUNsaWVudCgpO1xyXG4gICAgbGV0IG9yZ0NvbXB1dGVCeTogc3RyaW5nID0gdGhpcy5fY29tcHV0ZUJ5O1xyXG4gICAgLyonQycqL1xyXG4gICAgaWYgKGZvcmNlQ2xpZW50Q29tcHV0ZSlcclxuICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gQ09NUFVURV9ORVdSRUNfT05fQ0xJRU5ULyonQycqLztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0SW5Db21wdXRlKHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFzdWJGb3Jtcykge1xyXG4gICAgICAgIGlmICh0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAvKidDJyovICYmICFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpLyonQycqLztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpLyonTScqLztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBnZXRSZWNvcmREYXRhOiBib29sZWFuID0gY29tcHV0ZUJ5U2VydmVyO1xyXG4gICAgICAvLyBmb3IgbmV3bHkgY3JlYXRlZCByZWNvcmRzIC0gZ28gdG8gdGhlIHNlcnZlciAoaWYgdGhleSB3ZXJlIG5vdCBjb21wdXRlZCBhbHJlYWR5KVxyXG4gICAgICBpZiAoc3ViRm9ybXMgfHwgKGdldFJlY29yZERhdGEgJiYgIXRoaXMuQ3VyclJlYy5pc0NvbXB1dGVkKCkgJiYgIWZvcmNlQ2xpZW50Q29tcHV0ZSkpIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb21wdXRlRXZlbnRDb21tYW5kKHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpLCBzdWJGb3JtcywgdGhpcy5fY3VyclJlY0lkKTtcclxuICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNvbW1hbmQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFFDUiAjOTIxNDc1IC0gcmVsaW5rIGR1cmluZyBjb21wdXRlIGRlc3Ryb3lzIHZhbHVlcyBvZiB2aXJ0dWFsIGZpZWxkcyB3aXRoIG5vIGluaXQgZXhwLlxyXG4gICAgICAgIC8vIHRodXMgd2Ugc2F2ZSB0aGVtIGJlZm9yZSB0aGUgY29tcHV0ZSBhbmQgcmVzdG9yZSB0aGVtIGR1cmluZyB0aGUgbG9vcC5cclxuICAgICAgICBpZiAoZ2V0UmVjb3JkRGF0YSkge1xyXG4gICAgICAgICAgdG1wUmVjID0gbmV3IFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSwgdGhpcyk7XHJcbiAgICAgICAgICB0bXBSZWMuSW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgICAgdG1wUmVjLnNldEluaXRpYWxGbGRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNldFNlcnZlclJjbXAoZmFsc2UpO1xyXG4gICAgICAgIGxldCBmcm9tOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1JZHgoKTtcclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGkpO1xyXG4gICAgICAgICAgaWYgKGdldFJlY29yZERhdGEgJiYgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNlcnZlclJjbXBEb25lKCkgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLlZpckFzUmVhbCAmJiAhZmxkLmhhc0luaXRFeHAoKSkge1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlYzI6IFJlY29yZCA9IHRoaXMuQ3VyclJlYztcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjID0gdG1wUmVjO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGZsZC50YWtlVmFsRnJvbVJlYygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRoaXMuQ3VyclJlYyA9IGN1cnJSZWMyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9UT0RPOiBDaGVjayBpZiB3ZSBjYW4gdXNlIGFub3RoZXIgKG1heWJlLCBuZXcpIGZ1bmN0aW9uIHRvIGdldCB0aGUgZGF0YSB3aGlsZSB0cmFuc2ZlcnJpbmcgdGhlbSB0byBVSSBpbnN0ZWFkIG9mIGNvbXB1dGUoKS5cclxuICAgICAgICAgIGlmICghKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLlRyYW5zZmVycmluZ0RhdGFUb0dVSSlcclxuICAgICAgICAgICAgYXdhaXQgZmxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRJbkNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0TGF0ZUNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICB0aGlzLl9jb21wdXRlQnkgPSBvcmdDb21wdXRlQnk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRSZWNvcmQoZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBuZXdDdXJyUmVjSWQ6IG51bWJlciA9ICgtLXRoaXMuX2xhc3RDcmVhdGVkUmVjSWQpO1xyXG4gICAgbGV0IG1vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQ7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hZGRSZWNvcmRfMShkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZmFsc2UsIG5ld0N1cnJSZWNJZCwgbW9kZSwgaXNDcmVsaW5lQWJvdmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZG9TdWZmaXhcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHN1ZmZpeCBvZiB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZ25vcmVDdXJyUmVjXCI+aWYgdHJ1ZSB0aGVuIGRvIHRoZSBzdWZmaXggb2YgdGhlIHByZXZpb3VzIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNGaXJzdFJlY29yZFwiPiBpcyBmaXJzdCByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld0N1cnJSZWNJZFwiPiBuZXcgcmVjb3JkIGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RlXCI+IG9wZXJhdGlvbiBtb2RlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIG5ldyByZWMgaW5kZXg8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRSZWNvcmRfMShkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbiwgaXNGaXJzdFJlY29yZDogYm9vbGVhbiwgbmV3Q3VyclJlY0lkOiBudW1iZXIsIG1vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcywgaXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cclxuICAgIC8vIGdpdmUgdGhlIG5ldyByZWNvcmQgYSBuZWdhdGl2ZSBpZFxyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbmV3IFJlY29yZChuZXdDdXJyUmVjSWQsIHRoaXMpO1xyXG4gICAgcmVjLkluaXRpYWxpemUoKTtcclxuICAgIHJlYy5zZXRJbml0aWFsRmxkVmFscyhmYWxzZSwgIWlzRmlyc3RSZWNvcmQpO1xyXG5cclxuICAgIGxldCBuZXdDdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKGlzQ3JlbGluZUFib3ZlKVxyXG4gICAge1xyXG4gICAgICBuZXdDdXJyUmVjSWR4ID0gKHRoaXMuX2N1cnJSZWNJZHggPj0gMFxyXG4gICAgICAgID8gdGhpcy5fY3VyclJlY0lkeFxyXG4gICAgICAgIDogMCk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBuZXdDdXJyUmVjSWR4ID0gKHRoaXMuX2N1cnJSZWNJZHggIT0gSW50MzIuTWluVmFsdWVcclxuICAgICAgICA/IHRoaXMuX2N1cnJSZWNJZHggKyAxXHJcbiAgICAgICAgOiAwKTtcclxuXHJcblxyXG4gICAgLy9sZXQgbmV3Q3VyclJlY0lkeDogbnVtYmVyID0gKHRoaXMuX2N1cnJSZWNJZHggIT09IEludDMyLk1pblZhbHVlKSA/XHJcbiAgICAgIC8vKHRoaXMuX2N1cnJSZWNJZHggKyAxKVxyXG4gICAgICAvLzogMDtcclxuXHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLmluc2VydFJlY29yZChyZWMsIG5ld0N1cnJSZWNJZHgpO1xyXG4gICAgcmVjLnNldE1vZGUobW9kZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGNvbXB1dGU6IGJvb2xlYW4gPSAhaXNGaXJzdFJlY29yZDtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3Q3VyclJlY0lkeCwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIEludDMyLk1pblZhbHVlKTtcclxuXHJcbiAgICAgIC8vIHdoaWxlIHdlIGluIGNyZWF0ZSBtb2RlIGRvbid0IHNldCByZXNldCB0byBfbmV3UmVjXHJcbiAgICAgIGlmIChpc0ZpcnN0UmVjb3JkICYmIHRoaXMuZ2V0VGFzaygpLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgcmVjLnNldE9sZFJlYygpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4ZWNwdGlvbikge1xyXG4gICAgICBpZiAoZXhlY3B0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgbmV3Q3VyclJlY0lkeCA9IC0xO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbignaW4gRGF0YVZpZXcuYWRkUmVjb3JkKCkgaW52YWxpZCBleGNlcHRpb24nKTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4ZWNwdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdDdXJyUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSB0aGUgY3VycmVudCByZWNvcmQgZnJvbSB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlbW92ZUN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IG9uRGVsZXRlOiBib29sZWFuOyAvLyB0cnVlIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgcmVjb3JkIGR1ZSB0byBkZWxldGUuIGZhbHNlIGlmIGR1ZSB0byBjYW5jZWwgb24gaW5zZXJ0XHJcblxyXG4gICAgaWYgKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiZcclxuICAgICAgIXRoaXMuZ2V0VGFzaygpLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpKSB7XHJcbiAgICAgIC8vIHRoZSByZWNvcmQgd2FzIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCBzbyBpdCBoYXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZVxyXG4gICAgICAvLyBtb2RpZmllZCByZWNvcmRzIHRhYmxlIChpZiBpdCBpcyBhbHJlYWR5IHRoZXJlKSBiZWNhdXNlIHRoZSBzZXJ2ZXJcclxuICAgICAgLy8gZG9lc24ndCBoYXZlIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgaXRcclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLnJlbW92ZVJlY29yZCh0aGlzLkN1cnJSZWMpO1xyXG4gICAgICBvbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIHJlY29yZHMgdGFibGUgdG8gdGhlIG1vZGlmaWVkIHRhYmxlXHJcbiAgICAgIHRoaXMuQ3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcbiAgICAgIG9uRGVsZXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuQ3VyclJlYy5yZW1vdmVSZWNGcm9tRGMoKTtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIucmVtb3ZlUmVjb3JkKHRoaXMuX2N1cnJSZWNJZHgpO1xyXG4gICAgdGhpcy5zZXRDaGFuZ2VkKHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRW1wdHkoKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICBhd2FpdCB0aGlzLk1vdmVUb0VtcHR5RGF0YXZpZXdJZkFsbG93ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3RGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuY2FsY0xpbmVUb01vdmUob25EZWxldGUpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG1nRm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgbWdGb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBpbmRleCBpcyBiZXlvbmQgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgLy8gdHJ5IHRvIHNldCBpdCB0byB0aGUgcHJlY2VkaW5nIHJlY29yZFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICBuZXdEaXNwbGF5TGluZSA9IG1nRm9ybS5nZXRQcmV2TGluZShuZXdEaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICBpZiAobWdGb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdEaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBhd2FpdCBtZ0Zvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3RGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vIG1vcmUgcmVjb3JkcyBpbiB0aGUgZGF0YXZpZXdcclxuICAgICAgICAgICAgLy8gb3Igbm8gbm9kZXMgaW4gdGhlIHRyZWVcclxuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlbW92ZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29yZFwiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlUmVjb3JkKHJlY29yZDogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChyZWNvcmQuZ2V0SWQoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RvcFJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fdG9wUmVjSWR4LS07XHJcbiAgICBpZiAodGhpcy5fb2xkVG9wUmVjSWR4ID4gcmVjSWR4KVxyXG4gICAgICB0aGlzLl9vbGRUb3BSZWNJZHgtLTtcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID4gcmVjSWR4KVxyXG4gICAgICB0aGlzLl9jdXJyUmVjSWR4LS07XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZVJlY29yZChyZWNvcmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBtb3ZlIHRvIGVtcHR5IGRhdGF2aWV3IGlmIGFsbG93ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIE1vdmVUb0VtcHR5RGF0YXZpZXdJZkFsbG93ZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpKVxyXG4gICAgICAgIHN1cGVyLnNldEVtcHR5RGF0YXZpZXcodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGRpc3BsYXkgbGluZSB0byBtb3ZlIGFmdGVyIGRlbGV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkRlbGV0ZVwiPnRydWUgaWYgd2UgYXJlIHJlbW92aW5nIHRoZSByZWNvcmQgZHVlIHRvIGRlbGV0ZS4gZmFsc2UgaWYgZHVlIHRvIGNhbmNlbCBvbiBpbnNlcnRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbGNMaW5lVG9Nb3ZlKG9uRGVsZXRlOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBuZXdEaXNwbGF5TGluZTogbnVtYmVyO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgcmVtb3ZlZCBkdWUgdG8gaXRzIGRlbGV0aW9uLCB3ZSBuZWVkIHRvIGdvdCB0byB0aGUgbmV4dCByZWNvcmQgaW4gdGhlIHZpZXcgLVxyXG4gICAgLy8gbm93IHRoYXQgd2UgZGVsZXRlZCB0aGUgY3VycmVudCByZWNvcmQsIHRoZSBpbmRleCBvZiB0aGUgbmV4dCByZWNvcmQgaXMgdGhlIHNhbWUgaW5kZXggdGhhdCB3YXNcclxuICAgIC8vIG9mIHRoZSByZWNvcmQgdGhhdCB3YXMgZGVsZXRlZC5cclxuXHJcbiAgICBpZiAob25EZWxldGUpXHJcbiAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeDtcclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyAjNzUwMTkwIFNoYXlhXHJcbiAgICAgIC8vIG1vdmUgdG8gdGhlIFBSRVYgcmVjb3JkIGFmdGVyIGNhbmNlbFxyXG4gICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+IDApXHJcbiAgICAgICAgbmV3RGlzcGxheUxpbmUgPSB0aGlzLl9jdXJyUmVjSWR4IC0gMTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeDtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB2YWx1ZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgdGhpcy5TZXRJbmNsdWRlc0ZpcnN0KHRydWUpO1xyXG4gICAgdGhpcy5TZXRJbmNsdWRlc0xhc3QodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FuY2VsIHRoZSBlZGl0aW5nIG9mIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgcmVzdG9yZSB0aGUgb2xkIHZhbHVlcyBvZlxyXG4gIC8vLyAgIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlYWxcIj5pZiB0cnVlIG9ubHkgcmVzdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgcmVhbCBmaWVsZHMuIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXB1dGVVbmtub3duc1wiPnJlLXBlcmZvcm0gdW5rbm93biByZWNvbXB1dGVzLiA8L3BhcmFtPlxyXG4gIGFzeW5jIGNhbmNlbEVkaXQob25seVJlYWw6IGJvb2xlYW4sIHJlY29tcHV0ZVVua25vd25zOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGVtcEN1cnJSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgcmVjUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGluRW5kVGFzazogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrO1xyXG5cclxuICAgIC8vIFFDUiAjMzYyOTAzIC0gQXQgX3Rhc2sgc3VmZml4LCB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBsYXN0IHZhbHVlcyBvZiB0aGUgdmlydHVhbHMuXHJcbiAgICBpZiAoaW5FbmRUYXNrKVxyXG4gICAgICBvbmx5UmVhbCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5DdXJyUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgaWYgKCh0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiAodGhpcy5fcmVjb3Jkc1RhYiA9PT0gbnVsbCB8fCB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMSkpIHx8ICF0aGlzLkhhc01haW5UYWJsZSkge1xyXG5cclxuICAgICAgICAvLyBkZWZlY3QgMTIxOTY4LiBXaGVuIGZyb20gdGhlIHBhcmVudCB0YXNrIFwiVmlld1JlZnJlc2hcIiBvciBcIkNhbmNlbFwiIGFyZSBkb25lIGFuZCB0aGUgc3ViZm9ybSBpcyBpbiBDcmVhdGUgbm9kZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgc3ViZm9ybSBoYXMgbm8gcmVjb3JkcywgX29yaWdpbmFsIGlzIG51bGwuIFNvIHBhc3MgaXQuXHJcbiAgICAgICAgaWYgKHRoaXMuX29yaWdpbmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHRoaXMuX29yaWdpbmFsLCBvbmx5UmVhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ3VyclJlYygpO1xyXG4gICAgICAgIHJlY1JlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpOyAvLyBtdXN0IGNvcHkgYWdhaW4gdG8gcHJldmVudCBhbHRlcmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIChjdXJyUmVjLm1vZGlmaWVkKCkpXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLkN1cnJSZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICBsZXQgY3VyckN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgIGlmIChjdXJyQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGN1cnJDdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVjb21wdXRlVW5rbm93bnMpXHJcbiAgICAgICAgdGVtcEN1cnJSZWMgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcblxyXG4gICAgICAvLyBBVFRFTlRJT04gISEhXHJcbiAgICAgIC8vIHdlIGRvbid0IHN0ZXAgb3ZlciB0aGUgY3VyclJlYyByZWZlcmVuY2Ugd2l0aCB0aGUgb3JpZ2luYWwgcmVjb3JkXHJcbiAgICAgIC8vIHRvIGFzc3VyZSB0aGF0IGlmIHRoaXMgcmVjb3JkIGlzIGJvdGggaW4gdGhlIHJlY29yZHMgdGFibGUgYW5kIGluXHJcbiAgICAgIC8vIHRoZSBtb2RpZmllZCB0YWJsZSB0aGVzZSB0YWJsZXMgd2lsbCBrZWVwIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGluc3RhbmNlXHJcbiAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbClcclxuICAgICAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHRoaXMuX29yaWdpbmFsLCBvbmx5UmVhbCk7XHJcblxyXG4gICAgICBpZiAoKHRoaXMuX29yaWdpbmFsICE9PSBudWxsICYmIHJlY29tcHV0ZVVua25vd25zKSAmJiAhdGhpcy5DdXJyUmVjLmlzU2FtZVJlY0RhdGEodGVtcEN1cnJSZWMsIGZhbHNlLCBmYWxzZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjVW5rbm93blJjbXBzKHRoaXMuX29yaWdpbmFsKTtcclxuXHJcbiAgICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTsgLy8gbXVzdCBjb3B5IGFnYWluIHRvIHByZXZlbnQgYWx0ZXJpbmcgdGhlIG9yaWdpbmFsIHZhbHVlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlY1JlbW92ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlcmUgYXJlIG5vIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzRmlyc3QgJiYgdGhpcy5faW5jbHVkZXNMYXN0ICYmICh0aGlzLl9yZWNvcmRzVGFiID09PSBudWxsIHx8IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID09PSAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKCk6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKHNldFJlY1RvT2xkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWQoc2V0UmVjVG9PbGQ/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc2V0UmVjVG9PbGQpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYWRkQ3VyclRvTW9kaWZpZWRfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnJUb01vZGlmaWVkXzEoc2V0UmVjVG9PbGQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCB0aGUgY3VycmVudCByZWNvcmQgdG8gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGUgLSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZF8wKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJyVG9Nb2RpZmllZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlIC0gaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzU2V0T2xkUmVjXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkXzEoc2V0UmVjVG9PbGQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5hZGRSZWNvcmQodGhpcy5DdXJyUmVjKTtcclxuICAgIGlmIChzZXRSZWNUb09sZCkge1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0T2xkUmVjKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY29tbWFuZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSB0aGUgZmllbGQgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB0YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk6IHZvaWQge1xyXG4gICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnRha2VWYWxzRnJvbVJlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXBhcmUgYSBzZWxlY3RlZCBmaWVsZHMgdmFsdWVzIGJldHdlZW4gdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCB0aGUgcHJldmlvdXMgcmVjb3JkXHJcbiAgLy8vICAgYW5kIHJldHVybiB0cnVlIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTGlzdFwiPnRoZSBsaXN0IG9mIGZpZWxkIGluZGV4ZXMgdG8gY29tcGFyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGN1cnJFcXVhbHNQcmV2KGZsZExpc3Q6IG51bWJlcltdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5DdXJyUmVjICE9PSBudWxsICYmIHRoaXMuX3ByZXZDdXJyUmVjICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgPT09IHRoaXMuX3ByZXZDdXJyUmVjKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZsZExpc3QubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoIXRoaXMuQ3VyclJlYy5mbGRWYWxzRXF1YWwodGhpcy5fcHJldkN1cnJSZWMsIGZsZExpc3RbaV0pKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLkN1cnJSZWMgIT09IHRoaXMuX3ByZXZDdXJyUmVjKVxyXG4gIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIF90YXNrIG9mIHRoaXMgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3Rhc2sgaW5zdGFuY2VvZiBUYXNrQmFzZSk7XHJcbiAgICByZXR1cm4gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3JtIGZvciBfdGFzayBvZiB0aGlzIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybSB7XHJcbiAgICByZXR1cm4gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtb2RpZmllZFJlY29yZHNOdW1iZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQga25vd3MgaG93IHRvIGluaXQgYSBuZXcgcmVjb3JkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29tcHV0ZUJ5Q2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVCeSA9PT0gQ09NUFVURV9ORVdSRUNfT05fQ0xJRU5ULyonQycqLztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpcyBSZWNvcmQgZXhpc3RzIGluIHRoZSBEYXRhVmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPm9mIG5lZWRlZCByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIHJlY29yZCBleGlzdHMgPC9yZXR1cm5zPlxyXG4gIHJlY0V4aXN0c0J5SWQoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjb3JkKGlkKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICBQYXJhbWV0ZXJzRXhpc3QoaVBvczogbnVtYmVyLCBpTGVuOiBudW1iZXIpOiBib29sZWFuO1xyXG4gIFBhcmFtZXRlcnNFeGlzdCgpOiBib29sZWFuO1xyXG4gIFBhcmFtZXRlcnNFeGlzdChpUG9zPzogbnVtYmVyLCBpTGVuPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIHRoaXMuUGFyYW1ldGVyc0V4aXN0XzAoaVBvcywgaUxlbik7XHJcbiAgICByZXR1cm4gdGhpcy5QYXJhbWV0ZXJzRXhpc3RfMSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXJhbXMgaW4gdGhlIHNwZWNpZmllZCByYW5nZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpUG9zXCI+cG9zaXRpb24gb2YgZmlyc3QgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaUxlblwiPm51bWJlciBvZiBmaWVsZHMgaW4gdGhlIHJhbmdlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgPSB0aGVyZSBhcmUgcGFyYW1ldGVycyBpbiB0aGUgcmFuZ2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBQYXJhbWV0ZXJzRXhpc3RfMChpUG9zOiBudW1iZXIsIGlMZW46IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gaVBvczsgaSA8IGlQb3MgKyBpTGVuOyBpID0gaSArIDEpIHtcclxuICAgICAgaWYgKCg8RmllbGQ+c3VwZXIuZ2V0RmllbGQoaSkpLmlzUGFyYW0oKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgaWYgdGhlcmUgYXJlIHBhcmFtcyBpbiBEYXRhdmlldyB0YWJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBQYXJhbWV0ZXJzRXhpc3RfMSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlBhcmFtZXRlcnNFeGlzdCh0aGlzLl9ybUlkeCwgdGhpcy5fcm1TaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSByZWNvcmQgaXMgaW4gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgcmVjSW5Nb2RpZmllZFRhYihpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVjb3JkOiBSZWNvcmQgPSB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjb3JkKGlkKTtcclxuICAgIHJldHVybiByZWNvcmQgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2Q3VyclJlYygpOiB2b2lkO1xyXG4gIHNldFByZXZDdXJyUmVjKHJlYzogUmVjb3JkKTogdm9pZDtcclxuICBzZXRQcmV2Q3VyclJlYyhyZWM/OiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2V0UHJldkN1cnJSZWNfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFByZXZDdXJyUmVjXzEocmVjKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlcyB0aGUgY3VycmVudCByZWNvcmQgYXMgdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFByZXZDdXJyUmVjXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IHRoaXMuQ3VyclJlYztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UHJldkN1cnJSZWNfMShyZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSByZWM7XHJcbiAgfVxyXG5cclxuICBpc1ByZXZDdXJyUmVjTnVsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2Q3VyclJlYyA9PT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNvbXB1dGUgYWxsIHZpcnR1YWxzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uIHdoaWNoIGhhdmUgc2VydmVyIHJlY29tcHV0ZSBkZWZpbmVkIGZvciB0aGVtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcmdSZWNcIj5jb250YWlucyB0aGUgdmlydHVhbCdzIG9yaWdpbmFsIHZhbHVlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjVW5rbm93blJjbXBzKG9yZ1JlYzogUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1JZHgoKTtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1TaXplKCk7XHJcblxyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gdGhpcy5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gRmlyc3QgdGltZSAtIGluaXRpYWxpemUgdW5rbm93blJjbXAgdmFsdWVcclxuICAgIGlmICh0aGlzLl91bmtub3duUmNtcCA9PT0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEKSB7XHJcblxyXG4gICAgICBmb3IgKGkgPSBmcm9tO1xyXG4gICAgICAgICAgIGkgPCBmcm9tICsgc2l6ZSAmJiB0aGlzLl91bmtub3duUmNtcCA9PT0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEO1xyXG4gICAgICAgICAgIGkrKykge1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLklzVmlydHVhbCAmJiAhZmllbGQuaGFzSW5pdEV4cCgpICYmIGZpZWxkLmlzU2VydmVyUmNtcCgpKVxyXG4gICAgICAgICAgdGhpcy5fdW5rbm93blJjbXAgPSBVTktOT1dOX1JDTVBTX0ZPVU5ELyonWScqLztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfRk9VTkQgLyonWScqLyAmJiByZWMgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgaWYgKGZpZWxkLklzVmlydHVhbCAmJiAhZmllbGQuaGFzSW5pdEV4cCgpICYmIGZpZWxkLmlzU2VydmVyUmNtcCgpICYmICFyZWMuZmxkVmFsc0VxdWFsKG9yZ1JlYywgaSkpIHtcclxuICAgICAgICAgIGxldCBmaWVsZFZhbHVlOiBzdHJpbmcgPSByZWMuR2V0RmllbGRWYWx1ZShpKTtcclxuICAgICAgICAgIGxldCBpc051bGxGbGQ6IGJvb2xlYW4gPSByZWMuSXNOdWxsKGkpO1xyXG4gICAgICAgICAgcmVjLnNldEZpZWxkVmFsdWUoaSwgb3JnUmVjLkdldEZpZWxkVmFsdWUoaSksIGZhbHNlKTtcclxuICAgICAgICAgIGF3YWl0IGZpZWxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGRWYWx1ZSwgaXNOdWxsRmxkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRyYW5zQ2xlYXJlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc0NsZWFyZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90cmFuc0NsZWFyZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm0gYW55IGRhdGEgZXJyb3IgcmVjb3ZlcnkgYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgYXN5bmMgcHJvY2Vzc1JlY292ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICBsZXQgb3JnQWN0aW9uOiBzdHJpbmcgPSB0aGlzLl9wZW5kaW5nUmVjb3Zlcnk7XHJcbiAgICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuXHJcbiAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9OT05FO1xyXG4gICAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbilcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCB0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeDogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5DdHJsUHJlZml4O1xyXG5cclxuICAgICAgLy8gaWYgdGhlIGVycm9yIGZyb20gd2hpY2ggd2UgcmVjb3ZlciBoYXBwZW5lZCB3aGlsZSBpbiBjdHJsIHByZWZpeCwgcmVzZXQgaXQgZm9yIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaGVyZSxcclxuICAgICAgLy8gc28gdGhhdCBlbnRlcmluZyBhIG5ldyBjb250cm9sIHdpbGwgd29yayAoRGVmZWN0IDEyMjM4NykuXHJcbiAgICAgIGlmICh0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeClcclxuICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgc3dpdGNoIChvcmdBY3Rpb24pIHtcclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAoKDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnJlc2V0VXBkYXRlZCgpO1xyXG5cclxuICAgICAgICAgIC8vIFFDUiAjNzczOTc5ICh1cGRhdGVkIHJlY29yZCBjYW50IGJlIGNhbmNlbGVkKVxyXG5cclxuICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHFjciAjNzc2OTUyLiBjcmVhdGUgbW9kZSBhbmQgb25seSAxIHJlYyBvbiBkdi4gVGhlIHNlcnZlciBoYXMgb3JkZXJlZFxyXG4gICAgICAgICAgLy8gYSByb2xsYmFjay4gSGVyZSwgd2UgcmVzZXQgb3JpZ2luYWwgcmVjIGFuZCBjdXJyIHJlYyB0byBpbnNlcnQgbW9kZSxcclxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgbmV4dCB0aW1lIHRoZSBjbGllbnQgd2lsbCBzZXQgdXBkYXRlIG1vZGUgZm9yIHRoZSByZWMgaW5zdGVhZCBvZiBpbnNlcnQuXHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPT09IDEgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWwuc2V0U2FtZUFzKHRoaXMuQ3VyclJlYywgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFRoZSBjYW5jZWwgaGFuZGxlZCBoZXJlIHdpbGwgbm90IGNhdXNlZCBhIHJvbGxiYWNrIHNpbmNlIGl0IHdhcyByYWlzZWQgYnkgcm9sbGJhY2suIChyb2xsYiBhbHJlYWR5IGRvbmUgaW4gc2VydmVyKS5cclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0aGlzLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCxcclxuICAgICAgICAgICAgRXZlbnRTdWJUeXBlLkNhbmNlbFdpdGhOb1JvbGxiYWNrKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9NT1ZFX0RJUkVDVElPTl9CRUdJTjpcclxuICAgICAgICAgIC8vIERlZmVjdCAxNTIzMjA6IFdoZW4gRGF0YWJhc2UgZXJyb3Igb2NjdXJzIHdlIG5lZWQgbm90IGNhbGwgUmVjb3JkIHN1ZmZpeCBhZ2FpbiBhcyB0aGlzIGlzIGNhbGxlZCBmcm9tIFJlY29yZCBzdWZmaXguXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGF0dGVtcHQgdG8gcGFyayBvbiBsYXN0cGFya2VkQ3RybCBhbmQgd2FpdCB0aGVyZVxyXG4gICAgICAgICAgbGV0IGxhc3RQYXJrZWRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgIGlmKGxhc3RQYXJrZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgICAgICAgICBhd2FpdCBsYXN0UGFya2VkQ29udHJvbC5pbnZva2UoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9CRUdJTl9TQ1JFRU46XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRTpcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYWN0aW9uIGlzIGVuYWJsZWQgbm8gbWF0dGVyIG91ciBsb2NhdGlvbiBpbiB0aGUgdGFibGUuIG90aGVyd2lzZSwgcmVjIHByZWZpeCB3aWxsIG5vdCBiZSBleGVjdXRlZCBhZnRlciByb2xsYmFjay5cclxuICAgICAgICAgIHRoaXMuX3Rhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMKTtcclxuICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihvcmdTdG9wRXhlY3V0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeClcclxuICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAob3JnQWN0aW9uICE9PSBSRUNPVkVSWV9BQ1RfTk9ORSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUsIG9yZ0FjdGlvbiAhPT0gUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFID8gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uQUxMIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uU0VSVkVSKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsZWNpYXRlcyB0aGUgY3VycmVudCBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVwbGljYXRlKCk6IERhdGFWaWV3IHtcclxuICAgIGxldCByZXA6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMpO1xyXG4gICAgcmVwLl9yZWNvcmRzVGFiID0gdGhpcy5fcmVjb3Jkc1RhYi5yZXBsaWNhdGUoKTtcclxuICAgIHJlcC5fY3VyclJlY0lkID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApLmdldElkKCk7XHJcbiAgICByZXAuX2N1cnJSZWNJZHggPSAwO1xyXG4gICAgcmVwLkN1cnJSZWMgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICByZXAuX3ByZXZDdXJyUmVjID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG4gICAgcmVwLl9vcmlnaW5hbCA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIHJlcC5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgLy8gd2UgbXVzdCBjaGVjayBkY1ZhbHMgaWYgaXQgbmVlZCB0byBiZSByZXBsaWNhdGVkIGFzIHdlbGwgY3VycmVudHkgd2UgdGhpbmsgbm90XHJcbiAgICByZXR1cm4gcmVwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGR2UG9zIHZhbHVlIG5vbiBoYXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldER2UG9zVmFsdWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kdlBvc1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBkLnYgaXMgcGFyc2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaXJzdER2KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0RHY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGQudiBpcyBwYXJzZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFJlc2V0Rmlyc3REdigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0RHYgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhpcyBkYXRhdmlldyBjYWNoZSB0aW1lIHN0YW1wXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDYWNoZUxSVSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlTHJ1VGltZVN0YW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHRpbWUgc3RhbXAgb2YgdGhlIGRhdGF2aWV3XHJcbiAgLy8vICAgdXNlZCB3aGVuIGluc2VydGluZyBkYXRhdmlldyBpbiBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q2FjaGVMUlUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcCA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbmV3cyB0byB0YWtlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gZHYgYW5kIHRvIHNldCB0aGVtIGFzIHRoZSBjdXJyZW50IHZhbHVlc1xyXG4gIC8vLyAgIHRoZSBnaXZlbiBkdiBpcyB1c3VhbGx5IGNyZWF0ZWQgdmlhIGRhdGF2aWV3LnJlcGxpY2F0ZSgpXHJcbiAgLy8vICAgdGhpcyBtZXRob2QgZG9lcyBub3QgdGFrZSB0aGUgdmFsdWVzIG9mICBsYXN0U2Vzc2lvbkNvdW50IGFuZCBjYWNoZUxSVVRpbWVTdGFtcFxyXG4gIC8vLyAgIGZyb20gdGhlIGdpdmVuIGR2IHNpbmNlIHRoZXkgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSBvbmUgY3VycmVudCBkdiB0byB0aGUgb3RoZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHNldFNhbWVBcyhuZXdEdjogRGF0YVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3JtU2l6ZSA9IG5ld0R2Ll9ybVNpemU7XHJcbiAgICB0aGlzLl9ybUlkeCA9IG5ld0R2Ll9ybUlkeDtcclxuICAgIHRoaXMuX2NvbXB1dGVCeSA9IG5ld0R2Ll9jb21wdXRlQnk7XHJcbiAgICB0aGlzLl9mbHVzaFVwZGF0ZXMgPSBuZXdEdi5fZmx1c2hVcGRhdGVzO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gbmV3RHYuX2N1cnJSZWNJZDtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSBuZXdEdi5fY3VyclJlY0lkeDtcclxuICAgIHRoaXMuX3RvcFJlY0lkID0gbmV3RHYuX3RvcFJlY0lkO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbmV3RHYuQ3VyclJlYztcclxuICAgIHRoaXMuX29yaWdpbmFsID0gbmV3RHYuX29yaWdpbmFsO1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5fZmllbGRzVGFiID0gbmV3RHYuX2ZpZWxkc1RhYjtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIgPSBuZXdEdi5fcmVjb3Jkc1RhYjtcclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYiA9IG5ld0R2Ll9tb2RpZmllZFJlY29yZHNUYWI7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0ZpcnN0ID0gbmV3RHYuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSBuZXdEdi5faW5jbHVkZXNMYXN0O1xyXG4gICAgdGhpcy5faW5zZXJ0QXQgPSBuZXdEdi5faW5zZXJ0QXQ7XHJcbiAgICB0aGlzLl9sYXN0Q3JlYXRlZFJlY0lkID0gbmV3RHYuX2xhc3RDcmVhdGVkUmVjSWQ7XHJcbiAgICB0aGlzLl90YXNrID0gbmV3RHYuX3Rhc2s7XHJcbiAgICB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uID0gbmV3RHYuX2RjVmFsc0NvbGxlY3Rpb247XHJcbiAgICB0aGlzLl9yZWNvdmVyeSA9IG5ld0R2Ll9yZWNvdmVyeTtcclxuICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IG5ld0R2Ll9wZW5kaW5nUmVjb3Zlcnk7XHJcbiAgICB0aGlzLl9oYXNNYWluVGFibGUgPSBuZXdEdi5faGFzTWFpblRhYmxlO1xyXG4gICAgdGhpcy5fY2h1bmtTaXplID0gbmV3RHYuX2NodW5rU2l6ZTtcclxuICAgIHRoaXMuX2ZpcnN0RHYgPSBuZXdEdi5fZmlyc3REdjtcclxuICAgIHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlciA9IG5ld0R2Ll9sYXN0U2Vzc2lvbkNvdW50ZXI7XHJcbiAgICB0aGlzLl9za2lwUGFyc2luZyA9IG5ld0R2Ll9za2lwUGFyc2luZztcclxuICAgIHRoaXMuX3Vua25vd25SY21wID0gbmV3RHYuX3Vua25vd25SY21wO1xyXG4gICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gbmV3RHYuX3RyYW5zQ2xlYXJlZDtcclxuICAgIHRoaXMuX2R2UG9zVmFsdWUgPSBuZXdEdi5fZHZQb3NWYWx1ZTtcclxuICAgIHRoaXMuX2NhY2hlTHJ1VGltZVN0YW1wID0gbmV3RHYuX2NhY2hlTHJ1VGltZVN0YW1wO1xyXG4gICAgdGhpcy5fY2hhbmdlZCA9IG5ld0R2Ll9jaGFuZ2VkO1xyXG4gICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBuZXdEdi5fbG9jYXRlRmlyc3RSZWM7XHJcbiAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KG5ld0R2LmlzRW1wdHlEYXRhdmlldygpKTtcclxuICAgIHRoaXMuX3Rhc2suc2V0TW9kZShuZXdEdi50YXNrTW9kZUZyb21DYWNoZSk7XHJcblxyXG4gICAgLy8gVVBEQVRFIFRIRSBUQUJMRSBESVNQTEFZXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuSGFzTG9hY3RlKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWModGhpcy5fbG9jYXRlRmlyc3RSZWMsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KHRoaXMuX2xvY2F0ZUZpcnN0UmVjKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChJbnQzMi5NaW5WYWx1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIEludDMyLk1pblZhbHVlKTtcclxuICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLmdldEZvcm0oKS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGlmICgoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICAgIHRoaXMuVG90YWxSZWNvcmRzQ291bnQgPSBuZXdEdi5Ub3RhbFJlY29yZHNDb3VudDtcclxuICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gbmV3RHYuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeCh0aGlzLl90b3BSZWNJZHgsIHRydWUsIGZhbHNlLCB0cnVlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPT0gbnVsbClcclxuICAgICAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCd3cm9uZyB0b3AgcmVjb3JkIGlkeCBpbiBEYXRhVmlldy5zZXRTYW1lQXMnICsgZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q2hhbmdlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NoYW5nZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRMb2NhdGVGaXJzdFJlYygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvY2F0ZUZpcnN0UmVjO1xyXG4gIH1cclxuXHJcbiAgc2V0TG9jYXRlRmlyc3RSZWMobmV3Rmlyc3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBuZXdGaXJzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgcmVjb3JkIGJ5IGl0cyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJlY0J5SWR4KGlkeDogbnVtYmVyKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgfVxyXG5cclxuICBnZXRTZXJ2ZXJDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICB6ZXJvU2VydmVyQ3VyclJlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIuemVyb1NlcnZlckN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIGluUm9sbGJhY2soKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW5Sb2xsYmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0sgLyonUicqLyAmJiB0aGlzLmdldFRhc2soKS5pc1RyYW5zYWN0aW9uT3duZXIoKSkge1xyXG4gICAgICBpblJvbGxiYWNrID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBpblJvbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldFJlY0lkeChpZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChpZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYmFja3VwIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBiYWNrdXBDdXJyZW50KCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgY3VycmVudCByZWNvcmQgZnJvbSBiYWNrdXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjQmFja3VwXCI+YmFja3VwIG9mIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgcmVzdG9yZUN1cnJlbnQocmVjQmFja3VwOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChyZWNCYWNrdXAgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gcmVjQmFja3VwLmdldElkKCk7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgodGhpcy5fY3VyclJlY0lkKTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fY3VyclJlY0lkeCk7XHJcbiAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHJlY0JhY2t1cCwgZmFsc2UpO1xyXG4gICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGlkIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDdXJyZW50UmVjSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRhdGF2aWV3IGJvdW5kYXJpZXMgYXJlIGNoYW5nZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzRmlyc3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzTGFzdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBEYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiwgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb3JnSW5jbHVkZXNGaXJzdCAhPT0gdGhpcy5JbmNsdWRlc0ZpcnN0KCkgfHwgb3JnSW5jbHVkZXNMYXN0ICE9PSB0aGlzLkluY2x1ZGVzTGFzdCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcm91dGUgcGFyYW1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRSb3V0ZVBhcmFtcygpOiBMaXN0PGFueT4ge1xyXG4gICAgbGV0IHBhcmFtczogTGlzdDxhbnk+ID0gbmV3IExpc3QoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZmllbGRzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuICAgICAgbGV0IHZhbDogYW55O1xyXG4gICAgICBpZiAoZmllbGQuSXNFeHBvc2VkUm91dGVQYXJhbSAmJiAhZmllbGQuaXNOdWxsKCkpIHtcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERToge1xyXG4gICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgICAgIHZhbCA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKCg8c3RyaW5nPnZhbCkubGVuZ3RoID09PSAwID8gJyAnIDogdmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaCgoZmllbGQuZ2V0RGlzcFZhbHVlKCkpLmNoYXJBdCgwKSA9PT0gJzEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICBsZXQgcGljOiBQSUMgPSBuZXcgUElDKGZpZWxkLmdldFBpY3R1cmUoKSwgZmllbGQuZ2V0VHlwZSgpLCB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgICAgICB2YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AodmFsLCAnJywgcGljLCB0cnVlLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKHZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIChwYXJhbXMubGVuZ3RoID4gMCkgPyBwYXJhbXMgOiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=