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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (515) hide show
  1. package/{esm2020 → esm2022}/index.mjs +188 -188
  2. package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
  3. package/esm2022/src/AccessHelper.mjs +15 -0
  4. package/esm2022/src/ClientManager.mjs +399 -0
  5. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  6. package/esm2022/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2022/src/CommandsTable.mjs +162 -0
  8. package/esm2022/src/ConstInterface.mjs +516 -0
  9. package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
  10. package/esm2022/src/FlowMonitorInterface.mjs +16 -0
  11. package/esm2022/src/GUIManager.mjs +62 -0
  12. package/esm2022/src/GlobalCommandsManager.mjs +34 -0
  13. package/esm2022/src/GuiEventsProcessor.mjs +154 -0
  14. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  15. package/esm2022/src/ServerConfig.mjs +118 -0
  16. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  17. package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
  18. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
  19. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
  20. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
  21. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
  22. package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
  23. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  24. package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
  26. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
  27. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  28. package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
  29. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
  31. package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
  32. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  33. package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
  34. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
  35. package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
  38. package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
  39. package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
  40. package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
  41. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  44. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
  49. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  50. package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
  51. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
  53. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
  54. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
  56. package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
  57. package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
  58. package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
  59. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  61. package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  64. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
  65. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  67. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
  68. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
  69. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
  70. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  72. package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
  73. package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
  74. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
  75. package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
  76. package/esm2022/src/data/DataView.mjs +1613 -0
  77. package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
  78. package/esm2022/src/data/DataviewManager.mjs +28 -0
  79. package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
  80. package/esm2022/src/data/DvCache.mjs +67 -0
  81. package/esm2022/src/data/Field.mjs +646 -0
  82. package/esm2022/src/data/FieldBase.mjs +15 -0
  83. package/esm2022/src/data/FieldsTable.mjs +103 -0
  84. package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
  85. package/esm2022/src/data/Key.mjs +88 -0
  86. package/esm2022/src/data/Record.mjs +866 -0
  87. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  88. package/esm2022/src/data/RecordsTable.mjs +267 -0
  89. package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/{esm2020 → esm2022}/src/enums.mjs +23 -23
  92. package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2022/src/env/Environment.mjs +487 -0
  94. package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
  95. package/esm2022/src/env/LanguageData.mjs +226 -0
  96. package/esm2022/src/env/MirrorString.mjs +65 -0
  97. package/esm2022/src/event/ActionManager.mjs +91 -0
  98. package/esm2022/src/event/Event.mjs +1333 -0
  99. package/esm2022/src/event/EventHandler.mjs +766 -0
  100. package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
  101. package/esm2022/src/event/EventsManager.mjs +2975 -0
  102. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  103. package/esm2022/src/event/RunTimeEvent.mjs +392 -0
  104. package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
  105. package/esm2022/src/event/UserEventsTable.mjs +47 -0
  106. package/esm2022/src/exp/ExpTable.mjs +57 -0
  107. package/esm2022/src/exp/Expression.mjs +200 -0
  108. package/esm2022/src/exp/ExpressionDict.mjs +727 -0
  109. package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
  110. package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2022/src/exp/YesNoExp.mjs +36 -0
  113. package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
  114. package/esm2022/src/gui/FormsTable.mjs +66 -0
  115. package/esm2022/src/gui/MgControl.mjs +363 -0
  116. package/esm2022/src/gui/MgForm.mjs +1181 -0
  117. package/esm2022/src/http/HttpManager.mjs +97 -0
  118. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  119. package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
  120. package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
  121. package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
  122. package/esm2022/src/http/client/HttpUtility.mjs +84 -0
  123. package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
  124. package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
  128. package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
  131. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
  132. package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
  133. package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
  134. package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  136. package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2022/src/remote/ServerError.mjs +40 -0
  138. package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
  139. package/esm2022/src/rt/Argument.mjs +265 -0
  140. package/esm2022/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2022/src/rt/Boundary.mjs +152 -0
  142. package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
  143. package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
  144. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  145. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  146. package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
  147. package/esm2022/src/rt/ExecutionStack.mjs +94 -0
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  149. package/esm2022/src/rt/HandlersTable.mjs +96 -0
  150. package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
  151. package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
  152. package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
  153. package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
  154. package/esm2022/src/rt/Operation.mjs +735 -0
  155. package/esm2022/src/rt/OperationTable.mjs +67 -0
  156. package/esm2022/src/rt/Recompute.mjs +355 -0
  157. package/esm2022/src/rt/RecomputeTable.mjs +63 -0
  158. package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
  159. package/esm2022/src/rt/ResultValue.mjs +10 -0
  160. package/esm2022/src/rt/TableCache.mjs +177 -0
  161. package/esm2022/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2022/src/rt/Transaction.mjs +53 -0
  163. package/esm2022/src/security/UserDetails.mjs +71 -0
  164. package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
  165. package/esm2022/src/tasks/MGData.mjs +552 -0
  166. package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
  167. package/esm2022/src/tasks/RCTimer.mjs +63 -0
  168. package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
  169. package/esm2022/src/tasks/Task.mjs +2497 -0
  170. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  171. package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
  172. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  174. package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
  175. package/esm2022/src/util/ConstUtils.mjs +14 -0
  176. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  177. package/esm2022/src/util/HeapSort.mjs +70 -0
  178. package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
  179. package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
  180. package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
  181. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
  182. package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
  183. package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
  184. package/esm2022/src/util/PrmMap.mjs +152 -0
  185. package/esm2022/src/util/ReturnResult.mjs +46 -0
  186. package/esm2022/src/util/ReturnResultBase.mjs +18 -0
  187. package/esm2022/src/util/Scrambler.mjs +89 -0
  188. package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
  189. package/esm2022/src/util/cookie.service.mjs +92 -0
  190. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29713 -29693
  191. package/fesm2022/magic-xpa-engine.mjs.map +1 -0
  192. package/index.d.ts +187 -187
  193. package/package.json +8 -14
  194. package/src/AccessHelper.d.ts +20 -20
  195. package/src/ClientManager.d.ts +32 -32
  196. package/src/CommandsProcessorBase.d.ts +23 -23
  197. package/src/CommandsProcessorManager.d.ts +6 -6
  198. package/src/CommandsTable.d.ts +22 -22
  199. package/src/ConstInterface.d.ts +515 -515
  200. package/src/CurrentClientVersion.d.ts +1 -1
  201. package/src/FlowMonitorInterface.d.ts +15 -15
  202. package/src/GUIManager.d.ts +17 -17
  203. package/src/GlobalCommandsManager.d.ts +17 -17
  204. package/src/GuiEventsProcessor.d.ts +24 -24
  205. package/src/ICommandsTable.d.ts +9 -9
  206. package/src/ServerConfig.d.ts +34 -34
  207. package/src/bridge/IGuiEvent.d.ts +19 -19
  208. package/src/bridge/MagicBridge.d.ts +16 -16
  209. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
  210. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
  211. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
  212. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
  213. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
  214. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
  215. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
  216. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
  217. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
  218. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
  219. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
  220. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
  221. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
  222. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
  223. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
  224. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
  225. package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
  226. package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
  227. package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
  228. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
  229. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
  230. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
  231. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
  232. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
  233. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
  234. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  235. package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
  236. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
  237. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
  238. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
  239. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
  240. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  241. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
  242. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
  243. package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
  244. package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
  245. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
  246. package/src/commands/DataViewCommandBase.d.ts +6 -6
  247. package/src/commands/IClientCommand.d.ts +2 -2
  248. package/src/commands/IClientTargetedCommand.d.ts +12 -12
  249. package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
  250. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
  251. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
  252. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
  253. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
  254. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
  255. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
  256. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
  257. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
  258. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
  259. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
  260. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
  261. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
  262. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
  263. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
  264. package/src/communications/IConnectionStateManager.d.ts +4 -4
  265. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
  266. package/src/data/DataSourceIdKey.d.ts +2 -2
  267. package/src/data/DataView.d.ts +162 -162
  268. package/src/data/DataViewBase.d.ts +12 -12
  269. package/src/data/DataviewManager.d.ts +14 -14
  270. package/src/data/DataviewManagerBase.d.ts +11 -11
  271. package/src/data/DvCache.d.ts +15 -15
  272. package/src/data/Field.d.ts +103 -103
  273. package/src/data/FieldBase.d.ts +23 -23
  274. package/src/data/FieldsTable.d.ts +27 -27
  275. package/src/data/IRecordsTable.d.ts +7 -7
  276. package/src/data/Key.d.ts +15 -15
  277. package/src/data/Record.d.ts +156 -156
  278. package/src/data/RecordOutOfDataViewException.d.ts +10 -10
  279. package/src/data/RecordsTable.d.ts +38 -38
  280. package/src/data/TaskTransactionManager.d.ts +17 -17
  281. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
  282. package/src/enums.d.ts +21 -21
  283. package/src/env/EnvVariablesTable.d.ts +17 -17
  284. package/src/env/Environment.d.ts +118 -118
  285. package/src/env/ILanguageData.d.ts +3 -3
  286. package/src/env/LanguageData.d.ts +20 -20
  287. package/src/env/MirrorString.d.ts +15 -15
  288. package/src/event/ActionManager.d.ts +14 -14
  289. package/src/event/Event.d.ts +79 -79
  290. package/src/event/EventHandler.d.ts +66 -66
  291. package/src/event/EventHandlerPosition.d.ts +25 -25
  292. package/src/event/EventsManager.d.ts +204 -204
  293. package/src/event/IEventsManager.d.ts +77 -77
  294. package/src/event/RunTimeEvent.d.ts +123 -123
  295. package/src/event/RunTimeEventBase.d.ts +5 -5
  296. package/src/event/UserEventsTable.d.ts +11 -11
  297. package/src/exp/ExpTable.d.ts +11 -11
  298. package/src/exp/Expression.d.ts +37 -37
  299. package/src/exp/ExpressionDict.d.ts +12 -12
  300. package/src/exp/ExpressionEvaluator.d.ts +198 -198
  301. package/src/exp/ExpressionLocalJpn.d.ts +18 -18
  302. package/src/exp/GlobalParamsTable.d.ts +19 -19
  303. package/src/exp/YesNoExp.d.ts +9 -9
  304. package/src/gui/CreatedFormVector.d.ts +10 -10
  305. package/src/gui/FormsTable.d.ts +15 -15
  306. package/src/gui/MgControl.d.ts +60 -60
  307. package/src/gui/MgForm.d.ts +93 -93
  308. package/src/http/HttpManager.d.ts +25 -25
  309. package/src/http/client/HttpClientAsync.d.ts +16 -16
  310. package/src/http/client/HttpClientBase.d.ts +30 -30
  311. package/src/http/client/HttpClientEvents.d.ts +18 -18
  312. package/src/http/client/HttpClientSync.d.ts +17 -17
  313. package/src/http/client/HttpUtility.d.ts +10 -10
  314. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
  315. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
  316. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
  317. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
  318. package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
  319. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
  320. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
  321. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
  322. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
  323. package/src/remote/RemoteDataviewManager.d.ts +9 -9
  324. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
  325. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
  326. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
  327. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
  328. package/src/remote/ServerError.d.ts +16 -16
  329. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
  330. package/src/rt/Argument.d.ts +36 -36
  331. package/src/rt/ArgumentsList.d.ts +24 -24
  332. package/src/rt/Boundary.d.ts +27 -27
  333. package/src/rt/CompMainPrgTable.d.ts +10 -10
  334. package/src/rt/DataviewHeaderBase.d.ts +34 -34
  335. package/src/rt/DataviewHeaderFactory.d.ts +5 -5
  336. package/src/rt/DataviewHeaders.d.ts +12 -12
  337. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
  338. package/src/rt/ExecutionStack.d.ts +22 -22
  339. package/src/rt/ExecutionStackEntry.d.ts +7 -7
  340. package/src/rt/HandlersTable.d.ts +19 -19
  341. package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
  342. package/src/rt/IDataviewHeader.d.ts +10 -10
  343. package/src/rt/IResultValue.d.ts +4 -4
  344. package/src/rt/LastFocusedManager.d.ts +23 -23
  345. package/src/rt/Operation.d.ts +97 -97
  346. package/src/rt/OperationTable.d.ts +15 -15
  347. package/src/rt/Recompute.d.ts +41 -41
  348. package/src/rt/RecomputeTable.d.ts +9 -9
  349. package/src/rt/RemoteDataviewHeader.d.ts +14 -14
  350. package/src/rt/ResultValue.d.ts +7 -7
  351. package/src/rt/TableCache.d.ts +29 -29
  352. package/src/rt/TableCacheManager.d.ts +10 -10
  353. package/src/rt/Transaction.d.ts +23 -23
  354. package/src/security/UserDetails.d.ts +16 -16
  355. package/src/tasks/IMGDataCollection.d.ts +26 -26
  356. package/src/tasks/MGData.d.ts +63 -63
  357. package/src/tasks/MGDataCollection.d.ts +42 -42
  358. package/src/tasks/RCTimer.d.ts +13 -13
  359. package/src/tasks/RemoteTaskService.d.ts +16 -16
  360. package/src/tasks/Task.d.ts +312 -312
  361. package/src/tasks/TaskBase.d.ts +123 -123
  362. package/src/tasks/TaskServiceBase.d.ts +16 -16
  363. package/src/tasks/TasksTable.d.ts +21 -21
  364. package/src/tasks/sort/Sort.d.ts +4 -4
  365. package/src/tasks/sort/SortCollection.d.ts +11 -11
  366. package/src/util/ConstUtils.d.ts +3 -3
  367. package/src/util/FlowMonitorQueue.d.ts +70 -70
  368. package/src/util/HeapSort.d.ts +6 -6
  369. package/src/util/IMirrorXML.d.ts +6 -6
  370. package/src/util/IServerConfig.d.ts +11 -11
  371. package/src/util/MgBlockingQueue.d.ts +5 -5
  372. package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
  373. package/src/util/MgPriorityQueue.d.ts +13 -13
  374. package/src/util/ParamParseResult.d.ts +6 -6
  375. package/src/util/PrmMap.d.ts +28 -28
  376. package/src/util/ReturnResult.d.ts +18 -18
  377. package/src/util/ReturnResultBase.d.ts +11 -11
  378. package/src/util/Scrambler.d.ts +10 -10
  379. package/src/util/UniqueIDUtils.d.ts +4 -4
  380. package/src/util/cookie.service.d.ts +8 -8
  381. package/esm2020/src/AccessHelper.mjs +0 -9
  382. package/esm2020/src/ClientManager.mjs +0 -399
  383. package/esm2020/src/CommandsProcessorBase.mjs +0 -58
  384. package/esm2020/src/CommandsProcessorManager.mjs +0 -26
  385. package/esm2020/src/CommandsTable.mjs +0 -162
  386. package/esm2020/src/ConstInterface.mjs +0 -516
  387. package/esm2020/src/FlowMonitorInterface.mjs +0 -16
  388. package/esm2020/src/GUIManager.mjs +0 -62
  389. package/esm2020/src/GlobalCommandsManager.mjs +0 -34
  390. package/esm2020/src/GuiEventsProcessor.mjs +0 -154
  391. package/esm2020/src/ServerConfig.mjs +0 -117
  392. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
  393. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
  394. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  395. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  396. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  397. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  398. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
  399. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  400. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  401. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  402. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  403. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  404. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  405. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  406. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  407. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  408. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  409. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  410. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  411. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  412. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
  413. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
  414. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  415. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  416. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  417. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  418. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  419. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  420. package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
  421. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  422. package/esm2020/src/data/DataView.mjs +0 -1610
  423. package/esm2020/src/data/DataviewManager.mjs +0 -28
  424. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  425. package/esm2020/src/data/DvCache.mjs +0 -67
  426. package/esm2020/src/data/Field.mjs +0 -646
  427. package/esm2020/src/data/FieldBase.mjs +0 -18
  428. package/esm2020/src/data/FieldsTable.mjs +0 -103
  429. package/esm2020/src/data/Key.mjs +0 -88
  430. package/esm2020/src/data/Record.mjs +0 -846
  431. package/esm2020/src/data/RecordsTable.mjs +0 -267
  432. package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
  433. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
  434. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  435. package/esm2020/src/env/Environment.mjs +0 -489
  436. package/esm2020/src/env/LanguageData.mjs +0 -226
  437. package/esm2020/src/env/MirrorString.mjs +0 -65
  438. package/esm2020/src/event/ActionManager.mjs +0 -91
  439. package/esm2020/src/event/Event.mjs +0 -1333
  440. package/esm2020/src/event/EventHandler.mjs +0 -766
  441. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  442. package/esm2020/src/event/EventsManager.mjs +0 -2975
  443. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  444. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  445. package/esm2020/src/exp/ExpTable.mjs +0 -59
  446. package/esm2020/src/exp/Expression.mjs +0 -200
  447. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  448. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
  449. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  450. package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
  451. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  452. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  453. package/esm2020/src/gui/FormsTable.mjs +0 -66
  454. package/esm2020/src/gui/MgControl.mjs +0 -353
  455. package/esm2020/src/gui/MgForm.mjs +0 -1181
  456. package/esm2020/src/http/HttpManager.mjs +0 -97
  457. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  458. package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
  459. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  460. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  461. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  462. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
  463. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
  464. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
  465. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  466. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
  467. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
  468. package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
  469. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
  470. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
  471. package/esm2020/src/remote/ServerError.mjs +0 -40
  472. package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
  473. package/esm2020/src/rt/Argument.mjs +0 -265
  474. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  475. package/esm2020/src/rt/Boundary.mjs +0 -152
  476. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  477. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  478. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
  479. package/esm2020/src/rt/ExecutionStack.mjs +0 -94
  480. package/esm2020/src/rt/HandlersTable.mjs +0 -96
  481. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  482. package/esm2020/src/rt/Operation.mjs +0 -735
  483. package/esm2020/src/rt/OperationTable.mjs +0 -67
  484. package/esm2020/src/rt/Recompute.mjs +0 -355
  485. package/esm2020/src/rt/RecomputeTable.mjs +0 -63
  486. package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
  487. package/esm2020/src/rt/ResultValue.mjs +0 -12
  488. package/esm2020/src/rt/TableCache.mjs +0 -177
  489. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  490. package/esm2020/src/rt/Transaction.mjs +0 -53
  491. package/esm2020/src/security/UserDetails.mjs +0 -71
  492. package/esm2020/src/tasks/MGData.mjs +0 -552
  493. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  494. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  495. package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
  496. package/esm2020/src/tasks/Task.mjs +0 -2495
  497. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  498. package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
  499. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  500. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  501. package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
  502. package/esm2020/src/util/ConstUtils.mjs +0 -14
  503. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  504. package/esm2020/src/util/HeapSort.mjs +0 -70
  505. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  506. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  507. package/esm2020/src/util/PrmMap.mjs +0 -151
  508. package/esm2020/src/util/ReturnResult.mjs +0 -46
  509. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  510. package/esm2020/src/util/Scrambler.mjs +0 -89
  511. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  512. package/esm2020/src/util/cookie.service.mjs +0 -92
  513. package/fesm2015/magic-xpa-engine.mjs +0 -30835
  514. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  515. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,1181 @@
1
+ import { Commands, CommandType, DataModificationTypes, GuiEnvironment, Manager, MgFormBase, PropInterface } from '@magic-xpa/gui';
2
+ import { Constants, InternalInterface, Logger, MgControlType, Misc, Priority, XMLConstants } from '@magic-xpa/utils';
3
+ import { ApplicationException, Debug, Exception, Int32, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
4
+ import { MgControl } from './MgControl';
5
+ import { RecordOutOfDataViewException } from '../data/RecordOutOfDataViewException';
6
+ import { SET_DISPLAYLINE_BY_DV } from '../data/DataView';
7
+ import { TaskBase } from '../tasks/TaskBase';
8
+ import { ServerError } from '../remote/ServerError';
9
+ import { ConstInterface } from '../ConstInterface';
10
+ import { LastFocusedManager } from '../rt/LastFocusedManager';
11
+ import { CreatedFormVector } from './CreatedFormVector';
12
+ import { AccessHelper } from '../AccessHelper';
13
+ export class MgForm extends MgFormBase {
14
+ static TIME_LIMIT = 50;
15
+ IsMovingInView = false;
16
+ PrevDisplayLine = 0;
17
+ RefreshAllRows = false;
18
+ IgnoreFirstRecordCycle = false;
19
+ MovedToFirstControl = false;
20
+ _suffixDone = false;
21
+ hiddenControlsIsnsList = null;
22
+ static _createdForms = new CreatedFormVector();
23
+ _transferringDataToGUI = false;
24
+ isFetchingRecordsAhead = false;
25
+ constructor() {
26
+ super();
27
+ }
28
+ static get CreatedForms() {
29
+ return MgForm._createdForms;
30
+ }
31
+ get InRestore() {
32
+ return this._inRestore;
33
+ }
34
+ get TransferringDataToGUI() {
35
+ return this._transferringDataToGUI;
36
+ }
37
+ get shouldFetchRecordsAheadFromServer() {
38
+ if (this.isTableWithPagination()) {
39
+ let prop = this._tableMgControl.GetComputedProperty(PropInterface.PROP_TYPE_SERVER_READ_AHEAD);
40
+ return (prop != null ? prop.GetComputedValueBoolean() : false);
41
+ }
42
+ else
43
+ return false;
44
+ }
45
+ async FetchRecordsAheadFromServer() {
46
+ this.isFetchingRecordsAhead = true;
47
+ await this.GetDataview().FetchRecordsAheadFromServer();
48
+ this.isFetchingRecordsAhead = false;
49
+ }
50
+ GetDataview() {
51
+ let dv = null;
52
+ if (this._task != null)
53
+ dv = this._task.DataView;
54
+ return (dv);
55
+ }
56
+ async moveInView(unit, direction) {
57
+ let oldRecId = Int32.MinValue;
58
+ let currRec = this.GetDataview().getCurrRec();
59
+ let oldTaskMode = ' ';
60
+ let returnToVisibleLine = false;
61
+ let recordOutOfView = false;
62
+ let visibleLine = 0;
63
+ try {
64
+ this.IsMovingInView = true;
65
+ let oldDisplayLine = this.DisplayLine;
66
+ if (unit === Constants.MOVE_UNIT_TABLE) {
67
+ try {
68
+ if (direction === Constants.MOVE_DIRECTION_BEGIN) {
69
+ await this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_FIRST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
70
+ if (this.isLineMode()) {
71
+ this.GetDataview().setTopRecIdx(0);
72
+ await this.setCurrRowByDisplayLine(0, false, false);
73
+ }
74
+ }
75
+ else {
76
+ await this.GetDataview().setCurrRecByIdx(Constants.MG_DATAVIEW_LAST_RECORD, true, false, true, SET_DISPLAYLINE_BY_DV);
77
+ if (this.isLineMode()) {
78
+ this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage + 1);
79
+ if (this.GetDataview().getTopRecIdx() >= 0)
80
+ await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
81
+ else {
82
+ this.GetDataview().setTopRecIdx(0);
83
+ await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx(), false, false);
84
+ }
85
+ }
86
+ }
87
+ this.updateDisplayLineByDV();
88
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
89
+ }
90
+ catch (ex) {
91
+ if (ex instanceof RecordOutOfDataViewException)
92
+ Logger.Instance.WriteDevToLog(ex.Message);
93
+ }
94
+ }
95
+ else {
96
+ this.getTopIndexFromGUI();
97
+ let size;
98
+ if (unit === Constants.MOVE_UNIT_PAGE && this.isLineMode()) {
99
+ switch (direction) {
100
+ case Constants.MOVE_DIRECTION_BEGIN:
101
+ size = this.GetDataview().getCurrRecIdx() - this.GetDataview().getTopRecIdx();
102
+ break;
103
+ case Constants.MOVE_DIRECTION_END:
104
+ let last = this.GetDataview().getTopRecIdx() + this._rowsInPage - 1;
105
+ last = Math.min(last, this.GetDataview().getSize() - 1);
106
+ size = last - this.GetDataview().getCurrRecIdx();
107
+ break;
108
+ default:
109
+ returnToVisibleLine = true;
110
+ size = this._rowsInPage;
111
+ break;
112
+ }
113
+ }
114
+ else
115
+ size = 1;
116
+ size = (direction === Constants.MOVE_DIRECTION_PREV ||
117
+ direction === Constants.MOVE_DIRECTION_BEGIN
118
+ ? -size
119
+ : size);
120
+ if (this.isLineMode()) {
121
+ visibleLine = this.getVisibleLine();
122
+ if (visibleLine < 0) {
123
+ visibleLine = 0;
124
+ recordOutOfView = true;
125
+ }
126
+ if (visibleLine > this._rowsInPage + 1) {
127
+ visibleLine = this._rowsInPage;
128
+ recordOutOfView = true;
129
+ }
130
+ if (unit === Constants.MOVE_UNIT_PAGE &&
131
+ (direction === Constants.MOVE_DIRECTION_NEXT ||
132
+ direction === Constants.MOVE_DIRECTION_PREV) ||
133
+ unit === Constants.MOVE_UNIT_ROW &&
134
+ (direction === Constants.MOVE_DIRECTION_NEXT && visibleLine === this._rowsInPage - 1 ||
135
+ direction === Constants.MOVE_DIRECTION_PREV && visibleLine === 0)) {
136
+ if (direction === Constants.MOVE_DIRECTION_PREV &&
137
+ (unit === Constants.MOVE_UNIT_ROW || unit === Constants.MOVE_UNIT_PAGE) &&
138
+ visibleLine === 0 && this.GetDataview().getCurrRecIdx() === 0 && this.GetDataview().IncludesFirst())
139
+ return;
140
+ if (direction === Constants.MOVE_DIRECTION_NEXT && unit === Constants.MOVE_UNIT_PAGE &&
141
+ visibleLine === this.getLastValidRow() && this.GetDataview().getCurrRecIdx() === this.GetDataview().getSize() - 1 && this.GetDataview().IncludesLast())
142
+ return;
143
+ oldRecId = (this.GetDataview().getCurrRec()).getId();
144
+ this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + size);
145
+ this.GetDataview().setTopRecIdxModified(true);
146
+ try {
147
+ this._suffixDone = false;
148
+ await this.setCurrRowByDisplayLine(this.GetDataview().getCurrRecIdx() + size, true, false);
149
+ this.GetDataview().setTopRecIdxModified(false);
150
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
151
+ }
152
+ catch (ex) {
153
+ if (ex instanceof RecordOutOfDataViewException) {
154
+ this.GetDataview().setTopRecIdxModified(false);
155
+ if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
156
+ this.GetDataview().restoreTopRecIdx();
157
+ await this.restoreOldDisplayLine(oldDisplayLine);
158
+ return;
159
+ }
160
+ if (this.GetDataview().getTopRecIdx() < 0) {
161
+ this.GetDataview().setTopRecIdx(0);
162
+ try {
163
+ await this.setCurrRowByDisplayLine(0, true, false);
164
+ }
165
+ catch (exception) {
166
+ if (exception instanceof Exception) {
167
+ if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
168
+ this.GetDataview().restoreTopRecIdx();
169
+ await this.restoreOldDisplayLine(oldDisplayLine);
170
+ return;
171
+ }
172
+ }
173
+ }
174
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
175
+ }
176
+ else if (unit !== Constants.MOVE_UNIT_ROW && this.GetDataview().recExists(this.GetDataview().getTopRecIdx())) {
177
+ let newRecId = (this.GetDataview().getCurrRec()).getId();
178
+ if (newRecId === oldRecId && !this._suffixDone) {
179
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
180
+ if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
181
+ this.GetDataview().restoreTopRecIdx();
182
+ await this.restoreOldDisplayLine(oldDisplayLine);
183
+ return;
184
+ }
185
+ try {
186
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
187
+ await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + this.getLastValidRow(), false, true);
188
+ visibleLine = this.getLastValidRow();
189
+ }
190
+ catch (Exception) {
191
+ }
192
+ }
193
+ }
194
+ else {
195
+ this.GetDataview().restoreTopRecIdx();
196
+ await this.restoreOldDisplayLine(oldDisplayLine);
197
+ if (unit === Constants.MOVE_UNIT_ROW && direction === Constants.MOVE_DIRECTION_NEXT) {
198
+ if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
199
+ this._task.setExecEndTask();
200
+ else
201
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
202
+ }
203
+ return;
204
+ }
205
+ Logger.Instance.WriteDevToLog(ex.Message);
206
+ }
207
+ }
208
+ }
209
+ else {
210
+ try {
211
+ oldTaskMode = this._task.getMode();
212
+ oldRecId = (this.GetDataview().getCurrRec()).getId();
213
+ await this.setCurrRowByDisplayLine(oldDisplayLine + size, true, false);
214
+ if (!this.GetDataview().recExistsById(oldRecId)) {
215
+ if (size > 0 || oldTaskMode !== Constants.TASK_MODE_CREATE)
216
+ if (size !== -1 || this.GetDataview().recExists(oldDisplayLine))
217
+ await this.setCurrRowByDisplayLine(oldDisplayLine, false, false);
218
+ else
219
+ Logger.Instance.WriteDevToLog(NString.Format("skipped setcurrRow for row {0}", oldDisplayLine));
220
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
221
+ }
222
+ else if (AccessHelper.eventsManager.GetStopExecutionFlag()) {
223
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
224
+ }
225
+ }
226
+ catch (ex) {
227
+ if (ex instanceof RecordOutOfDataViewException) {
228
+ if (this.GetDataview().recExistsById(oldRecId)) {
229
+ await this.restoreOldDisplayLine(oldDisplayLine);
230
+ if (!currRec.Synced && oldTaskMode === Constants.TASK_MODE_CREATE) {
231
+ this._task.setMode(Constants.TASK_MODE_CREATE);
232
+ currRec.clearMode();
233
+ currRec.setMode(DataModificationTypes.Insert);
234
+ currRec.setNewRec();
235
+ }
236
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
237
+ }
238
+ else {
239
+ if (oldTaskMode === Constants.TASK_MODE_CREATE && oldDisplayLine > 0)
240
+ await this.restoreOldDisplayLine(oldDisplayLine - 1);
241
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
242
+ }
243
+ if (size <= 0 || AccessHelper.eventsManager.GetStopExecutionFlag())
244
+ Logger.Instance.WriteDevToLog(ex.Message);
245
+ else {
246
+ if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
247
+ this._task.setExecEndTask();
248
+ return;
249
+ }
250
+ else {
251
+ if (this._task.ActionManager.isEnabled(InternalInterface.MG_ACT_CRELINE))
252
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
253
+ else {
254
+ let doRecordSuffix = true;
255
+ let refdoRecordSuffix = new RefParam(doRecordSuffix);
256
+ if (!await AccessHelper.eventsManager.DoTaskLevelRecordSuffix(this._task, refdoRecordSuffix))
257
+ await AccessHelper.eventsManager.DoTaskLevelRecordPrefix(this._task);
258
+ doRecordSuffix = refdoRecordSuffix.value;
259
+ }
260
+ }
261
+ }
262
+ return;
263
+ }
264
+ }
265
+ }
266
+ }
267
+ else {
268
+ try {
269
+ await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx() + size, true, false, true, SET_DISPLAYLINE_BY_DV);
270
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
271
+ }
272
+ catch (ex) {
273
+ if (ex instanceof RecordOutOfDataViewException) {
274
+ if (size > 0) {
275
+ if (!this._task.IsInteractive && this._task.getMode() !== Constants.TASK_MODE_CREATE)
276
+ this._task.setExecEndTask();
277
+ else
278
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
279
+ }
280
+ else
281
+ Logger.Instance.WriteDevToLog(ex.Message);
282
+ return;
283
+ }
284
+ else if (ex instanceof ServerError) {
285
+ await this._task.stop();
286
+ this._task.abort();
287
+ await AccessHelper.eventsManager.ProcessAbortingError(ex);
288
+ }
289
+ else if (ex instanceof Exception) {
290
+ Logger.Instance.WriteDevToLog(ex.Message);
291
+ return;
292
+ }
293
+ }
294
+ }
295
+ }
296
+ if (returnToVisibleLine) {
297
+ if (recordOutOfView) {
298
+ if (visibleLine === 0)
299
+ this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
300
+ else
301
+ this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx() - this._rowsInPage);
302
+ this.SetTableTopIndex();
303
+ }
304
+ else {
305
+ this.SetTableTopIndex();
306
+ await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + visibleLine, false, true);
307
+ }
308
+ }
309
+ else
310
+ this.SetTableTopIndex();
311
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
312
+ }
313
+ catch (e) {
314
+ if (e instanceof RecordOutOfDataViewException) {
315
+ Logger.Instance.WriteDevToLog(e.Message);
316
+ }
317
+ }
318
+ finally {
319
+ this.SelectRow();
320
+ this.IsMovingInView = false;
321
+ }
322
+ }
323
+ async addRec(doSuffix, isCrelineAbove) {
324
+ let newLine = 1;
325
+ let currLine = -1;
326
+ if (!this._task.DataView.isEmptyDataview())
327
+ currLine = this.getVisibleLine();
328
+ if (this.isTableWithAbsoluteScrollbar()) {
329
+ this.GetDataview().TotalRecordsCount += 1;
330
+ this.RefreshAllRows = true;
331
+ }
332
+ let newRecIdx = await this.GetDataview().addRecord(doSuffix, false, isCrelineAbove);
333
+ if (newRecIdx > -1) {
334
+ if (this.isLineMode()) {
335
+ let newCurrRow;
336
+ if (this.GetDataview().getSize() === 0 || this.GetDataview().getTopRecIdx() === Int32.MinValue) {
337
+ this.GetDataview().setTopRecIdx(0);
338
+ newCurrRow = 0;
339
+ }
340
+ else if (currLine === this._rowsInPage - 1) {
341
+ this.GetDataview().setTopRecIdx(this.GetDataview().getTopRecIdx() + 1);
342
+ newCurrRow = this.getVisibleLine();
343
+ }
344
+ else {
345
+ if (isCrelineAbove)
346
+ newCurrRow = currLine > 0 ? currLine : 0;
347
+ else
348
+ newCurrRow = currLine + 1;
349
+ }
350
+ newLine = this.GetDataview().getTopRecIdx() + newCurrRow;
351
+ this.removeRecordsAfterIdx(this.GetDataview().getTopRecIdx() + newCurrRow);
352
+ try {
353
+ if (!this._task.DataView.isEmptyDataview())
354
+ this._task.setMode(Constants.TASK_MODE_CREATE);
355
+ await this.setCurrRowByDisplayLine(newLine, false, false);
356
+ }
357
+ catch (ex) {
358
+ if (ex instanceof RecordOutOfDataViewException) {
359
+ Logger.Instance.WriteDevToLog(NString.Format("in Form.addRec() {0}", ex.Message));
360
+ }
361
+ }
362
+ await this.RefreshDisplay(Constants.TASK_REFRESH_TABLE);
363
+ }
364
+ }
365
+ else if (this.isTableWithAbsoluteScrollbar()) {
366
+ this.GetDataview().TotalRecordsCount -= 1;
367
+ this.RefreshAllRows = false;
368
+ }
369
+ }
370
+ async delCurrRec() {
371
+ let topTableRow = super.isLineMode() && this.GetDataview().getTopRecIdx() === this.GetDataview().getCurrRecIdx();
372
+ await this.GetDataview().removeCurrRec();
373
+ if (this.GetDataview().isEmpty() && !this._task.IsTryingToStop) {
374
+ if (this._task.DataView.isEmptyDataview()) {
375
+ await this.addRec(false, false);
376
+ }
377
+ else {
378
+ if (await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) {
379
+ if (this._task.getMode() !== Constants.TASK_MODE_CREATE)
380
+ this._task.setMode(Constants.TASK_MODE_CREATE);
381
+ this._task.enableCreateActs(true);
382
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
383
+ }
384
+ else
385
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_EXIT);
386
+ }
387
+ }
388
+ if (!this.GetDataview().isEmpty()) {
389
+ if (topTableRow)
390
+ this.GetDataview().setTopRecIdx(this.GetDataview().getCurrRecIdx());
391
+ if (super.isLineMode()) {
392
+ if (super.HasTable()) {
393
+ if (this.isTableWithAbsoluteScrollbar()) {
394
+ this.GetDataview().TotalRecordsCount--;
395
+ this.RefreshAllRows = true;
396
+ }
397
+ this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
398
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
399
+ }
400
+ else
401
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
402
+ }
403
+ else {
404
+ try {
405
+ await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), true, true, true, SET_DISPLAYLINE_BY_DV);
406
+ }
407
+ catch (ex) {
408
+ if (ex instanceof RecordOutOfDataViewException) {
409
+ }
410
+ else
411
+ throw ex;
412
+ }
413
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
414
+ }
415
+ }
416
+ }
417
+ async cancelEdit(isActCancel, isQuitEvent) {
418
+ let mode = this._task.getMode();
419
+ let newMode;
420
+ let row = 0;
421
+ let execRecPrefix = false;
422
+ if (this.GetDataview().getSize() === 1 && mode === Constants.TASK_MODE_CREATE)
423
+ newMode = Constants.TASK_MODE_CREATE;
424
+ else
425
+ newMode = Constants.TASK_MODE_MODIFY;
426
+ let recRemoved = await this.GetDataview().cancelEdit(false, false);
427
+ this.GetDataview().setPrevCurrRec(null);
428
+ if ((this.GetDataview().isEmpty() || ((isActCancel && recRemoved) && (!GuiEnvironment.Environment.GetSpecialCancelOnCreate()) && this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE)) && !this._task.IsTryingToStop) {
429
+ let orgCancelWasRaised = this._task.cancelWasRaised();
430
+ this._task.setCancelWasRaised(isActCancel);
431
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_CRELINE);
432
+ this._task.setCancelWasRaised(orgCancelWasRaised);
433
+ }
434
+ else if (isActCancel)
435
+ execRecPrefix = true;
436
+ if (!this.GetDataview().isEmpty()) {
437
+ if (super.isLineMode()) {
438
+ try {
439
+ if (super.HasTable()) {
440
+ row = this.getVisibleLine();
441
+ if (row < 0 || row >= this._rowsInPage) {
442
+ let topRecIdx = this.GetDataview().getTopRecIdx();
443
+ let currRecIdx = this.GetDataview().getCurrRecIdx();
444
+ if (topRecIdx > currRecIdx)
445
+ this.GetDataview().setTopRecIdx(currRecIdx);
446
+ row = 0;
447
+ }
448
+ await this.setCurrRowByDisplayLine(this.GetDataview().getTopRecIdx() + row, false, true);
449
+ }
450
+ }
451
+ catch (ex) {
452
+ if (ex instanceof RecordOutOfDataViewException) {
453
+ if (row !== 0)
454
+ Logger.Instance.WriteDevToLog(NString.Format("in Form.cancelEdit() {0}", ex.Message));
455
+ }
456
+ else
457
+ throw ex;
458
+ }
459
+ if (super.HasTable()) {
460
+ if (this.isTableWithAbsoluteScrollbar() && recRemoved) {
461
+ this.GetDataview().TotalRecordsCount--;
462
+ this.RefreshAllRows = true;
463
+ }
464
+ this.removeRecordsAfterIdx(this.GetDataview().getCurrRecIdx());
465
+ }
466
+ }
467
+ else {
468
+ try {
469
+ await this.GetDataview().setCurrRecByIdx(this.GetDataview().getCurrRecIdx(), false, true, true, SET_DISPLAYLINE_BY_DV);
470
+ }
471
+ catch (ex) {
472
+ if (ex instanceof RecordOutOfDataViewException) {
473
+ Logger.Instance.WriteDevToLog("in Form.cancelEdit() error in Screen mode for Current Record");
474
+ }
475
+ else
476
+ throw ex;
477
+ }
478
+ }
479
+ this._task.setMode(newMode);
480
+ if (!this._task.InEndTask)
481
+ await this.RefreshDisplay(Constants.TASK_REFRESH_FORM);
482
+ if (!this._task.InEndTask)
483
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
484
+ }
485
+ if (execRecPrefix) {
486
+ this._task.setLevel(Constants.TASK_LEVEL_TASK);
487
+ let lastParkedCtrl = LastFocusedManager.getLastFocusedControl();
488
+ if (lastParkedCtrl !== null) {
489
+ if (lastParkedCtrl.getForm().getTask().pathContains(this._task))
490
+ for (let parent = lastParkedCtrl.getForm().getTask(); parent !== null && parent !== this._task; parent = parent.getParent()) {
491
+ parent.setLevel(Constants.TASK_LEVEL_TASK);
492
+ (parent.DataView.getCurrRec()).resetModified();
493
+ }
494
+ else
495
+ lastParkedCtrl.getForm().getTask().setLevel(Constants.TASK_LEVEL_TASK);
496
+ }
497
+ if (!isQuitEvent) {
498
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_PREFIX);
499
+ await AccessHelper.eventsManager.HandleParkabilityOnRowChange(this._task);
500
+ }
501
+ }
502
+ }
503
+ async refreshOnExpressions() {
504
+ for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
505
+ let mgControl = ((this.CtrlTab.getCtrl(i) instanceof MgControl) ? this.CtrlTab.getCtrl(i) : null);
506
+ if (mgControl != null)
507
+ await mgControl.refreshOnExpression();
508
+ else
509
+ Debug.Assert(false);
510
+ }
511
+ await super.refreshPropsOnExpression();
512
+ }
513
+ removeRefsToCtrls() {
514
+ let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
515
+ if (lastFocusedControl !== null && lastFocusedControl.getForm() === this)
516
+ LastFocusedManager.setLastFocusedControl(this._task, null);
517
+ super.removeRefsToCtrls();
518
+ }
519
+ getCtrlByCtrlName(ctrlName) {
520
+ return this.CtrlTab.getCtrl(ctrlName);
521
+ }
522
+ getSubFormCtrlByName(ctrlName) {
523
+ let guiParentTask;
524
+ let destSubForm = null;
525
+ for (guiParentTask = this._task; destSubForm === null && guiParentTask !== null && guiParentTask.getForm() !== null; guiParentTask = guiParentTask.getParent()) {
526
+ destSubForm = guiParentTask.getForm().getCtrlByName(ctrlName, MgControlType.CTRL_TYPE_SUBFORM);
527
+ if (destSubForm == null) {
528
+ if (!guiParentTask.IsSubForm || NString.Equals(guiParentTask.getForm().getSubFormCtrl().Name, ctrlName, true))
529
+ break;
530
+ }
531
+ }
532
+ return destSubForm;
533
+ }
534
+ setSuffixDone() {
535
+ this._suffixDone = true;
536
+ }
537
+ getDestinationRow() {
538
+ return this._destTblRow;
539
+ }
540
+ setSubFormCtrl(subFormCtrl) {
541
+ Debug.Assert(this._subFormCtrl === null && subFormCtrl !== null);
542
+ this._subFormCtrl = subFormCtrl;
543
+ }
544
+ getSubFormCtrlForTask(taskId) {
545
+ let curr = null;
546
+ let parentCtrlTab;
547
+ let guiParentForm = null;
548
+ let destSubForm = null;
549
+ for (guiParentForm = this; guiParentForm != null; guiParentForm = guiParentForm.ParentForm) {
550
+ parentCtrlTab = guiParentForm.CtrlTab;
551
+ for (let i = 0; i < parentCtrlTab.getSize(); i++) {
552
+ curr = ((parentCtrlTab.getCtrl(i) instanceof MgControl) ? parentCtrlTab.getCtrl(i) : null);
553
+ if (curr != null && curr.isSubform() && (curr.getSubformTaskId() != null))
554
+ if (curr.getSubformTaskId() === taskId) {
555
+ destSubForm = curr;
556
+ break;
557
+ }
558
+ }
559
+ if (destSubForm != null)
560
+ break;
561
+ }
562
+ return destSubForm;
563
+ }
564
+ removeRecordsAfterIdx(idx) {
565
+ let removeAll = false;
566
+ if (this.isTableWithPagination())
567
+ this.setTableItemsCount(false);
568
+ else {
569
+ if (idx <= this._rowsInPage + 1 && this.GetDataview().getSize() > this._rowsInPage)
570
+ idx = 0;
571
+ if (idx === 0)
572
+ removeAll = true;
573
+ super.SetTableItemsCount(idx, removeAll);
574
+ this.setTableItemsCount(false);
575
+ }
576
+ }
577
+ isRowValidated(idx) {
578
+ if (this.Rows.length <= idx || idx < 0)
579
+ return false;
580
+ let row = this.Rows.get_Item(idx);
581
+ if (row == null)
582
+ return false;
583
+ return row.Created && row.Validated;
584
+ }
585
+ async transferDataToGui() {
586
+ let saveRowIdx = this.GetDataview().getCurrRecIdx();
587
+ let maxTime = Misc.getSystemMilliseconds() + MgForm.TIME_LIMIT;
588
+ let updated = false;
589
+ let currentEditingControl = super.getTask().CurrentEditingControl;
590
+ try {
591
+ let bkpRecord = this.GetDataview().backupCurrent();
592
+ while (Misc.getSystemMilliseconds() < maxTime && this.RefreshRepeatableAllowed) {
593
+ if (this._lastRowSent + 1 >= this.GetDataview().getSize()) {
594
+ this.RefreshUI();
595
+ break;
596
+ }
597
+ else if (this.isTableWithPagination() && this._lastRowSent + 1 >= this.getMaxRowsInPaginatedTable()) {
598
+ this.RefreshUI();
599
+ break;
600
+ }
601
+ this._lastRowSent++;
602
+ this._transferringDataToGUI = true;
603
+ this.AllowedSubformRecompute = false;
604
+ if (!this.isRowValidated(this._lastRowSent)) {
605
+ super.checkAndCreateRow(this._lastRowSent);
606
+ if (this._lastRowSent !== saveRowIdx) {
607
+ super.getTask().CurrentEditingControl = null;
608
+ await this.setCurrRowByDisplayLine(this._lastRowSent, false, true);
609
+ await super.refreshControls(true);
610
+ updated = true;
611
+ }
612
+ }
613
+ this.AllowedSubformRecompute = true;
614
+ this._transferringDataToGUI = false;
615
+ }
616
+ if (updated) {
617
+ await this.restoreBackup(saveRowIdx, bkpRecord);
618
+ await super.refreshControls(true);
619
+ super.getTask().CurrentEditingControl = currentEditingControl;
620
+ }
621
+ }
622
+ catch (ex) {
623
+ if (ex instanceof RecordOutOfDataViewException) {
624
+ Logger.Instance.WriteDevToLog(ex.Message);
625
+ }
626
+ else
627
+ throw ex;
628
+ }
629
+ this._transferingData = false;
630
+ this.checkAndCreateRowsEvent();
631
+ }
632
+ checkAndCreateRowsEvent() {
633
+ if (this._tableMgControl !== null && this.Opened && this.RefreshRepeatableAllowed) {
634
+ let size = this.GetDataview().getSize();
635
+ if (this._lastRowSent >= this.Rows.length) {
636
+ this._lastRowSent = this.Rows.length - 1;
637
+ }
638
+ let transferDataToGui = this._lastRowSent < (size - 1);
639
+ if (this.isTableWithPagination() && (this._lastRowSent + 1) >= this.getMaxRowsInPaginatedTable())
640
+ transferDataToGui = false;
641
+ if (transferDataToGui && !this._transferingData) {
642
+ AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_DV_TO_GUI, Priority.LOWEST);
643
+ this._transferingData = true;
644
+ }
645
+ else if (this.shouldFetchRecordsAheadFromServer && !transferDataToGui && (!this.GetDataview().IncludesLast() || !this.GetDataview().IncludesFirst())) {
646
+ AccessHelper.eventsManager.addInternalEventWithCtrlAndCodeAndPriority(this._tableMgControl, InternalInterface.MG_ACT_FETCH_RECORDS_AHEAD_FROM_SERVER, Priority.LOWEST);
647
+ }
648
+ }
649
+ }
650
+ async setRowData(desiredTopIndex, sendAll) {
651
+ let saveRowIdx = this.GetDataview().getCurrRecIdx();
652
+ let diff = 0;
653
+ let getPrevChunk = false;
654
+ let getNextChunk = false;
655
+ let updated = false;
656
+ if (desiredTopIndex !== Int32.MinValue) {
657
+ if (desiredTopIndex < 0) {
658
+ getPrevChunk = true;
659
+ this.GetDataview().setTopRecIdx(0);
660
+ }
661
+ else if (desiredTopIndex + this._rowsInPage + 1 >= this.GetDataview().getSize())
662
+ getNextChunk = true;
663
+ }
664
+ else
665
+ desiredTopIndex = this.GetDataview().getTopRecIdx();
666
+ let bkpRecord = this.GetDataview().backupCurrent();
667
+ this._transferringDataToGUI = true;
668
+ this.AllowedSubformRecompute = false;
669
+ let diffRef = new RefParam(diff);
670
+ updated = await this.refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef);
671
+ diff = diffRef.value;
672
+ if ((getPrevChunk && diff !== 0) || getNextChunk) {
673
+ this.GetDataview().setTopRecIdx(desiredTopIndex + diff);
674
+ this.SetTableTopIndex();
675
+ if (this._topIndexUpdated) {
676
+ this._topIndexUpdated = false;
677
+ }
678
+ }
679
+ this.AllowedSubformRecompute = true;
680
+ this._transferringDataToGUI = false;
681
+ if (updated) {
682
+ await this.restoreBackup(saveRowIdx + diff, bkpRecord);
683
+ await super.refreshControls(true);
684
+ }
685
+ super.SelectRow();
686
+ if (getPrevChunk) {
687
+ let lastFocusedControl = LastFocusedManager.getLastFocusedControl();
688
+ if (lastFocusedControl !== null && lastFocusedControl.getParentTable() === this._tableMgControl) {
689
+ }
690
+ }
691
+ }
692
+ async refreshRows(desiredTopIndex, sendAll, saveRowIdx, diffRef) {
693
+ let index = 0;
694
+ let updated = false;
695
+ diffRef.value = 0;
696
+ let orgIncludesFirst = this.GetDataview().IncludesFirst();
697
+ let orgIncludesLast = this.GetDataview().IncludesLast();
698
+ for (let i = 0; i < this._rowsInPage; i++) {
699
+ let idx = desiredTopIndex + i;
700
+ let prevTopIdx = this.GetDataview().getTopRecIdx();
701
+ try {
702
+ index = idx + diffRef.value;
703
+ if (!this.isRowValidated(idx) || sendAll || this.RefreshAllRows) {
704
+ if (index >= 0)
705
+ super.checkAndCreateRow(index);
706
+ if (saveRowIdx + diffRef.value !== index) {
707
+ await this.setCurrRowByDisplayLine(index, false, true);
708
+ await super.refreshControls(true);
709
+ }
710
+ updated = true;
711
+ }
712
+ }
713
+ catch (ex) {
714
+ if (ex instanceof RecordOutOfDataViewException) {
715
+ if (super.isRowCreated(index))
716
+ super.markRowNOTCreated(index);
717
+ break;
718
+ }
719
+ else
720
+ throw ex;
721
+ }
722
+ finally {
723
+ diffRef.value = diffRef.value + (this.GetDataview().getTopRecIdx() - prevTopIdx);
724
+ prevTopIdx = this.GetDataview().getTopRecIdx();
725
+ if (!updated && this.GetDataview().DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast))
726
+ updated = true;
727
+ }
728
+ }
729
+ this.RefreshUI();
730
+ this.RefreshAllRows = false;
731
+ return updated;
732
+ }
733
+ getVisibleLine() {
734
+ let currRecIdx = 0;
735
+ if (this.GetDataview().getCurrRecIdx() !== Int32.MinValue)
736
+ currRecIdx = this.GetDataview().getCurrRecIdx();
737
+ return currRecIdx - Math.max(this.GetDataview().getTopRecIdx(), 0);
738
+ }
739
+ async bringRecordToPage() {
740
+ if (this._tableMgControl !== null && !this._task.DataView.isEmptyDataview()) {
741
+ let topIndex = Commands.getTopIndex(this._tableMgControl);
742
+ let currIdx = this.GetDataview().getCurrRecIdx();
743
+ let newTopIndex = topIndex;
744
+ if (!this.isTableWithPagination()) {
745
+ if (topIndex > currIdx) {
746
+ this._topIndexUpdated = true;
747
+ newTopIndex = currIdx;
748
+ }
749
+ else if (topIndex + this._rowsInPage - 1 < currIdx) {
750
+ this._topIndexUpdated = true;
751
+ if (this._rowsInPage > 0)
752
+ newTopIndex = currIdx - this._rowsInPage + 1;
753
+ else
754
+ newTopIndex = currIdx;
755
+ }
756
+ }
757
+ else {
758
+ let currGuiIdx = this.getGuiRowidx(currIdx);
759
+ let newTopGuiIndex = (currGuiIdx) - ((currGuiIdx) % this._rowsInPage);
760
+ newTopIndex = this.getDvRowIdx(newTopGuiIndex);
761
+ if (newTopIndex !== this._prevGuiTopIndex || this.IsMovingInView)
762
+ this._topIndexUpdated = true;
763
+ }
764
+ if (this.GetDataview().getTopRecIdx() !== newTopIndex || this._topIndexUpdated) {
765
+ this.GetDataview().setTopRecIdx(newTopIndex);
766
+ this.SetTableTopIndex();
767
+ await this.setRowData(Int32.MinValue, false);
768
+ this._topIndexUpdated = false;
769
+ }
770
+ }
771
+ }
772
+ invalidateTable() {
773
+ for (let i = 0; i < this.Rows.length; i++) {
774
+ let row = this.Rows.get_Item(i);
775
+ if (row !== null)
776
+ row.Validated = false;
777
+ }
778
+ this._lastRowSent = -1;
779
+ this.checkAndCreateRowsEvent();
780
+ }
781
+ getPrevLine(line) {
782
+ return line - 1;
783
+ }
784
+ clearTableColumnSortMark(clearSortMark) {
785
+ if (clearSortMark) {
786
+ }
787
+ }
788
+ async stopRowEditing(idx) {
789
+ if (this.getIsRowEditingFromGui(idx)) {
790
+ Commands.addValueWithLine(CommandType.SET_NOT_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
791
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
792
+ Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
793
+ }
794
+ }
795
+ async startRowEditing(idx) {
796
+ if (!this.getIsRowEditingFromGui(idx)) {
797
+ Commands.addValueWithLine(CommandType.SET_IS_ROW_EDITING, this, this.isLineMode() ? idx : 0, this.isLineMode());
798
+ await this.RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
799
+ Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
800
+ }
801
+ }
802
+ getIsRowEditingFromGui(displayIndex) {
803
+ let isRowEditing = Commands.getIsRowEditing(this, this.isLineMode() ? displayIndex : 0, this.isLineMode());
804
+ return isRowEditing;
805
+ }
806
+ async RefreshDisplay(refreshType) {
807
+ let task = this._task;
808
+ if (this.isFetchingRecordsAhead)
809
+ return false;
810
+ if (task.isAborting())
811
+ return false;
812
+ let currRec = this.GetDataview().getCurrRec();
813
+ if (currRec !== null && currRec.InCompute && !currRec.isNewRec())
814
+ return false;
815
+ if (this._inRefreshDisp)
816
+ return false;
817
+ this._inRefreshDisp = true;
818
+ try {
819
+ if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_TABLE) {
820
+ if (super.HasTable() && this.Opened)
821
+ await this.refreshTable();
822
+ }
823
+ if (refreshType === Constants.TASK_REFRESH_FORM || refreshType === Constants.TASK_REFRESH_CURR_REC) {
824
+ if (refreshType === Constants.TASK_REFRESH_CURR_REC && super.hasTable()) {
825
+ this.SetTableTopIndex();
826
+ super.SelectRow();
827
+ await this.fetchPrevChunkForCurrentPage();
828
+ }
829
+ await super.refreshProps();
830
+ await super.refreshControls(false);
831
+ }
832
+ }
833
+ catch (ex) {
834
+ if (ex instanceof Exception) {
835
+ Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("{0} : {1} in task {2}", ex.GetType(), ex.Message, super.getTask().PreviouslyActiveTaskId));
836
+ }
837
+ else
838
+ throw ex;
839
+ }
840
+ finally {
841
+ this._inRefreshDisp = false;
842
+ }
843
+ if (refreshType === Constants.TASK_REFRESH_CURR_REC && (!super.isLineMode() || this._tableRefreshed)) {
844
+ this.FormRefreshed = true;
845
+ if (this._task.isFirstRecordCycle() || AccessHelper.eventsManager.getIsInViewRefresh()) {
846
+ Commands.addNoParameters(CommandType.SET_WC_IDLE, this);
847
+ AccessHelper.eventsManager.setIsInViewRefresh(false);
848
+ }
849
+ }
850
+ return true;
851
+ }
852
+ RefreshUI() {
853
+ if (!this.getTask().isMainProg()) {
854
+ Commands.addNoParameters(CommandType.REFRESH_TASK, this.getForm());
855
+ }
856
+ }
857
+ async refreshTable() {
858
+ if (this.isFetchingRecordsAhead)
859
+ return;
860
+ Logger.Instance.WriteGuiToLog("Start form.refreshTable()");
861
+ this.updateDisplayLineByDV();
862
+ let oldCurrRow = this.DisplayLine;
863
+ let currRecIdx = this.GetDataview().getCurrRecIdx();
864
+ if (!this._tableRefreshed && currRecIdx >= 0) {
865
+ oldCurrRow = this.GetDataview().getCurrRecIdx();
866
+ if (oldCurrRow + 1 > this._rowsInPage)
867
+ this.GetDataview().setTopRecIdx(oldCurrRow - Math.floor(this._rowsInPage / 2) + 1);
868
+ else
869
+ this.GetDataview().setTopRecIdx(0);
870
+ }
871
+ else {
872
+ if (oldCurrRow === Int32.MinValue)
873
+ oldCurrRow = 0;
874
+ if (this.GetDataview().getTopRecIdx() === Int32.MinValue)
875
+ this.GetDataview().setTopRecIdx(currRecIdx);
876
+ }
877
+ if (this.GetDataview().getTopRecIdx() < 0)
878
+ return;
879
+ oldCurrRow = oldCurrRow - this.GetDataview().getTopRecIdx();
880
+ let bkpRecord = this.GetDataview().backupCurrent();
881
+ this._tableRefreshed = true;
882
+ let oriTransferDataToGui = this._transferringDataToGUI;
883
+ if (!oriTransferDataToGui)
884
+ this._transferringDataToGUI = true;
885
+ this.AllowedSubformRecompute = false;
886
+ for (let i = 0; i < this._rowsInPage; i++) {
887
+ let topIndex = this.GetDataview().getTopRecIdx();
888
+ if (topIndex < 0) {
889
+ this.GetDataview().setTopRecIdx(0);
890
+ topIndex = 0;
891
+ }
892
+ let idx = topIndex + i;
893
+ try {
894
+ super.checkAndCreateRow(idx);
895
+ if (i !== oldCurrRow) {
896
+ await this.setCurrRowByDisplayLine(idx, false, true);
897
+ await super.refreshControls(true);
898
+ }
899
+ }
900
+ catch (ex) {
901
+ if (ex.name == "RecordOutOfDataViewException") {
902
+ if (super.isRowCreated(idx))
903
+ super.markRowNOTCreated(idx);
904
+ break;
905
+ }
906
+ else
907
+ throw ex;
908
+ }
909
+ }
910
+ this.AllowedSubformRecompute = true;
911
+ if (!oriTransferDataToGui)
912
+ this._transferringDataToGUI = false;
913
+ await this.restoreBackup(oldCurrRow + this.GetDataview().getTopRecIdx(), bkpRecord);
914
+ await super.refreshControls(true);
915
+ this.RefreshUI();
916
+ Logger.Instance.WriteGuiToLog("End form.refreshTable()");
917
+ }
918
+ updateDisplayLineByDV() {
919
+ this.DisplayLine = this.recordIdx2DisplayLine(this.GetDataview().getCurrRecIdx());
920
+ }
921
+ async setCurrRowByDisplayLine(displayLine, doSuffix, ignoreCurrRec) {
922
+ let recIdx = this.displayLine2RecordIdx(displayLine);
923
+ await this.setCurrRowByRecIdx(recIdx, doSuffix, ignoreCurrRec, displayLine);
924
+ if (super.HasTable())
925
+ this.updateDisplayLineByDV();
926
+ else
927
+ this.DisplayLine = displayLine;
928
+ }
929
+ async setCurrRowByRecIdx(rowNum, doSuffix, ignoreCurrRec, displayLine) {
930
+ if (this.GetDataview() === null || (!super.hasTable() && rowNum !== 0))
931
+ throw new ApplicationException("in Form.setCurrRow() no table ");
932
+ try {
933
+ this._destTblRow = rowNum;
934
+ await this.GetDataview().setCurrRecByIdx(rowNum, doSuffix, ignoreCurrRec, true, displayLine);
935
+ }
936
+ finally {
937
+ this._destTblRow = rowNum - this.GetDataview().getTopRecIdx();
938
+ }
939
+ }
940
+ getLastValidRow() {
941
+ return Math.min(this._rowsInPage - 1, this.GetDataview().getSize() - 1 - this.GetDataview().getTopRecIdx());
942
+ }
943
+ recordIdx2DisplayLine(recIdx) {
944
+ return recIdx;
945
+ }
946
+ displayLine2RecordIdx(displayLine) {
947
+ return displayLine;
948
+ }
949
+ async restoreOldDisplayLine(displayLine) {
950
+ try {
951
+ this._inRestore = true;
952
+ await this.setCurrRowByDisplayLine(displayLine, false, true);
953
+ }
954
+ catch (ex) {
955
+ if (ex instanceof RecordOutOfDataViewException) {
956
+ }
957
+ else
958
+ throw ex;
959
+ }
960
+ finally {
961
+ this._inRestore = false;
962
+ }
963
+ }
964
+ getTopIndexFromGUI() {
965
+ let topDisplayLine = super.getTopIndexFromGUI();
966
+ if (super.hasTable())
967
+ this.GetDataview().setTopRecIdx(this.displayLine2RecordIdx(topDisplayLine));
968
+ return topDisplayLine;
969
+ }
970
+ getCurrRecPosInForm() {
971
+ let topDisplayLine = super.getTopIndexFromGUI();
972
+ return this.DisplayLine - topDisplayLine + 1;
973
+ }
974
+ async restoreBackup(oldDisplayLine, bkpRecord) {
975
+ if (bkpRecord.getId() >= 0 && this.GetDataview().getRecIdx(bkpRecord.getId()) >= 0 && oldDisplayLine >= 0 && oldDisplayLine < this.GetDataview().getSize() && this.GetDataview().getCurrRecIdx() >= 0 && bkpRecord.getMode() === DataModificationTypes.None) {
976
+ this.GetDataview().restoreCurrent(bkpRecord);
977
+ this.updateDisplayLineByDV();
978
+ }
979
+ else
980
+ await this.restoreOldDisplayLine(oldDisplayLine);
981
+ }
982
+ ConstructMgControl(type, taskOrParentMgForm, parentControlOrParentControlIdx) {
983
+ if (arguments.length === 0) {
984
+ return this.ConstructMgControl_0();
985
+ }
986
+ if (arguments.length === 3 && (type === null || type.constructor === Number) && (taskOrParentMgForm === null || taskOrParentMgForm instanceof TaskBase) && (parentControlOrParentControlIdx === null || parentControlOrParentControlIdx.constructor === Number)) {
987
+ return this.ConstructMgControl_1(type, taskOrParentMgForm, parentControlOrParentControlIdx);
988
+ }
989
+ return this.ConstructMgControl_2(type, taskOrParentMgForm, parentControlOrParentControlIdx);
990
+ }
991
+ ConstructMgControl_0() {
992
+ return new MgControl();
993
+ }
994
+ ConstructMgControl_1(type, task, parentControl) {
995
+ return new MgControl(type, task, parentControl);
996
+ }
997
+ ConstructMgControl_2(type, parentMgForm, parentControlIdx) {
998
+ return new MgControl(type, parentMgForm, parentControlIdx);
999
+ }
1000
+ alreadyMovedToFirstControl() {
1001
+ return this._task.getMGData().AlreadyMovedToFirstControl();
1002
+ }
1003
+ async firstTableRefresh() {
1004
+ if (this._tableMgControl !== null) {
1005
+ super.firstTableRefresh();
1006
+ this.setTableItemsCount(false);
1007
+ await this.refreshTable();
1008
+ super.SelectRow();
1009
+ }
1010
+ }
1011
+ InsertTableItems(idx, count) {
1012
+ if (this._tableMgControl != null) {
1013
+ this.Rows.InsertRange(new Array(count));
1014
+ this.InsertTableChildrenArrays(idx, count);
1015
+ this._lastRowSent = -1;
1016
+ }
1017
+ this.setTableItemsCount(false);
1018
+ }
1019
+ setTableItemsCount(removeAll) {
1020
+ let tableItemsCount;
1021
+ if (this.isTableWithAbsoluteScrollbar()) {
1022
+ if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_CREATE
1023
+ && this._task.getMode() == Constants.TASK_MODE_CREATE) {
1024
+ tableItemsCount = this.GetDataview().getSize();
1025
+ if (this.GetDataview().RecordsBeforeCurrentView > 0) {
1026
+ this.GetDataview().RecordsBeforeCurrentView = 0;
1027
+ this.SetRecordsBeforeCurrentView(0);
1028
+ this.RefreshUI();
1029
+ }
1030
+ }
1031
+ else {
1032
+ tableItemsCount = (this.GetDataview().TotalRecordsCount > 0) ? this.GetDataview().TotalRecordsCount : 1;
1033
+ this.SetRecordsBeforeCurrentView(this.GetDataview().RecordsBeforeCurrentView);
1034
+ }
1035
+ }
1036
+ else {
1037
+ tableItemsCount = this.GetDataview().getSize();
1038
+ }
1039
+ super.SetTableItemsCount(this.GetDataview().getSize(), tableItemsCount, removeAll);
1040
+ }
1041
+ InitTableControl(dvSize, tableItemsCount, removeAll) {
1042
+ if (arguments.length === 0) {
1043
+ this.InitTableControl_00();
1044
+ return;
1045
+ }
1046
+ this.InitTableControl_01(dvSize, tableItemsCount, removeAll);
1047
+ }
1048
+ InitTableControl_00() {
1049
+ let dvSize = 1;
1050
+ let tableItemsCount = 1;
1051
+ if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
1052
+ let recordsBeforeCurrentView = this.GetDataview().RecordsBeforeCurrentView;
1053
+ tableItemsCount = this.GetDataview().TotalRecordsCount;
1054
+ Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, recordsBeforeCurrentView);
1055
+ }
1056
+ this.InitTableControl(dvSize, tableItemsCount, false);
1057
+ this.SetTableTopIndex();
1058
+ }
1059
+ InitTableControl_01(dvSize, tableItemsCount, removeAll) {
1060
+ if (this._tableMgControl !== null) {
1061
+ if (removeAll) {
1062
+ Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, true);
1063
+ Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, true);
1064
+ }
1065
+ else {
1066
+ Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_FIRST, this._tableMgControl, 0, this.GetDataview().IncludesFirst() || this.GetDataview().IsOneWayKey);
1067
+ Commands.addBoolWithLine(CommandType.SET_TABLE_INCLUDES_LAST, this._tableMgControl, 0, this.GetDataview().IncludesLast());
1068
+ Commands.addBoolWithLine(CommandType.SET_EMPTY_DATAVIEW, this._tableMgControl, 0, this.GetDataview().isEmptyDataview());
1069
+ }
1070
+ super.InitTableControl(dvSize, tableItemsCount, removeAll);
1071
+ this.checkAndCreateRowsEvent();
1072
+ }
1073
+ }
1074
+ SetTableTopIndex() {
1075
+ if (this._tableMgControl !== null) {
1076
+ let index = this.GetDataview().getTopRecIdx();
1077
+ if (index === Int32.MinValue)
1078
+ index = 0;
1079
+ if (!this.isTableWithPagination()) {
1080
+ if (this.GetDataview().IncludesLast()) {
1081
+ if (index + this._rowsInPage > this.GetDataview().getSize()) {
1082
+ if (this.GetDataview().IncludesFirst() || this.GetDataview().getSize() > this._rowsInPage + 1) {
1083
+ index = Math.max(this.GetDataview().getSize() - this._rowsInPage, 0);
1084
+ this.GetDataview().setTopRecIdx(index);
1085
+ this._topIndexUpdated = true;
1086
+ }
1087
+ }
1088
+ }
1089
+ }
1090
+ if (index !== this._prevGuiTopIndex || this.IsMovingInView) {
1091
+ Commands.addWithNumber(CommandType.SET_TABLE_TOP_INDEX, this._tableMgControl, index);
1092
+ this._prevGuiTopIndex = this.getGuiRowidx(index);
1093
+ }
1094
+ }
1095
+ }
1096
+ async createForm() {
1097
+ await super.createForm();
1098
+ MgForm.CreatedForms.add(this);
1099
+ }
1100
+ UpdateStatusBar() {
1101
+ }
1102
+ initInnerObjects(foundTagName) {
1103
+ if (foundTagName === null)
1104
+ return false;
1105
+ let parser = Manager.GetCurrentRuntimeContext().Parser;
1106
+ if (foundTagName === XMLConstants.MG_TAG_RECOMPUTE) {
1107
+ Logger.Instance.WriteDevToLog("goes to recompute form");
1108
+ this._task.RecomputeFillData(parser);
1109
+ return true;
1110
+ }
1111
+ return super.initInnerObjects(foundTagName);
1112
+ }
1113
+ toString() {
1114
+ return "{" + this.constructor.name + ": task=" + this._task + ", Id=" + this._userStateId + "}";
1115
+ }
1116
+ GetHiddenControlListXML() {
1117
+ let xml = new StringBuilder();
1118
+ if (this.hiddenControlsIsnsList !== null && this.hiddenControlsIsnsList.length > 0) {
1119
+ xml.Append("<" + ConstInterface.MG_TAG_HIDDEN_CONTOLS + " " + ConstInterface.MG_ATTR_ISNS + "=\"");
1120
+ this.hiddenControlsIsnsList.forEach((change) => {
1121
+ xml.Append(change + ",");
1122
+ });
1123
+ xml.Remove(xml.Length - 1, 1);
1124
+ xml.Append("\"/>");
1125
+ this.hiddenControlsIsnsList = null;
1126
+ }
1127
+ return xml.ToString();
1128
+ }
1129
+ ShouldBehaveAsModal() {
1130
+ let shouldBeModal = false;
1131
+ if (!this._task.IsInteractive && !this._task.isMainProg())
1132
+ shouldBeModal = TaskBase.ShouldNonInteractiveBeModal();
1133
+ else {
1134
+ let parentTask = this._task.ParentTask;
1135
+ if (parentTask !== null && !parentTask.IsInteractive && !parentTask.isMainProg())
1136
+ shouldBeModal = parentTask.ShouldNonInteractiveChildBeModal();
1137
+ }
1138
+ return shouldBeModal;
1139
+ }
1140
+ isTableWithPagination() {
1141
+ return this.isTableWithAbsoluteScrollbar();
1142
+ }
1143
+ isTableWithAbsoluteScrollbar() {
1144
+ let tableWithAbsoluteScrollbar = false;
1145
+ if (this._tableMgControl !== null)
1146
+ tableWithAbsoluteScrollbar = this._tableMgControl.IsTableWithAbsoluteScrollbar();
1147
+ return tableWithAbsoluteScrollbar;
1148
+ }
1149
+ SetRecordsBeforeCurrentView(value) {
1150
+ if (this._tableMgControl !== null) {
1151
+ Commands.addWithNumber(CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW, this._tableMgControl, value);
1152
+ }
1153
+ }
1154
+ buildFormName() {
1155
+ let name = this.UniqueName;
1156
+ let task = this.getTask();
1157
+ name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
1158
+ while (task.IsSubtask) {
1159
+ task = task.StudioParentTask;
1160
+ name = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + '_' + name;
1161
+ }
1162
+ name = name.replace(/ /g, "_");
1163
+ name = name.replace(/-/g, "_");
1164
+ return name;
1165
+ }
1166
+ async fetchPrevChunkForCurrentPage() {
1167
+ if (this.isTableWithAbsoluteScrollbar() && this.GetDataview().TotalRecordsCount > 0) {
1168
+ let recPosOnPage = this.GetDataview().RecordsBeforeCurrentView % this._rowsInPage;
1169
+ if (recPosOnPage > 0 && this.DisplayLine === 0) {
1170
+ await this.setRowData(-recPosOnPage, false);
1171
+ }
1172
+ }
1173
+ }
1174
+ getGuiRowidx(dvRowIdx) {
1175
+ return dvRowIdx + this.GetDataview().RecordsBeforeCurrentView;
1176
+ }
1177
+ getDvRowIdx(guiRowIdx) {
1178
+ return guiRowIdx - this.GetDataview().RecordsBeforeCurrentView;
1179
+ }
1180
+ }
1181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ndWkvTWdGb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUVYLHFCQUFxQixFQUNyQixjQUFjLEVBQ2QsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sYUFBYSxFQUNiLElBQUksRUFDSixRQUFRLEVBQ1IsWUFBWSxFQUViLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFXLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE1BQU0sT0FBTyxNQUFPLFNBQVEsVUFBVTtJQUM1QixNQUFNLENBQUMsVUFBVSxH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QUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21tYW5kcyxcclxuICBDb21tYW5kVHlwZSxcclxuICBDb250cm9sVGFibGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIFByb3BJbnRlcmZhY2UsXHJcbiAgUm93XHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIFByaW9yaXR5LFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgSW50MzIsXHJcbiAgTGlzdCxcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbn0gZnJvbSAnLi4vZGF0YS9SZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uJztcclxuaW1wb3J0IHtEYXRhVmlldywgU0VUX0RJU1BMQVlMSU5FX0JZX0RWfSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tICcuLi9yZW1vdGUvU2VydmVyRXJyb3InO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuL0NyZWF0ZWRGb3JtVmVjdG9yJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIE1nRm9ybSBleHRlbmRzIE1nRm9ybUJhc2Uge1xyXG4gIHByaXZhdGUgc3RhdGljIFRJTUVfTElNSVQ6IG51bWJlciA9IDUwOyAvLyB0aW1lIGxpbWl0IGZvciBvbmUgdHJhbnNmZXIgb3BlcmF0aW9uIChpbiBtaWxsaSBzZWNvbmRzKVxyXG4gIElzTW92aW5nSW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJldkRpc3BsYXlMaW5lOiBudW1iZXIgPSAwOyAvLyBkaXNwbGF5IGlkZW50aWZpZXIgb2YgcHJldiBsaW5lXHJcbiAgUmVmcmVzaEFsbFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgSWdub3JlRmlyc3RSZWNvcmRDeWNsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1vdmVkVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSB3aGVuIG1vdmUgdG8gZmlyc3QgY29udHJvbCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGZvcm1cclxuXHJcbiAgcHJpdmF0ZSBfc3VmZml4RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGhpZGRlbkNvbnRyb2xzSXNuc0xpc3Q6IExpc3Q8bnVtYmVyPiA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IG5ldyBDcmVhdGVkRm9ybVZlY3RvcigpO1xyXG5cclxuICAvL1RPRE86IE1heWJlIHRoZSBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlIGFsbG93RmllbGRDb21wdXRlXHJcbiAgcHJpdmF0ZSBfdHJhbnNmZXJyaW5nRGF0YVRvR1VJOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaXNGZXRjaGluZ1JlY29yZHNBaGVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IENyZWF0ZWRGb3JtcygpOiBDcmVhdGVkRm9ybVZlY3RvciB7XHJcbiAgICByZXR1cm4gTWdGb3JtLl9jcmVhdGVkRm9ybXM7XHJcbiAgfVxyXG5cclxuICBnZXQgSW5SZXN0b3JlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVzdG9yZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2ZlcnJpbmdEYXRhVG9HVUkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3VsZEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgIGxldCBwcm9wID0gdGhpcy5fdGFibGVNZ0NvbnRyb2wuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRVJWRVJfUkVBRF9BSEVBRCk7XHJcblxyXG4gICAgICByZXR1cm4gKHByb3AgIT0gbnVsbCA/IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSA6IGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNGZXRjaGluZ1JlY29yZHNBaGVhZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk7XHJcbiAgICB0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSB0YXNrIGRhdGF2aWV3LCBpZiB0aGUgdGFzayBleGlzdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSB0YXNrIGRhdGF2aWV3PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgR2V0RGF0YXZpZXcoKTogRGF0YVZpZXcge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgIT0gbnVsbClcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuXHJcbiAgICByZXR1cm4gKGR2KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIG9uZSBwYWdlL3JvdyB1cC9kb3duIG9yIHRvIHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVuaXRcIj50byBtb3ZlIGludG88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRGlyZWN0aW9uXCI+b2YgbW92aW5nPC9wYXJhbT5cclxuICBhc3luYyBtb3ZlSW5WaWV3KHVuaXQ6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvbGRSZWNJZDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gICAgbGV0IHJldHVyblRvVmlzaWJsZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNvcmRPdXRPZlZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB2aXNpYmxlTGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLklzTW92aW5nSW5WaWV3ID0gdHJ1ZTtcclxuICAgICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgICAgLy8gdGFibGUgbW92ZW1lbnRzIChmaXJzdCAvIGxhc3QgcmVjb3JkKVxyXG4gICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBCRUdJTklORyBPRiBUQUJMRVxyXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0JFR0lOKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRDdXJyUmVjQnlJZHgoQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCwgdHJ1ZSwgZmFsc2UsIHRydWUsXHJcbiAgICAgICAgICAgICAgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB0YWJsZSBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUoMCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRU5EIE9GIFRBQkxFXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeChDb25zdGFudHMuTUdfREFUQVZJRVdfTEFTVF9SRUNPUkQsIHRydWUsIGZhbHNlLCB0cnVlLFxyXG4gICAgICAgICAgICAgIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGFibGUgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpIC0gdGhpcy5fcm93c0luUGFnZSArIDEpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPj0gMClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gcGFnZSBhbmQgcm93IG1vdmVtZW50c1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlY29yZHMgdG8gc2tpcFxyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJiB0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU46XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORDpcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGxhc3Q6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHRoaXMuX3Jvd3NJblBhZ2UgLSAxO1xyXG4gICAgICAgICAgICAgIGxhc3QgPSBNYXRoLm1pbihsYXN0LCB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgc2l6ZSA9IGxhc3QgLSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVyblRvVmlzaWJsZUxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHNpemUgPSB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBzaXplID0gMTtcclxuXHJcbiAgICAgICAgc2l6ZSA9IChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWIHx8XHJcbiAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU5cclxuICAgICAgICAgID8gLXNpemVcclxuICAgICAgICAgIDogc2l6ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPCAwKSB7XHJcbiAgICAgICAgICAgIHZpc2libGVMaW5lID0gMDtcclxuICAgICAgICAgICAgcmVjb3JkT3V0T2ZWaWV3ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2aXNpYmxlTGluZSA+IHRoaXMuX3Jvd3NJblBhZ2UgKyAxKSB7XHJcbiAgICAgICAgICAgIHZpc2libGVMaW5lID0gdGhpcy5fcm93c0luUGFnZTtcclxuICAgICAgICAgICAgcmVjb3JkT3V0T2ZWaWV3ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHNjcm9sbGluZyB0aGUgdGFibGUgb25lIHBhZ2Ugb3Igb25lIHJvdyB1cCBvciBkb3duXHJcbiAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFICYmXHJcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUIHx8XHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVikgfHxcclxuICAgICAgICAgICAgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiZcclxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQgJiYgdmlzaWJsZUxpbmUgPT09IHRoaXMuX3Jvd3NJblBhZ2UgLSAxIHx8XHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFViAmJiB2aXNpYmxlTGluZSA9PT0gMCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgd2UgbW92ZSB0byB0aGUgcHJldmlvdXMgcm93IGJ1dCB3ZSBhcmUgYXQgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUgYW5kIGRhdGEgdmlld1xyXG4gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYgJiZcclxuICAgICAgICAgICAgICAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgfHwgdW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFKSAmJlxyXG4gICAgICAgICAgICAgIHZpc2libGVMaW5lID09PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPT09IDAgJiYgdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB3ZSBtb3ZlIHRvIHRoZSBuZXh0IHJvdyBidXQgd2UgYXJlIGF0IHRoZSBsYXN0IHJvdyBvZiB0aGUgdGFibGUgYW5kIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUICYmIHVuaXQgPT09IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSAmJlxyXG4gICAgICAgICAgICAgIHZpc2libGVMaW5lID09PSB0aGlzLmdldExhc3RWYWxpZFJvdygpICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgPT09IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBvbGRSZWNJZCA9ICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHNpemUpO1xyXG4gICAgICAgICAgICAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkuc2V0VG9wUmVjSWR4TW9kaWZpZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3VmZml4RG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgKyBzaXplLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnNldFRvcFJlY0lkeE1vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKDAsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUUNSICM5OTU0OTY6IHdoZW4gdGhlIHJlY29yZCBzdWZmaXggZmFpbGVkIGdvIGJhY2sgdG8gdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCByb3dcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZXN0b3JlVG9wUmVjSWR4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh1bml0ICE9PSBDb25zdGFudHMuTU9WRV9VTklUX1JPVyAmJiAoPERhdGFWaWV3PnRoaXMuR2V0RGF0YXZpZXcoKSkucmVjRXhpc3RzKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM5OTIxMDE6IGlmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCBpdCBtZWFucyB0aGF0IHRoZSByZWMgc3VmZml4XHJcbiAgICAgICAgICAgICAgICAgIC8vIHdhc24ndCBleGVjdXRlZCBzbyB3ZSBtdXN0IGhhbmRsZSBpdCBiZWZvcmUgd2UgZ28gdG8gYSBuZXcgcm93XHJcbiAgICAgICAgICAgICAgICAgIGxldCBuZXdSZWNJZDogbnVtYmVyID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChuZXdSZWNJZCA9PT0gb2xkUmVjSWQgJiYgIXRoaXMuX3N1ZmZpeERvbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSIDc1ODYzOVxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICsgdGhpcy5nZXRMYXN0VmFsaWRSb3coKSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUxpbmUgPSB0aGlzLmdldExhc3RWYWxpZFJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodW5pdCA9PT0gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1cgJiYgZGlyZWN0aW9uID09PSBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIG1vdmluZyB0aGUgbWFya2luZyBvbmUgcm93IHVwIG9yIGRvd25cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIG9sZFRhc2tNb2RlID0gdGhpcy5fdGFzay5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgICAgICAgIG9sZFJlY0lkID0gKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjKCkpLmdldElkKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSArIHNpemUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCB3YXMgZGVsZXRlZCBpbiBSdW4gVGltZSBieSBGb3JjZSBEZWxldGUgZm9yIGV4YW1wbGVcclxuICAgICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwIHx8IG9sZFRhc2tNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IC0xIHx8ICg8RGF0YVZpZXc+dGhpcy5HZXREYXRhdmlldygpKS5yZWNFeGlzdHMob2xkRGlzcGxheUxpbmUpKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFFDUiAjMjkzNjY4XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwic2tpcHBlZCBzZXRjdXJyUm93IGZvciByb3cgezB9XCIsIG9sZERpc3BsYXlMaW5lKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBpZiBldmVyeXRoaW5nIGlzIE9LLCBjdXJyIHJlYyB3aWxsIGxhdGVyIGJlIHJlZnJlc2hlZCBpblxyXG4gICAgICAgICAgICAgICAgLy8gUkVDX1BSRUZJWFxyXG4gICAgICAgICAgICAgICAgLy8gdGh1cywgcmVmcmVzaCBvbmx5IGluIGNhc2Ugb2YgZXJyb3IuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGVycm9yIGlzIGJlY2F1c2UgdGhlIG9sZC1yZWMgd2FzIHJlbW92ZWQgKGNhbmNlbEVkaXQnZWQpLCBzbyByZWZyZXNoIGZvcm0uXHJcbiAgICAgICAgICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNzc1MzA5OiBpZiBsZWF2aW5nIHRoZSBuZXcgY3JlYXRlZCByZWNvcmQgZmFpbGVkIHRoZW4gcmVzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAvLyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGEgbmV3IHJlY29yZCBzbyB0aGUgbmV4dCBhY3Rpb24gd291bGRcclxuICAgICAgICAgICAgICAgICAgLy8gXCJrbm93XCIgdGhhdCBpdCBpcyBzdGlsbCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIC8vIERlZmVjdCAjIDgxNjI3IDogSWYgdGFzayBpcyBoYXZpbmcgYSBzdWJmb3JtLCB0aGVuIHdoaWxlIG1vdmluZyB0byBzdWJmb3JtLCBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAgICAgICAgICAgICAvLyBpcyBzeW5jZWQgYW5kIGl0IGlzIGluc2VydGVkIGluIF9tb2RpZmllZFRhYiBhcyAnaW5zZXJ0JyByZWNvcmQuIFNvLCBhbnkgcmVxdWVzdCB0byBzZXJ2ZXIgaW5zZXJ0c1xyXG4gICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdG8gc2VydmVyLiBFdmVuIGlmIHdlIGRvbnQgZ28gdG8gc2VydmVyLCBpdCBpcyB0aGVyZSBpbiBfbW9kaWZpZWRUYWIgYXMgbmV3IHJlY29yZC4gSW5zZXJ0aW5nXHJcbiAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYWxyZWFkeSBzeW5jZWQgcmVjb3JkIGNhdXNlcyBpbnNlcnRpb24gb2YgcmVjb3JkIHR3aWNlLiBTbywgSWYgY3VycmVudCByZWNvcmQgaXMgbm90IHN5bmNlZCB0aGVuIG9ubHkgaW5zZXJ0LlxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyUmVjLlN5bmNlZCAmJiBvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM5ODA1Mjg6IFJlZnJlc2ggdGhlIGN1cnJlbnQgcm93IGFmdGVyIGNhbmNlbCBlZGl0IHRvIHJlZmxlY3RcclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3RvcmVkIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvbGRUYXNrTW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgb2xkRGlzcGxheUxpbmUgPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lIC0gMSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDAgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gbm9uIGludGVyYWN0aXZlLCBlbmQgb2YgZGF0YSBtZWFucyBlbmQgb2Ygb3duZXJUYXNrLCB1bmxlc3Mgd2UgYXJlIGluIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2suSXNJbnRlcmFjdGl2ZSAmJiB0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKSlcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCBidWcgIzo5NDE3NjMsIHdoaWxlIGNyZWF0ZSBpc24ndCBhbGxvd2VkIG5lZWQgdG8gZG8gc3VmZml4IGFuZCBwcmVmaXggb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9SZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmRvUmVjb3JkU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1JlY29yZFN1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCg8VGFza0Jhc2U+dGhpcy5fdGFzaywgcmVmZG9SZWNvcmRTdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Eb1Rhc2tMZXZlbFJlY29yZFByZWZpeCh0aGlzLl90YXNrKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGRvUmVjb3JkU3VmZml4ID0gcmVmZG9SZWNvcmRTdWZmaXgudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHRoZSBmb3JtIGRvZXMgbm90IGhhdmUgYSB0YWJsZSwgbW92ZSB0byBvbmUgcm93IGluIHRoZSBjaG9zZW4gRGlyZWN0aW9uXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkgKyBzaXplLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSwgZW5kIG9mIGRhdGEgbWVhbnMgZW5kIG9mIG93bmVyVGFzaywgdW5sZXNzIHdlIGFyZSBpbiBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuYWJvcnQoKTtcclxuICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5Qcm9jZXNzQWJvcnRpbmdFcnJvcihleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHVyblRvVmlzaWJsZUxpbmUpIHtcclxuICAgICAgICBpZiAocmVjb3JkT3V0T2ZWaWV3KSB7XHJcbiAgICAgICAgICBpZiAodmlzaWJsZUxpbmUgPT09IDApXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSAtIHRoaXMuX3Jvd3NJblBhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHZpc2libGVMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhlLk1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93KCk7XHJcbiAgICAgIHRoaXMuSXNNb3ZpbmdJblZpZXcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgcmVjb3JkIHRvIHRoZSBmb3JtIGFuZCBtYWtlIGl0IHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYWRkUmVjKGRvU3VmZml4OiBib29sZWFuLGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbmV3TGluZTogbnVtYmVyID0gMTtcclxuICAgIGxldCBjdXJyTGluZTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKCF0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBjdXJyTGluZSA9IHRoaXMuZ2V0VmlzaWJsZUxpbmUoKTtcclxuXHJcbiAgICAvLyBJbmNyZW1lbnQgdGhlIFRvdGFsUmVjb3Jkc0NvdW50IGFzIHJlY29yZCBiZWluZyBhZGRlZCBpbnRvIHRoZSB2aWV3LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgKz0gMTtcclxuICAgICAgdGhpcy5SZWZyZXNoQWxsUm93cyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1JlY0lkeDogbnVtYmVyID0gYXdhaXQgKDxEYXRhVmlldz50aGlzLkdldERhdGF2aWV3KCkpLmFkZFJlY29yZChkb1N1ZmZpeCwgZmFsc2UsIGlzQ3JlbGluZUFib3ZlKTtcclxuXHJcbiAgICBpZiAobmV3UmVjSWR4ID4gLTEpIHtcclxuICAgICAgLy8gZm9ybXMgd2l0aCBhIHRhYmxlXHJcbiAgICAgIGlmICh0aGlzLmlzTGluZU1vZGUoKSkge1xyXG4gICAgICAgIC8vIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSBzbyB0aGUgbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyXHJcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgdG9wIHJlY29yZCB0byAwIGFuZCB0aGUgY3VycmVudCByb3cgdG8gMFxyXG4gICAgICAgIGxldCBuZXdDdXJyUm93OiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDAgfHwgdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpID09PSBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGUgY3Vyc29yIGlzIHBhcmtpbmcgb24gdGhlIGxhc3Qgcm93IG9mIHRoZSBkaXNwbGF5ZWQgdGFibGUgc28gdGhlXHJcbiAgICAgICAgLy8gbmV3IHJvdyBpcyBjcmVhdGVkIGFmdGVyIGluY3JlbWVudGluZyB0aGUgdG9wIHJlY29yZCBpbmRleFxyXG4gICAgICAgIGVsc2UgaWYgKGN1cnJMaW5lID09PSB0aGlzLl9yb3dzSW5QYWdlIC0gMSkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyAxKTtcclxuICAgICAgICAgIG5ld0N1cnJSb3cgPSB0aGlzLmdldFZpc2libGVMaW5lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoZSBuZXcgcm93IGlzIGNyZWF0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgdG9wIHJlY29yZFxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoaXNDcmVsaW5lQWJvdmUpXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSA+IDAgPyBjdXJyTGluZSA6IDA7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5ld0N1cnJSb3cgPSBjdXJyTGluZSArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbmV3TGluZSA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIG5ld0N1cnJSb3c7XHJcblxyXG4gICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgKyBuZXdDdXJyUm93KTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgICAgIGlmICghdGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3TGluZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gc2hvdWxkIHJlYWxseSBiZSBjYXVnaHQgaGVyZVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcImluIEZvcm0uYWRkUmVjKCkgezB9XCIsIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudCAtPSAxO1xyXG4gICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZGVsZXRlIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZGVsQ3VyclJlYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0b3BUYWJsZVJvdzogYm9vbGVhbiA9IHN1cGVyLmlzTGluZU1vZGUoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnJlbW92ZUN1cnJSZWMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmlzRW1wdHkoKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICBpZiAodGhpcy5fdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYWRkUmVjKGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuX3Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpIHtcclxuICAgICAgICAgIC8vIGNoYW5nZSB0byBjcmVhdGUgbW9kZVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuXHJcbiAgICAgICAgICAvLyBNR19BQ1RfQ1JFTElORSBtYXkgYmUgZGlzYWJsZWQgLmkuZS4gUFJPUF9UWVBFX0FMTE9XX0NSRUFURSBleHByZXNzaW9uIGNhbiBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBleGl0IGZyb20gdGhlIG93bmVyVGFza1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGUgZW1wdGluZXNzIG9mIHRoZSBEViBtdXN0IGJlIGNoZWNrZWQgYWdhaW4gYmVjYXVzZSB0aGUgXCJjcmVhdGUgbGluZVwiIG1heSBmYWlsXHJcbiAgICBpZiAoIXRoaXMuR2V0RGF0YXZpZXcoKS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHRvcFRhYmxlUm93KVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgodGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSk7XHJcblxyXG4gICAgICBpZiAoc3VwZXIuaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudC0tO1xyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY29yZHNBZnRlcklkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCB0cnVlLCB0cnVlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYW5jZWwgdGhlIGVkaXRpbmcgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCByZXN0b3JlIHRoZSBvbGQgdmFsdWVzIG9mIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDYW5jZWxcIj50cnVlIGlmIGNhbGxlZCBmb3IgQUNUX0NBTkNFTCwgZmFsc2Ugb3RoZXJ3aXNlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdEV2ZW50XCI+PC9wYXJhbT5cclxuICBhc3luYyBjYW5jZWxFZGl0KGlzQWN0Q2FuY2VsOiBib29sZWFuLCBpc1F1aXRFdmVudDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1vZGU6IHN0cmluZyA9IHRoaXMuX3Rhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IG5ld01vZGU6IHN0cmluZztcclxuICAgIGxldCByb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXhlY1JlY1ByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFdlIHJldHVybiB0byBjcmVhdGUgbW9kZSBvbmx5IGlmIHRoZXJlIGlzIG5vIHJlY29yZCB0byBnbyB0byBhZnRlciB0aGUgY2FuY2VsIGFjdGlvblxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPT09IDEgJiYgbW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgIG5ld01vZGUgPSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURTtcclxuICAgIGVsc2VcclxuICAgICAgbmV3TW9kZSA9IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgLy8gOTk3MDczICYgOTMxMDIxLlxyXG4gICAgLy8gRXhwZWN0ZWQgYmVoYXZpb3IgZHVyaW5nIGNhbmNlbCBldmVudCwgZm9yIGEgbmV3IHJlY29yZDpcclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBub3QgY3JlYXRlLCBkZWxldGUgdGhlIG5ldyByZWNvcmQgYW5kIGdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgIC8vIElmIHRoZSBvcmlnaW5hbCBvd25lclRhc2sgbW9kZSBpcyBjcmVhdGUsIHN0YXkgb24gdGhlIG5ldyByZWNvcmQuXHJcblxyXG4gICAgLy8gZHYuY2FuY2VsRWRpdCgpIHJlbW92ZXMgdGhlIG5ldyByZWNvcmQgdW5kZXIgc29tZSBjb25kaXRpb24uXHJcbiAgICAvLyBTbywgaW4gY2FzZSBvZiBvcmdUYXNrTW9kZT1DLCBzaW5jZSB3ZSB3YW50IHRvIHN0YXkgb24gdGhlIG5ldyByZWNvcmQsIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGEgcmVjb3JkLlxyXG5cclxuICAgIC8vIEJ1dCBhcyBzYWlkLCBkdi5jYW5jZWxFZGl0KCkgcmVtb3ZlcyB0aGUgbmV3IHJlY29yZCBPTkxZIHVuZGVyIHNvbWUgY29uZGl0aW9uLlxyXG4gICAgLy8gVGhlIGNvbmRpdGlvbiBpcyBhcyBmb2xsb3dzOlxyXG4gICAgLy8gVGhlIHJlY29yZCBpcyByZW1vdmVkIG9ubHkgaWYgdGhlIGR2IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEuIFNvLCBpZiB0aGUgZHYgc2l6ZSBpcyAxLCBkdi5jYW5jZWxFZGl0KClcclxuICAgIC8vIGRvZXMgbm90IHJlbW92ZSB0aGUgcmVjb3JkIGFuZCBoZW5jZSBpbiB0aGlzIGNhc2UsIGZvcm0uY2FuY2VsRWRpdCgpIHNob3VsZCBub3QgY3JlYXRlIGEgbmV3IHJlY29yZC5cclxuICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgdGhlIHNpZ25hdHVyZSBvZiBkdi5jYW5jZWxFZGl0KCkgaXMgY2hhbmdlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHJlbW92ZWQgb3Igbm90LlxyXG5cclxuICAgIC8vIFRoaXMgaXMgb25lIHBhcnQuXHJcblxyXG4gICAgLy8gTm93LCBhZnRlciBjYW5jZWxFZGl0LCBSUCBoYXMgdG8gYmUgZXhlY3V0ZWQuIFRoaXMgd2FzIGRvbmUgaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyKCktPmNhc2UgTUdfQUNUX0NBTkNFTC5cclxuICAgIC8vIEJ1dCB3aGF0IGhhcHBlbnMgaXMsIGlmIGZvcm0uY2FuY2VsRWRpdCgpIGNyZWF0ZWQgYSBuZXcgbGluZSwgUlAgd2FzIGFscmVhZHkgZXhlY3V0ZWQgZnJvbSB0aGVyZS4gQW5kIGZyb21cclxuICAgIC8vIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLCBSUCBpcyBleGVjdXRlZCBmb3IgdGhlIHNlY29uZCB0aW1lLlxyXG4gICAgLy8gU28sIG1vdmVkIHRoZSBjb2RlIG9mIGV4ZWN1dGluZyBSUCBmcm9tIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlcigpLT5jYXNlIE1HX0FDVF9DQU5DRUwgdG8gZm9ybS5jYW5jZWxFZGl0KClcclxuICAgIC8vIGFuZCB0aGF0IHdpbGwgYmUgZG9uZSBvbmx5IGlmIHRoZSBjcmVhdGUgbGluZSB3YXMgbm90IGV4ZWN1dGVkLlxyXG5cclxuICAgIC8vIE5vdywgd2UgaGF2ZSBvbmUgbW9yZSBpc3N1ZS5cclxuXHJcbiAgICAvLyBVbnRpbCBub3csIHRoZSBSUCB3YXMgZXhlY3V0ZWQgYWZ0ZXIgZm9ybS5jYW5jZWxFZGl0KCkuXHJcbiAgICAvLyBTbywgd2hlbiB0aGUgY29kZSBpcyBtb3ZlZCB0byBmb3JtLmNhbmNlbEVkaXQoKSwgaXQgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgbGV0IHJlY1JlbW92ZWQ6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgdGhpcy5HZXREYXRhdmlldygpLnNldFByZXZDdXJyUmVjKG51bGwpO1xyXG4gICAgaWYgKCh0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpIHx8ICgoaXNBY3RDYW5jZWwgJiYgcmVjUmVtb3ZlZCkgJiYgKCFHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSkmJig8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpICYmICEoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKSB7XHJcbiAgICAgIC8vIFNldCBDYW5jZWwgaW5kaWNhdGlvbiBvbiB0aGUgdGFzayBmb3IgdG8gbm90IHBlcmZvcm0gY29udHJvbCB2YWx1ZSB2YWxpZGF0aW9uIGluIHRoZSBDcmVhdGUgbGluZSBhY3Rpb24uXHJcbiAgICAgIGxldCBvcmdDYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLnNldENhbmNlbFdhc1JhaXNlZChpc0FjdENhbmNlbCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuc2V0Q2FuY2VsV2FzUmFpc2VkKG9yZ0NhbmNlbFdhc1JhaXNlZCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc0FjdENhbmNlbClcclxuICAgICAgZXhlY1JlY1ByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gdGhlIGVtcHRpbmVzcyBvZiB0aGUgRFYgbXVzdCBiZSBjaGVja2VkIGFnYWluIGJlY2F1c2UgdGhlIFwiY3JlYXRlIGxpbmVcIiBtYXkgZmFpbFxyXG4gICAgaWYgKCF0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmIChzdXBlci5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgcm93ID0gdGhpcy5nZXRWaXNpYmxlTGluZSgpO1xyXG4gICAgICAgICAgICBpZiAocm93IDwgMCB8fCByb3cgPj0gdGhpcy5fcm93c0luUGFnZSkge1xyXG4gICAgICAgICAgICAgIGxldCB0b3BSZWNJZHg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKTtcclxuICAgICAgICAgICAgICBpZiAodG9wUmVjSWR4ID4gY3VyclJlY0lkeClcclxuICAgICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICAgICAgICAgICAgcm93ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSArIHJvdywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHNob3VsZCByZWFsbHkgYmUgY2F1Z2h0IGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChyb3cgIT09IDApXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBGb3JtLmNhbmNlbEVkaXQoKSB7MH1cIiwgZXguTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgIC8vIERlY3JlbWVudCB0aGUgVG90YWxSZWNvcmRzQ291bnQgYXMgcmVjb3JkIGJlaW5nIGRlbGV0ZWQuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgcmVjUmVtb3ZlZClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50LS07XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEFsbFJvd3MgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucmVtb3ZlUmVjb3Jkc0FmdGVySWR4KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBzY3JlZW4gbW9kZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5HZXREYXRhdmlldygpLnNldEN1cnJSZWNCeUlkeCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgU0VUX0RJU1BMQVlMSU5FX0JZX0RWKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiaW4gRm9ybS5jYW5jZWxFZGl0KCkgZXJyb3IgaW4gU2NyZWVuIG1vZGUgZm9yIEN1cnJlbnQgUmVjb3JkXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKG5ld01vZGUpO1xyXG4gICAgICBpZiAoISg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAgIGlmICghKDxUYXNrQmFzZT50aGlzLl90YXNrKS5JbkVuZFRhc2spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXhlY1JlY1ByZWZpeCkge1xyXG4gICAgICAvLyBRQ1IgIzkyNTY0NiwgIzQ1NDE2NzogZXhpdCB0byB0aGUgb3duZXJUYXNrIGxldmVsIGluIG9yZGVyIHRvIHNraXAgY29udHJvbCBzdWZmaXhcclxuICAgICAgLy8gYW5kIHJlY29yZCBzdWZmaXggb2YgdGhlIGNhbmNlbGVkIG5ldyByZWNvcmQgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZVxyXG4gICAgICAvLyBuZXh0IHJlY29yZCBwZXJmaXggd291bGQgYmUgZXhlY3V0ZWRcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgb3duZXJUYXNrIHdoaWxlIGZvY3VzZWQgb24gc3ViZm9ybS9vd25lclRhc2suIFdlIGRvIG5vdCB3YW50IHRoZSBjdHJsIG9uIHRoZSBzdWJmb3JtIHRvIGRvIGN0cmwgc3VmZml4LlxyXG4gICAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCg8VGFza0Jhc2U+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkucGF0aENvbnRhaW5zKDxUYXNrQmFzZT50aGlzLl90YXNrKSlcclxuICAgICAgICAgIGZvciAobGV0IHBhcmVudCA9IDxUYXNrQmFzZT5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50ICE9PSB0aGlzLl90YXNrO1xyXG4gICAgICAgICAgICAgICBwYXJlbnQgPSA8VGFza0Jhc2U+cGFyZW50LmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgKCg8RGF0YVZpZXc+cGFyZW50LkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnJlc2V0TW9kaWZpZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNRdWl0RXZlbnQpIHtcclxuICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBmb2xsb3dpbmcgMiBsaW5lcyBjYW4gYmUgbWVyZ2VkIGluIG9uZSBtZXRob2RcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UodGhpcy5fdGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzY2FuIGFsbCBjb250cm9scyBpbiB0aGUgZm9ybS4gRXZlcnkgY29udHJvbCB3aGljaCBoYXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGFuIGV4cHJlc3Npb24gd2lsbCBiZVxyXG4gIC8vLyAgIHJlZnJlc2hlZC4gVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGUgY29udHJvbCdzIGRpc3BsYXkgaXMgc3luY2hlZCB3aXRoIHRoZSBleHByZXNzaW4ncyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaE9uRXhwcmVzc2lvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9ICgodGhpcy5DdHJsVGFiLmdldEN0cmwoaSkgaW5zdGFuY2VvZiBNZ0NvbnRyb2wpID8gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChpKSA6IG51bGwpO1xyXG5cclxuICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbC5yZWZyZXNoT25FeHByZXNzaW9uKCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gcmVmcmVzaCB0aGUgZm9ybSBwcm9wZXJ0aWVzXHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoUHJvcHNPbkV4cHJlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgY29udHJvbHMgb2YgdGhpcyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZzVG9DdHJscygpOiB2b2lkIHtcclxuICAgIC8vIGlmIGxhc3QgZm9jdXNlZCBjb250cm9sIHdhcyBmcm9tIHRoaXMgdGFzayAtIHplcm8gaXQuXHJcbiAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsICYmIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkgPT09IHRoaXMpXHJcbiAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPnRoaXMuX3Rhc2ssIG51bGwpO1xyXG5cclxuICAgIHN1cGVyLnJlbW92ZVJlZnNUb0N0cmxzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBjb250cm9sIHdpdGggYSBnaXZlbiBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5Q3RybE5hbWUoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gPE1nQ29udHJvbD50aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBzdWJmb3JtIGNvbnRyb2wgd2l0aCB0aGUgdHlwZWQgbmFtZSBmcm9tIGFsbCBwYXJlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+IHRoZSByZXF1ZXN0ZWQgc3ViZm9ybSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIGdldFN1YkZvcm1DdHJsQnlOYW1lKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2wge1xyXG4gICAgbGV0IGd1aVBhcmVudFRhc2s6IFRhc2tCYXNlO1xyXG4gICAgbGV0IGRlc3RTdWJGb3JtOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIGZvciAoZ3VpUGFyZW50VGFzayA9IDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG4gICAgICAgICBkZXN0U3ViRm9ybSA9PT0gbnVsbCAmJiBndWlQYXJlbnRUYXNrICE9PSBudWxsICYmIGd1aVBhcmVudFRhc2suZ2V0Rm9ybSgpICE9PSBudWxsO1xyXG4gICAgICAgICBndWlQYXJlbnRUYXNrID0gZ3VpUGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBkZXN0U3ViRm9ybSA9IDxNZ0NvbnRyb2w+Z3VpUGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSA9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFndWlQYXJlbnRUYXNrLklzU3ViRm9ybSB8fCBOU3RyaW5nLkVxdWFscyhndWlQYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpLk5hbWUsIGN0cmxOYW1lLCB0cnVlKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgc3VmZml4RG9uZSBwYXJhbWV0ZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3VmZml4RG9uZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1ZmZpeERvbmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVzdGluYXRpb25Sb3coKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0VGJsUm93O1xyXG4gIH1cclxuXHJcbiAgc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3N1YkZvcm1DdHJsID09PSBudWxsICYmIHN1YkZvcm1DdHJsICE9PSBudWxsKTtcclxuICAgIHRoaXMuX3N1YkZvcm1DdHJsID0gc3ViRm9ybUN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHN1YmZvcm0gY29udHJvbCB0aGF0IHBvaW50cyB0byBhIHRhc2sgd2hvc2UgaWQgaXMgZ2l2ZW4gaW4gdGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPnRoZSBpZCBvZiByZXF1ZXN0ZWQgc3ViZm9ybSBvd25lclRhc2s8L3BhcmFtPlxyXG4gIGdldFN1YkZvcm1DdHJsRm9yVGFzayh0YXNrSWQ6IHN0cmluZyk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VycjogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCBwYXJlbnRDdHJsVGFiOiBDb250cm9sVGFibGU7XHJcbiAgICBsZXQgZ3VpUGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgICBsZXQgZGVzdFN1YkZvcm06IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChndWlQYXJlbnRGb3JtID0gdGhpczsgZ3VpUGFyZW50Rm9ybSAhPSBudWxsOyBndWlQYXJlbnRGb3JtID0gZ3VpUGFyZW50Rm9ybS5QYXJlbnRGb3JtKSB7XHJcbiAgICAgIHBhcmVudEN0cmxUYWIgPSBndWlQYXJlbnRGb3JtLkN0cmxUYWI7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXJlbnRDdHJsVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgY3VyciA9ICgocGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIGluc3RhbmNlb2YgTWdDb250cm9sKSA/IDxNZ0NvbnRyb2w+cGFyZW50Q3RybFRhYi5nZXRDdHJsKGkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKGN1cnIgIT0gbnVsbCAmJiBjdXJyLmlzU3ViZm9ybSgpICYmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSAhPSBudWxsKSlcclxuICAgICAgICAgIGlmIChjdXJyLmdldFN1YmZvcm1UYXNrSWQoKSA9PT0gdGFza0lkKSB7XHJcbiAgICAgICAgICAgIGRlc3RTdWJGb3JtID0gY3VycjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkZXN0U3ViRm9ybSAhPSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc3RTdWJGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3JlYXRlIHJlY29yZHMgYmV0d2VlbiBpZHggYW5kIGVuZCBvZiBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHJlbW92ZVJlY29yZHNBZnRlcklkeChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlbW92ZUFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGluIHNvbWUgY2FzZXMgaW52aXNpYmxlIC0xIHJvdyAodGhhdCBleGlzdCBvbmx5IGZvciBzY3JvbGxiYXIgZWZmZWN0cykgYmVjb21lcyB2aXNpYmxlLlxyXG4gICAgLy8gVG8gcHJldmVudCB0aGlzIHdlJ2xsIHJlbW92ZSBhbGwgcmVjb3Jkcy4gVGhpcyB3aWxsIG5vdCBjYXVzZSBwZXJmcm9tYW5jZSBwcm9ibGVtcyBzaW5jZVxyXG4gICAgLy8gd2Ugd2lsbCBhZGQgbWF4aW11bSByb3dJblBhZ2UgcmVjb3JkcyBtb3JlIHRoZW4gd2UgaW50ZW5kZWQgaW4gdGhlIGJlZ2luaW5nXHJcblxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaWR4IDw9IHRoaXMuX3Jvd3NJblBhZ2UgKyAxICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlKVxyXG4gICAgICAgIGlkeCA9IDA7XHJcbiAgICAgIGlmIChpZHggPT09IDApXHJcbiAgICAgICAgcmVtb3ZlQWxsID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIGludmFsaWRhdGVzIGFsbCByZWNvcmRzIGFmdGVyIG5ld0N1cnJSb3dcclxuICAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KGlkeCwgcmVtb3ZlQWxsKTtcclxuICAgICAgLy8gdXBkYXRlcyB0YWJsZSBpdGVtJ3MgY291bnRcclxuXHJcbiAgICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcm93IGlzIHZhbGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1Jvd1ZhbGlkYXRlZChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuUm93cy5sZW5ndGggPD0gaWR4IHx8IGlkeCA8IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCByb3cgPSA8Um93PnRoaXMuUm93cy5nZXRfSXRlbShpZHgpO1xyXG4gICAgaWYgKHJvdyA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gcm93LkNyZWF0ZWQgJiYgcm93LlZhbGlkYXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBydW5zIGluIFdvcmtlciB0aHJlYWQgd2hlbiB0aGUgdGhyZWFkIGlzIGZyZWUgYW5kIHNlbmQgdG8gR1VJIHRocmVhZCBjb250cm9scyBkYXRhIG9mIGFsbCByb3dzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyB0cmFuc2ZlckRhdGFUb0d1aSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IG1heFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgKyBNZ0Zvcm0uVElNRV9MSU1JVDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG4gICAgICAvLyB0aGlzIGxpbWl0YXRpb24gaXMgbmVlZGVkIHNvIHRoaXMgcmVxdWVzdCB3aWxsIG5ldmVyIHRha2UgdG9vIG11Y2ggdGltZVxyXG4gICAgICB3aGlsZSAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSA8IG1heFRpbWUgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxID49IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICAvLyBhbGwgcm93cyBhbHJlYWR5IHNlbnRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpICYmIHRoaXMuX2xhc3RSb3dTZW50ICsgMSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpIHtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQrKztcclxuICAgICAgICB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQodGhpcy5fbGFzdFJvd1NlbnQpKSB7XHJcbiAgICAgICAgICAvLyByb3cgbmVlZHMgdG8gYmUgc2VudFxyXG4gICAgICAgICAgLy8gc2VuZCByb3cgZGF0YVxyXG4gICAgICAgICAgc3VwZXIuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5fbGFzdFJvd1NlbnQpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RSb3dTZW50ICE9PSBzYXZlUm93SWR4KSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmdldFRhc2soKS5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsOyAvLyByZXNldCB0aGUgZmxhZ1xyXG4gICAgICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0cmVlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUodGhpcy5fbGFzdFJvd1NlbnQsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZFxyXG4gICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4LCBia3BSZWNvcmQpO1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICBzdXBlci5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gY3VycmVudEVkaXRpbmdDb250cm9sOyAvLyBzZXQgdGhlIGZsYWcgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdHJhbnNmZXJpbmdEYXRhID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYW55IHJvd3MgbmVlZCB0byBiZSBzZW50IHRvIEdVSSB0aHJlYWRcclxuICAvLy8gICBpZiB0aGVyZSBhcmUsIHB1dHMgZXZlbnQgaW4gZXZlbnQgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tBbmRDcmVhdGVSb3dzRXZlbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5PcGVuZWQgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcbiAgICAgIGlmICh0aGlzLl9sYXN0Um93U2VudCA+PSB0aGlzLlJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gd2hlbiB3ZSBkZWNyZWFzZSBzaXplIG9mIHJvd3MgYXJyYXkgYWRqdXN0IGxhc3RSb3dTZW50XHJcbiAgICAgICAgdGhpcy5fbGFzdFJvd1NlbnQgPSB0aGlzLlJvd3MubGVuZ3RoIC0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gdGhlcmUgYXJlIHJvd3MgdG8gc2VuZCBhbmQgdGhlcmUgaXMgbm93IHJlcXVlc3QgZm9yIHJvd3MgeWV0XHJcbiAgICAgIC8vIGFkZCByZXF1ZXN0IGZvciByb3dzXHJcbiAgICAgIGxldCB0cmFuc2ZlckRhdGFUb0d1aTogYm9vbGVhbiA9IHRoaXMuX2xhc3RSb3dTZW50IDwgKHNpemUgLSAxKTtcclxuXHJcbiAgICAgIC8vIEZvciBwYWdpbmF0ZWQgdGFibGUgY2hlY2sgdGhlIG1heCByb3dzIG9mIEdVSSB0YWJsZSBjb250cm9sLlxyXG4gICAgICBpZiAodGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSAmJiAodGhpcy5fbGFzdFJvd1NlbnQgKyAxKSA+PSB0aGlzLmdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCkpXHJcbiAgICAgICAgdHJhbnNmZXJEYXRhVG9HdWkgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh0cmFuc2ZlckRhdGFUb0d1aSAmJiAhdGhpcy5fdHJhbnNmZXJpbmdEYXRhKSB7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KHRoaXMuX3RhYmxlTWdDb250cm9sLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJLCBQcmlvcml0eS5MT1dFU1QpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZmVyaW5nRGF0YSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zaG91bGRGZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIgJiYgIXRyYW5zZmVyRGF0YVRvR3VpICYmICghdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzTGFzdCgpIHx8ICF0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpKSkge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eSh0aGlzLl90YWJsZU1nQ29udHJvbCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0ZFVENIX1JFQ09SRFNfQUhFQURfRlJPTV9TRVJWRVIsIFByaW9yaXR5LkxPV0VTVCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIHJvdyBkYXRhIGZvciB0aGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXNpcmVkVG9wSW5kZXhcIj5kZXNpcmVkIHRvcCBpbmRleCBpZiBkZXNpcmVkVG9wSW5kZXggaXMgSW50ZWdlci5NSU5fVkFMVUUsIHRvcCBpbmRleCBpcyBjZWNpZXZlZCBmb3JtIGR2PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj5pZiB0cnVlLCBzZW5kIGFsbCByZWNvcmRzLCBldmVuIGlmIHRoZXkgYXJlIGNyZWF0ZWQgYW5kIHZhbGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Rm9jdXNlZFZhbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Um93RGF0YShkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlUm93SWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgbGV0IGRpZmY6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZ2V0UHJldkNodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZ2V0TmV4dENodW5rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChkZXNpcmVkVG9wSW5kZXggIT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIGlmIChkZXNpcmVkVG9wSW5kZXggPCAwKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyByZXF1ZXN0IGZvciBsaW5lIG9yIHBhZ2UgYmVmb3JlIGN1cnJlbnQgY2h1bmtcclxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHRvcCBpbmRleCBpcyBhbHdheXMgMFxyXG4gICAgICAgIGdldFByZXZDaHVuayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkZXNpcmVkVG9wSW5kZXggKyB0aGlzLl9yb3dzSW5QYWdlICsgMSA+PSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKVxyXG4gICAgICAvLyBwYWdlZG93biBvciBhcnJvd2Rvd24gYXQgZW5kIG9mIHRoZSBkYXRhdmlld1xyXG4gICAgICAgIGdldE5leHRDaHVuayA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIGRlc2lyZWRUb3BJbmRleCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuXHJcbiAgICBsZXQgYmtwUmVjb3JkOiBSZWNvcmQgPSB0aGlzLkdldERhdGF2aWV3KCkuYmFja3VwQ3VycmVudCgpO1xyXG5cclxuICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IHRydWU7XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gZmFsc2U7XHJcbiAgICBsZXQgZGlmZlJlZjogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbShkaWZmKTtcclxuICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleCwgc2VuZEFsbCwgc2F2ZVJvd0lkeCwgZGlmZlJlZik7XHJcbiAgICBkaWZmID0gZGlmZlJlZi52YWx1ZTtcclxuXHJcbiAgICBpZiAoKGdldFByZXZDaHVuayAmJiBkaWZmICE9PSAwKSB8fCBnZXROZXh0Q2h1bmspIHtcclxuICAgICAgLy8gaWYgZGlmZiAhPSAwIGEgbmV3IGNodW5rIHdhcyBicm91Z2h0IHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgZHZcclxuICAgICAgLy8gc2V0IHRvcCBpbmRleCB0byBmaXJzdCByZXF1ZXN0ZWQgaW5kZXhcclxuICAgICAgLy8gaWYgbmV4dCBjaHVuayB3YXMgYnJvdWdodCwgdG9wIGluZGV4IG1heSBhbHNvIGJlIHVwZGF0ZWRcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChkZXNpcmVkVG9wSW5kZXggKyBkaWZmKTtcclxuICAgICAgdGhpcy5TZXRUYWJsZVRvcEluZGV4KCk7XHJcbiAgICAgIGlmICh0aGlzLl90b3BJbmRleFVwZGF0ZWQpIHtcclxuICAgICAgICAvLyBpZiB0b3AgaW5kZXggd2FzIHVwZGF0ZWQgaW4gdGhlIHNldFRhYmxlVG9wSW5kZXggLSB3ZSBtaWdodCBoYXZlIHJvd3MgdGhhdCB3ZXJlIG5vdCByZWZyZXNoZWRcclxuICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB0cnVlO1xyXG4gICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHVwZGF0ZWQpIHtcclxuICAgICAgLy8gYW55IHJvdyB3YXMgdXBkYXRlZFxyXG4gICAgICAvLyByZXN0b3JlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZUJhY2t1cChzYXZlUm93SWR4ICsgZGlmZiwgYmtwUmVjb3JkKTtcclxuICAgICAgYXdhaXQgc3VwZXIucmVmcmVzaENvbnRyb2xzKHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gYXNrIHRhYmxlIHRvIHJlZnJlc2ggdGhlIHBhZ2VcclxuXHJcbiAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIGlmIChnZXRQcmV2Q2h1bmspIHtcclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGZvY3VzZWRcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCAmJiBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0UGFyZW50VGFibGUoKSA9PT0gdGhpcy5fdGFibGVNZ0NvbnRyb2wpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2hlcyByb3dzIGluIHRoZSBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc2lyZWRUb3BJbmRleFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNhdmVSb3dJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlmZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hSb3dzKGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBzYXZlUm93SWR4OiBudW1iZXIsIGRpZmZSZWY6IFJlZlBhcmFtPG51bWJlcj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCB1cGRhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkaWZmUmVmLnZhbHVlID0gMDtcclxuICAgIGxldCBvcmdJbmNsdWRlc0ZpcnN0OiBib29sZWFuID0gdGhpcy5HZXREYXRhdmlldygpLkluY2x1ZGVzRmlyc3QoKTtcclxuICAgIGxldCBvcmdJbmNsdWRlc0xhc3Q6IGJvb2xlYW4gPSB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcm93c0luUGFnZTsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGRlc2lyZWRUb3BJbmRleCArIGk7XHJcbiAgICAgIGxldCBwcmV2VG9wSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgd2UgZmFpbCB0byBnZXQgb25lIHJlY29yZCwgd2UgbWF5IHN1Y2NlZWQgdG8gZ2V0IHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gaWR4ICsgZGlmZlJlZi52YWx1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSb3dWYWxpZGF0ZWQoaWR4KSB8fCBzZW5kQWxsIHx8IHRoaXMuUmVmcmVzaEFsbFJvd3MpIHtcclxuICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxyXG4gICAgICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpbmRleCk7XHJcblxyXG4gICAgICAgICAgaWYgKHNhdmVSb3dJZHggKyBkaWZmUmVmLnZhbHVlICE9PSBpbmRleCkgeyAvLyBub3QgY3VycmVudCBsaW5lXHJcbiAgICAgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRyZWVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpbmRleCwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgYSBuZXcgY2h1bmsgaXMgYnJvdWdodCB0b3AgaW5kZXggd2lsbCBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgLy8gY3JlYXRpb24gb2Ygcm93IGZhaWxlZCwgbWFyayB0aGUgcm93IGFzIG5vdCBjcmVhdGVkXHJcbiAgICAgICAgICBpZiAoc3VwZXIuaXNSb3dDcmVhdGVkKGluZGV4KSlcclxuICAgICAgICAgICAgc3VwZXIubWFya1Jvd05PVENyZWF0ZWQoaW5kZXgpO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgfVxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICAvLyBRQ1IgIzI2MTA1NSwgZXZlbiBzbyByZXF1aXJlZCByZWNvcmQgbWF5IG5vdCBiZSBmb3VuZCwgaXQgaXMgcG9zc2libGUgdGhhdCBhIG5ldyBjaHVuayBoYXMgYmVlbiBzZW50XHJcbiAgICAgICAgLy8gYW5kIGRpZmYgbXVzdCBiZSB1cGRhdGVkXHJcbiAgICAgICAgZGlmZlJlZi52YWx1ZSA9IGRpZmZSZWYudmFsdWUgKyAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpIC0gcHJldlRvcElkeCk7XHJcbiAgICAgICAgcHJldlRvcElkeCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgICBpZiAoIXVwZGF0ZWQgJiYgdGhpcy5HZXREYXRhdmlldygpLkRhdGF2aWV3Qm91bmRyaWVzQXJlQ2hhbmdlZChvcmdJbmNsdWRlc0ZpcnN0LCBvcmdJbmNsdWRlc0xhc3QpKVxyXG4gICAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICB0aGlzLlJlZnJlc2hBbGxSb3dzID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdXBkYXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gcm93IGluIHRoZSBwYWdlPC9yZXR1cm5zPlxyXG4gIGdldFZpc2libGVMaW5lKCk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VyclJlY0lkeDogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpICE9PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgY3VyclJlY0lkeCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCk7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJSZWNJZHggLSBNYXRoLm1heCh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFzc2VydHMgdGhhdCBjdXJyZW50IHJlY29yZCBpcyBpbiB0aGUgdmlldywgaWYgaXQgaXMgbm90IG9uIHRoZSBwYWdlLCBhZGp1c3RzIHRvcCBpbmRleCwgc28gdGhhdCBjdXJyZW50XHJcbiAgLy8vICAgcmVjb3JkIHdpbGwgYmUgb24gdGhlIHZpc2libGUgcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgYnJpbmdSZWNvcmRUb1BhZ2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgbGV0IHRvcEluZGV4OiBudW1iZXIgPSBDb21tYW5kcy5nZXRUb3BJbmRleCh0aGlzLl90YWJsZU1nQ29udHJvbCk7XHJcbiAgICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG4gICAgICBsZXQgbmV3VG9wSW5kZXg6IG51bWJlciA9IHRvcEluZGV4O1xyXG5cclxuICAgICAgLy8gVGFibGUgdG9wIGluZGV4IGZvciBub24tcGFnaW5hdGVkIHRhYmxlXHJcbiAgICAgIGlmICghdGhpcy5pc1RhYmxlV2l0aFBhZ2luYXRpb24oKSkge1xyXG4gICAgICAgIGlmICh0b3BJbmRleCA+IGN1cnJJZHgpIHtcclxuICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRvcEluZGV4ICsgdGhpcy5fcm93c0luUGFnZSAtIDEgPCBjdXJySWR4KSB7XHJcbiAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Jvd3NJblBhZ2UgPiAwKVxyXG4gICAgICAgICAgICBuZXdUb3BJbmRleCA9IGN1cnJJZHggLSB0aGlzLl9yb3dzSW5QYWdlICsgMTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgbmV3VG9wSW5kZXggPSBjdXJySWR4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRhYmxlIHRvcCBpbmRleCBmb3IgcGFnaW5hdGVkIHRhYmxlLlxyXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgaW5kZXggb2YgZmlyc3QgcmVjb3JkIG9uIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgcmVjb3JkIHRvIGJlIHNlbGVjdGVkLlxyXG4gICAgICAgIGxldCBjdXJyR3VpSWR4ID0gdGhpcy5nZXRHdWlSb3dpZHgoY3VycklkeCk7XHJcbiAgICAgICAgbGV0IG5ld1RvcEd1aUluZGV4ID0gKGN1cnJHdWlJZHgpIC0gKChjdXJyR3VpSWR4KSAlIHRoaXMuX3Jvd3NJblBhZ2UpOyAvL2d1aSBpZHggb2YgZmlyc3QgcmVjb3JkIG9mIHJlc3BlY3RpdmUgcGFnZVxyXG5cclxuICAgICAgICBuZXdUb3BJbmRleCA9IHRoaXMuZ2V0RHZSb3dJZHgobmV3VG9wR3VpSW5kZXgpO1xyXG5cclxuICAgICAgICBpZihuZXdUb3BJbmRleCAhPT0gdGhpcy5fcHJldkd1aVRvcEluZGV4IHx8IHRoaXMuSXNNb3ZpbmdJblZpZXcgKVxyXG4gICAgICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZXQgdG9wIGluZGV4IHRvIGJlIGN1cnJlbnQgbGluZVxyXG4gICAgICBpZiAodGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpICE9PSBuZXdUb3BJbmRleCB8fCB0aGlzLl90b3BJbmRleFVwZGF0ZWQpIHtcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KG5ld1RvcEluZGV4KTtcclxuICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFJvd0RhdGEoSW50MzIuTWluVmFsdWUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLl90b3BJbmRleFVwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGludmFsaWRhdGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGludmFsaWRhdGVUYWJsZSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHJvdzogUm93ID0gPFJvdz50aGlzLlJvd3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChyb3cgIT09IG51bGwpXHJcbiAgICAgICAgcm93LlZhbGlkYXRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xhc3RSb3dTZW50ID0gLTE7XHJcbiAgICB0aGlzLmNoZWNrQW5kQ3JlYXRlUm93c0V2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHByZXZpb3VzIHZpc2libGUgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFByZXZMaW5lKGxpbmU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbGluZSAtIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHNvcnQgbWFyayhkZWx0YSkgZnJvbSB0aGUgY29sdW1uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhclNvcnRNYXJrXCI+PC9wYXJhbT5cclxuICBjbGVhclRhYmxlQ29sdW1uU29ydE1hcmsoY2xlYXJTb3J0TWFyazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGNsZWFyU29ydE1hcmspIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2Qgc3RvcCB0aGUgcm93IGZyb20gZWRpdGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHN0b3BSb3dFZGl0aW5nKGlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgIGlmICh0aGlzLmdldElzUm93RWRpdGluZ0Zyb21HdWkoaWR4KSkge1xyXG4gICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfTk9UX0lTX1JPV19FRElUSU5HLCB0aGlzLCAgdGhpcy5pc0xpbmVNb2RlKCkgID8gaWR4IDogMCwgdGhpcy5pc0xpbmVNb2RlKCkpO1xyXG4gICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2Qgc3RhcnQgdGhlIHJvdyBlZGl0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgc3RhcnRSb3dFZGl0aW5nKGlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGlmICghdGhpcy5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKGlkeCkpIHtcclxuICAgICAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX0lTX1JPV19FRElUSU5HLCB0aGlzLCB0aGlzLmlzTGluZU1vZGUoKSA/IGlkeCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICBDb21tYW5kcy5hZGROb1BhcmFtZXRlcnMoQ29tbWFuZFR5cGUuUkVGUkVTSF9UQVNLLCB0aGlzLmdldEZvcm0oKSk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHJldHVybiBpZiB0aGUgcm93IGlzIGluIGVkaXRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBwdWJsaWMgZ2V0SXNSb3dFZGl0aW5nRnJvbUd1aShkaXNwbGF5SW5kZXg6bnVtYmVyICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzUm93RWRpdGluZzogYm9vbGVhbiA9IENvbW1hbmRzLmdldElzUm93RWRpdGluZyh0aGlzLCB0aGlzLmlzTGluZU1vZGUoKSA/IGRpc3BsYXlJbmRleCA6IDAsIHRoaXMuaXNMaW5lTW9kZSgpKTtcclxuICAgIHJldHVybiBpc1Jvd0VkaXRpbmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRoZSBkaXNwbGF5LCB0aGUgY29udHJvbHMgYW5kIHRoZWlyIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KHJlZnJlc2hUeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLl90YXNrO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBUYWtlIGFub3RoZXIgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIG9mIFFDUnMgIzk4NDk5OSwgIzkzMzYzOSAmICM2OTk4MjE6XHJcbiAgICAvLyBOb3csIHRoZSBkaXNwbGF5IHdvdWxkIGJlIHJlZnJlc2hlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHJlY29yZCBpcyBOT1QgYW4gb2xkXHJcbiAgICAvLyByZWNvcmQgd2hpY2ggaXMgYmVpbmcgY29tcHV0ZWQuIFRoZSByZXN1bHQgb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCBkdXJpbmcgdGhlXHJcbiAgICAvLyBjb21wdXRlIHByb2Nlc3Mgb2YgYSByZWNvcmQgdGhlIGRpc3BsYXkgaXMgbm90IHJlZnJlc2hlZCAod2hpY2ggaXMgZ29vZCBmb3IgdXMpLlxyXG4gICAgLy8gVGhlIGRpc3BsYXkgd291bGQgYmUgcmVmcmVzaGVkIGFueXdheSBBRlRFUiB0aGUgY29tcHV0ZSBwcm9jZXNzIGlzIGRvbmUuXHJcbiAgICAvLyAoRWh1ZCAyMS1NQVktMjAwMilcclxuICAgIGlmIChjdXJyUmVjICE9PSBudWxsICYmIGN1cnJSZWMuSW5Db21wdXRlICYmICFjdXJyUmVjLmlzTmV3UmVjKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5faW5SZWZyZXNoRGlzcClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5faW5SZWZyZXNoRGlzcCA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHJlZnJlc2hUeXBlID09PSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0gfHwgcmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHRhYmxlIGluIHRoZSBmb3JtIGFuZCByZWZyZXNoIGl0XHJcbiAgICAgICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkgJiYgdGhpcy5PcGVuZWQpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSB8fCByZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQykge1xyXG4gICAgICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyAmJiBzdXBlci5oYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICAgICAgICAgIHN1cGVyLlNlbGVjdFJvdygpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZWZyZXNoIHRoZSBmb3JtIHByb3BlcnRpZXNcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoUHJvcHMoKTtcclxuICAgICAgICAvLyByZWZyZXNoIHRoZSBjdXJyZW50IHJlY29yZC9Sb3dcclxuICAgICAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHMoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9IGluIHRhc2sgezJ9XCIsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZSwgKDxUYXNrQmFzZT5zdXBlci5nZXRUYXNrKCkpLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZWZyZXNoRGlzcCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNpZ25hbCB3ZSBjb21wbGV0ZWQgdGhlIGZpcnN0IGN5Y2xlIG9mIHJlZnJlc2hpbmcgdGhlIGZvcm1cclxuICAgIGlmIChyZWZyZXNoVHlwZSA9PT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyAmJiAoIXN1cGVyLmlzTGluZU1vZGUoKSB8fCB0aGlzLl90YWJsZVJlZnJlc2hlZCkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuRm9ybVJlZnJlc2hlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoKDxUYXNrQmFzZT50aGlzLl90YXNrKS5pc0ZpcnN0UmVjb3JkQ3ljbGUoKSB8fCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRJc0luVmlld1JlZnJlc2goKSkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5TRVRfV0NfSURMRSwgdGhpcyk7XHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0SXNJblZpZXdSZWZyZXNoKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hVSSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRUYXNrKCkuaXNNYWluUHJvZygpIC8qJiYgSW5pdGlhbGl6YXRpb25GaW5pc2hlZCovKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE5vUGFyYW1ldGVycyhDb21tYW5kVHlwZS5SRUZSRVNIX1RBU0ssIHRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGZvcm1zIHdpdGggdGFibGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzRmV0Y2hpbmdSZWNvcmRzQWhlYWQpXHJcbiAgICAgIHJldHVybjtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUd1aVRvTG9nKFwiU3RhcnQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuICAgIC8vIHRvZG8gZm9yIG5vdyAtIGFsd2F5cyBzaG93IGFsbCByZWNvcmRzXHJcbiAgICAvLyBzYXZlIHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBsZXQgb2xkQ3VyclJvdzogbnVtYmVyID0gdGhpcy5EaXNwbGF5TGluZTtcclxuICAgIGxldCBjdXJyUmVjSWR4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSB3ZSByZWZyZXNoIHRoZSB0YWJsZSAtIHNldCBjdXJyLXJvdyBhbmQgdG9wLXJlYy1pZHggdG8gYmUgdGhlXHJcbiAgICAvLyBvbmVzIHJlcXVlc3RlZCBieSB0aGUgZGF0YXZpZXcuXHJcbiAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHJlZnJlc2hlcyAtIHdlIGNoYW5nZSBjdXJyLXJvdyBhbmQgdG9wLXJlYyBvbmx5IGlmIHRoZSB0YWJsZVxyXG4gICAgLy8gYmVjb21lcyBlbXB0eS5cclxuICAgIGlmICghdGhpcy5fdGFibGVSZWZyZXNoZWQgJiYgY3VyclJlY0lkeCA+PSAwKSB7XHJcbiAgICAgIG9sZEN1cnJSb3cgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0Q3VyclJlY0lkeCgpO1xyXG5cclxuXHJcbiAgICAgIGlmIChvbGRDdXJyUm93ICsgMSA+IHRoaXMuX3Jvd3NJblBhZ2UpXHJcbiAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeChvbGRDdXJyUm93IC0gTWF0aC5mbG9vcih0aGlzLl9yb3dzSW5QYWdlIC8gMikgKyAxKTtcclxuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLkdldERhdGF2aWV3KCkuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChvbGRDdXJyUm93ID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBvbGRDdXJyUm93ID0gMDtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCkgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoY3VyclJlY0lkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiBUb3BSZWNJZHggPCAwIGl0IG1lYW5zIHdlIHNob2xkIG5vdCBjb250aW51ZSB0aGUgcmVmcmVzaCBzaW5jZSB3ZSBhcmUgaW4gdGVtcG9yYXJ5IHNpdHVhdGlvbi5cclxuICAgIC8vIEFub3RoZXIgcmVmcmVzaCB3aWxsIGJlIGRvbmUgc29vbiB3aXRoIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgLy8gVGhpcyBpcyBjYW4gaGFwcGVuIHdoZW4gOlxyXG4gICAgLy8gSW4gZmV0Y2hDaHVua0Zyb21TZXJ2ZXIgd2UgZ28gdG8gdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBleHBlY3RzIG5ldyByZWNvcmRzLlxyXG4gICAgLy8gV2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZmV0Y2hpbmdDaHVuaywgd2UgbWlnaHQgZ28gYWdhaW4gdG8gdGhlIHNlcnZlciwgYmVmb3JlIHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGNodW5rLlxyXG4gICAgLy8gR29pbmcgdG8gdGhlIHNlcnZlciBpbiB0aGUgZ2V0IGNodW5rIHByb2Nlc3MgLCBjYW4gYmUgZm9yIGV4YW1wbGU6IHJlY29yZCBzdWZmaXgsIG9yIGFueSBzZXJ2ZXIgc2lkZSBvcCBpbiByZWMgc3VmZiBvciBWQy5cclxuICAgIC8vIFVzdWFsbHksIGR1cmluZyB0aGlzIHBhcnQsIHdlIGRvIG5vdCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIC8vIEJ1dCwgZm9yIGV4YW1wbGUgaW4gUUNSICM2OTgyMTcsIGEgY2FsbCB3YXMgbWFkZSB0byByZWZyZXNoVGFibGUgd2l0aCBUb3BSZWNJZHggPT0gLTEuXHJcbiAgICAvLyBUaGUgcmVhc29uIHdhcywgdGhhdCBpbiB0aGUgVkMgdGhlcmUgd2FzIGEgc2VydmVyIG9wIHRoYXQgdXBkYXRlZCBhIHZhciBpbiB0aGUgdGFzay4gQXMgYSByZXN1bHQsIHRoZSAnbW9kaScgZmxhZ1xyXG4gICAgLy8gZnJvbSB0aGUgc2VydmVyIHdhcyBvbiwgd2hpY2ggY2F1c2VkIHRoZSBcInRlbXBcIiByZWZyZXNoVGFibGUgYmVmb3JlIHRoZSByZWFsIGNodW5rIGFycml2ZWQuXHJcbiAgICAvLyBUaGlzIGluIHR1cm4gY2F1c2VkIGEgY2hhbmdlIGluIHRoZSBjdXJyIHJlYyBpZCwgd2hpY2ggd2FzIHdyb25nLlxyXG4gICAgLy8gQWZ0ZXIgdGhlIGNodW5rIGFycml2ZXMsIHRoZSByZWZyZXNoIHNldHMgdGhlIGNvcnJlY3QgdmFsdWVzLlxyXG4gICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKSA8IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBvbGRDdXJyUm93ID0gb2xkQ3VyclJvdyAtIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTsgLy8gc2F2ZSBvbGRDdXJyUm93IHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBpbmRleFxyXG4gICAgbGV0IGJrcFJlY29yZDogUmVjb3JkID0gdGhpcy5HZXREYXRhdmlldygpLmJhY2t1cEN1cnJlbnQoKTtcclxuICAgIHRoaXMuX3RhYmxlUmVmcmVzaGVkID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb3JpVHJhbnNmZXJEYXRhVG9HdWkgPSB0aGlzLl90cmFuc2ZlcnJpbmdEYXRhVG9HVUk7XHJcblxyXG4gICAgaWYgKCFvcmlUcmFuc2ZlckRhdGFUb0d1aSlcclxuICAgICAgdGhpcy5fdHJhbnNmZXJyaW5nRGF0YVRvR1VJID0gdHJ1ZTtcclxuICAgIHRoaXMuQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSBmYWxzZTtcclxuICAgIC8vIFFDUiAjOTk4MDY3LCB3ZSBtdXN0IG5vdCByZWZyZXNoIHN1YmZvcm1zIGZvciBhbnkgcm93cyB0aGF0IGFyZSBub3Qgb3VyIHJlYWwgY3VycmVudCByb3dcclxuXHJcbiAgICAvLyByZWZyZXNoIGFsbCB0aGUgcm93cyBCVVQgbm90IHRoZSBvbGQgY3VycmVudCByb3dcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9yb3dzSW5QYWdlOyBpKyspIHtcclxuICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyByZWNvcmQgZm9yIGEgcm93IGp1c3QgZGlzYWJsZSBpdCBhbmQgdmljZSB2ZXJzYVxyXG4gICAgICBsZXQgdG9wSW5kZXg6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRUb3BSZWNJZHgoKTtcclxuICAgICAgaWYgKHRvcEluZGV4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgdG9wSW5kZXggPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IHRvcEluZGV4ICsgaTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdXBlci5jaGVja0FuZENyZWF0ZVJvdyhpZHgpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBvbGQgY3VycmVudCByb3cuIHRoZSByZWZyZXNoIGZvciB0aGlzIHJvdyBpcyBkb25lIGJ5IHRoZSBjYWxsZXJcclxuICAgICAgICAvLyBhbmQgcmVmcmVzaCBvbmx5IHZhbGlkIGxpbmVzIHRoYXQgd2VyZSBub3QgZGlzYWJsZWRcclxuICAgICAgICBpZiAoaSAhPT0gb2xkQ3VyclJvdykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShpZHgsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHN1cGVyLnJlZnJlc2hDb250cm9scyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4Lm5hbWUgPT0gXCJSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uXCIpIHtcclxuICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIHJvdyBmYWlsZWQsIG1hcmsgdGhlIHJvdyBhcyBub3QgY3JlYXRlZFxyXG4gICAgICAgICAgaWYgKHN1cGVyLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICAgICAgICBzdXBlci5tYXJrUm93Tk9UQ3JlYXRlZChpZHgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLkFsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdHJ1ZTtcclxuICAgIGlmICghb3JpVHJhbnNmZXJEYXRhVG9HdWkpXHJcbiAgICAgIHRoaXMuX3RyYW5zZmVycmluZ0RhdGFUb0dVSSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlQmFja3VwKG9sZEN1cnJSb3cgKyB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCksIGJrcFJlY29yZCk7XHJcbiAgICBhd2FpdCBzdXBlci5yZWZyZXNoQ29udHJvbHModHJ1ZSk7XHJcbiAgICB0aGlzLlJlZnJlc2hVSSgpO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlR3VpVG9Mb2coXCJFbmQgZm9ybS5yZWZyZXNoVGFibGUoKVwiKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGRpc3BsYXkgbGluZSBieSByZWNvcmQgbGluZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdXBkYXRlRGlzcGxheUxpbmVCeURWKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNwbGF5TGluZSA9IHRoaXMucmVjb3JkSWR4MkRpc3BsYXlMaW5lKHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRDdXJyUmVjSWR4KCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj5pcyB0aGUgbmV3IGN1cnJlbnQgZGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZTogbnVtYmVyLCBkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlY0lkeDogbnVtYmVyID0gdGhpcy5kaXNwbGF5TGluZTJSZWNvcmRJZHgoZGlzcGxheUxpbmUpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlSZWNJZHgocmVjSWR4LCBkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZGlzcGxheUxpbmUpO1xyXG4gICAgaWYgKHN1cGVyLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRGlzcGxheUxpbmUgPSBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN1cnJlbnQgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd051bVwiPmlzIHRoZSBuZXcgY3VycmVudCByb3cgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+ZG8gdGhlIHJlY29yZCBzdWZmaXggZm9yIHRoZSBwcmV2aW91cyByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmRvIHRoZSBhY3Rpb25zIGFzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNldEN1cnJSb3dCeVJlY0lkeChyb3dOdW06IG51bWJlciwgZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGRpc3BsYXlMaW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkgPT09IG51bGwgfHwgKCFzdXBlci5oYXNUYWJsZSgpICYmIHJvd051bSAhPT0gMCkpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEZvcm0uc2V0Q3VyclJvdygpIG5vIHRhYmxlIFwiKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtO1xyXG4gICAgICBhd2FpdCB0aGlzLkdldERhdGF2aWV3KCkuc2V0Q3VyclJlY0J5SWR4KHJvd051bSwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIHRydWUsIGRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9kZXN0VGJsUm93ID0gcm93TnVtIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGxhc3QgdmFsaWQgcm93IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFZhbGlkUm93KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fcm93c0luUGFnZSAtIDEsIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgLSAxIC0gdGhpcy5HZXREYXRhdmlldygpLmdldFRvcFJlY0lkeCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgcmVjb3JkIGxpbmUgdG8gZGlzcGxheSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY0lkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICByZWNvcmRJZHgyRGlzcGxheUxpbmUocmVjSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgZGlzcGxheSBsaW5lIHRvIHJlY29yZCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGRpc3BsYXlMaW5lMlJlY29yZElkeChkaXNwbGF5TGluZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBkaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgY3VycmVudCByb3cgdXNpbmcgdGhlIHBhcmFtZXRlciBhbmQgaWdub3JpbmcgYW55IGV4Y2VwdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwbGF5TGluZVwiPnRoZSBvbGQgY3VycmVudCByb3cgbnVtYmVyIHRvIGJlIHJlc3RvcmVkPC9wYXJhbT5cclxuICBhc3luYyByZXN0b3JlT2xkRGlzcGxheUxpbmUoZGlzcGxheUxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5faW5SZXN0b3JlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0cyByZWNvcmQgZnJvbSBndWkgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSBzdXBlci5nZXRUb3BJbmRleEZyb21HVUkoKTtcclxuXHJcbiAgICBpZiAoc3VwZXIuaGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5HZXREYXRhdmlldygpLnNldFRvcFJlY0lkeCh0aGlzLmRpc3BsYXlMaW5lMlJlY29yZElkeCh0b3BEaXNwbGF5TGluZSkpO1xyXG5cclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCByZWNvcmQgcG9zaXRpb24gaW4gdGhlIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN1cnJSZWNQb3NJbkZvcm0oKTogbnVtYmVyIHtcclxuICAgIC8vIHdoZW4gdGhlIHNlbGVjdGVkIHJlY29yZCBpcyBvdXRzaWRlIHRoZSB2aWV3LCB0b3BJbmRleCBhbmQgRGlzcGxheUxpbmUgd2lsbCBiZSAwXHJcbiAgICAvLyByZXN1bHRpbmcgaW4gY3VyclJlY1Bvc0luRm9ybSA9PSAxXHJcbiAgICBsZXQgdG9wRGlzcGxheUxpbmU6IG51bWJlciA9IHN1cGVyLmdldFRvcEluZGV4RnJvbUdVSSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuRGlzcGxheUxpbmUgLSB0b3BEaXNwbGF5TGluZSArIDE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkRGlzcGxheUxpbmVcIj5vbGQgY3VycmVudCByZWNvcmQgaWR4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJrcFJlY29yZFwiPnNhdmVkIHJlY29yZDwvcGFyYW0+XHJcbiAgYXN5bmMgcmVzdG9yZUJhY2t1cChvbGREaXNwbGF5TGluZTogbnVtYmVyLCBia3BSZWNvcmQ6IFJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUUNSICM5NDI4NzgsIGlmIHJlY29yZCBpcyBpbiBwcm9jZXNzIG9mIGluc2VydCwgZGVsZXRlIG9yIG1vZGlmeSB3ZSBtdXN0IHBlcmZvcm0gcmVzdG9yZU9sZEN1cnJSb3dcclxuICAgIC8vIHRoYXQgd2lsbCBwZXJmb3JtIGFsbCBuZWNlc3NhcnkgYWN0aW9ucyBmb3IgdGhlIHJlY29yZCwgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IHJlc3RvcmUgaXQgZnJvbSBiYWNrdXBcclxuICAgIGlmIChia3BSZWNvcmQuZ2V0SWQoKSA+PSAwICYmIHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRSZWNJZHgoYmtwUmVjb3JkLmdldElkKCkpID49IDAgJiYgb2xkRGlzcGxheUxpbmUgPj0gMCAmJiBvbGREaXNwbGF5TGluZSA8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLmdldEN1cnJSZWNJZHgoKSA+PSAwICYmIGJrcFJlY29yZC5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lKSB7XHJcbiAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5yZXN0b3JlQ3VycmVudChia3BSZWNvcmQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVPbGREaXNwbGF5TGluZShvbGREaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZTogTWdDb250cm9sVHlwZSwgdGFzazogVGFza0Jhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik6IE1nQ29udHJvbEJhc2U7XHJcbiAgQ29uc3RydWN0TWdDb250cm9sKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZTtcclxuICBDb25zdHJ1Y3RNZ0NvbnRyb2wodHlwZT86IE1nQ29udHJvbFR5cGUsIHRhc2tPclBhcmVudE1nRm9ybT86IGFueSwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeD86IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzAoKTtcclxuICAgIH1cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICh0eXBlID09PSBudWxsIHx8IHR5cGUuY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHRhc2tPclBhcmVudE1nRm9ybSA9PT0gbnVsbCB8fCB0YXNrT3JQYXJlbnRNZ0Zvcm0gaW5zdGFuY2VvZiBUYXNrQmFzZSkgJiYgKHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHggPT09IG51bGwgfHwgcGFyZW50Q29udHJvbE9yUGFyZW50Q29udHJvbElkeC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5Db25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlLCB0YXNrT3JQYXJlbnRNZ0Zvcm0sIHBhcmVudENvbnRyb2xPclBhcmVudENvbnRyb2xJZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQ29uc3RydWN0TWdDb250cm9sXzIodHlwZSwgdGFza09yUGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sT3JQYXJlbnRDb250cm9sSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzAoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb25zdHJ1Y3RNZ0NvbnRyb2xfMSh0eXBlOiBNZ0NvbnRyb2xUeXBlLCB0YXNrOiBUYXNrQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IE1nQ29udHJvbCh0eXBlLCB0YXNrLCBwYXJlbnRDb250cm9sKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyZW50TWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgQ29uc3RydWN0TWdDb250cm9sXzIodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiBuZXcgTWdDb250cm9sKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFscmVhZHkgbW92ZWQgdG8gdGhlIGZpcnN0IGNvbnRyb2wgb24gb25lIG9mIHRoZSBNZ0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuZ2V0TUdEYXRhKCkuQWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRhYmxlIGZpcnN0IHRpbWUgd2UgZW50ZXIgdGhlIG93bmVyVGFza1xyXG4gIC8vLyAgIGdldCByb3dzIG51bWJlciBmb3JtIGd1aSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlyc3RUYWJsZVJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgc3VwZXIuZmlyc3RUYWJsZVJlZnJlc2goKTtcclxuICAgICAgdGhpcy5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUYWJsZSgpO1xyXG4gICAgICBzdXBlci5TZWxlY3RSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEluc2VydFRhYmxlSXRlbXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuUm93cy5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgICAgdGhpcy5JbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICB0aGlzLl9sYXN0Um93U2VudCA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gICBzZXRUYWJsZUl0ZW1zQ291bnQocmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXI7XHJcblxyXG4gICAgLy8gRm9yIGFic29sdXRlIHNjcm9sbGJhciwgc2V0IHRoZSB2aXJ0dWFsIGl0ZW1zIGNvdW50IGFjY29yZGluZ2x5LlxyXG4gICAgaWYgKHRoaXMuaXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpKSB7XHJcblxyXG4gICAgICAvLyBJZiB0YXNrIGlzIG1vdmVkIGludG8gQ1JFQVRFIG1vZGUgYW5kIGN1cnJlbnRseSBuZXcgbGluZSBpcyBjcmVhdGVkXHJcbiAgICAgIC8vIHRoZW4gb25seSBuZXdseSBjcmVhdGVkIHJlY29yZHMgc2hvdWxkIGJlIHNlZSBvbiB0aGUgc2NyZWVuXHJcbiAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldyA9IDA7XHJcbiAgICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50VmlldygwKTtcclxuICAgICAgICAgIHRoaXMuUmVmcmVzaFVJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFRhYmxlIHdpdGggc2V0IG9mIHJlY29yZHMgT1IgaWYgZW1wdHkgdGFibGUgdGhlbiB0YWJsZUl0ZW1zQ291bnQgc2hvdWxkIG5vdCBiZSAwLCBhcyB3ZSBhbHdheXMgaGF2ZSAwdGggcm93LlxyXG4gICAgICAgIHRhYmxlSXRlbXNDb3VudCA9ICh0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSA/IHRoaXMuR2V0RGF0YXZpZXcoKS5Ub3RhbFJlY29yZHNDb3VudDogMTtcclxuICAgICAgICB0aGlzLlNldFJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vbi1wYWdpbmF0ZWQgdGFibGVcclxuICAgICAgdGFibGVJdGVtc0NvdW50ID0gdGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICAgc3VwZXIuU2V0VGFibGVJdGVtc0NvdW50KHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCksIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGhlIHRhYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMCgpOiB2b2lkIHtcclxuICAgIGxldCBkdlNpemU6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAxO1xyXG5cclxuICAgIC8vIEluaXRpYWxpemluZyB0aGUgdGFibGUgY29udHJvbCBmb3IgdGhlIGZpcnN0IHRpbWUgd2hpbGUgY3JlYXRpbmcgdGhlIGZvcm0gd2l0aCB0b3RhbFJlY29yZHNDb3VudCBhbmQgYWxzb1xyXG4gICAgLy8gc2V0IHRoZSByZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcsIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgZmlyc3Qgcm93IGF0IHJlc3BlY3RpdmUgbG9jYXRpb24gaW4gY2FzZSBvZiBsb2NhdGUuXHJcbiAgICBpZiAodGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCkgJiYgdGhpcy5HZXREYXRhdmlldygpLlRvdGFsUmVjb3Jkc0NvdW50ID4gMCkge1xyXG4gICAgICBsZXQgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICB0YWJsZUl0ZW1zQ291bnQgPSB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQ7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1JFQ09SRFNfQkVGT1JFX0NVUlJFTlRfVklFVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCBmYWxzZSk7XHJcbiAgICB0aGlzLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdHMgdGFibGUgY29udHJvbCdzIHJvd3MgdG8gJ3RhYmxlSXRlbXNDb3VudCcgY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2U2l6ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFibGVJdGVtc0NvdW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZW1vdmVBbGxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wMShkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGlmIChyZW1vdmVBbGwpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0ZJUlNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgMCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkQm9vbFdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19GSVJTVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIDAsIHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0ZpcnN0KCkgfHwgdGhpcy5HZXREYXRhdmlldygpLklzT25lV2F5S2V5KTtcclxuICAgICAgICBDb21tYW5kcy5hZGRCb29sV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lOQ0xVREVTX0xBU1QsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNMYXN0KCkpO1xyXG4gICAgICAgIENvbW1hbmRzLmFkZEJvb2xXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfRU1QVFlfREFUQVZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCAwLCB0aGlzLkdldERhdGF2aWV3KCkuaXNFbXB0eURhdGF2aWV3KCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdXBlci5Jbml0VGFibGVDb250cm9sKGR2U2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvd3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0b3AgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldFRhYmxlVG9wSW5kZXgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLkdldERhdGF2aWV3KCkuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzVGFibGVXaXRoUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuR2V0RGF0YXZpZXcoKS5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICAgICAgLy8gdGFibGUgbm93IGJlaGF2ZXMgbGlrZSBsaXN0dmlldywgaXQgY2FuIG5vdCBzaG93IGVtcHR5IGxpbmVzXHJcbiAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHVwZGF0ZSB0b3AgaW5kZXhcclxuICAgICAgICAgIGlmIChpbmRleCArIHRoaXMuX3Jvd3NJblBhZ2UgPiB0aGlzLkdldERhdGF2aWV3KCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSBkbyBzaG93IGVtcHR5IGxpbmVzIGlmIGluY2x1ZGVGaXJzdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBoYXZlIGxlc3MgcmVjb3JkcyB0aGVuIHJvd3Mgb24gc2NyZWVuIFFDUiAjISEhISEhXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldERhdGF2aWV3KCkuSW5jbHVkZXNGaXJzdCgpIHx8IHRoaXMuR2V0RGF0YXZpZXcoKS5nZXRTaXplKCkgPiB0aGlzLl9yb3dzSW5QYWdlICsgMSkge1xyXG4gICAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgodGhpcy5HZXREYXRhdmlldygpLmdldFNpemUoKSAtIHRoaXMuX3Jvd3NJblBhZ2UsIDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RGF0YXZpZXcoKS5zZXRUb3BSZWNJZHgoaW5kZXgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RvcEluZGV4VXBkYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2R3VpVG9wSW5kZXggfHwgdGhpcy5Jc01vdmluZ0luVmlldykge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX1RPUF9JTkRFWCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGluZGV4KTtcclxuICAgICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSB0aGlzLmdldEd1aVJvd2lkeChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmVhdGVzIHRoZSB3aW5kb3cgZGVmaW5lZCBieSB0aGlzIGZvcm0gYW5kIGl0cyBjaGlsZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgY3JlYXRlRm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUZvcm0oKTtcclxuICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMuYWRkKHRoaXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Xcml0ZXMgdGhlIHN0cmluZyBvciBzZXRzIHRoZSBpbWFnZSBvbiB0aGUgcGFuZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhbmVJZHhcIj5JbmRleCBvZiB0aGUgcGFuZSB0byBiZSB1cGRhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJJbmZvXCI+TWVzc2FnZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+U291bmQgYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFVwZGF0ZVN0YXR1c0JhcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBpbiBXZWJDbGllbnQuXHJcbiAgICAvLyBpZiAocGFuZUlkeCA9PSBDb25zdGFudHMuU0JfTVNHX1BBTkVfTEFZRVIgfHwgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0U3BlY2lhbFNob3dTdGF0dXNCYXJQYW5lcygpKVxyXG4gICAgLy8gICBiYXNlLlVwZGF0ZVN0YXR1c0JhcihwYW5lSWR4LCBzdHJJbmZvLCBzb3VuZEJlZXApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSByZWNvbXB1dGUgdGFibGUgZm9yIHRoYXQgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUkVDT01QVVRFKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byByZWNvbXB1dGUgZm9ybVwiKTtcclxuICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5SZWNvbXB1dGVGaWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdXBlci5pbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IHRhc2s9XCIgKyB0aGlzLl90YXNrICsgXCIsIElkPVwiICsgdGhpcy5fdXNlclN0YXRlSWQgKyBcIn1cIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYnVpbGQgdGhlIFhNTCBlbnRyeSBvZiB0aGUgaGlkZGVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEhpZGRlbkNvbnRyb2xMaXN0WE1MKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgeG1sOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ICE9PSBudWxsICYmIHRoaXMuaGlkZGVuQ29udHJvbHNJc25zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHdyaXRlIHRoZSBpZFxyXG4gICAgICB4bWwuQXBwZW5kKFwiPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hJRERFTl9DT05UT0xTICsgXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTTlMgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0LmZvckVhY2goKGNoYW5nZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgeG1sLkFwcGVuZChjaGFuZ2UgKyBcIixcIik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgeG1sLlJlbW92ZSh4bWwuTGVuZ3RoIC0gMSwgMSk7XHJcblxyXG4gICAgICB4bWwuQXBwZW5kKFwiXFxcIi8+XCIpO1xyXG5cclxuICAgICAgdGhpcy5oaWRkZW5Db250cm9sc0lzbnNMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIEZvciBSSUEsIE5vbiBJbnRlcmFjdGl2ZSB0YXNrJ3MgYW5kIGl0cyBhbGwgY2hpbGQgdGFzayBzaG91bGQgYmVoYXZlIGFzIGEgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2hvdWxkQmVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcyBhbmQgaXRzIGNoaWxkcmVuIHdpbGwgYmUgb3BlbmVkIHVzaW5nIHNob3cgZGlhbG9nIHRvIHByZXZlbnQgZXZlbnRzIG9uIHRoZWlyIGFuY2VzdG9yc1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpKVxyXG4gICAgICBzaG91bGRCZU1vZGFsID0gVGFza0Jhc2UuU2hvdWxkTm9uSW50ZXJhY3RpdmVCZU1vZGFsKCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBhcmVudFRhc2s6IFRhc2tCYXNlID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5QYXJlbnRUYXNrO1xyXG4gICAgICBpZiAocGFyZW50VGFzayAhPT0gbnVsbCAmJiAhcGFyZW50VGFzay5Jc0ludGVyYWN0aXZlICYmICFwYXJlbnRUYXNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBzaG91bGRCZU1vZGFsID0gcGFyZW50VGFzay5TaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaG91bGRCZU1vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFnaW5hdGVkIHRhYmxlIGJlaW5nIHVzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RhYmxlV2l0aFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIHdoZXRoZXIgdGFibGUgYmVpbmcgdXNlZCB3aXRoIGFic29sdXRlIHNjcm9sbGJhciB0aHVtYi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgdGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIgPSAoPE1nQ29udHJvbD50aGlzLl90YWJsZU1nQ29udHJvbCkuSXNUYWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcigpO1xyXG5cclxuICAgIHJldHVybiB0YWJsZVdpdGhBYnNvbHV0ZVNjcm9sbGJhcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHJlY29yZHNCZWZvcmVDdXJyZW50Vmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0UmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVcsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidWlsZEZvcm1OYW1lKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gIHRoaXMuVW5pcXVlTmFtZTtcclxuICAgIGxldCB0YXNrOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT50aGlzLmdldFRhc2soKTtcclxuXHJcbiAgICBuYW1lID0gKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgJ18nICsgbmFtZTtcclxuICAgIHdoaWxlICh0YXNrLklzU3VidGFzaykge1xyXG4gICAgICB0YXNrID0gPFRhc2tCYXNlPnRhc2suU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgbmFtZSA9ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArICdfJyArIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmZXRjaFByZXZDaHVua0ZvckN1cnJlbnRQYWdlKCkgOiBUbyBmZXRjaCBwcmV2aW91cyBjaHVuayBvZiByZWNvcmRzIGlmIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hQcmV2Q2h1bmtGb3JDdXJyZW50UGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKSAmJiB0aGlzLkdldERhdGF2aWV3KCkuVG90YWxSZWNvcmRzQ291bnQgPiAwKSB7XHJcbiAgICAgIGxldCByZWNQb3NPblBhZ2U6IG51bWJlciA9IHRoaXMuR2V0RGF0YXZpZXcoKS5SZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgJSB0aGlzLl9yb3dzSW5QYWdlO1xyXG5cclxuICAgICAgLy8gSWYgcmVjb3JkIGlzIG5vdCB0aGUgZmlyc3QgcmVjb3JkIG9uIHBhZ2UsIGZldGNoIHByZXZpb3VzIHJlY29yZCBmb3IgdGhhdCBwYWdlLlxyXG4gICAgICAvLyBUT0RPIDogdGhpcy5EaXNwbGF5TGluZSAtIENoZWNrIHdoZXRoZXIgY2FuIGJlIHJlbW92ZWQgP1xyXG4gICAgICBpZiAocmVjUG9zT25QYWdlID4gMCAmJiB0aGlzLkRpc3BsYXlMaW5lID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRSb3dEYXRhKC1yZWNQb3NPblBhZ2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3VpUm93aWR4KGR2Um93SWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGR2Um93SWR4ICsgdGhpcy5HZXREYXRhdmlldygpLlJlY29yZHNCZWZvcmVDdXJyZW50VmlldztcclxuICB9XHJcblxyXG4gIGdldER2Um93SWR4KGd1aVJvd0lkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBndWlSb3dJZHggLSB0aGlzLkdldERhdGF2aWV3KCkuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gIH1cclxufVxyXG4iXX0=