@magic-xpa/engine 4.1100.0-dev4110.26 → 4.1100.0-dev4110.260

Sign up to get free protection for your applications and to get access to all the features.
Files changed (491) 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 +418 -0
  5. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  6. package/{esm2020 → esm2022}/src/CommandsProcessorManager.mjs +25 -25
  7. package/esm2022/src/CommandsTable.mjs +162 -0
  8. package/esm2022/src/ConstInterface.mjs +517 -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 +156 -0
  14. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  15. package/esm2022/src/ServerConfig.mjs +122 -0
  16. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  17. package/esm2022/src/bridge/MagicBridge.mjs +41 -0
  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/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
  23. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  24. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +59 -59
  25. package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
  26. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
  27. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  28. package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
  29. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
  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 +40 -0
  35. package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
  36. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
  37. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -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/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
  41. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
  42. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  44. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
  45. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
  47. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
  48. package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
  49. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  50. package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
  51. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
  52. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
  53. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
  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 +2 -2
  59. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  61. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddRangeCommand.mjs +62 -62
  62. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddSortCommand.mjs +33 -33
  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/{esm2020 → esm2022}/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -132
  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/{esm2020 → esm2022}/src/data/Key.mjs +88 -88
  86. package/esm2022/src/data/Record.mjs +880 -0
  87. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  88. package/esm2022/src/data/RecordsTable.mjs +267 -0
  89. package/{esm2020 → esm2022}/src/data/TaskTransactionManager.mjs +107 -103
  90. package/{esm2020 → esm2022}/src/data/XMLBasedDcValuesBuilder.mjs +74 -74
  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 +227 -0
  96. package/{esm2020 → esm2022}/src/env/MirrorString.mjs +65 -65
  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 +2988 -0
  102. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  103. package/esm2022/src/event/RunTimeEvent.mjs +399 -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/{esm2020 → esm2022}/src/exp/GlobalParamsTable.mjs +85 -85
  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 +1224 -0
  117. package/esm2022/src/http/HttpManager.mjs +97 -0
  118. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  119. package/{esm2020 → esm2022}/src/http/client/HttpClientBase.mjs +132 -132
  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/{esm2020 → esm2022}/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -18
  125. package/{esm2020 → esm2022}/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -18
  126. package/{esm2020 → esm2022}/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -18
  127. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
  128. package/{esm2020 → esm2022}/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -25
  129. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandBase.mjs +24 -24
  130. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandFactory.mjs +60 -60
  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/{esm2020 → esm2022}/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +16 -16
  135. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  136. package/{esm2020 → esm2022}/src/remote/ResetUserSortRemoteDataviewCommand.mjs +15 -15
  137. package/esm2022/src/remote/ServerError.mjs +40 -0
  138. package/{esm2020 → esm2022}/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +19 -19
  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/esm2022/src/rt/DataviewHeaderBase.mjs +98 -0
  144. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  145. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  146. package/{esm2020 → esm2022}/src/rt/DataviewHeadersSaxHandler.mjs +38 -38
  147. package/{esm2020 → esm2022}/src/rt/ExecutionStack.mjs +94 -94
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  149. package/{esm2020 → esm2022}/src/rt/HandlersTable.mjs +96 -96
  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/{esm2020 → esm2022}/src/rt/RecomputeTable.mjs +62 -62
  158. package/{esm2020 → esm2022}/src/rt/RemoteDataviewHeader.mjs +108 -108
  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/{esm2020 → esm2022}/src/tasks/RemoteTaskService.mjs +44 -44
  169. package/esm2022/src/tasks/Task.mjs +2499 -0
  170. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  171. package/{esm2020 → esm2022}/src/tasks/TaskServiceBase.mjs +24 -24
  172. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  174. package/{esm2020 → esm2022}/src/tasks/sort/SortCollection.mjs +67 -67
  175. package/{esm2020 → esm2022}/src/util/ConstUtils.mjs +13 -13
  176. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  177. package/{esm2020 → esm2022}/src/util/HeapSort.mjs +69 -69
  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/{esm2020 → esm2022}/src/util/cookie.service.mjs +91 -91
  190. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29885 -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 +35 -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 +516 -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 +35 -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 +9 -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 +11 -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 +9 -8
  220. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
  221. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -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 +16 -15
  226. package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
  227. package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
  228. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -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 +9 -8
  232. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
  233. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
  234. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  235. package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
  236. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
  237. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
  238. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
  239. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
  240. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  241. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
  242. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
  243. package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
  244. package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -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 +4 -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 +157 -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 +205 -204
  293. package/src/event/IEventsManager.d.ts +77 -77
  294. package/src/event/RunTimeEvent.d.ts +126 -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 +96 -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/CommandsTable.mjs +0 -162
  385. package/esm2020/src/ConstInterface.mjs +0 -516
  386. package/esm2020/src/FlowMonitorInterface.mjs +0 -16
  387. package/esm2020/src/GUIManager.mjs +0 -62
  388. package/esm2020/src/GlobalCommandsManager.mjs +0 -34
  389. package/esm2020/src/GuiEventsProcessor.mjs +0 -154
  390. package/esm2020/src/ServerConfig.mjs +0 -117
  391. package/esm2020/src/bridge/MagicBridge.mjs +0 -41
  392. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
  393. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -23
  394. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
  395. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  396. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  397. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
  398. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  399. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  400. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  401. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  402. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
  403. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  404. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  405. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  406. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  407. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  408. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +0 -15
  409. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
  410. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  411. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  412. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  413. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  414. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  415. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  416. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  417. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  418. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  419. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  420. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  421. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  422. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  423. package/esm2020/src/data/DataView.mjs +0 -1610
  424. package/esm2020/src/data/DataviewManager.mjs +0 -28
  425. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  426. package/esm2020/src/data/DvCache.mjs +0 -67
  427. package/esm2020/src/data/Field.mjs +0 -646
  428. package/esm2020/src/data/FieldBase.mjs +0 -18
  429. package/esm2020/src/data/FieldsTable.mjs +0 -103
  430. package/esm2020/src/data/Record.mjs +0 -846
  431. package/esm2020/src/data/RecordsTable.mjs +0 -267
  432. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  433. package/esm2020/src/env/Environment.mjs +0 -489
  434. package/esm2020/src/env/LanguageData.mjs +0 -226
  435. package/esm2020/src/event/ActionManager.mjs +0 -91
  436. package/esm2020/src/event/Event.mjs +0 -1333
  437. package/esm2020/src/event/EventHandler.mjs +0 -766
  438. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  439. package/esm2020/src/event/EventsManager.mjs +0 -2975
  440. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  441. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  442. package/esm2020/src/exp/ExpTable.mjs +0 -59
  443. package/esm2020/src/exp/Expression.mjs +0 -200
  444. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  445. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
  446. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  447. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  448. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  449. package/esm2020/src/gui/FormsTable.mjs +0 -66
  450. package/esm2020/src/gui/MgControl.mjs +0 -353
  451. package/esm2020/src/gui/MgForm.mjs +0 -1181
  452. package/esm2020/src/http/HttpManager.mjs +0 -97
  453. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  454. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  455. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  456. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  457. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  458. package/esm2020/src/remote/ServerError.mjs +0 -40
  459. package/esm2020/src/rt/Argument.mjs +0 -265
  460. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  461. package/esm2020/src/rt/Boundary.mjs +0 -152
  462. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  463. package/esm2020/src/rt/DataviewHeaderBase.mjs +0 -96
  464. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  465. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  466. package/esm2020/src/rt/Operation.mjs +0 -735
  467. package/esm2020/src/rt/OperationTable.mjs +0 -67
  468. package/esm2020/src/rt/Recompute.mjs +0 -355
  469. package/esm2020/src/rt/ResultValue.mjs +0 -12
  470. package/esm2020/src/rt/TableCache.mjs +0 -177
  471. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  472. package/esm2020/src/rt/Transaction.mjs +0 -53
  473. package/esm2020/src/security/UserDetails.mjs +0 -71
  474. package/esm2020/src/tasks/MGData.mjs +0 -552
  475. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  476. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  477. package/esm2020/src/tasks/Task.mjs +0 -2495
  478. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  479. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  480. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  481. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  482. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  483. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  484. package/esm2020/src/util/PrmMap.mjs +0 -151
  485. package/esm2020/src/util/ReturnResult.mjs +0 -46
  486. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  487. package/esm2020/src/util/Scrambler.mjs +0 -89
  488. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  489. package/fesm2015/magic-xpa-engine.mjs +0 -30835
  490. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  491. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,2499 @@
1
+ import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
2
+ import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
3
+ import { Commands, DataModificationTypes, DisplayConvertor, Events, GuiDataCollection, Helps, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
4
+ import { DataView } from '../data/DataView';
5
+ import { DvCache } from '../data/DvCache';
6
+ import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
7
+ import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
8
+ import { TaskServiceBase } from './TaskServiceBase';
9
+ import { TaskTransactionManager } from '../data/TaskTransactionManager';
10
+ import { DataviewManager } from '../data/DataviewManager';
11
+ import { SortCollection } from './sort/SortCollection';
12
+ import { MgForm } from '../gui/MgForm';
13
+ import { RemoteTaskService } from './RemoteTaskService';
14
+ import { ReturnResult } from '../util/ReturnResult';
15
+ import { RunTimeEvent } from '../event/RunTimeEvent';
16
+ import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
17
+ import { DataviewHeaders } from '../rt/DataviewHeaders';
18
+ import { Transaction } from '../rt/Transaction';
19
+ import { TasksTable } from './TasksTable';
20
+ import { HandlersTable } from '../rt/HandlersTable';
21
+ import { RecomputeTable } from '../rt/RecomputeTable';
22
+ import { ExpTable } from '../exp/ExpTable';
23
+ import { UserEventsTable } from '../event/UserEventsTable';
24
+ import { FormsTable } from '../gui/FormsTable';
25
+ import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
26
+ import { ActionManager } from '../event/ActionManager';
27
+ import { ConstInterface } from '../ConstInterface';
28
+ import { GUIManager } from '../GUIManager';
29
+ import { CommandsProcessorManager } from '../CommandsProcessorManager';
30
+ import { EventSubType } from '../enums';
31
+ import { OpeningTaskDetails, Task_SubformExecModeEnum, TaskBase } from './TaskBase';
32
+ import { LanguageData } from '../env/LanguageData';
33
+ import { Environment } from '../env/Environment';
34
+ import { LastFocusedManager } from '../rt/LastFocusedManager';
35
+ import { GlobalCommandsManager } from '../GlobalCommandsManager';
36
+ import { EventsAllowedType } from '../event/IEventsManager';
37
+ import { AccessHelper } from '../AccessHelper';
38
+ import { MGDataCollection } from './MGDataCollection';
39
+ import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
40
+ import { EventHandlerPosition } from '../event/EventHandlerPosition';
41
+ import { ClientManager } from "../ClientManager";
42
+ export var Task_Flow;
43
+ (function (Task_Flow) {
44
+ Task_Flow[Task_Flow["NONE"] = 0] = "NONE";
45
+ Task_Flow[Task_Flow["STEP"] = 1] = "STEP";
46
+ Task_Flow[Task_Flow["FAST"] = 2] = "FAST";
47
+ })(Task_Flow || (Task_Flow = {}));
48
+ export var Task_Direction;
49
+ (function (Task_Direction) {
50
+ Task_Direction[Task_Direction["BACK"] = -1] = "BACK";
51
+ Task_Direction[Task_Direction["NONE"] = 0] = "NONE";
52
+ Task_Direction[Task_Direction["FORE"] = 1] = "FORE";
53
+ })(Task_Direction || (Task_Direction = {}));
54
+ export class Task extends TaskBase {
55
+ _dvCache = null;
56
+ _mgData = null;
57
+ _aborting = false;
58
+ _bExecEndTask = false;
59
+ _isStarted = false;
60
+ _evalOldValues = false;
61
+ _inRecordSuffix = false;
62
+ _cancelWasRaised = false;
63
+ _counter = 0;
64
+ _currStartProgLevel = 0;
65
+ _destinationSubform = false;
66
+ _enableZoomHandler = false;
67
+ _firstRecordCycle = false;
68
+ _originalTaskMode = ' ';
69
+ _inCreateLine = false;
70
+ InSelect = false;
71
+ InStartProcess = false;
72
+ _isDestinationCall = false;
73
+ _knownToServer = true;
74
+ _loopStack = null;
75
+ allowRemoteCmdExecution;
76
+ DelayCommandExecution = false;
77
+ _parentTask = null;
78
+ get ParentTask() {
79
+ return this._parentTask;
80
+ }
81
+ ContextTask = null;
82
+ _triggeringTask = null;
83
+ PathParentTask = null;
84
+ _preventControlChange = false;
85
+ _preventRecordSuffix = false;
86
+ _taskPath = null;
87
+ _tryingToCommit = false;
88
+ set TryingToCommit(value) {
89
+ this._tryingToCommit = value;
90
+ }
91
+ get TryingToCommit() {
92
+ return this._tryingToCommit;
93
+ }
94
+ _useLoopStack = false;
95
+ _inProcessingTopMostEndTaskSaved = false;
96
+ InHandleActCancel = false;
97
+ RuntimeSorts = null;
98
+ VewFirst = 0;
99
+ dataViewContent = null;
100
+ PerformParentRecordPrefix = false;
101
+ ModeAsParent = false;
102
+ TaskTransactionManager = null;
103
+ ExecuteClientSubformRefresh = false;
104
+ InCommonHandlerBeforeRP = false;
105
+ _taskService = null;
106
+ get TaskService() {
107
+ if (this._taskService == null)
108
+ this._taskService = new RemoteTaskService();
109
+ return this._taskService;
110
+ }
111
+ static get CommandsProcessor() {
112
+ return CommandsProcessorManager.GetCommandsProcessor();
113
+ }
114
+ hasLocate = false;
115
+ taskDefinitionId = null;
116
+ ArgumentsList = null;
117
+ get LogicalStudioParentTask() {
118
+ if (this.StudioParentTask === null && !super.isMainProg()) {
119
+ return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
120
+ }
121
+ return this.StudioParentTask;
122
+ }
123
+ get KnownToServer() {
124
+ return this._knownToServer;
125
+ }
126
+ ConfirmUpdateNo = false;
127
+ DataSynced = false;
128
+ UniqueSort = null;
129
+ set Transaction(value) {
130
+ this.DataviewManager.CurrentDataviewManager.Transaction = value;
131
+ }
132
+ get Transaction() {
133
+ return this.DataviewManager.CurrentDataviewManager.Transaction;
134
+ }
135
+ RefreshOnVars = null;
136
+ DvPosDescriptor = null;
137
+ SubTasks = null;
138
+ ExpTab = null;
139
+ UserEvtTab = null;
140
+ DataviewHeadersTable = null;
141
+ HandlersTab = null;
142
+ _forms = null;
143
+ Name = null;
144
+ PublicName = null;
145
+ TaskSuffixExecuted = false;
146
+ get TaskDefinitionId() {
147
+ if (this.taskDefinitionId === null) {
148
+ this.taskDefinitionId = new TaskDefinitionId(this._ctlIdx, this.ProgramIsn, this.TaskIsn, this._isPrg);
149
+ }
150
+ return this.taskDefinitionId;
151
+ }
152
+ RetrunValueExp = 0;
153
+ SubformControl = null;
154
+ static StartProgLevel = 0;
155
+ static _idleTimerStarted = false;
156
+ static get IsBlockingBatch() {
157
+ return false;
158
+ }
159
+ constructor(parent) {
160
+ super();
161
+ if (isNullOrUndefined(parent)) {
162
+ this.constructor_0();
163
+ return;
164
+ }
165
+ this.constructor_1(parent);
166
+ }
167
+ constructor_0() {
168
+ this.ActionManager = new ActionManager();
169
+ this.DataView = new DataView(this);
170
+ this._flowMonitor = FlowMonitorQueue.Instance;
171
+ this.ContextTask = this;
172
+ this._dvCache = new DvCache(this);
173
+ this.PerformParentRecordPrefix = true;
174
+ this.DataviewManager = new DataviewManager(this);
175
+ this.allowRemoteCmdExecution = true;
176
+ this.TaskTransactionManager = new TaskTransactionManager(this);
177
+ }
178
+ Init() {
179
+ this.DataView.Init();
180
+ }
181
+ constructor_1(parent) {
182
+ this.constructor_0();
183
+ this.PathParentTask = parent;
184
+ this._parentTask = parent;
185
+ this._triggeringTask = null;
186
+ this.buildTaskPath();
187
+ }
188
+ static CreateTask() {
189
+ let task = new Task();
190
+ task.Init();
191
+ return task;
192
+ }
193
+ isAborting() {
194
+ return this._aborting;
195
+ }
196
+ buildTaskPath() {
197
+ this._taskPath = new List();
198
+ if (this._parentTask._taskPath !== null)
199
+ this._taskPath.AddRange(this._parentTask._taskPath.GetEnumerator());
200
+ this._taskPath.push(this);
201
+ }
202
+ async fillData(mgd, openingTaskDetails) {
203
+ if (!super.isMainProg()) {
204
+ if (this._parentTask === null && openingTaskDetails.CallingTask !== null) {
205
+ this._parentTask = openingTaskDetails.CallingTask;
206
+ this.buildTaskPath();
207
+ openingTaskDetails.CallingTask.addSubTask(this);
208
+ }
209
+ if (this.PathParentTask === null && openingTaskDetails.PathParentTask !== null) {
210
+ this.PathParentTask = openingTaskDetails.PathParentTask;
211
+ }
212
+ }
213
+ if (this._parentTask !== null && this._parentTask.getEnableZoomHandler()) {
214
+ this.setEnableZoomHandler();
215
+ }
216
+ this._mgData = mgd;
217
+ this.fillAttributes();
218
+ this._mgData.addTask(this);
219
+ let parentForm = (this._parentTask !== null) ? this._parentTask.getForm() : null;
220
+ while (await this.initInnerObjects(RuntimeContextBase.Instance.Parser.getNextTag(), parentForm)) {
221
+ }
222
+ this.TaskTransactionManager.PrepareTransactionProperties(this.DataviewManager.RemoteDataviewManager.Transaction, false);
223
+ this.HandleTriggerTask();
224
+ this.HandlePreviouslyActiveTaskId();
225
+ this.CheckAndSetSubForm();
226
+ if (this.IsSubForm) {
227
+ let subFormCtrl = this.getParent().getForm().getSubFormCtrlForTask(this._taskTag);
228
+ if (subFormCtrl !== null) {
229
+ subFormCtrl.setSubformTaskId(this._taskTag);
230
+ }
231
+ if (this.Form !== null) {
232
+ this.Form.setSubFormCtrl(subFormCtrl);
233
+ }
234
+ }
235
+ }
236
+ HandlePreviouslyActiveTaskId() {
237
+ if (this._parentTask !== null && this._parentTask.GetContextTask() !== null && this._mgData !== this._parentTask.getMGData())
238
+ this.PreviouslyActiveTaskId = (this._parentTask.GetContextTask()).getTaskTag();
239
+ else if (this._parentTask !== null)
240
+ this.PreviouslyActiveTaskId = this._parentTask.getTaskTag();
241
+ }
242
+ HandleTriggerTask() {
243
+ this._triggeringTask = this._parentTask;
244
+ }
245
+ FillTaskTables(taskTablesData) {
246
+ if (arguments.length === 1) {
247
+ this.FillTaskTables_0();
248
+ return;
249
+ }
250
+ this.FillTaskTables_1();
251
+ }
252
+ FillTaskTables_0() {
253
+ }
254
+ fillAttributes() {
255
+ let parser = RuntimeContextBase.Instance.Parser;
256
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
257
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
258
+ super.fillAttributes(parser);
259
+ if (super.isMainProg())
260
+ this._mgData = AccessHelper.mgDataTable.getMGData(0);
261
+ }
262
+ else {
263
+ Logger.Instance.WriteExceptionToLogWithMsg("in Task.fillAttributes() out of string bounds");
264
+ }
265
+ }
266
+ setAttribute(attribute, valueStr) {
267
+ let isTagProcessed;
268
+ isTagProcessed = super.setAttribute(attribute, valueStr);
269
+ if (!isTagProcessed) {
270
+ isTagProcessed = true;
271
+ switch (attribute) {
272
+ case ConstInterface.MG_ATTR_REFRESHON:
273
+ if (!(valueStr.trim() === ""))
274
+ this.SetRefreshOnVars(valueStr);
275
+ break;
276
+ case XMLConstants.MG_ATTR_NAME:
277
+ this.Name = valueStr;
278
+ break;
279
+ case ConstInterface.MG_ATTR_DVPOS_DEC:
280
+ if (!(valueStr.trim() === ""))
281
+ this.setDescriptor(valueStr);
282
+ break;
283
+ case ConstInterface.MG_ATTR_HAS_LOCATE:
284
+ if (+valueStr == 1)
285
+ this.hasLocate = true;
286
+ break;
287
+ case ConstInterface.MG_ATTR_AS_PARENT:
288
+ if (+valueStr == 1)
289
+ this.ModeAsParent = true;
290
+ break;
291
+ case ConstInterface.MG_ATTR_TASK_UNIQUE_SORT:
292
+ this.UniqueSort = valueStr[0];
293
+ break;
294
+ case ConstInterface.MG_ATTR_TRANS_ID:
295
+ this.setRemoteTransaction(valueStr);
296
+ break;
297
+ case ConstInterface.MG_ATTR_PUBLIC:
298
+ this.PublicName = XmlParser.unescape(valueStr);
299
+ break;
300
+ case XMLConstants.MG_ATTR_IS_OFFLINE:
301
+ this.IsOffline = XmlParser.getBoolean(valueStr);
302
+ break;
303
+ case XMLConstants.MG_ATTR_RETURN_VALUE_EXP:
304
+ this.RetrunValueExp = XmlParser.getInt(valueStr);
305
+ break;
306
+ case XMLConstants.MG_ATTR_MENUS_FILE_NAME:
307
+ break;
308
+ default:
309
+ isTagProcessed = false;
310
+ break;
311
+ }
312
+ }
313
+ if (!isTagProcessed)
314
+ Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
315
+ return true;
316
+ }
317
+ async initInnerObjects(foundTagName, parentForm) {
318
+ if (foundTagName == null)
319
+ return false;
320
+ let parser = RuntimeContextBase.Instance.Parser;
321
+ switch (foundTagName) {
322
+ case XMLConstants.MG_TAG_HELPTABLE:
323
+ if (this._helpTab == null)
324
+ this._helpTab = new Helps();
325
+ if (Events.ShouldLog(Logger_LogLevels.Development))
326
+ Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
327
+ this._helpTab.fillData(parser);
328
+ break;
329
+ case XMLConstants.MG_TAG_DVHEADER:
330
+ if (Events.ShouldLog(Logger_LogLevels.Development))
331
+ Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
332
+ this.DataView.fillHeaderData(parser);
333
+ break;
334
+ case XMLConstants.MG_TAG_PROP:
335
+ this._propTab.fillData(this, 'T', parser);
336
+ break;
337
+ case XMLConstants.MG_TAG_FORM:
338
+ this.Form = this.FormInitData(parentForm);
339
+ break;
340
+ case XMLConstants.MG_ATTR_MENU_CONTENT:
341
+ break;
342
+ case "assemblies":
343
+ let endContext = parser.getXMLdata().indexOf('/assemblies', parser.getCurrIndex());
344
+ parser.setCurrIndex(endContext);
345
+ parser.setCurrIndex2EndOfTag();
346
+ break;
347
+ case XMLConstants.MG_TAG_FORMS:
348
+ this._forms = new FormsTable(this, parentForm);
349
+ Logger.Instance.WriteDevToLog(NString.Format("{0} ...", foundTagName));
350
+ await this._forms.fillData();
351
+ break;
352
+ case XMLConstants.MG_TAG_TASK:
353
+ if (this.SubTasks == null)
354
+ this.SubTasks = new TasksTable();
355
+ let subtask = new Task(this);
356
+ subtask.Init();
357
+ this.SubTasks.addTask(subtask);
358
+ let mgd = this._mgData;
359
+ if (this.isMainProg())
360
+ mgd = AccessHelper.mgDataTable.GetMGDataForStartupProgram();
361
+ await subtask.fillData(mgd, new OpeningTaskDetails());
362
+ break;
363
+ case ConstInterface.MG_TAG_TASKURL:
364
+ await Task.ProcessTaskURL();
365
+ break;
366
+ case ConstInterface.MG_TAG_EXPTABLE:
367
+ if (this.ExpTab == null)
368
+ this.ExpTab = new ExpTable();
369
+ Logger.Instance.WriteDevToLog("goes to exp");
370
+ this.ExpTab.fillData(this, parser);
371
+ break;
372
+ case ConstInterface.MG_TAG_USER_EVENTS:
373
+ if (this.UserEvtTab == null)
374
+ this.UserEvtTab = new UserEventsTable();
375
+ Logger.Instance.WriteDevToLog("goes to user event tab");
376
+ this.UserEvtTab.fillData(this, parser);
377
+ break;
378
+ case ConstInterface.MG_TAG_LINKS:
379
+ this.DataviewHeadersTable = new DataviewHeaders(this);
380
+ this.DataviewHeadersTable.fillData(parser);
381
+ break;
382
+ case ConstInterface.MG_TAG_SORTS:
383
+ this.RuntimeSorts = new SortCollection();
384
+ this.RuntimeSorts.fillData(parser);
385
+ break;
386
+ case ConstInterface.MG_TAG_TASK_TABLES:
387
+ this.FillTaskTables();
388
+ break;
389
+ case XMLConstants.MG_TAG_RECOMPUTE:
390
+ Logger.Instance.WriteDevToLog("goes to recompute");
391
+ this.RecomputeFillData(parser);
392
+ break;
393
+ case ConstInterface.MG_TAG_EVENTHANDLERS:
394
+ Logger.Instance.WriteDevToLog("goes to eventhandlers");
395
+ if (this.HandlersTab == null)
396
+ this.HandlersTab = new HandlersTable();
397
+ this.HandlersTab.fillData(this, parser);
398
+ this.addExpHandlersToMGData();
399
+ break;
400
+ default:
401
+ if (foundTagName === ("/" + XMLConstants.MG_TAG_TASK)) {
402
+ RuntimeContextBase.Instance.Parser.setCurrIndex2EndOfTag();
403
+ return false;
404
+ }
405
+ else {
406
+ Logger.Instance.WriteDevToLog("There is no such tag in Task.initInnerObjects . Enter case for " + foundTagName);
407
+ return false;
408
+ }
409
+ }
410
+ return true;
411
+ }
412
+ RecomputeFillData(parser) {
413
+ let recomputeTable = new RecomputeTable();
414
+ recomputeTable.fillData_1(this.DataView, this, parser);
415
+ }
416
+ FillTaskTables_1() {
417
+ let parser = RuntimeContextBase.Instance.Parser;
418
+ let endContext = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_TASK_TABLES_END, parser.getCurrIndex());
419
+ endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, endContext) + XMLConstants.TAG_CLOSE.length;
420
+ let taskTablesData = parser.getXMLsubstring(endContext);
421
+ this.FillTaskTables(taskTablesData);
422
+ parser.setCurrIndex(endContext);
423
+ }
424
+ addExpHandlersToMGData() {
425
+ let idx = 0;
426
+ for (let i = this.HandlersTab.getSize() - 1; i >= 0; i--) {
427
+ let handler = this.HandlersTab.getHandler(i);
428
+ let evt = handler.getEvent();
429
+ if (evt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION ||
430
+ (evt.getType() === ConstInterface.EVENT_TYPE_USER && evt.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
431
+ this._mgData.addExpHandler(handler, idx);
432
+ idx++;
433
+ }
434
+ }
435
+ }
436
+ SetRefreshOnVars(variables) {
437
+ let strTok = StrUtil.tokenize(variables, ",");
438
+ let fldNum;
439
+ let intVals = new List();
440
+ let i;
441
+ for (i = 0; i < strTok.length; i++) {
442
+ fldNum = NNumber.Parse(strTok[i]);
443
+ intVals.push(fldNum);
444
+ }
445
+ this.RefreshOnVars = new Array(intVals.length);
446
+ for (i = 0; i < intVals.length; i++) {
447
+ fldNum = intVals.get_Item(i);
448
+ this.RefreshOnVars[i] = fldNum;
449
+ }
450
+ }
451
+ setDataSynced(synced) {
452
+ this.DataSynced = synced;
453
+ }
454
+ getField(fldName) {
455
+ return this.DataView.getFieldByName(fldName);
456
+ }
457
+ getExpById(id) {
458
+ if (this.ExpTab !== null)
459
+ return this.ExpTab.getExpById(id);
460
+ else
461
+ Logger.Instance.WriteExceptionToLogWithMsg("in Task.GetExpById(): no expression table");
462
+ return null;
463
+ }
464
+ getExpObjectById(id) {
465
+ return this.getExpById(id);
466
+ }
467
+ GetExpressionStorage(expId) {
468
+ let result = null;
469
+ if (expId > 0) {
470
+ let expById = this.getExpById(expId);
471
+ Debug.Assert(expById !== null);
472
+ result = expById.GetStorageAttribute();
473
+ }
474
+ return result;
475
+ }
476
+ async CalculateExpression(expId, resType, length) {
477
+ let result = null;
478
+ if (expId > 0) {
479
+ let expById = this.getExpById(expId);
480
+ Debug.Assert(expById !== null);
481
+ result = await expById.evaluateWithResultTypeAndLength(resType, length);
482
+ }
483
+ return result;
484
+ }
485
+ async insertRecordTable(invalidate, parser) {
486
+ if (await this.isCached()) {
487
+ let firstTime = this.DataView.getFirstDv();
488
+ if (!firstTime && invalidate) {
489
+ if (!this.hasLocate) {
490
+ if (this.DataView.IncludesFirst()) {
491
+ if (!this.DataView.getChanged())
492
+ this._dvCache.putInCache(this.DataView.replicate());
493
+ else
494
+ this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
495
+ }
496
+ }
497
+ else
498
+ this.locatePutInCache();
499
+ }
500
+ }
501
+ await this.DataView.fillData(parser);
502
+ if (invalidate)
503
+ this.DataView.setChanged(false);
504
+ }
505
+ getHandlersTab() {
506
+ return this.HandlersTab;
507
+ }
508
+ async buildXML(message) {
509
+ this.IsAfterRetryBeforeBuildXML = this.getAfterRetry();
510
+ if (this.KnownToServer && !this.IsOffline) {
511
+ message.Append(XMLConstants.START_TAG + XMLConstants.MG_TAG_TASK);
512
+ message.Append(" " + XMLConstants.MG_ATTR_TASKID + "=\"" + this.getTaskTag() + "\"");
513
+ message.Append(" " + ConstInterface.MG_ATTR_TASK_MAINLEVEL + "=\"" + this.getMainLevel() + "\"");
514
+ message.Append(XMLConstants.TAG_CLOSE);
515
+ await this.DataView.buildXML(message);
516
+ if (this.Form != null && this.Form.Opened)
517
+ message.Append(this.Form.GetHiddenControlListXML());
518
+ message.Append("\n </" + XMLConstants.MG_TAG_TASK + XMLConstants.TAG_CLOSE);
519
+ }
520
+ }
521
+ buildXMLForRngs(message, UserRanges, locate) {
522
+ let i;
523
+ let fld;
524
+ let cellAttr = StorageAttribute.SKIP;
525
+ let toBase64 = (Environment.Instance.GetDebugLevel() <= 1);
526
+ message.Append(XMLConstants.TAG_CLOSE);
527
+ for (i = 0; i < UserRanges.length; i++) {
528
+ message.Append(XMLConstants.START_TAG + ConstInterface.USER_RNG);
529
+ let rng = UserRanges.get_Item(i);
530
+ message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + rng.veeIdx + "\"");
531
+ fld = this.DataView.getField(rng.veeIdx - 1);
532
+ let fldAttr = fld.getType();
533
+ if (rng.nullMin)
534
+ message.Append(" " + ConstInterface.NULL_MIN_RNG + "=\"1\"");
535
+ if (!rng.discardMin && rng.min != null) {
536
+ let val = RecordUtils.itemValToXML(rng.min, fldAttr, cellAttr, toBase64);
537
+ message.Append(" " + ConstInterface.MIN_RNG + "=\"" + val + "\"");
538
+ }
539
+ if (rng.nullMax)
540
+ message.Append(" " + ConstInterface.NULL_MAX_RNG + "=\"1\"");
541
+ if (!rng.discardMax && rng.max != null) {
542
+ let val = RecordUtils.itemValToXML(rng.max, fldAttr, cellAttr, toBase64);
543
+ message.Append(" " + ConstInterface.MAX_RNG + "=\"" + val + "\"");
544
+ }
545
+ message.Append(XMLConstants.TAG_TERM);
546
+ }
547
+ if (locate)
548
+ message.Append(XMLConstants.END_TAG + ConstInterface.USER_LOCATES + XMLConstants.TAG_CLOSE);
549
+ else
550
+ message.Append(XMLConstants.END_TAG + ConstInterface.USER_RANGES + XMLConstants.TAG_CLOSE);
551
+ }
552
+ buildXMLForSorts(message) {
553
+ if (this.UserSorts != null && this.UserSorts.length > 0) {
554
+ let i;
555
+ for (i = 0; i < this.UserSorts.length; i++) {
556
+ message.Append(XMLConstants.TAG_CLOSE);
557
+ let srt = this.UserSorts.get_Item(i);
558
+ message.Append(XMLConstants.START_TAG + ConstInterface.SORT);
559
+ message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + srt.fldIdx + "\"");
560
+ if (srt.dir)
561
+ message.Append(" " + ConstInterface.MG_ATTR_DIR + "=\"1\"");
562
+ message.Append(XMLConstants.TAG_TERM);
563
+ }
564
+ this.UserSorts.Clear();
565
+ this.UserSorts = null;
566
+ message.Append(XMLConstants.END_TAG + ConstInterface.MG_TAG_SORTS + XMLConstants.TAG_CLOSE);
567
+ }
568
+ }
569
+ getUserEvent(idx) {
570
+ Debug.Assert(this.UserEvtTab !== null);
571
+ let retEvent = null;
572
+ if (this.UserEvtTab !== null)
573
+ retEvent = this.UserEvtTab.getEvent(idx);
574
+ return retEvent;
575
+ }
576
+ SetMoveToFirstControl(moveToFirstControl) {
577
+ if (moveToFirstControl || !this.IsSubForm) {
578
+ if (this.Form !== null) {
579
+ let alreadyMoved = this.Form.alreadyMovedToFirstControl();
580
+ if (!alreadyMoved)
581
+ this.Form.MovedToFirstControl = true;
582
+ }
583
+ }
584
+ }
585
+ async Start(moveToFirstControl, callByDestSubForm) {
586
+ let nonInteractiveTask = null;
587
+ if (!this._isStarted) {
588
+ this._isStarted = true;
589
+ this.InitializeExecution();
590
+ this.InStartProcess = true;
591
+ let result = await this.Setup();
592
+ if (!result.Success)
593
+ return null;
594
+ this._inProcessingTopMostEndTaskSaved = AccessHelper.eventsManager.getProcessingTopMostEndTask();
595
+ AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
596
+ await this.EnableActions();
597
+ result = await this.InitializeForm(moveToFirstControl);
598
+ if (!result.Success)
599
+ return null;
600
+ if (!this.IsInteractive && !this._isMainPrg)
601
+ nonInteractiveTask = this;
602
+ this.DataViewWasRetrieved = true;
603
+ let subTasks = this.SubTasks;
604
+ if (this.isMainProg())
605
+ this.SubTasks = null;
606
+ if (this.isMainProg())
607
+ this.SubTasks = subTasks;
608
+ if (!result.Success)
609
+ return null;
610
+ if (this._aborting)
611
+ return null;
612
+ let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.FirstChunk);
613
+ result = await this.DataviewManager.Execute(dataViewCommand);
614
+ if (!result.Success)
615
+ return null;
616
+ this.ResumeSubformLayout();
617
+ }
618
+ nonInteractiveTask = await this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
619
+ this.InStartProcess = false;
620
+ return nonInteractiveTask;
621
+ }
622
+ InitializeExecution() {
623
+ super.setBrkLevel(ConstInterface.BRK_LEVEL_REC_MAIN, -1);
624
+ this._firstRecordCycle = true;
625
+ this._currStartProgLevel = ((this.IsSubForm && this.getParent().getForm().alreadyMovedToFirstControl())
626
+ ? this.getParent()._currStartProgLevel
627
+ : Task.StartProgLevel);
628
+ }
629
+ async InitializeForm(moveToFirstControl) {
630
+ if (this.Form !== null) {
631
+ this.SetMoveToFirstControl(moveToFirstControl);
632
+ AccessHelper.eventsManager.pushNewExecStacks();
633
+ this.routeParams = this.DataView.GetRouteParams();
634
+ await this.InitForm();
635
+ AccessHelper.eventsManager.popNewExecStacks();
636
+ this.getMGData().StartTimers();
637
+ Commands.beginInvoke();
638
+ }
639
+ return new ReturnResult();
640
+ }
641
+ async StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm) {
642
+ if (this.hasSubTasks()) {
643
+ for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
644
+ let task = this.SubTasks.getTask(i);
645
+ let tmpNonInteractiveTask = await task.Start(moveToFirstControl, callByDestSubForm);
646
+ if (nonInteractiveTask === null)
647
+ nonInteractiveTask = tmpNonInteractiveTask;
648
+ else if (tmpNonInteractiveTask !== null)
649
+ Debug.Assert(false, "more than 1 non interactive in task.start");
650
+ }
651
+ }
652
+ return nonInteractiveTask;
653
+ }
654
+ async EnableActions() {
655
+ let actList = ActionManager.actEnabled;
656
+ this.ActionManager.enableList(actList, true, false);
657
+ if (this.IsSubForm)
658
+ this.ActionManager.enable(InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT, true);
659
+ await this.enableModes();
660
+ if (await this.checkProp(PropInterface.PROP_TYPE_SELECTION, false)) {
661
+ this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
662
+ }
663
+ let enablePrintdata = await this.checkProp(PropInterface.PROP_TYPE_PRINT_DATA, false);
664
+ this.ActionManager.enable(InternalInterface.MG_ACT_PRINT_DATA, enablePrintdata);
665
+ if (this.getEnableZoomHandler())
666
+ this.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
667
+ }
668
+ async ShowError(text) {
669
+ let mlsTransText = LanguageData.Instance.translate(text);
670
+ let mlsTransTitle = LanguageData.Instance.translate(ConstInterface.ERROR_STRING);
671
+ await GUIManager.Instance.MessageBox(mlsTransTitle, mlsTransText, Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
672
+ }
673
+ async EndTaskOnError(result, displayError) {
674
+ if (!result.Success && !this.isAborting()) {
675
+ if (this.InStartProcess) {
676
+ await this.endTask(false, false, false);
677
+ if (displayError)
678
+ await this.ShowError(result.ErrorDescription);
679
+ this.InStartProcess = false;
680
+ return true;
681
+ }
682
+ else {
683
+ if (displayError)
684
+ await this.ShowError(result.ErrorDescription);
685
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_EXIT);
686
+ }
687
+ }
688
+ return false;
689
+ }
690
+ async Setup() {
691
+ let result;
692
+ this.TaskService.InitTaskPrefixExecutedFlag(this);
693
+ this.TaskSuffixExecuted = false;
694
+ TaskServiceBase.CreateFirstRecord(this);
695
+ let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Init);
696
+ result = await this.DataviewManager.Execute(dataViewCommand);
697
+ if (!result.Success)
698
+ return result;
699
+ if (result.Success) {
700
+ let commands = GlobalCommandsManager.Instance.getCommandsExecutedAfterTaskStarted();
701
+ for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
702
+ let command = (commands.get_Item(cmdIdx));
703
+ if (command.TaskTag === this.getTaskTag()) {
704
+ await command.Execute(null);
705
+ GlobalCommandsManager.Instance.removeCommandsExecutedAfterTaskStarted(command);
706
+ }
707
+ }
708
+ dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Prepare);
709
+ result = await this.DataviewManager.Execute(dataViewCommand);
710
+ }
711
+ if (result.Success) {
712
+ result = this.TaskService.PrepareTask(this);
713
+ if (!result.Success)
714
+ await this.EndTaskOnError(result, true);
715
+ }
716
+ if (result.Success) {
717
+ dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.InitDataControlViews);
718
+ result = await this.DataviewManager.Execute(dataViewCommand);
719
+ }
720
+ return result;
721
+ }
722
+ async doFirstRecordCycle() {
723
+ if (!this._isMainPrg) {
724
+ AccessHelper.eventsManager.pushNewExecStacks();
725
+ this.SubformExecMode = Task_SubformExecModeEnum.FIRST_TIME;
726
+ await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(this, InternalInterface.MG_ACT_REC_PREFIX, this.IsSubForm);
727
+ if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
728
+ if (this.IsSubForm) {
729
+ if (this.hasSubTasks())
730
+ for (let i = 0; i < this.SubTasks.getSize(); i++) {
731
+ let subTask = this.SubTasks.getTask(i);
732
+ if (subTask.IsSubForm) {
733
+ subTask.getForm().IgnoreFirstRecordCycle = true;
734
+ await subTask.doFirstRecordCycle();
735
+ }
736
+ }
737
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
738
+ }
739
+ }
740
+ this.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
741
+ AccessHelper.eventsManager.popNewExecStacks();
742
+ }
743
+ }
744
+ CheckAndSetSubForm() {
745
+ this.IsSubForm = (!super.isMainProg() && this !== this._mgData.getFirstTask());
746
+ }
747
+ IsRoute() {
748
+ return (this.RouterPath != null);
749
+ }
750
+ async stop() {
751
+ let task;
752
+ if (this._aborting)
753
+ return;
754
+ if (this.hasSubTasks()) {
755
+ while ((task = this.SubTasks.getTask(0)) != null) {
756
+ task.setDestinationSubform(this._destinationSubform);
757
+ await task.stop();
758
+ }
759
+ }
760
+ if (!this._isMainPrg)
761
+ this._aborting = true;
762
+ if (this._parentTask != null) {
763
+ this._parentTask.removeSubTask(this);
764
+ if (this.IsSubForm) {
765
+ let oldTimers = new List(), newTimers = new List();
766
+ let mgd = this.getMGData();
767
+ if (mgd.getTimerHandlers() != null)
768
+ oldTimers = mgd.getTimerHandlers().getTimersVector();
769
+ mgd.removeTimerHandler(this);
770
+ mgd.removeExpressionHandler(this);
771
+ if (mgd.getTimerHandlers() != null)
772
+ newTimers = mgd.getTimerHandlers().getTimersVector();
773
+ mgd.changeTimers(oldTimers, newTimers);
774
+ mgd.removeTask(this);
775
+ GUIManager.Instance.abort(this.getForm());
776
+ }
777
+ }
778
+ this.AbortTransaction();
779
+ if (this.getClickedControl() != null)
780
+ RuntimeContextBase.Instance.CurrentClickedCtrl = null;
781
+ if (this.Form != null)
782
+ this.Form.removeRefsToCtrls();
783
+ if (this.IsSubForm) {
784
+ let subForm = this.Form.getSubFormCtrl();
785
+ subForm.setSubformTaskId(null);
786
+ subForm.initSubformTask();
787
+ if (LastFocusedManager.Instance.getLastFocusedTask() === this)
788
+ LastFocusedManager.Instance.setLastFocusedTask(this._parentTask);
789
+ if (subForm.SubformLoaded)
790
+ await (subForm.getProp(PropInterface.PROP_TYPE_VISIBLE)).RefreshDisplay(true);
791
+ }
792
+ let clearDataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Clear);
793
+ await this.DataviewManager.Execute(clearDataViewCommand);
794
+ }
795
+ abort() {
796
+ this.getMGData().abort();
797
+ }
798
+ hasSubTasks() {
799
+ return this.SubTasks !== null && this.SubTasks.getSize() > 0;
800
+ }
801
+ getTaskDepth(byParentOrder) {
802
+ if (byParentOrder)
803
+ return this.getTaskDepth_(byParentOrder);
804
+ let depth = this.GetContextTask().getTaskDepth_(byParentOrder);
805
+ if (this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
806
+ depth = depth + 1;
807
+ return depth;
808
+ }
809
+ getTaskDepth_(byParentOrder) {
810
+ let tmpTask = this.getTriggeringTask();
811
+ if (tmpTask == null || byParentOrder)
812
+ if (this._parentTask == null)
813
+ return 1;
814
+ else {
815
+ if (byParentOrder && this.getCtlIdx() !== this._parentTask.getCtlIdx())
816
+ return 2 + this._parentTask.getTaskDepth_(byParentOrder);
817
+ return 1 + this._parentTask.getTaskDepth_(byParentOrder);
818
+ }
819
+ return 1 + (tmpTask).getTaskDepth_(byParentOrder);
820
+ }
821
+ GetTaskAncestor(generation) {
822
+ return this.getTaskAncestor_(generation);
823
+ }
824
+ getTaskAncestor_(generation) {
825
+ let retTask = null;
826
+ if (generation === 0)
827
+ retTask = this;
828
+ else {
829
+ let tmpTask = this.getTriggeringTask();
830
+ if (tmpTask === null)
831
+ tmpTask = this._parentTask;
832
+ if (tmpTask !== null)
833
+ retTask = tmpTask.getTaskAncestor_(--generation);
834
+ }
835
+ return retTask;
836
+ }
837
+ GetTaskDepth() {
838
+ return this.getTaskDepth(false);
839
+ }
840
+ pathContains(task) {
841
+ return this._taskPath.Contains(task);
842
+ }
843
+ SetContextTask(context) {
844
+ this.ContextTask = context;
845
+ }
846
+ GetContextTask() {
847
+ let currRec = (this.DataView.getCurrRec());
848
+ if (this.InStartProcess
849
+ || currRec !== null && (currRec.InCompute || currRec.InRecompute)
850
+ || this.Form !== null && this.Form.inRefreshDisplay())
851
+ return this;
852
+ return this.ContextTask;
853
+ }
854
+ getTriggeringTask() {
855
+ if (this._triggeringTask !== null && this._triggeringTask.getMGData().IsAborting)
856
+ this._triggeringTask = this._parentTask;
857
+ return this._triggeringTask;
858
+ }
859
+ setLastParkedCtrl(ctrl) {
860
+ super.setLastParkedCtrl(ctrl);
861
+ LastFocusedManager.setLastFocusedControl(this, ctrl);
862
+ }
863
+ queryTaskPath() {
864
+ let insertedNames = 0;
865
+ let result = new StringBuilder(7936);
866
+ let treeRoute = new Array(this.getTaskDepth(false));
867
+ this.pathToRoot(treeRoute, false);
868
+ for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
869
+ let currTsk = treeRoute[tsk];
870
+ if (currTsk.isMainProg())
871
+ continue;
872
+ let nameProp = currTsk.getProp(PropInterface.PROP_TYPE_NAME);
873
+ if (nameProp == null)
874
+ continue;
875
+ let name = nameProp.GetComputedValue();
876
+ if (!NString.IsNullOrEmpty(name)) {
877
+ if (insertedNames++ !== 0)
878
+ result.Append(';');
879
+ result.Append(name);
880
+ }
881
+ }
882
+ return result;
883
+ }
884
+ ctl_itm_2_parent_vee(itm) {
885
+ let currTsk;
886
+ let currItm = 0;
887
+ let lastItm = 0;
888
+ let treeRoute = new Array(this.getTaskDepth(true));
889
+ this.pathToRoot(treeRoute, true);
890
+ for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
891
+ currTsk = treeRoute[tsk];
892
+ currItm += currTsk.DataView.GetFieldsTab().getSize();
893
+ if (itm < currItm) {
894
+ itm -= lastItm;
895
+ return currTsk.DataView.getField(itm);
896
+ }
897
+ lastItm = currItm;
898
+ }
899
+ return null;
900
+ }
901
+ GetControlIDFromVarItem(item) {
902
+ let currTask;
903
+ let currItem = 0;
904
+ let lastItem = 0;
905
+ let noOfControlsBeforeCurrTask = 0;
906
+ let treeRoute = new Array(this.getTaskDepth(true));
907
+ this.pathToRoot(treeRoute, true);
908
+ for (let task = treeRoute.length - 1; task >= 0; task--) {
909
+ currTask = treeRoute[task];
910
+ currItem += currTask.DataView.GetFieldsTab().getSize();
911
+ if (item < currItem) {
912
+ item -= lastItem;
913
+ let field = currTask.DataView.getField(item);
914
+ if (field.getCtrl() != null)
915
+ return noOfControlsBeforeCurrTask = noOfControlsBeforeCurrTask + currTask.Form.getControlIdx(field.getCtrl()) + 1;
916
+ return 0;
917
+ }
918
+ if (currTask.Form != null)
919
+ noOfControlsBeforeCurrTask += currTask.Form.getCtrlCount();
920
+ lastItem = currItem;
921
+ }
922
+ return 0;
923
+ }
924
+ GetControlFromControlID(controlID, parent) {
925
+ let control = null;
926
+ parent.value = -1;
927
+ if (controlID >= 0) {
928
+ let currTask = null;
929
+ let callerTask = null;
930
+ let noOfControlsInCurrtask = 0;
931
+ let noOfControlsBeforeCurrTask = 0;
932
+ let controlIdx = 0;
933
+ let treeRoute = new Array(this.getTaskDepth(true));
934
+ this.pathToRoot(treeRoute, true);
935
+ for (let task = treeRoute.length - 1; task >= 0; task--) {
936
+ currTask = treeRoute[task];
937
+ if (currTask.Form != null) {
938
+ noOfControlsInCurrtask = currTask.Form.getCtrlCount();
939
+ if (controlID < (noOfControlsBeforeCurrTask + noOfControlsInCurrtask)) {
940
+ controlIdx = controlID - noOfControlsBeforeCurrTask;
941
+ control = currTask.Form.CtrlTab.getCtrl(controlIdx);
942
+ callerTask = currTask;
943
+ break;
944
+ }
945
+ noOfControlsBeforeCurrTask += noOfControlsInCurrtask;
946
+ }
947
+ }
948
+ if (control != null) {
949
+ parent.value = 0;
950
+ let prevCtlIdx = treeRoute[0].TaskDefinitionId.CtlIndex;
951
+ for (let task = 0; task < treeRoute.length - 1; task++) {
952
+ currTask = treeRoute[task];
953
+ if (prevCtlIdx !== currTask.TaskDefinitionId.CtlIndex)
954
+ parent.value++;
955
+ if (callerTask.TaskDefinitionId.CtlIndex === currTask.TaskDefinitionId.CtlIndex)
956
+ break;
957
+ prevCtlIdx = currTask.TaskDefinitionId.CtlIndex;
958
+ }
959
+ }
960
+ }
961
+ return control;
962
+ }
963
+ ctl_itm_4_parent_vee(parent, vee) {
964
+ let tsk;
965
+ let depth = this.getTaskDepth(true);
966
+ if (parent !== TaskBase.MAIN_PRG_PARENT_ID && depth <= parent)
967
+ return vee;
968
+ let treeRoute = new Array(depth);
969
+ if (vee !== 0) {
970
+ this.pathToRoot(treeRoute, true);
971
+ let indOfParentInTaskTree = this.getIndOfParentInTaskTree(parent, treeRoute);
972
+ let i;
973
+ for (i = treeRoute.length - 1; i > indOfParentInTaskTree; i--) {
974
+ tsk = treeRoute[i];
975
+ vee += tsk.DataView.GetFieldsTab().getSize();
976
+ }
977
+ }
978
+ return vee;
979
+ }
980
+ getIndOfParentInTaskTree(parent, taskTree) {
981
+ let indOfParentInTaskTree = 0;
982
+ if (parent === TaskBase.MAIN_PRG_PARENT_ID) {
983
+ for (let i = 1; i < taskTree.length; i = i + 1) {
984
+ if (taskTree[i].isMainProg() && this._ctlIdx === taskTree[i].getCtlIdx()) {
985
+ indOfParentInTaskTree = i;
986
+ break;
987
+ }
988
+ }
989
+ }
990
+ else
991
+ indOfParentInTaskTree = parent;
992
+ return indOfParentInTaskTree;
993
+ }
994
+ getFieldByName(fldName) {
995
+ return (this.GetContextTask()).getFieldByName_(fldName);
996
+ }
997
+ getFieldByName_(fldName) {
998
+ let tmpTask;
999
+ if (fldName == null)
1000
+ return null;
1001
+ let fld = this.getField(fldName);
1002
+ if (fld == null) {
1003
+ tmpTask = this.getTriggeringTask() != null ? this.getTriggeringTask() : this._parentTask;
1004
+ if (tmpTask != null) {
1005
+ if (!this.isMainProg() && this.getCtlIdx() !== tmpTask.getCtlIdx()) {
1006
+ let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, this.getCtlIdx());
1007
+ fld = mainPrg.getFieldByName_(fldName);
1008
+ }
1009
+ if (fld == null)
1010
+ fld = tmpTask.getFieldByName_(fldName);
1011
+ }
1012
+ }
1013
+ return fld;
1014
+ }
1015
+ getIndexOfFieldByName(fldName) {
1016
+ let depth = this.getTaskDepth(true);
1017
+ let index = 0;
1018
+ let fld = this.getFieldByName(fldName);
1019
+ let fldTab;
1020
+ if (fld == null)
1021
+ return 0;
1022
+ let treeRoute = new Array(depth);
1023
+ this.pathToRoot(treeRoute, true);
1024
+ for (let curr = depth - 1; curr >= 0; curr--) {
1025
+ let currTask = treeRoute[curr];
1026
+ if (currTask === fld.getTask()) {
1027
+ curr = fld.getId();
1028
+ index += ++curr;
1029
+ break;
1030
+ }
1031
+ fldTab = currTask.DataView.GetFieldsTab();
1032
+ index += fldTab.getSize();
1033
+ }
1034
+ return index;
1035
+ }
1036
+ pathToRoot(path, byParentOrder) {
1037
+ let task = (byParentOrder ? this : this.GetContextTask());
1038
+ for (let i = 0; i < path.length; i++) {
1039
+ path[i] = task;
1040
+ let ctlIdx = task.getCtlIdx();
1041
+ let tmpTask = byParentOrder ? null : task.getTriggeringTask();
1042
+ if (tmpTask != null)
1043
+ task = tmpTask;
1044
+ else {
1045
+ task = task.getParent();
1046
+ if (task == null) {
1047
+ if (!byParentOrder && this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
1048
+ path[i + 1] = this;
1049
+ break;
1050
+ }
1051
+ if (byParentOrder && ctlIdx !== task.getCtlIdx())
1052
+ path[++i] = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
1053
+ }
1054
+ }
1055
+ }
1056
+ shouldBeRefreshed() {
1057
+ let dataView = this._parentTask.DataView;
1058
+ let result = false;
1059
+ if (this._parentTask === null || dataView.isPrevCurrRecNull() ||
1060
+ (this.RefreshOnVars !== null && !dataView.currEqualsPrev(this.RefreshOnVars)))
1061
+ result = true;
1062
+ return result;
1063
+ }
1064
+ async CheckRefreshSubTasks() {
1065
+ let ret = false;
1066
+ if (this._enteredRecLevel) {
1067
+ let subformsToRefresh = await this.GetSubformsToRefresh();
1068
+ if (subformsToRefresh.length > 0)
1069
+ ret = true;
1070
+ }
1071
+ return ret;
1072
+ }
1073
+ GetSubTasks() {
1074
+ let subTasks = new List();
1075
+ if (this.hasSubTasks()) {
1076
+ for (let i = 0; i < this.SubTasks.getSize(); i = i + 1)
1077
+ subTasks.push(this.SubTasks.getTask(i));
1078
+ }
1079
+ return subTasks;
1080
+ }
1081
+ async GetSubformsToRefresh() {
1082
+ let subTasks = this.GetSubTasks();
1083
+ let subTasksToRefresh = new List();
1084
+ for (let i = 0; i < subTasks.length; i++) {
1085
+ let subTask = subTasks.get_Item(i);
1086
+ if (await this.ShouldRefreshSubformTask(subTask))
1087
+ subTasksToRefresh.push(subTask);
1088
+ }
1089
+ return subTasksToRefresh;
1090
+ }
1091
+ async ShouldRefreshSubformTask(subTask) {
1092
+ let refresh = false;
1093
+ let subformCtrl = subTask.getForm().getSubFormCtrl();
1094
+ subTask.DoSubformPrefixSuffix = false;
1095
+ if (subformCtrl != null && !subTask.InSelect && subTask.AfterFirstRecordPrefix) {
1096
+ let parentMode = this.getMode();
1097
+ let modeProperty = (parentMode === Constants.TASK_MODE_QUERY ? PropInterface.PROP_TYPE_ALLOW_QUERY
1098
+ : parentMode === Constants.TASK_MODE_MODIFY
1099
+ ? PropInterface.PROP_TYPE_ALLOW_MODIFY
1100
+ : PropInterface.PROP_TYPE_ALLOW_CREATE);
1101
+ if (subTask.ModeAsParent && parentMode !== subTask.getMode() &&
1102
+ this.getLevel() === Constants.TASK_LEVEL_RECORD &&
1103
+ await (subTask.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean() &&
1104
+ await subTask.checkProp(modeProperty, true)) {
1105
+ if (!subformCtrl.isVisible() &&
1106
+ !await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
1107
+ subformCtrl.RefreshOnVisible = true;
1108
+ refresh = false;
1109
+ }
1110
+ else
1111
+ refresh = true;
1112
+ await subTask.SetModeAsParent(parentMode);
1113
+ }
1114
+ else {
1115
+ refresh = await subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true) && subTask.shouldBeRefreshed();
1116
+ if (refresh) {
1117
+ if (!subformCtrl.isVisible() &&
1118
+ !await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
1119
+ subformCtrl.RefreshOnVisible = true;
1120
+ refresh = false;
1121
+ }
1122
+ }
1123
+ }
1124
+ if (refresh)
1125
+ subTask.DoSubformPrefixSuffix = true;
1126
+ }
1127
+ return refresh;
1128
+ }
1129
+ async SetModeAsParent(parentMode) {
1130
+ await this.enableModes();
1131
+ if (parentMode === Constants.TASK_MODE_CREATE) {
1132
+ let cmd = CommandFactory.CreateEventCommand(this.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
1133
+ await this.DataviewManager.Execute(cmd);
1134
+ }
1135
+ else if (this.getMode() === Constants.TASK_MODE_CREATE) {
1136
+ this.setPreventRecordSuffix(true);
1137
+ this.setPreventControlChange(true);
1138
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
1139
+ this.setPreventRecordSuffix(false);
1140
+ this.setPreventControlChange(false);
1141
+ let subTaskDv = this.DataView;
1142
+ if (!subTaskDv.isEmpty() && (subTaskDv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
1143
+ this.setMode(parentMode);
1144
+ else
1145
+ this.setMode(Constants.TASK_MODE_CREATE);
1146
+ await this.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
1147
+ }
1148
+ else
1149
+ this.setMode(parentMode);
1150
+ this.setOriginalTaskMode(parentMode);
1151
+ await this.setCreateDeleteActsEnableState();
1152
+ }
1153
+ async doSubformRecPrefixSuffix() {
1154
+ let subTasks = this.GetSubTasks();
1155
+ for (let i = 0; i < subTasks.length; i++) {
1156
+ let subTask = subTasks.get_Item(i);
1157
+ if (subTask.DoSubformPrefixSuffix) {
1158
+ await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subTask, InternalInterface.MG_ACT_REC_PREFIX, true);
1159
+ if (!AccessHelper.eventsManager.GetStopExecutionFlag())
1160
+ await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_REC_SUFFIX);
1161
+ }
1162
+ }
1163
+ }
1164
+ CleanDoSubformPrefixSuffix() {
1165
+ let subTasks = this.GetSubTasks();
1166
+ for (let i = 0; i < subTasks.length; i++) {
1167
+ let subTask = subTasks.get_Item(i);
1168
+ subTask.DoSubformPrefixSuffix = false;
1169
+ }
1170
+ }
1171
+ mustConfirmInDeleteMode() {
1172
+ let prop = this.getProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE);
1173
+ return !prop.isExpression();
1174
+ }
1175
+ addSubTask(subTask) {
1176
+ if (this.SubTasks === null)
1177
+ this.SubTasks = new TasksTable();
1178
+ this.SubTasks.addTask(subTask);
1179
+ }
1180
+ removeSubTask(subTask) {
1181
+ if (this.SubTasks !== null)
1182
+ this.SubTasks.removeTask(subTask);
1183
+ }
1184
+ setTransactionFailed(val) {
1185
+ this._transactionFailed = val;
1186
+ if (!val)
1187
+ this.TransactionErrorHandlingsRetry = null;
1188
+ }
1189
+ transactionFailed(level) {
1190
+ if (level === ConstInterface.TRANS_NONE ||
1191
+ (this.Transaction != null && this.Transaction.getLevel() === level))
1192
+ return this._transactionFailed;
1193
+ else if (level === ConstInterface.TRANS_NONE ||
1194
+ (this.TransactionErrorHandlingsRetry != null && this.TransactionErrorHandlingsRetry.getLevel() === level))
1195
+ return this._transactionFailed;
1196
+ return false;
1197
+ }
1198
+ setAfterRetry(val) {
1199
+ if (this.Transaction != null)
1200
+ this.Transaction.setAfterRetry(val);
1201
+ else if (this.TransactionErrorHandlingsRetry != null) {
1202
+ if (val === ConstInterface.RECOVERY_NONE)
1203
+ this.TransactionErrorHandlingsRetry = null;
1204
+ else
1205
+ this.TransactionErrorHandlingsRetry.setAfterRetry(val);
1206
+ }
1207
+ }
1208
+ getAfterRetry(recovery) {
1209
+ if (arguments.length === 0) {
1210
+ return this.getAfterRetry_0();
1211
+ }
1212
+ return this.getAfterRetry_1(recovery);
1213
+ }
1214
+ getAfterRetry_0() {
1215
+ if (this.Transaction != null)
1216
+ return this.Transaction.getAfterRetry();
1217
+ else if (this.TransactionErrorHandlingsRetry != null)
1218
+ return this.TransactionErrorHandlingsRetry.getAfterRetry();
1219
+ return false;
1220
+ }
1221
+ getAfterRetry_1(recovery) {
1222
+ if (this.Transaction != null)
1223
+ return this.Transaction.getAfterRetry(recovery);
1224
+ else if (this.TransactionErrorHandlingsRetry != null)
1225
+ return this.TransactionErrorHandlingsRetry.getAfterRetry(recovery);
1226
+ return false;
1227
+ }
1228
+ getExecEndTask() {
1229
+ return this._bExecEndTask;
1230
+ }
1231
+ resetExecEndTask() {
1232
+ this._bExecEndTask = false;
1233
+ }
1234
+ setExecEndTask() {
1235
+ this._bExecEndTask = true;
1236
+ }
1237
+ async evalEndCond(mode) {
1238
+ let endTaskCondProp;
1239
+ let evalEndCondProp = this.getProp(PropInterface.PROP_TYPE_EVAL_END_CONDITION);
1240
+ if (this.InEndTask)
1241
+ return false;
1242
+ if (this._bExecEndTask)
1243
+ return true;
1244
+ if (evalEndCondProp != null && (NString.Compare(await evalEndCondProp.getValue(), ConstInterface.END_COND_EVAL_IMMIDIATE, true) === 0 || ((await evalEndCondProp.getValue()).toLowerCase() === mode.toLowerCase()))) {
1245
+ endTaskCondProp = this.getProp(PropInterface.PROP_TYPE_END_CONDITION);
1246
+ if (endTaskCondProp == null)
1247
+ return false;
1248
+ let endTask = await endTaskCondProp.getValue();
1249
+ if (DisplayConvertor.toBoolean(endTask)) {
1250
+ this._bExecEndTask = true;
1251
+ return true;
1252
+ }
1253
+ return false;
1254
+ }
1255
+ return false;
1256
+ }
1257
+ setTryingToStop(val) {
1258
+ if (this.hasSubTasks()) {
1259
+ for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1260
+ let task = this.SubTasks.getTask(i);
1261
+ task.setTryingToStop(val);
1262
+ }
1263
+ }
1264
+ this.IsTryingToStop = val;
1265
+ }
1266
+ getInRecordSuffix() {
1267
+ return this._inRecordSuffix;
1268
+ }
1269
+ setInRecordSuffix(bValue) {
1270
+ if (bValue !== this._inRecordSuffix) {
1271
+ this._inRecordSuffix = bValue;
1272
+ return true;
1273
+ }
1274
+ return false;
1275
+ }
1276
+ setEvalOldValues(bFlag) {
1277
+ if (bFlag !== this._evalOldValues) {
1278
+ this._evalOldValues = bFlag;
1279
+ return true;
1280
+ }
1281
+ return false;
1282
+ }
1283
+ getEvalOldValues() {
1284
+ return this._evalOldValues;
1285
+ }
1286
+ async endTask(reversibleExit, onlyDescs, dueToVerifyError, subformDestination) {
1287
+ if (isNullOrUndefined(subformDestination))
1288
+ return await this.endTask_1(reversibleExit, onlyDescs, false, dueToVerifyError);
1289
+ else
1290
+ return await this.endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError);
1291
+ }
1292
+ async endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError) {
1293
+ let succeeded = true;
1294
+ let closedSubForm = false;
1295
+ let subTask;
1296
+ let mgdTab = AccessHelper.mgDataTable;
1297
+ if ((this.IsSubForm && !subformDestination) && !this._parentTask.InEndTask) {
1298
+ succeeded = await this._parentTask.endTask(reversibleExit, onlyDescs, dueToVerifyError);
1299
+ }
1300
+ else if (!this.isAborting() && !this.InEndTask) {
1301
+ try {
1302
+ this.InEndTask = true;
1303
+ if ((MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI) && AccessHelper.eventsManager.GetStopExecutionFlag()) {
1304
+ let cmd = CommandFactory.CreateUnloadCommand();
1305
+ MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
1306
+ await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1307
+ return;
1308
+ }
1309
+ if (!this.IsTryingToStop)
1310
+ this.setTryingToStop(true);
1311
+ let i;
1312
+ if (reversibleExit) {
1313
+ if (this.hasSubTasks()) {
1314
+ if (!RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
1315
+ let pendingTransactions = true;
1316
+ let clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1317
+ if (!clientOperExist) {
1318
+ clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_REC_SUFFIX);
1319
+ if (!clientOperExist)
1320
+ pendingTransactions = this.CheckIfPendingTransactions(this);
1321
+ }
1322
+ if (!clientOperExist && !pendingTransactions) {
1323
+ this.allowRemoteCmdExecution = false;
1324
+ this.SetServerSideTaskSuffix(this);
1325
+ RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1326
+ }
1327
+ }
1328
+ else
1329
+ this.SetServerSideTaskSuffix(this);
1330
+ for (i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1331
+ subTask = this.SubTasks.getTask(i);
1332
+ closedSubForm = closedSubForm || subTask.IsSubForm;
1333
+ await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_EXIT);
1334
+ succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1335
+ }
1336
+ }
1337
+ else {
1338
+ if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution)
1339
+ this.SetServerSideTaskSuffix(this);
1340
+ }
1341
+ if (this === mgdTab.StartupMgData.getFirstTask()) {
1342
+ for (i = mgdTab.getSize() - 1; i > 0 && succeeded; i--) {
1343
+ if (mgdTab.getMGData(i) != null) {
1344
+ await AccessHelper.eventsManager.handleInternalEventWithTask(mgdTab.getMGData(i).getFirstTask(), InternalInterface.MG_ACT_EXIT);
1345
+ succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1346
+ }
1347
+ }
1348
+ }
1349
+ }
1350
+ if (succeeded) {
1351
+ if (reversibleExit && !dueToVerifyError) {
1352
+ let forceSuffix = await this.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1353
+ if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1354
+ this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "0");
1355
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
1356
+ if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
1357
+ this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "1");
1358
+ }
1359
+ succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1360
+ if (succeeded && !onlyDescs)
1361
+ this.HandleTransactionInfo();
1362
+ let preTskSuffix = succeeded;
1363
+ if (succeeded && !onlyDescs && reversibleExit && !dueToVerifyError &&
1364
+ (!this.IsSubForm || subformDestination) &&
1365
+ this.TaskPrefixExecuted && !this.TaskSuffixExecuted)
1366
+ succeeded = await this.handleTaskSuffix(true);
1367
+ if (reversibleExit && this.hasSubTasks())
1368
+ for (i = 0; i < this.SubTasks.getSize(); i++) {
1369
+ subTask = this.SubTasks.getTask(i);
1370
+ if (!subTask.IsSubForm)
1371
+ await AccessHelper.eventsManager.handleNonReversibleEvent(subTask, InternalInterface.MG_ACT_EXIT);
1372
+ }
1373
+ if (reversibleExit)
1374
+ succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
1375
+ if (preTskSuffix)
1376
+ AccessHelper.eventsManager.setStopExecution(false);
1377
+ this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1378
+ if (!this.isAborting() && succeeded && !onlyDescs) {
1379
+ if (reversibleExit) {
1380
+ this.setTransactionFailed(false);
1381
+ await this.TaskTransactionManager.checkAndCommit(false, ConstInterface.TRANS_TASK_PREFIX, false);
1382
+ succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError) && !this.isAborting() && !this.transactionFailed(ConstInterface.TRANS_TASK_PREFIX);
1383
+ }
1384
+ this.setAfterRetry(ConstInterface.RECOVERY_NONE);
1385
+ if (succeeded) {
1386
+ if (!this.allowRemoteCmdExecution) {
1387
+ this.allowRemoteCmdExecution = true;
1388
+ RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
1389
+ }
1390
+ else if (this.DelayCommandExecution) {
1391
+ this.DelayCommandExecution = false;
1392
+ RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
1393
+ }
1394
+ let baseMgd = AccessHelper.mgDataTable.StartupMgData;
1395
+ if (reversibleExit && baseMgd.getFirstTask().getTaskTag() === this.getTaskTag()) {
1396
+ AccessHelper.eventsManager.setProcessingTopMostEndTask(true);
1397
+ await AccessHelper.eventsManager.handleEvents(baseMgd, 0);
1398
+ AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
1399
+ if (this.isAborting()) {
1400
+ RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
1401
+ this.DelayCommandExecution = false;
1402
+ this.allowRemoteCmdExecution = true;
1403
+ return true;
1404
+ }
1405
+ }
1406
+ await TaskServiceBase.Exit(this, reversibleExit, subformDestination);
1407
+ if (this._parentTask != null && this._parentTask.isMainProg()) {
1408
+ let mgd = AccessHelper.mgDataTable.getMGData(0);
1409
+ let mainPrgTask = mgd.getMainProg(0);
1410
+ let rootTask = AccessHelper.mgDataTable.StartupMgData.getFirstTask();
1411
+ let endMainPrg = await mainPrgTask.checkProp(PropInterface.PROP_TYPE_END_CONDITION, false);
1412
+ if (this !== rootTask && endMainPrg) {
1413
+ let rtEvt = new RunTimeEvent(rootTask);
1414
+ rtEvt.setInternal(InternalInterface.MG_ACT_CLOSE);
1415
+ rtEvt.setCtrl(null);
1416
+ rtEvt.setArgList(null);
1417
+ AccessHelper.eventsManager.addToTail(rtEvt);
1418
+ }
1419
+ }
1420
+ MgForm.CreatedForms.remove(this.Form);
1421
+ }
1422
+ }
1423
+ }
1424
+ }
1425
+ finally {
1426
+ if (!this.IsSubForm || subformDestination)
1427
+ this.handleFinallyEndTask(succeeded, reversibleExit);
1428
+ }
1429
+ }
1430
+ else if (this.InEndTask)
1431
+ succeeded = false;
1432
+ AccessHelper.eventsManager.setProcessingTopMostEndTask(this._inProcessingTopMostEndTaskSaved);
1433
+ return succeeded;
1434
+ }
1435
+ SetServerSideTaskSuffix(task) {
1436
+ var rtEvt = new RunTimeEvent(task);
1437
+ rtEvt.setInternal(InternalInterface.MG_ACT_TASK_SUFFIX);
1438
+ let handler = null;
1439
+ var evtHanPos = new EventHandlerPosition();
1440
+ evtHanPos.init(rtEvt);
1441
+ handler = evtHanPos.getNext();
1442
+ if (handler != null) {
1443
+ for (let i = 0; i < handler.getOperationTab().getSize(); i++) {
1444
+ let oper = handler.getOperationTab().getOperation(i);
1445
+ oper.setExecOnServer(true);
1446
+ }
1447
+ }
1448
+ if (task.hasSubTasks()) {
1449
+ for (let i = 0; i < task.GetSubTasks().length; i++) {
1450
+ let subTask = task.SubTasks.getTask(i);
1451
+ this.SetServerSideTaskSuffix(subTask);
1452
+ }
1453
+ }
1454
+ }
1455
+ async CheckIfClientOperationExistsInSubformTasks(task, eventCode) {
1456
+ let clientOperationExist = false;
1457
+ var rtEvt = new RunTimeEvent(task);
1458
+ rtEvt.setInternal(eventCode);
1459
+ let handler = null;
1460
+ var evtHanPos = new EventHandlerPosition();
1461
+ evtHanPos.init(rtEvt);
1462
+ handler = evtHanPos.getNext();
1463
+ if (eventCode == InternalInterface.MG_ACT_REC_SUFFIX) {
1464
+ let currRecord = task.DataView.getCurrRec();
1465
+ if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1466
+ clientOperationExist = true;
1467
+ if (!clientOperationExist) {
1468
+ let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
1469
+ if (forceSuffix === true)
1470
+ if (task.IsInteractive || task.getMode() !== Constants.TASK_MODE_CREATE)
1471
+ clientOperationExist = true;
1472
+ }
1473
+ }
1474
+ if (handler != null && !clientOperationExist) {
1475
+ let cnt = handler.getOperationTab().getSize();
1476
+ for (let i = 0; i < cnt; i++) {
1477
+ let oper = handler.getOperationTab().getOperation(i);
1478
+ if (oper.getExecOnClient()) {
1479
+ clientOperationExist = true;
1480
+ break;
1481
+ }
1482
+ else {
1483
+ if (oper.getType() == ConstInterface.MG_OPER_RAISE_EVENT) {
1484
+ if (oper.GetRuntimeEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL &&
1485
+ oper.GetRuntimeEvent().getInternalCode() === InternalInterface.MG_ACT_RT_REFRESH_VIEW) {
1486
+ clientOperationExist = true;
1487
+ break;
1488
+ }
1489
+ }
1490
+ }
1491
+ }
1492
+ }
1493
+ if (!clientOperationExist && task.hasSubTasks()) {
1494
+ for (let i = 0; (!clientOperationExist && i < task.getSubTasks().getSize()); i++) {
1495
+ let subTask = task.SubTasks.getTask(i);
1496
+ clientOperationExist = await this.CheckIfClientOperationExistsInSubformTasks(subTask, eventCode);
1497
+ }
1498
+ }
1499
+ return clientOperationExist;
1500
+ }
1501
+ CheckIfPendingTransactions(task) {
1502
+ let pendingTransactions = false;
1503
+ let currRecord = task.DataView.getCurrRec();
1504
+ if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
1505
+ pendingTransactions = true;
1506
+ if (!pendingTransactions && task.hasSubTasks()) {
1507
+ for (let i = 0; (!pendingTransactions && i < task.getSubTasks().getSize()); i++) {
1508
+ let subTask = task.SubTasks.getTask(i);
1509
+ pendingTransactions = this.CheckIfPendingTransactions(subTask);
1510
+ }
1511
+ }
1512
+ return pendingTransactions;
1513
+ }
1514
+ HandleTransactionInfo() {
1515
+ let transaction = this.DataviewManager.RemoteDataviewManager.Transaction;
1516
+ if (transaction !== null && transaction.isOwner(this) && transaction.getLevel() === 'P') {
1517
+ this.DataviewManager.RemoteDataviewManager.Transaction = null;
1518
+ this.DataView.setTransCleared();
1519
+ }
1520
+ }
1521
+ async Exit(reversibleExit, subformDestination) {
1522
+ let cmd = reversibleExit ?
1523
+ CommandFactory.CreateBrowserEscEventCommand(this.getTaskTag(), subformDestination) :
1524
+ CommandFactory.CreateNonReversibleExitCommand(this.getTaskTag(), subformDestination);
1525
+ this._mgData.CmdsToServer.Add(cmd);
1526
+ if (!subformDestination) {
1527
+ try {
1528
+ if (this.getTaskTag() == MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag() ||
1529
+ !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI))
1530
+ await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
1531
+ }
1532
+ catch (err) {
1533
+ if (this.isMainProg()) {
1534
+ this._mgData.CmdsToServer.Add(cmd);
1535
+ }
1536
+ else
1537
+ throw err;
1538
+ }
1539
+ }
1540
+ }
1541
+ handleFinallyEndTask(succeeded, reversibleExit) {
1542
+ let subTask;
1543
+ if (this.hasSubTasks()) {
1544
+ for (let i = 0; i < this.SubTasks.getSize(); i++) {
1545
+ subTask = this.SubTasks.getTask(i);
1546
+ subTask.handleFinallyEndTask(succeeded, reversibleExit);
1547
+ }
1548
+ }
1549
+ this.InEndTask = false;
1550
+ if (succeeded)
1551
+ this._isStarted = false;
1552
+ if (!succeeded && reversibleExit && this.IsTryingToStop)
1553
+ this.setTryingToStop(false);
1554
+ }
1555
+ async handleTaskSuffix(withSubTasks) {
1556
+ let succeeded = true;
1557
+ let subTask;
1558
+ if (withSubTasks) {
1559
+ if (this.hasSubTasks()) {
1560
+ for (let i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
1561
+ subTask = this.SubTasks.getTask(i);
1562
+ succeeded = await subTask.handleTaskSuffix(withSubTasks);
1563
+ }
1564
+ }
1565
+ }
1566
+ if (succeeded)
1567
+ await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_TASK_SUFFIX);
1568
+ succeeded = !AccessHelper.eventsManager.GetStopExecutionFlag();
1569
+ this.TaskSuffixExecuted = true;
1570
+ return succeeded;
1571
+ }
1572
+ setInCreateLine(inCreateLine) {
1573
+ this._inCreateLine = inCreateLine;
1574
+ }
1575
+ getInCreateLine() {
1576
+ return this._inCreateLine;
1577
+ }
1578
+ async handleEventOnSlaveTasks(internalEvtCode) {
1579
+ let i;
1580
+ let task = null;
1581
+ let failureTask = null;
1582
+ let mgdTab = AccessHelper.mgDataTable;
1583
+ let triggeredTasks = mgdTab.getTriggeredTasks(this);
1584
+ let orphans = null;
1585
+ let sameTrans;
1586
+ let hasSlaves = false;
1587
+ let isOwner = this.Transaction != null && this.Transaction.isOwner(this);
1588
+ if (isOwner) {
1589
+ AccessHelper.eventsManager.setEventScopeTrans();
1590
+ orphans = new List();
1591
+ mgdTab.startTasksIteration();
1592
+ while ((task = mgdTab.getNextTask()) != null) {
1593
+ sameTrans = task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1594
+ if (task !== this && sameTrans && task.PreviouslyActiveTaskId != null && mgdTab.GetTaskByID(task.PreviouslyActiveTaskId) == null)
1595
+ orphans.push(task);
1596
+ }
1597
+ }
1598
+ let scopeTrans = AccessHelper.eventsManager.isEventScopeTrans();
1599
+ for (i = 0; i < triggeredTasks.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1600
+ task = triggeredTasks.get_Item(i);
1601
+ sameTrans = this.Transaction != null && task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
1602
+ if (!task.IsSubForm && (scopeTrans && sameTrans) && task.isStarted()) {
1603
+ if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1604
+ await task.DataView.currRecCompute(false);
1605
+ await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1606
+ hasSlaves = true;
1607
+ }
1608
+ }
1609
+ for (; isOwner && i < orphans.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
1610
+ task = orphans.get_Item(i);
1611
+ if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
1612
+ await task.DataView.currRecCompute(false);
1613
+ await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
1614
+ hasSlaves = true;
1615
+ }
1616
+ if (hasSlaves && AccessHelper.eventsManager.GetStopExecutionFlag())
1617
+ failureTask = task;
1618
+ if (isOwner)
1619
+ AccessHelper.eventsManager.clearEventScope();
1620
+ return failureTask;
1621
+ }
1622
+ async enableRecordActions() {
1623
+ let dataview = this.DataView;
1624
+ await this.setCreateDeleteActsEnableState();
1625
+ if (dataview.IncludesFirst() || dataview.IsOneWayKey) {
1626
+ if (dataview.isEmptyDataview() || dataview.getCurrRecIdx() === 0) {
1627
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, false);
1628
+ if (dataview.IsOneWayKey)
1629
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1630
+ else
1631
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, false);
1632
+ if (this.Form.isScreenMode())
1633
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1634
+ }
1635
+ else {
1636
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1637
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1638
+ if (this.Form.isScreenMode())
1639
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1640
+ }
1641
+ if (!this.Form.isScreenMode())
1642
+ if (dataview.isEmptyDataview() || (dataview.getCurrRecIdx() === 0) || (dataview.getTopRecIdx() === 0))
1643
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
1644
+ else
1645
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1646
+ }
1647
+ else {
1648
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
1649
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
1650
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
1651
+ }
1652
+ if (dataview.IncludesLast()) {
1653
+ if (((this.getMode() === Constants.TASK_MODE_QUERY) || dataview.isEmptyDataview() ||
1654
+ ((this.getMode() === Constants.TASK_MODE_MODIFY) &&
1655
+ (!Environment.Instance.allowCreateInModifyMode(this.getCompIdx()) ||
1656
+ !await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)))) && (dataview.getCurrRecIdx() + 1) === dataview.getSize()) {
1657
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, false);
1658
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, false);
1659
+ if (this.Form.isScreenMode())
1660
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1661
+ }
1662
+ else {
1663
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1664
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1665
+ if (this.Form.isScreenMode())
1666
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1667
+ }
1668
+ if (!this.Form.isScreenMode()) {
1669
+ if (dataview.isEmptyDataview() || ((dataview.getSize() - dataview.getTopRecIdx()) <= this.Form.getRowsInPage()))
1670
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
1671
+ else
1672
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1673
+ }
1674
+ }
1675
+ else {
1676
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
1677
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
1678
+ this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
1679
+ }
1680
+ if (dataview.isEmptyDataview())
1681
+ this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, false);
1682
+ else
1683
+ this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, true);
1684
+ this.ActionManager.enable(InternalInterface.MG_ACT_ENTER_ROW_EDITING, true);
1685
+ this.ActionManager.enable(InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS, true);
1686
+ }
1687
+ isStarted() {
1688
+ return this._isStarted;
1689
+ }
1690
+ getSubTasks() {
1691
+ return this.SubTasks;
1692
+ }
1693
+ refreshesOn(fldId) {
1694
+ let result = false;
1695
+ for (let i = 0; !result && this.RefreshOnVars !== null && i < this.RefreshOnVars.length; i++) {
1696
+ result = (this.RefreshOnVars[i] === fldId);
1697
+ }
1698
+ return result;
1699
+ }
1700
+ AbortTransaction() {
1701
+ this.DataviewManager.RemoteDataviewManager.Transaction = null;
1702
+ }
1703
+ setPreventRecordSuffix(val) {
1704
+ this._preventRecordSuffix = val;
1705
+ }
1706
+ getPreventRecordSuffix() {
1707
+ return this._preventRecordSuffix;
1708
+ }
1709
+ setPreventControlChange(val) {
1710
+ this._preventControlChange = val;
1711
+ }
1712
+ getPreventControlChange() {
1713
+ return this._preventControlChange;
1714
+ }
1715
+ resetKnownToServer() {
1716
+ this._knownToServer = false;
1717
+ }
1718
+ evaluateDescriptor() {
1719
+ let result = "";
1720
+ let res;
1721
+ if (this.DvPosDescriptor == null)
1722
+ return HashUtils.GetHashCode(result);
1723
+ let first = true;
1724
+ for (let i = 0; i < this.DvPosDescriptor.length; i++) {
1725
+ if (!first)
1726
+ result += ";";
1727
+ let currentCell = this.DvPosDescriptor.get_Item(i);
1728
+ let currentTag = currentCell[0];
1729
+ let currentVeeIdx = NNumber.Parse(currentCell[1]);
1730
+ let currentTask = AccessHelper.mgDataTable.GetTaskByID(currentTag);
1731
+ let currentField = currentTask.DataView.getField(currentVeeIdx);
1732
+ let dispVal = currentField.getDispValue();
1733
+ if (currentField.isNull())
1734
+ dispVal = "";
1735
+ let pic;
1736
+ switch (currentField.getType()) {
1737
+ case StorageAttribute.BOOLEAN:
1738
+ case StorageAttribute.ALPHA:
1739
+ case StorageAttribute.UNICODE:
1740
+ case StorageAttribute.BLOB:
1741
+ case StorageAttribute.BLOB_VECTOR:
1742
+ result += dispVal;
1743
+ break;
1744
+ case StorageAttribute.DATE:
1745
+ case StorageAttribute.TIME:
1746
+ if (dispVal !== "") {
1747
+ pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1748
+ let conv = DisplayConvertor.Instance;
1749
+ result += conv.mg2disp(dispVal, "", pic, false, this.getCompIdx(), false);
1750
+ }
1751
+ break;
1752
+ case StorageAttribute.NUMERIC:
1753
+ if (dispVal !== "") {
1754
+ res = new NUM_TYPE(dispVal);
1755
+ pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
1756
+ result += res.to_a(pic);
1757
+ }
1758
+ break;
1759
+ }
1760
+ first = false;
1761
+ }
1762
+ let tmpStr2 = StrUtil.stringToHexaDump(result, 4);
1763
+ return HashUtils.GetHashCode(tmpStr2);
1764
+ }
1765
+ setDescriptor(newDesc) {
1766
+ if (!(newDesc.trim() === "")) {
1767
+ let desc = StrUtil.tokenize(newDesc, ";");
1768
+ this.DvPosDescriptor = new List();
1769
+ for (let i = 0; i < desc.length; i = i + 1) {
1770
+ let cell = new Array(2);
1771
+ let tagVeePair = StrUtil.tokenize(desc[i], ",");
1772
+ cell[0] = tagVeePair[0];
1773
+ cell[1] = tagVeePair[1];
1774
+ this.DvPosDescriptor.push(cell);
1775
+ }
1776
+ }
1777
+ }
1778
+ getTaskCache() {
1779
+ return this._dvCache;
1780
+ }
1781
+ async prepareCache(ignoreCurr) {
1782
+ let success = true;
1783
+ if (!ignoreCurr) {
1784
+ if (await this.isCached()) {
1785
+ if (this.DataView.getChanged()) {
1786
+ this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1787
+ success = false;
1788
+ }
1789
+ }
1790
+ else {
1791
+ if (this.IsSubForm && !await this.isCached()) {
1792
+ success = false;
1793
+ }
1794
+ }
1795
+ }
1796
+ let curretTask;
1797
+ if (this.hasSubTasks()) {
1798
+ for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
1799
+ curretTask = this.SubTasks.getTask(i);
1800
+ if (!await curretTask.prepareCache(false)) {
1801
+ success = false;
1802
+ }
1803
+ }
1804
+ }
1805
+ return success;
1806
+ }
1807
+ async testAndSet(ignoreCurr) {
1808
+ if (!ignoreCurr && await this.isCached()) {
1809
+ let requestedDv = this.evaluateDescriptor();
1810
+ if (requestedDv !== this.DataView.getDvPosValue()) {
1811
+ let fromCache = this._dvCache.getCachedDataView(requestedDv);
1812
+ if (fromCache == null)
1813
+ return false;
1814
+ await this.changeDv(fromCache);
1815
+ }
1816
+ this.DoSubformPrefixSuffix = true;
1817
+ }
1818
+ if (this.hasSubTasks()) {
1819
+ for (let i = 0; i < this.SubTasks.getSize(); i++) {
1820
+ if (!await this.SubTasks.getTask(i).testAndSet(false))
1821
+ return false;
1822
+ }
1823
+ }
1824
+ return true;
1825
+ }
1826
+ async changeDv(fromCache) {
1827
+ let dataview = this.DataView;
1828
+ if (!this.hasLocate) {
1829
+ if (!dataview.getChanged() && dataview.IncludesFirst())
1830
+ this._dvCache.putInCache(dataview.replicate());
1831
+ }
1832
+ else
1833
+ this.locatePutInCache();
1834
+ await dataview.setSameAs(fromCache);
1835
+ dataview.takeFldValsFromCurrRec();
1836
+ this.Form.SetTableItemsCount(0, true);
1837
+ this.Form.setTableItemsCount(false);
1838
+ await this.Form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
1839
+ this.setOriginalTaskMode(this.getMode());
1840
+ }
1841
+ setOriginalTaskMode(originalTaskMode) {
1842
+ this._originalTaskMode = originalTaskMode.charAt(0);
1843
+ }
1844
+ getOriginalTaskMode() {
1845
+ return this._originalTaskMode;
1846
+ }
1847
+ async isCached() {
1848
+ return this.IsSubForm && await this.Form.getSubFormCtrl().checkProp(PropInterface.PROP_TYPE_IS_CACHED, false);
1849
+ }
1850
+ locatePutInCache() {
1851
+ let cached = this._dvCache.getCachedDataView(this.DataView.getDvPosValue());
1852
+ if (cached != null) {
1853
+ if (this.DataView.checkFirst(cached.getLocateFirstRec()) && !this.DataView.getChanged()) {
1854
+ this.DataView.setLocateFirstRec(cached.getLocateFirstRec());
1855
+ this._dvCache.putInCache(this.DataView.replicate());
1856
+ }
1857
+ else
1858
+ this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
1859
+ }
1860
+ else {
1861
+ if (!this.DataView.getChanged())
1862
+ this._dvCache.putInCache(this.DataView.replicate());
1863
+ }
1864
+ }
1865
+ HasLoacte() {
1866
+ return this.hasLocate;
1867
+ }
1868
+ setRemoteTransaction(transId) {
1869
+ let mgdTab = AccessHelper.mgDataTable;
1870
+ let transTask;
1871
+ let isFind = false;
1872
+ mgdTab.startTasksIteration();
1873
+ while ((transTask = mgdTab.getNextTask()) != null) {
1874
+ if (transTask.DataviewManager.RemoteDataviewManager.Transaction != null &&
1875
+ transTask.DataviewManager.RemoteDataviewManager.Transaction.getTransId() === transId) {
1876
+ isFind = true;
1877
+ break;
1878
+ }
1879
+ }
1880
+ this.DataviewManager.RemoteDataviewManager.Transaction = (isFind ?
1881
+ transTask.DataviewManager.RemoteDataviewManager.Transaction :
1882
+ new Transaction(this, transId));
1883
+ }
1884
+ setTransOwnerTask() {
1885
+ this.Transaction.setOwnerTask(this);
1886
+ this.Transaction.setTransBegin('T');
1887
+ }
1888
+ getLoopCounter() {
1889
+ let result = 0;
1890
+ if (this._useLoopStack && this._loopStack !== null && !(this._loopStack.count() === 0)) {
1891
+ result = this._loopStack.peek();
1892
+ }
1893
+ return result;
1894
+ }
1895
+ enterLoop() {
1896
+ if (this._loopStack === null)
1897
+ this._loopStack = new Stack();
1898
+ this._loopStack.push(0);
1899
+ }
1900
+ leaveLoop() {
1901
+ this.popLoopCounter();
1902
+ }
1903
+ popLoopCounter() {
1904
+ let result = 0;
1905
+ if (this._loopStack !== null && !(this._loopStack.count() === 0))
1906
+ result = this._loopStack.pop();
1907
+ return result;
1908
+ }
1909
+ increaseLoopCounter() {
1910
+ this._loopStack.push(this.popLoopCounter() + 1);
1911
+ }
1912
+ getLoopStackSize() {
1913
+ if (this._loopStack !== null)
1914
+ return this._loopStack.count();
1915
+ return 0;
1916
+ }
1917
+ setUseLoopStack(val) {
1918
+ this._useLoopStack = val;
1919
+ }
1920
+ getDataviewHeaders() {
1921
+ return this.DataviewHeadersTable;
1922
+ }
1923
+ isFirstRecordCycle(Value_) {
1924
+ if (arguments.length === 0) {
1925
+ return this.isFirstRecordCycle_0();
1926
+ }
1927
+ return this.isFirstRecordCycle_1(Value_);
1928
+ }
1929
+ isFirstRecordCycle_0() {
1930
+ return this._firstRecordCycle;
1931
+ }
1932
+ isFirstRecordCycle_1(Value_) {
1933
+ this._firstRecordCycle = Value_;
1934
+ }
1935
+ getPublicName() {
1936
+ return this.PublicName;
1937
+ }
1938
+ async isAllowEvents() {
1939
+ let prop = this.getProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS);
1940
+ return await prop.getValueBoolean();
1941
+ }
1942
+ getExternalTaskId() {
1943
+ let taskId = "";
1944
+ let prop = this.getProp(PropInterface.PROP_TYPE_TASK_ID);
1945
+ if (prop != null)
1946
+ taskId = prop.GetComputedValue();
1947
+ return taskId;
1948
+ }
1949
+ isTransactionOwner() {
1950
+ let isTransOwner = false;
1951
+ if (this.Transaction != null && this.Transaction.isOwner(this))
1952
+ isTransOwner = true;
1953
+ return isTransOwner;
1954
+ }
1955
+ isTransactionOnLevel(level) {
1956
+ return this.isTransactionOwner() && this.Transaction.getLevel() === level;
1957
+ }
1958
+ isProgram() {
1959
+ return this._isPrg;
1960
+ }
1961
+ async enableModes() {
1962
+ let enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
1963
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_MODIFY, enable);
1964
+ enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true);
1965
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_CREATE, enable);
1966
+ enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_QUERY, true);
1967
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_QUERY, enable);
1968
+ enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_RANGE, true);
1969
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_RANGE, enable);
1970
+ enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE, true);
1971
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_LOCATE, enable);
1972
+ this.ActionManager.enable(InternalInterface.MG_ACT_RTO_SEARCH, enable);
1973
+ enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_SORT, true);
1974
+ this.ActionManager.enable(InternalInterface.MG_ACT_SORT_RECORDS, enable);
1975
+ enable = await this.checkProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX, true);
1976
+ this.ActionManager.enable(InternalInterface.MG_ACT_VIEW_BY_KEY, enable);
1977
+ this.ActionManager.enable(InternalInterface.MG_ACT_DUMP_ENVIRONMENT, true);
1978
+ }
1979
+ setEnableZoomHandler() {
1980
+ this._enableZoomHandler = true;
1981
+ }
1982
+ getEnableZoomHandler() {
1983
+ return this._enableZoomHandler;
1984
+ }
1985
+ isDestinationSubform() {
1986
+ return this._destinationSubform;
1987
+ }
1988
+ setDestinationSubform(destinationSubform) {
1989
+ this._destinationSubform = destinationSubform;
1990
+ }
1991
+ getIsDestinationCall() {
1992
+ return this._isDestinationCall;
1993
+ }
1994
+ setIsDestinationCall(isDestinationCall) {
1995
+ this._isDestinationCall = isDestinationCall;
1996
+ }
1997
+ setCancelWasRaised(val) {
1998
+ this._cancelWasRaised = val;
1999
+ }
2000
+ cancelWasRaised() {
2001
+ return this._cancelWasRaised;
2002
+ }
2003
+ enableCreateActs(val) {
2004
+ this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE, val);
2005
+ this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE_ABOVE, (this.getForm().HasTable()) ? val : false);
2006
+ }
2007
+ async setCreateDeleteActsEnableState() {
2008
+ if (!(this.DataView).isEmptyDataview() && await this.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true) &&
2009
+ this.getMode() === Constants.TASK_MODE_MODIFY && this.DataView.HasMainTable)
2010
+ this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, true);
2011
+ else
2012
+ this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
2013
+ if ((await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) &&
2014
+ (this.DataView.HasMainTable &&
2015
+ (this.getMode() === Constants.TASK_MODE_MODIFY && Environment.Instance.allowCreateInModifyMode(this.getCompIdx())) ||
2016
+ (this.getMode() === Constants.TASK_MODE_CREATE)))
2017
+ this.enableCreateActs(true);
2018
+ else
2019
+ this.enableCreateActs(false);
2020
+ }
2021
+ setEmptyDataview(emptyDataview) {
2022
+ this.DataView.setEmptyDataview(emptyDataview);
2023
+ }
2024
+ getName() {
2025
+ return this.Name;
2026
+ }
2027
+ async emptyDataviewOpen(subformRefresh) {
2028
+ if (this.getLevel() === Constants.TASK_LEVEL_TASK) {
2029
+ this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, true);
2030
+ if (this.IsSubForm) {
2031
+ let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
2032
+ if ((rtEvnt != null && rtEvnt.getInternalCode() == InternalInterface.MG_ACT_RT_REFRESH_VIEW) || subformRefresh) {
2033
+ let rtEvt = new RunTimeEvent(this);
2034
+ rtEvt.setInternal(InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2035
+ rtEvt.SetEventSubType(EventSubType.Normal);
2036
+ await AccessHelper.eventsManager.handleEvent(rtEvt, false);
2037
+ }
2038
+ }
2039
+ else
2040
+ AccessHelper.eventsManager.addInternalEventWithItaskAndCode(this, InternalInterface.MG_ACT_EMPTY_DATAVIEW);
2041
+ this.setLevel(Constants.TASK_LEVEL_RECORD);
2042
+ if (this.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME && subformRefresh && await this.CheckRefreshSubTasks()) {
2043
+ await this.DataView.computeSubForms();
2044
+ await this.doSubformRecPrefixSuffix();
2045
+ }
2046
+ await this.enableRecordActions();
2047
+ this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, false);
2048
+ this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, false);
2049
+ }
2050
+ }
2051
+ emptyDataviewClose() {
2052
+ this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, false);
2053
+ this.setLevel(Constants.TASK_LEVEL_TASK);
2054
+ this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, true);
2055
+ this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, true);
2056
+ }
2057
+ async SubformRefresh(subformTask, explicitSubformRefresh) {
2058
+ let currTask = LastFocusedManager.Instance.getLastFocusedTask();
2059
+ let isInside = await subformTask.ExecuteNestedRS(currTask);
2060
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
2061
+ return;
2062
+ if (subformTask.getLevel() !== Constants.TASK_LEVEL_TASK && !AccessHelper.eventsManager.GetStopExecutionFlag()) {
2063
+ AccessHelper.eventsManager.pushNewExecStacks();
2064
+ await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_SUFFIX, true);
2065
+ AccessHelper.eventsManager.popNewExecStacks();
2066
+ isInside = true;
2067
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
2068
+ return;
2069
+ }
2070
+ let cmd = CommandFactory.CreateSubformRefreshCommand(this.getTaskTag(), subformTask.getTaskTag(), explicitSubformRefresh);
2071
+ await subformTask.DataviewManager.Execute(cmd);
2072
+ if (subformTask.isAborting())
2073
+ return;
2074
+ if (explicitSubformRefresh) {
2075
+ AccessHelper.eventsManager.pushNewExecStacks();
2076
+ let performParentRecordPrefixOrg = subformTask.PerformParentRecordPrefix;
2077
+ subformTask.PerformParentRecordPrefix = false;
2078
+ await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_PREFIX, true);
2079
+ subformTask.PerformParentRecordPrefix = performParentRecordPrefixOrg;
2080
+ AccessHelper.eventsManager.popNewExecStacks();
2081
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
2082
+ return;
2083
+ }
2084
+ if (isInside) {
2085
+ }
2086
+ else {
2087
+ if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
2088
+ if (explicitSubformRefresh) {
2089
+ await AccessHelper.eventsManager.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_SUFFIX);
2090
+ if (currTask != null)
2091
+ currTask.DataView.setPrevCurrRec();
2092
+ subformTask.DoSubformPrefixSuffix = false;
2093
+ }
2094
+ }
2095
+ }
2096
+ }
2097
+ async ExecuteNestedRS(lastTask) {
2098
+ let isExecuteNestedRS = false;
2099
+ if (lastTask == null)
2100
+ return isExecuteNestedRS;
2101
+ if (this.getLevel() !== Constants.TASK_LEVEL_TASK && lastTask.getMgdID() !== this.getMgdID())
2102
+ return isExecuteNestedRS;
2103
+ for (let task = lastTask; task !== this && task.pathContains(this) && task.getLevel() !== Constants.TASK_LEVEL_TASK; task = task.getParent()) {
2104
+ AccessHelper.eventsManager.pushNewExecStacks();
2105
+ await AccessHelper.eventsManager.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
2106
+ AccessHelper.eventsManager.popNewExecStacks();
2107
+ isExecuteNestedRS = true;
2108
+ }
2109
+ return isExecuteNestedRS;
2110
+ }
2111
+ async execSubformRecSuffix(newTask) {
2112
+ let subfTask;
2113
+ let i, idx = 0;
2114
+ for (i = this._taskPath.length; i > 0; i--) {
2115
+ subfTask = this._taskPath.get_Item(i - 1);
2116
+ if (!newTask._taskPath.Contains(subfTask)) {
2117
+ await AccessHelper.eventsManager.handleInternalEventWithTask(subfTask, InternalInterface.MG_ACT_REC_SUFFIX);
2118
+ if (AccessHelper.eventsManager.GetStopExecutionFlag())
2119
+ break;
2120
+ if (subfTask.getMode() === Constants.TASK_MODE_CREATE && !(subfTask.DataView.getCurrRec()).isNewRec())
2121
+ subfTask.setMode(Constants.TASK_MODE_MODIFY);
2122
+ }
2123
+ else {
2124
+ idx = newTask._taskPath.indexOf(subfTask);
2125
+ break;
2126
+ }
2127
+ }
2128
+ Debug.Assert(i > 0);
2129
+ return idx;
2130
+ }
2131
+ getCounter() {
2132
+ return this._counter;
2133
+ }
2134
+ increaseCounter() {
2135
+ this._counter = this._counter + 1;
2136
+ }
2137
+ setCounter(cnt) {
2138
+ this._counter = cnt;
2139
+ }
2140
+ isCurrentStartProgLevel() {
2141
+ return this._currStartProgLevel === Task.StartProgLevel;
2142
+ }
2143
+ static isMainProgramField(fieldStr) {
2144
+ let Field = XmlParser.getTokens(fieldStr, ',');
2145
+ let mainProgField = false;
2146
+ if (Field.length === 2) {
2147
+ let parent = NNumber.Parse(Field.get_Item(0));
2148
+ if (parent === TaskBase.MAIN_PRG_PARENT_ID)
2149
+ mainProgField = true;
2150
+ }
2151
+ return mainProgField;
2152
+ }
2153
+ getTaskInfo() {
2154
+ let taskName = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2155
+ return NString.Format('{0} {1}', this.isProgram() ? 'Program' : 'Subtask', taskName);
2156
+ }
2157
+ toString() {
2158
+ return NString.Format("(task {0}-\"{1}\"{2})", this._taskTag, this.Name, super.isMainProg() ? (" ctl " + this._ctlIdx) : "");
2159
+ }
2160
+ ConstructMgForm(alreadySetParentForm) {
2161
+ let form = new MgForm();
2162
+ let parentForm = (this.ParentTask != null ? this.ParentTask.getForm() : null);
2163
+ while (parentForm != null && !parentForm.getTask().isOpenWin()) {
2164
+ parentForm = parentForm.ParentForm;
2165
+ }
2166
+ form.ParentForm = parentForm;
2167
+ alreadySetParentForm.value = true;
2168
+ return form;
2169
+ }
2170
+ getMgdID() {
2171
+ return this._mgData.GetId();
2172
+ }
2173
+ getMGData() {
2174
+ return this._mgData;
2175
+ }
2176
+ async RefreshDisplay() {
2177
+ if (this.Form !== null && !this.isAborting() && this.isStarted()) {
2178
+ Logger.Instance.WriteDevToLog("Start task.RefreshDisplay()");
2179
+ if (this._refreshType !== Constants.TASK_REFRESH_NONE) {
2180
+ let form = this.Form;
2181
+ let wasRefreshed = await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
2182
+ if (wasRefreshed) {
2183
+ this._refreshType = Constants.TASK_REFRESH_NONE;
2184
+ }
2185
+ }
2186
+ Logger.Instance.WriteDevToLog("End task.RefreshDisplay()");
2187
+ }
2188
+ }
2189
+ getFieldDisplayValue(fieldDef, value, isNull) {
2190
+ value.value = fieldDef.getDispValue();
2191
+ isNull.value = fieldDef.isNull();
2192
+ }
2193
+ async UpdateFieldValueAndStartRecompute(fieldDef, value, isNull) {
2194
+ if (this.TaskPrefixExecuted) {
2195
+ await fieldDef.setValueAndStartRecompute(value, isNull, true, false, false);
2196
+ }
2197
+ }
2198
+ ShouldNonInteractiveChildBeModal() {
2199
+ return this.ShouldChildBeModal();
2200
+ }
2201
+ ShouldChildBeModal() {
2202
+ let childShouldBehaveAsModal = false;
2203
+ if ((this.Form.ConcreteWindowType === WindowType.Overlay) && this.getForm().Opened)
2204
+ childShouldBehaveAsModal = true;
2205
+ else if (!this.IsInteractive) {
2206
+ childShouldBehaveAsModal = true;
2207
+ }
2208
+ return childShouldBehaveAsModal;
2209
+ }
2210
+ getParent() {
2211
+ return this._parentTask;
2212
+ }
2213
+ isDescendentOf(chkTask) {
2214
+ if (chkTask === this)
2215
+ return true;
2216
+ else if (chkTask === null || this._parentTask === null)
2217
+ return false;
2218
+ return this._parentTask.isDescendentOf(chkTask);
2219
+ }
2220
+ GetSubformModalParentTask() {
2221
+ let currTask = this;
2222
+ while (currTask._parentTask != null && currTask._parentTask.getIsDestinationCall()) {
2223
+ let subformCtrl = (currTask._parentTask.getForm().getSubFormCtrl());
2224
+ if (subformCtrl.IsModal()) {
2225
+ return subformCtrl;
2226
+ }
2227
+ currTask = currTask._parentTask;
2228
+ }
2229
+ return null;
2230
+ }
2231
+ ShouldEvaluatePropertyLocally(propId) {
2232
+ return this.TaskService.ShouldEvaluatePropertyLocally(propId);
2233
+ }
2234
+ EnsureValidForm() {
2235
+ if (this._isMainPrg && this.Form !== null) {
2236
+ if (!this._openWin || !this.Form.isLegalForm) {
2237
+ this.Form = null;
2238
+ }
2239
+ }
2240
+ }
2241
+ async ComputeMainDisplay() {
2242
+ let propMainDisplay = this.getProp(PropInterface.PROP_TYPE_MAIN_DISPLAY);
2243
+ let mainDisplayIndex = await propMainDisplay.getValueInt();
2244
+ mainDisplayIndex = this.GetRealMainDisplayIndexOnCurrentTask(mainDisplayIndex);
2245
+ this._forms.InitFormFromXmlString(mainDisplayIndex);
2246
+ this.EnsureValidForm();
2247
+ }
2248
+ async PrepareTaskForm() {
2249
+ await TaskServiceBase.PreparePropOpenTaskWindow(this);
2250
+ return await RemoteTaskService.PreparePropMainDisplay(this);
2251
+ }
2252
+ FormIsLegal() {
2253
+ let isFormIsLegal = super.isMainProg();
2254
+ return isFormIsLegal || super.getForm().isLegalForm;
2255
+ }
2256
+ GetRealMainDisplayIndexOnDepth(mainDspIdx) {
2257
+ let task = this.LogicalStudioParentTask;
2258
+ while (task != null) {
2259
+ mainDspIdx += task._forms.Count;
2260
+ task = task.LogicalStudioParentTask;
2261
+ }
2262
+ return mainDspIdx;
2263
+ }
2264
+ GetRealMainDisplayIndexOnCurrentTask(mainDspIdx) {
2265
+ if (mainDspIdx > 1) {
2266
+ let task = this.LogicalStudioParentTask;
2267
+ while (task != null) {
2268
+ mainDspIdx -= task._forms.Count;
2269
+ task = task.LogicalStudioParentTask;
2270
+ }
2271
+ }
2272
+ return mainDspIdx;
2273
+ }
2274
+ GetAncestorTaskByTaskDefinitionId(findTaskDefinitionId) {
2275
+ let currentTask = this;
2276
+ if (findTaskDefinitionId.IsMainProgram())
2277
+ return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, findTaskDefinitionId.CtlIndex);
2278
+ while (currentTask != null) {
2279
+ if (currentTask.TaskDefinitionId.Equals(findTaskDefinitionId))
2280
+ return currentTask;
2281
+ currentTask = currentTask._parentTask;
2282
+ }
2283
+ return null;
2284
+ }
2285
+ SetDataControlValuesReference(controlId, dcValuesId) {
2286
+ let ctrl = super.getForm().getCtrl(controlId);
2287
+ ctrl.setDcValId(dcValuesId);
2288
+ }
2289
+ DisplayMessageToStatusBar(text) {
2290
+ let taskToVerifyOn = this.GetContextTask();
2291
+ if (taskToVerifyOn.getForm() == null)
2292
+ taskToVerifyOn = LastFocusedManager.Instance.getLastFocusedTask();
2293
+ taskToVerifyOn.WriteToMessagePane(text);
2294
+ }
2295
+ isTableWithAbsolutesScrollbar() {
2296
+ let isTableWithAbsolutesScrollbar = false;
2297
+ if (this.getForm() != null)
2298
+ isTableWithAbsolutesScrollbar = this.getForm().isTableWithAbsoluteScrollbar();
2299
+ return isTableWithAbsolutesScrollbar;
2300
+ }
2301
+ GetTaskDetails() {
2302
+ let names = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
2303
+ let task = this;
2304
+ while (task.ParentTask !== null && !task.ParentTask.isMainProg()) {
2305
+ task = task.ParentTask;
2306
+ names = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + "." + names;
2307
+ }
2308
+ return names;
2309
+ }
2310
+ static async ProcessTaskURL() {
2311
+ let xmlData = RuntimeContextBase.Instance.Parser.getXMLdata();
2312
+ let endTaskUrlIdx = xmlData.indexOf(XMLConstants.TAG_CLOSE, RuntimeContextBase.Instance.Parser.getCurrIndex());
2313
+ Debug.Assert(endTaskUrlIdx !== -1 && endTaskUrlIdx < xmlData.length);
2314
+ let tag = RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx);
2315
+ RuntimeContextBase.Instance.Parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_TASKURL) + ConstInterface.MG_TAG_TASKURL.length);
2316
+ let tokensVector = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx), XMLConstants.XML_ATTR_DELIM);
2317
+ let taskCacheURL = tokensVector.get_Item(1);
2318
+ let refListStr = tokensVector.get_Item(3);
2319
+ let taskContentOriginal = "";
2320
+ if (taskCacheURL.trim() != "") {
2321
+ if (taskCacheURL.startsWith("./"))
2322
+ taskCacheURL = NString.Replace(taskCacheURL, './', ClientManager.GetAssetsURL() + '/cache/');
2323
+ taskContentOriginal = await Task.CommandsProcessor.GetContent(taskCacheURL, true);
2324
+ }
2325
+ let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
2326
+ let reflist = this.getReflist(refListStr, ';', true, -1);
2327
+ let refListIdx = 0;
2328
+ let currIdx = taskContentOriginal.indexOf("[:");
2329
+ let prevIdx = 0;
2330
+ while (currIdx !== -1) {
2331
+ taskContentFinal.Append(taskContentOriginal.substr(prevIdx, currIdx - prevIdx));
2332
+ taskContentFinal.Append(reflist.get_Item(refListIdx++));
2333
+ currIdx += 2;
2334
+ prevIdx = currIdx;
2335
+ currIdx = taskContentOriginal.indexOf("[:", prevIdx);
2336
+ }
2337
+ taskContentFinal.Append(taskContentOriginal.substr(prevIdx));
2338
+ taskContentFinal.Append(xmlData.substr(xmlData.indexOf(XMLConstants.TAG_CLOSE, endTaskUrlIdx + 1) + 1));
2339
+ xmlData = taskContentFinal.ToString();
2340
+ Logger.Instance.WriteDevToLog(NString.Format("{0} -------> {1}", taskCacheURL, xmlData));
2341
+ RuntimeContextBase.Instance.Parser.setXMLdata(xmlData);
2342
+ RuntimeContextBase.Instance.Parser.setCurrIndex(RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1));
2343
+ }
2344
+ static getReflist(data, delim, trunc, maxTokens) {
2345
+ let currStr = new StringBuilder();
2346
+ let list = new List();
2347
+ let tokensCnt = 0;
2348
+ for (let i = 1; i < data.length; i++) {
2349
+ let curr = data.charAt(i);
2350
+ if (curr !== '\\' && curr !== delim)
2351
+ currStr.Append(curr);
2352
+ else if (curr === delim) {
2353
+ list.push(currStr.ToString());
2354
+ currStr = new StringBuilder();
2355
+ tokensCnt++;
2356
+ if (tokensCnt === maxTokens)
2357
+ break;
2358
+ }
2359
+ else if (curr === '\\') {
2360
+ if (!trunc && data.charAt(i + 1) !== delim)
2361
+ currStr.Append(data.charAt(i));
2362
+ i++;
2363
+ currStr.Append(data.charAt(i));
2364
+ }
2365
+ }
2366
+ list.push(currStr.ToString());
2367
+ return list;
2368
+ }
2369
+ static async StartProgram(callByDestSubForm, moveToFirstControl) {
2370
+ let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
2371
+ let nonInteractiveTaskAlreadyExecuted = null;
2372
+ let allowEvents = AccessHelper.eventsManager.getAllowEvents();
2373
+ AccessHelper.eventsManager.setAllowEvents(EventsAllowedType.ALL);
2374
+ Logger.Instance.WriteDevToLog("Start \"startProg\"");
2375
+ Task.StartProgLevel++;
2376
+ AccessHelper.eventsManager.setStopExecution(false);
2377
+ nonInteractiveTaskAlreadyExecuted = await this.ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl);
2378
+ let nonInteractiveTaskAlreadyExecutedRef = new RefParam(nonInteractiveTaskAlreadyExecuted);
2379
+ let currentNonInteractiveTaskRef = new RefParam(null);
2380
+ await Task.ExecuteMainProgram(0, callByDestSubForm, moveToFirstControl, nonInteractiveTaskAlreadyExecutedRef, currentNonInteractiveTaskRef, AccessHelper.mgDataTable);
2381
+ nonInteractiveTaskAlreadyExecuted = nonInteractiveTaskAlreadyExecutedRef.value;
2382
+ if (!Task._idleTimerStarted) {
2383
+ GUIManager.Instance.startTimer(AccessHelper.mgDataTable.getMGData(0), Environment.Instance.getIdleTime(0), true);
2384
+ Task._idleTimerStarted = true;
2385
+ }
2386
+ await this.OpenForms(callByDestSubForm);
2387
+ await this.DoFirstRecordCycle();
2388
+ await this.MoveToFirstControls(callByDestSubForm);
2389
+ if (Task.StartProgLevel === 1) {
2390
+ let resetAllowEvents = false;
2391
+ let canExecuteEvents = true;
2392
+ if (nonInteractiveTaskAlreadyExecuted !== null && nonInteractiveTaskAlreadyExecuted.isStarted()) {
2393
+ resetAllowEvents = true;
2394
+ AccessHelper.eventsManager.setNonInteractiveAllowEvents(await nonInteractiveTaskAlreadyExecuted.isAllowEvents());
2395
+ canExecuteEvents = await nonInteractiveTaskAlreadyExecuted.isAllowEvents();
2396
+ }
2397
+ if (LastFocusedManager.Instance.getLastFocusedTask() !== null && canExecuteEvents) {
2398
+ AccessHelper.eventsManager.pushNewExecStacks();
2399
+ await AccessHelper.eventsManager.handleEvents(AccessHelper.mgDataTable.getCurrMGData(), 0);
2400
+ AccessHelper.eventsManager.popNewExecStacks();
2401
+ }
2402
+ if (resetAllowEvents)
2403
+ AccessHelper.eventsManager.setAllowEvents(allowEvents);
2404
+ }
2405
+ Task.StartProgLevel--;
2406
+ Logger.Instance.WriteDevToLog("End \"startProg\"");
2407
+ if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2408
+ if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
2409
+ AccessHelper.eventsManager.setStopExecution(orgStopExecution);
2410
+ return nonInteractiveTaskAlreadyExecuted;
2411
+ }
2412
+ static async ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl) {
2413
+ let currentNonInteractiveTask = new RefParam(null);
2414
+ let nonInteractiveTaskAlreadyExecuted = new RefParam(null);
2415
+ let maxCtlIdx = AccessHelper.mgDataTable.getMGData(0).getMaxCtlIdx();
2416
+ for (let i = 1; i <= maxCtlIdx; i = i + 1) {
2417
+ let componentMainProgram = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, i);
2418
+ if (componentMainProgram !== null)
2419
+ await Task.ExecuteMainProgram(i, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, AccessHelper.mgDataTable);
2420
+ }
2421
+ return nonInteractiveTaskAlreadyExecuted.value;
2422
+ }
2423
+ static async ExecuteMainProgram(CtlIndex, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, mgDataTable) {
2424
+ let mainProgramTask = mgDataTable.GetMainProgByCtlIdx(-1, CtlIndex);
2425
+ Logger.Instance.WriteDevToLog(NString.Format(" ClientManager.startProg: ctlIdx={0}, task={1}", CtlIndex, mainProgramTask));
2426
+ currentNonInteractiveTask.value = (await mainProgramTask.Start(moveToFirstControl, callByDestSubForm));
2427
+ if (nonInteractiveTaskAlreadyExecuted.value === null)
2428
+ nonInteractiveTaskAlreadyExecuted.value = currentNonInteractiveTask.value;
2429
+ else if (currentNonInteractiveTask.value !== null) {
2430
+ Debug.Assert(false, "more than 1 non interactive tasks in startProg");
2431
+ }
2432
+ }
2433
+ static async OpenForms(callByDestSubForm) {
2434
+ let createdForms = MgForm.CreatedForms;
2435
+ if (createdForms.Count() > 0) {
2436
+ let i = 0;
2437
+ while (i < createdForms.Count()) {
2438
+ let mgForm = createdForms.get(i);
2439
+ let canOpen = false;
2440
+ if (mgForm.isSubForm()) {
2441
+ let opened = mgForm.getSubFormCtrl().getForm().Opened;
2442
+ if (opened) {
2443
+ canOpen = true;
2444
+ }
2445
+ }
2446
+ else {
2447
+ if (mgForm.getTask().isCurrentStartProgLevel()) {
2448
+ canOpen = true;
2449
+ }
2450
+ }
2451
+ if (canOpen) {
2452
+ Manager.OpenForm(mgForm);
2453
+ await Manager.DoFirstRefreshTable(mgForm);
2454
+ }
2455
+ if (mgForm.Opened) {
2456
+ createdForms.remove(mgForm);
2457
+ }
2458
+ else
2459
+ i++;
2460
+ }
2461
+ }
2462
+ }
2463
+ static async DoFirstRecordCycle() {
2464
+ for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2465
+ let mgd = AccessHelper.mgDataTable.getMGData(i);
2466
+ if (mgd === null || mgd.IsAborting)
2467
+ continue;
2468
+ for (let j = 0; j < mgd.getTasksCount(); j++) {
2469
+ let task = mgd.getTask(j);
2470
+ if (task !== null) {
2471
+ let mgForm = task.getForm();
2472
+ if (mgForm !== null && task.isCurrentStartProgLevel() && !mgForm.IgnoreFirstRecordCycle) {
2473
+ mgForm.IgnoreFirstRecordCycle = true;
2474
+ await task.doFirstRecordCycle();
2475
+ }
2476
+ }
2477
+ }
2478
+ }
2479
+ }
2480
+ static async MoveToFirstControls(callByDestSubForm) {
2481
+ for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
2482
+ let mgd = AccessHelper.mgDataTable.getMGData(i);
2483
+ if (mgd === null || mgd.IsAborting)
2484
+ continue;
2485
+ let tasksCount = mgd.getTasksCount();
2486
+ for (let j = 0; j < tasksCount; j++) {
2487
+ let task = mgd.getTask(j);
2488
+ let mgForm = task.getForm();
2489
+ if (task.isCurrentStartProgLevel() && mgForm !== null && mgForm.MovedToFirstControl) {
2490
+ mgForm.MovedToFirstControl = false;
2491
+ AccessHelper.eventsManager.pushNewExecStacks();
2492
+ await mgForm.moveToFirstParkabelControl(callByDestSubForm);
2493
+ AccessHelper.eventsManager.popNewExecStacks();
2494
+ }
2495
+ }
2496
+ }
2497
+ }
2498
+ }
2499
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pJLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFFUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixNQUFNLEVBRU4saUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxPQUFPLEVBR1AsUUFBUSxFQUNSLEdBQUcsRUFFSCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVB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QyxFQUFFLEVBQUU7WUFDbkUsSUFBSSxHQUFHLEdBQVcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVO2dCQUNoQyxTQUFTO1lBRVgsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksSUFBSSxHQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTVDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUU7b0JBQ25GLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7b0JBQ25DLFlBQVksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDL0MsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDM0QsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2lCQUMvQzthQUNGO1NBQ0Y7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWJ1ZywgSGFzaFV0aWxzLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVbmlxdWVUc2tTb3J0LFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzLFxyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEaXNwbGF5Q29udmVydG9yLFxyXG4gIEV2ZW50cyxcclxuICBGaWVsZERlZixcclxuICBHdWlEYXRhQ29sbGVjdGlvbixcclxuICBIZWxwcyxcclxuICBJVGFzayxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSZWNvcmRVdGlscyxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gJy4uL2V2ZW50L0V2ZW50JztcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSAnLi4vZGF0YS9EYXRhVmlldyc7XHJcbmltcG9ydCB7RHZDYWNoZX0gZnJvbSAnLi4vZGF0YS9EdkNhY2hlJztcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gJy4vTUdEYXRhJztcclxuaW1wb3J0IHtEYXRhVmlld0NvbW1hbmRUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9EYXRhdmlld0NvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtUYXNrU2VydmljZUJhc2V9IGZyb20gJy4vVGFza1NlcnZpY2VCYXNlJztcclxuaW1wb3J0IHtBcmd1bWVudHNMaXN0fSBmcm9tICcuLi9ydC9Bcmd1bWVudHNMaXN0JztcclxuaW1wb3J0IHtUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyfSBmcm9tICcuLi9kYXRhL1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXInO1xyXG5pbXBvcnQge0RhdGF2aWV3TWFuYWdlcn0gZnJvbSAnLi4vZGF0YS9EYXRhdmlld01hbmFnZXInO1xyXG5pbXBvcnQge1NvcnRDb2xsZWN0aW9ufSBmcm9tICcuL3NvcnQvU29ydENvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1NvcnR9IGZyb20gJy4vc29ydC9Tb3J0JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7UmVtb3RlVGFza1NlcnZpY2V9IGZyb20gJy4vUmVtb3RlVGFza1NlcnZpY2UnO1xyXG5pbXBvcnQge1JldHVyblJlc3VsdH0gZnJvbSAnLi4vdXRpbC9SZXR1cm5SZXN1bHQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi4vZXZlbnQvUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7RGF0YXZpZXdIZWFkZXJzfSBmcm9tICcuLi9ydC9EYXRhdmlld0hlYWRlcnMnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9ufSBmcm9tICcuLi9ydC9UcmFuc2FjdGlvbic7XHJcbmltcG9ydCB7VGFza3NUYWJsZX0gZnJvbSAnLi9UYXNrc1RhYmxlJztcclxuaW1wb3J0IHtJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50VGFyZ2V0ZWRDb21tYW5kJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtSZWNvbXB1dGVUYWJsZX0gZnJvbSAnLi4vcnQvUmVjb21wdXRlVGFibGUnO1xyXG5pbXBvcnQge0V4cFRhYmxlfSBmcm9tICcuLi9leHAvRXhwVGFibGUnO1xyXG5pbXBvcnQge1VzZXJFdmVudHNUYWJsZX0gZnJvbSAnLi4vZXZlbnQvVXNlckV2ZW50c1RhYmxlJztcclxuaW1wb3J0IHtGb3Jtc1RhYmxlfSBmcm9tICcuLi9ndWkvRm9ybXNUYWJsZSc7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZGF0YS9GaWVsZCc7XHJcbmltcG9ydCB7QWN0aW9uTWFuYWdlcn0gZnJvbSAnLi4vZXZlbnQvQWN0aW9uTWFuYWdlcic7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJ9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb24nO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuLi9kYXRhL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7T3BlbmluZ1Rhc2tEZXRhaWxzLCBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlLCBVc2VyUmFuZ2V9IGZyb20gJy4vVGFza0Jhc2UnO1xyXG5pbXBvcnQge0xhbmd1YWdlRGF0YX0gZnJvbSAnLi4vZW52L0xhbmd1YWdlRGF0YSc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0dsb2JhbENvbW1hbmRzTWFuYWdlcn0gZnJvbSAnLi4vR2xvYmFsQ29tbWFuZHNNYW5hZ2VyJztcclxuaW1wb3J0IHtFdmVudHNBbGxvd2VkVHlwZX0gZnJvbSAnLi4vZXZlbnQvSUV2ZW50c01hbmFnZXInO1xyXG5pbXBvcnQge0NyZWF0ZWRGb3JtVmVjdG9yfSBmcm9tICcuLi9ndWkvQ3JlYXRlZEZvcm1WZWN0b3InO1xyXG5pbXBvcnQge0FjY2Vzc0hlbHBlcn0gZnJvbSAnLi4vQWNjZXNzSGVscGVyJztcclxuaW1wb3J0IHtJTUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9JTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7TUdEYXRhQ29sbGVjdGlvbn0gZnJvbSAnLi9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlclBvc2l0aW9ufSBmcm9tICcuLi9ldmVudC9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7Q2xpZW50TWFuYWdlcn0gZnJvbSBcIi4uL0NsaWVudE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBlbnVtIFRhc2tfRmxvdyB7XHJcbiAgTk9ORSxcclxuICBTVEVQLFxyXG4gIEZBU1RcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVGFza19EaXJlY3Rpb24ge1xyXG4gIEJBQ0sgPSAtMSxcclxuICBOT05FLFxyXG4gIEZPUkVcclxufVxyXG5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIFRhc2sgZXh0ZW5kcyBUYXNrQmFzZSB7XHJcbiAgcHJpdmF0ZSBfZHZDYWNoZTogRHZDYWNoZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbWdEYXRhOiBNR0RhdGEgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Fib3J0aW5nOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgYW4gYWJvcnQgY29tbWFuZCB3YXMgZXhlY3V0ZWQgZm9yIHRoaXMgdGFzayBvciBvbmUgb2YgaXRzIGFuY2VzdG9yc1xyXG4gIHByaXZhdGUgX2JFeGVjRW5kVGFzazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2YWxPbGRWYWx1ZXM6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgIC8vIGluZGljYXRlcyBmb3IgdGhlIGdldCB2YWx1ZSB0byBnZXQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICBwcml2YXRlIF9pblJlY29yZFN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB3ZSBhcmUgaW4gcmVjb3JkIHN1ZmZpeCAoaGFuZGxlIGJlZm9yZSlcclxuICBwcml2YXRlIF9jYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAvLyB3YXMgY2FuY2VsL3F1aXQgZXZlbnQgcmFpc2VkID9cclxuICBwcml2YXRlIF9jb3VudGVyOiBudW1iZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZXMgb25seSBpbiBub24gaW50ZXJ2YWwgdGFza3MuXHJcbiAgcHJpdmF0ZSBfY3VyclN0YXJ0UHJvZ0xldmVsOiBudW1iZXIgPSAwOyAgICAgICAgICAgICAgLy8gdGhlIGxldmVsIG9mIHN0YXJ0UHJvZyByZXF1ZXN0IGluIHdoaWNoIHdlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uU3ViZm9ybTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgIC8vIGlmIFRSVUUsIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgcHJpdmF0ZSBfZW5hYmxlWm9vbUhhbmRsZXI6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gaWYgVFJVRSwgdGhlcmUgaXMgYSB6b29tIGhhbmRsZXIgZm9yIHRoaXMgZmllbGRcclxuICBwcml2YXRlIF9maXJzdFJlY29yZEN5Y2xlOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUgaW4gdGhlIGZpcnN0IHJlY29yZCBjeWNsZVxyXG4gIHByaXZhdGUgX29yaWdpbmFsVGFza01vZGU6IHN0cmluZyA9ICcgJztcclxuICBwcml2YXRlIF9pbkNyZWF0ZUxpbmU6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAvLyBpcyB0aGUgdGFzayBpbnRvIHByb2Nlc3NpbmcgQ1JFQVRFIExJTkVcclxuICBwdWJsaWMgSW5TZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSB3aGVuIHRoZSB0YXNrIGlzIGV4ZWN1dGluZyBhIFNFTEVDVCBpbnRlcm5hbCBldmVudFxyXG4gIHB1YmxpYyBJblN0YXJ0UHJvY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzRGVzdGluYXRpb25DYWxsOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrIGJ5IGNhbGwgb3BlcmF0aW9uXHJcbiAgcHJpdmF0ZSBfa25vd25Ub1NlcnZlcjogYm9vbGVhbiA9IHRydWU7ICAgICAgICAgICAgICAgLy8gRmFsc2UgaWYgdGhlIHNlcnZlciBoYXNcclxuICBwcml2YXRlIF9sb29wU3RhY2s6IFN0YWNrPG51bWJlcj4gPSBudWxsO1xyXG4gIHByaXZhdGUgYWxsb3dSZW1vdGVDbWRFeGVjdXRpb246IGJvb2xlYW47XHJcbiAgcHVibGljIERlbGF5Q29tbWFuZEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLy88c3VtbWFyeT5cclxuICAvLy8gVGhpcyBpcyB0aGUgdGFzayB3aGljaCBpbnZva2VkIHRoZSBoYW5kbGVyIGNvbnRhaW5pbmcgdGhlIENhbGwgb3BlcmF0aW9uLlxyXG4gIC8vLyBUaGlzIG1lbWJlciBpcyB1c2VkIGZvciBzZWFyY2hpbmcgdGhlIHZhcmlhYmxlcyBsaWtlIFZhckluZGV4KCksIGV0Y1xyXG4gIC8vLzwvc3VtbWFyeT5cclxuICBwcml2YXRlIF9wYXJlbnRUYXNrOiBUYXNrID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGdldCBQYXJlbnRUYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIENvbnRleHRUYXNrOiBUYXNrID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGNvbnRleHQgb2Ygd2hpY2ggdGFzayB0aGlzIHRhc2sgaXMgY3VycmVudGx5IHJ1bm5pbmdcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgaXMgc2FtZSBhcyBfcGFyZW50VGFzayBleGNlcHQgZm9yIE1vZGFsIHRhc2tzLiBJbiBjYXNlLCB0aGUgY3VycmVudCB0YXNrIGlzIG1vZGFsLCBfdHJpZ2dlcmluZ1Rhc2sgcmVmZXJzIHRvXHJcbiAgLy8vICB0aGUgdGFzayB3aGljaCBpbnZva2VkIHRoZSBoYW5kbGVyIG9mIHRoZSBfcGFyZW50VGFzay4gVGhpcyBtZW1iZXIgaXMgdXNlZCBmb3IgYWxsIGdlbmVyYXRpb24tYmFzZWQgZnVuY3Rpb25zIGFuZCBQcm9nKCkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIF90cmlnZ2VyaW5nVGFzazogVGFzayA9IG51bGw7ICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIgd2hpY2ggY3JlYXRlZCBtZVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGlzIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5lZCB0aGUgQ2FsbCBvcGVyYXRpb24uIElmIHRoZSB0YXNrIHdhcyBleGVjdXRlZCB3aXRob3V0IGNhbGxcclxuICAvLy8gICBvcGVyYXRpb24gZWcuIHRoZSBNUCwgdGhlIHN0YXJ0dXAgcHJvZ3JhbSwgZXRjLiwgaXQgcmVmZXJzIHRvIGl0c2VsZi4gVGhpcyBtZW1iZXIgdXNlZCB0byBzZWFyY2ggZm9yIHRoZSBldmVudCBoYW5kbGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFBhdGhQYXJlbnRUYXNrOiBUYXNrID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfcHJldmVudENvbnRyb2xDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcmV2ZW50UmVjb3JkU3VmZml4OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdGFza1BhdGg6IExpc3Q8VGFzaz4gPSBudWxsO1xyXG5cclxuICAvLyByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgY3VycmVudGx5IHRyeWluZyB0byBjb21taXQgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgcHJpdmF0ZSBfdHJ5aW5nVG9Db21taXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2V0IFRyeWluZ1RvQ29tbWl0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl90cnlpbmdUb0NvbW1pdCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyeWluZ1RvQ29tbWl0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyeWluZ1RvQ29tbWl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXNlTG9vcFN0YWNrOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gKExPT1BDT1VOVEVSKCkpIGlzIGluIHRoZSBzY29wZSBvZiBCbG9jayBMb29wLlxyXG4gIHByaXZhdGUgX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIEluSGFuZGxlQWN0Q2FuY2VsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIFJ1bnRpbWVTb3J0czogU29ydENvbGxlY3Rpb24gPSBudWxsO1xyXG4gIHB1YmxpYyBWZXdGaXJzdDogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgZGF0YVZpZXdDb250ZW50OiBzdHJpbmcgPSBudWxsOyAgICAgICAgICAgICAgICAvLyBkYXRhVmlld0NvbnRlbnQgcmV0cmlldmVkIGJ5IEdldERhdGFWaWV3Q29udGVudCBjb21tYW5kLlxyXG4gIHB1YmxpYyBQZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4OiBib29sZWFuID0gZmFsc2U7ICAgIC8vIEluIHJlY29yZCBwcmVmaXggKGNvbW1vbkhhbmRsZXJCZWZvcmUpIHdlIGV4ZWN1dGUgcmVjb3JkIHByZWZpeCBvZiBhbGwgZmF0aGVycy5cclxuXHJcbiAgLy8gQnV0IHdlIGRvIG5vdCBuZWVkIGl0IGluIGFsbCBjYXNlcy5cclxuICAvLyBXaGVuIHdlIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIgd2UgZG8gbm90IG5lZWQgaXQuXHJcbiAgLy8gV2hlbiB3ZSBjbGljayBvbiB0aGUgbmVzdGVkIHN1YmZvcm0gd2UgbmVlZCBpdC5cclxuICAvLyBpZiB0cnVlLCBkbyB0aGUgcGFyZW50IHN1YmZvcm0gcmVjb3JkIHByZWZpeFxyXG5cclxuICAvLyAtMSDigJMgVGhlIHRhc2sgaXMgbm90IGV4ZWN1dGVkIGFzIGEgc3ViZm9ybVxyXG4gIC8vICAwIOKAkyBUaGUgdGFzayBpcyBleGVjdXRlZCBieSBzZXR0aW5nIHRoZSBmb2N1cyBvbiBpdFxyXG4gIC8vICAxIOKAkyBUaGUgc3VidGFzayBpcyBleGVjdXRlZCBmb3IgdGhlIGZpcnN0IHRpbWVcclxuICAvLyAgMiDigJMgVGhlIHRhc2sgaXMgZXhlY3V0ZWQgYmVjYXVzZSB0aGUgQXV0b21hdGljIFJlZnJlc2ggcHJvcGVydHlcclxuICAvLyAgICAgIG9yIHRoZSBTdWJmb3JtIFJlZnJlc2ggZXZlbnQgaGFzIGJlZW4gdHJpZ2dlcmVkXHJcbiAgcHVibGljIE1vZGVBc1BhcmVudDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhc2sgbW9kZSBpcyAnQXMgUGFyZW50JyB3ZSBuZWVkIHRvIGNhcmUgb3V0IGl0IHNwZWNpZmljYWxseVxyXG4gIHB1YmxpYyBUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyOiBUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWQgb24gdGhlIGNsaWVudC5cclxuICAvLy8gUmVsZXZhbnQgb25seSBmb3Igbm9uLW9mZmxpbmUgd2l0aCBsb2NhbCBkYXRhLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEV4ZWN1dGVDbGllbnRTdWJmb3JtUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGV4ZWN1dGVzIENvbW1vbkhhbmRsZXJCZWZvcmUgbWV0aG9kLlxyXG4gIC8vLyBGb3Igc3ViZm9ybXMgd2UgZG8gbm90IGV4ZWN1dGUgaXQncyBSUCBpZiB0aGUgcGFyZW50IGRpZG4ndCBmaW5pc2hlZCB5ZXRcclxuICAvLy8gaXQncyBDb21tYW5kSGFuZGxlckJlZm9yZSBtZXRob2QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgSW5Db21tb25IYW5kbGVyQmVmb3JlUlA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXRyaWV2ZSBhbmQgcmV0dXJuIGEgc2VydmljZSBvYmplY3QgY29udGFpbmluZyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgZGlmZmVyZW50IGluIHRoZSB0YXNrIGxldmVsIGJldHdlZW4gY29ubmVjdGVkIGFuZCBvZmZsaW5lIHN0YXRlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3Rhc2tTZXJ2aWNlOiBUYXNrU2VydmljZUJhc2UgPSBudWxsO1xyXG5cclxuICBnZXQgVGFza1NlcnZpY2UoKTogVGFza1NlcnZpY2VCYXNlIHtcclxuICAgIGlmICh0aGlzLl90YXNrU2VydmljZSA9PSBudWxsKVxyXG4gICAgICB0aGlzLl90YXNrU2VydmljZSA9IG5ldyBSZW1vdGVUYXNrU2VydmljZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl90YXNrU2VydmljZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0cmlldmUgYW5kIHJldHVybiBhIGNvbW1hbmRzIHByb2Nlc3NvciBkZXBlbmRpbmcgb24gdGFzayB0eXBlIGFuZCBzdGF0ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBnZXQgQ29tbWFuZHNQcm9jZXNzb3IoKTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlIHtcclxuICAgIHJldHVybiBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzTG9jYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkID0gbnVsbDtcclxuICBwdWJsaWMgQXJndW1lbnRzTGlzdDogQXJndW1lbnRzTGlzdCA9IG51bGw7ICAgICAgICAgICAvLyBvZmYtbGluZSBleGVjdXRpb24gLSB0YXNrIGFyZ3VtZW50LCB0byBlbmFibGUgdGhlIHVwZGF0ZSBvZiBmaWVsZCB2YWx1ZXNcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwYXJlbnQgdGFzayBvZiB0aGUgc3VidGFzayBieSB0b29sa2l0IHRyZWUgaW5jbHVkZSB0aGUgbWFpbiBwcm9ncmFtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IExvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuU3R1ZGlvUGFyZW50VGFzayA9PT0gbnVsbCAmJiAhc3VwZXIuaXNNYWluUHJvZygpKSB7XHJcbiAgICAgIHJldHVybiA8VGFzaz5HdWlEYXRhQ29sbGVjdGlvbi5NR0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KHRoaXMuQ29udGV4dElELCB0aGlzLl9jdGxJZHgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiA8VGFzaz50aGlzLlN0dWRpb1BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBnZXQgS25vd25Ub1NlcnZlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9rbm93blRvU2VydmVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIENvbmZpcm1VcGRhdGVObzogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZm9yIGNvbmZpcm1zIHVwZGF0ZVxyXG4gIHB1YmxpYyBEYXRhU3luY2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIFVuaXF1ZVNvcnQ6IFVuaXF1ZVRza1NvcnQgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0aGUgdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBvbiB0aGUgZGF0YSB2aWV3IG1hbmFnZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldCBUcmFuc2FjdGlvbih2YWx1ZTogVHJhbnNhY3Rpb24pIHtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkN1cnJlbnREYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZWZyZXNoT25WYXJzOiBudW1iZXJbXSA9IG51bGw7XHJcbiAgcHVibGljIER2UG9zRGVzY3JpcHRvcjogTGlzdDxzdHJpbmdbXT4gPSBudWxsO1xyXG4gIHB1YmxpYyBTdWJUYXNrczogVGFza3NUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIEV4cFRhYjogRXhwVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBVc2VyRXZ0VGFiOiBVc2VyRXZlbnRzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBEYXRhdmlld0hlYWRlcnNUYWJsZTogRGF0YXZpZXdIZWFkZXJzID0gbnVsbDtcclxuICBwdWJsaWMgSGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBfZm9ybXM6IEZvcm1zVGFibGUgPSBudWxsO1xyXG4gIHB1YmxpYyBOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyBQdWJsaWNOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0YXNrIHN1ZmZpeCB3YXMgcGVyZm9ybWVkIGZvciB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBUYXNrU3VmZml4RXhlY3V0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IFRhc2tEZWZpbml0aW9uSWQoKTogVGFza0RlZmluaXRpb25JZCB7XHJcbiAgICBpZiAodGhpcy50YXNrRGVmaW5pdGlvbklkID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMudGFza0RlZmluaXRpb25JZCA9IG5ldyBUYXNrRGVmaW5pdGlvbklkKHRoaXMuX2N0bElkeCwgdGhpcy5Qcm9ncmFtSXNuLCB0aGlzLlRhc2tJc24sIHRoaXMuX2lzUHJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgUmV0cnVuVmFsdWVFeHA6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIFN1YmZvcm1Db250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICBzdGF0aWMgU3RhcnRQcm9nTGV2ZWw6IG51bWJlciA9IDA7ICAvLyByZWN1cnNpdmUgbGV2ZWwgb2YgXCJzdGFydFByb2dcIiBpbnZvY2F0aW9uc1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBfaWRsZVRpbWVyU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGF0aWMgZ2V0IElzQmxvY2tpbmdCYXRjaCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFRhc2spO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudD86IFRhc2spIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHBhcmVudCkpIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShwYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoKTtcclxuICAgIHRoaXMuRGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcyk7XHJcbiAgICB0aGlzLl9mbG93TW9uaXRvciA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgICB0aGlzLkNvbnRleHRUYXNrID0gdGhpcztcclxuICAgIHRoaXMuX2R2Q2FjaGUgPSBuZXcgRHZDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHRydWU7XHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlciA9IG5ldyBEYXRhdmlld01hbmFnZXIodGhpcyk7XHJcbiAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlciA9IG5ldyBUYXNrVHJhbnNhY3Rpb25NYW5hZ2VyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LkluaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShwYXJlbnQ6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3BhcmVudFRhc2sgPSBwYXJlbnQ7XHJcbiAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IG51bGw7XHJcbiAgICB0aGlzLmJ1aWxkVGFza1BhdGgoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBDcmVhdGVUYXNrKCk6IFRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrID0gIG5ldyBUYXNrKCk7XHJcbiAgICB0YXNrLkluaXQoKTtcclxuICAgIHJldHVybiB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8gSVRhc2sgTWVtYmVyc1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0ZWxscyB3aGV0aGVyIHRoZSB0YXNrIGlzIGFib3J0aW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Fib3J0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Fib3J0aW5nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRhc2tQYXRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza1BhdGggPSBuZXcgTGlzdDxUYXNrPigpO1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoICE9PSBudWxsKVxyXG4gICAgICB0aGlzLl90YXNrUGF0aC5BZGRSYW5nZSh0aGlzLl9wYXJlbnRUYXNrLl90YXNrUGF0aC5HZXRFbnVtZXJhdG9yKCkpO1xyXG4gICAgdGhpcy5fdGFza1BhdGgucHVzaCh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgZGF0YSBieSBwYXJzaW5nIHRoZSB4bWwgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nZFwiPnJlZmVyZW5jZSB0byBNR0RhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wZW5pbmdUYXNrRGV0YWlsc1wiPmFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb2Ygb3BlbmluZyB0YXNrPC9wYXJhbT5cclxuICBhc3luYyBmaWxsRGF0YShtZ2Q6IE1HRGF0YSwgb3BlbmluZ1Rhc2tEZXRhaWxzOiBPcGVuaW5nVGFza0RldGFpbHMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIElmIHRoaXMgdGFzayB3YXMgb3BlbmVkIGJ5IGFuIFwib3BlbiB3aW5kb3dcIiBjb21tYW5kIC0gY29ubmVjdCBoaW0gdG8gaXRzIHBhcmVudFxyXG4gICAgaWYgKCFzdXBlci5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5DYWxsaW5nVGFzaztcclxuICAgICAgICB0aGlzLmJ1aWxkVGFza1BhdGgoKTtcclxuICAgICAgICAoPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrKS5hZGRTdWJUYXNrKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLlBhdGhQYXJlbnRUYXNrID09PSBudWxsICYmIG9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuUGF0aFBhcmVudFRhc2sgPSA8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuUGF0aFBhcmVudFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGZvciBNR19BQ1RfWk9PTSBhY3Rpb24gZW5hYmxlXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbCAmJiB0aGlzLl9wYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgdGhpcy5zZXRFbmFibGVab29tSGFuZGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX21nRGF0YSA9IG1nZDtcclxuICAgIHRoaXMuZmlsbEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICB0aGlzLl9tZ0RhdGEuYWRkVGFzayh0aGlzKTtcclxuXHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsKSA/IHRoaXMuX3BhcmVudFRhc2suZ2V0Rm9ybSgpIDogbnVsbDtcclxuXHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJlbnRGb3JtKSkge1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5QcmVwYXJlVHJhbnNhY3Rpb25Qcm9wZXJ0aWVzKHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiwgZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuSGFuZGxlVHJpZ2dlclRhc2soKTtcclxuICAgIHRoaXMuSGFuZGxlUHJldmlvdXNseUFjdGl2ZVRhc2tJZCgpO1xyXG5cclxuICAgIC8vIFNldCBpc1N1YmZvcm0gZmxhZ1xyXG4gICAgdGhpcy5DaGVja0FuZFNldFN1YkZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgLy8gZ2V0IHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgbGV0IHN1YkZvcm1DdHJsOiBNZ0NvbnRyb2wgPSAoPE1nRm9ybT50aGlzLmdldFBhcmVudCgpLmdldEZvcm0oKSkuZ2V0U3ViRm9ybUN0cmxGb3JUYXNrKHRoaXMuX3Rhc2tUYWcpO1xyXG4gICAgICBpZiAoc3ViRm9ybUN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBzdWJGb3JtQ3RybC5zZXRTdWJmb3JtVGFza0lkKHRoaXMuX3Rhc2tUYWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB1cGRhdGUgdGhlIGZvcm0gd2l0aCB0aGUgc3ViZm9ybSBjb250cm9sIGZyb20gdGhlIHBhcmVudCB0YXNrXHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLnNldFN1YkZvcm1DdHJsKHN1YkZvcm1DdHJsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIGhhbmRsZSB0aGUgUHJldmlvdXNseUFjdGl2ZVRhc2tJZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFuZGxlUHJldmlvdXNseUFjdGl2ZVRhc2tJZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSAhPT0gbnVsbCAmJiB0aGlzLl9tZ0RhdGEgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0TUdEYXRhKCkpXHJcbiAgICAgIHRoaXMuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCA9ICh0aGlzLl9wYXJlbnRUYXNrLkdldENvbnRleHRUYXNrKCkpLmdldFRhc2tUYWcoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuUHJldmlvdXNseUFjdGl2ZVRhc2tJZCA9IHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza1RhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBoYW5kbGUgdGhlIHRyaWdnZXIgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFuZGxlVHJpZ2dlclRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBGaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YTogc3RyaW5nKTogdm9pZDtcclxuICBGaWxsVGFza1RhYmxlcygpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLkZpbGxUYXNrVGFibGVzXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5GaWxsVGFza1RhYmxlc18xKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxUYXNrVGFibGVzXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlcjtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgc3VwZXIuZmlsbEF0dHJpYnV0ZXMocGFyc2VyKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjNzU5OTExOiBtcHJnIG11c3QgYmVsb25nIHRvIHRoZSBtYWluIGFwcGxpY2F0aW9uJ3MgTUdEYXRhLlxyXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgaXQgd2lsbCBub3QgYmUgZGlzY2FyZGVkIHVudGlsIHRoZSBlbmQgb2YgZXhlY3V0aW9uLlxyXG4gICAgICBpZiAoc3VwZXIuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuX21nRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gVGFzay5maWxsQXR0cmlidXRlcygpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW47XHJcbiAgICBpc1RhZ1Byb2Nlc3NlZCA9IHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKTtcclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpIHtcclxuICAgICAgaXNUYWdQcm9jZXNzZWQgPSB0cnVlO1xyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUZSRVNIT046XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLlNldFJlZnJlc2hPblZhcnModmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgdGhpcy5OYW1lID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfREVDOlxyXG4gICAgICAgICAgaWYgKCEodmFsdWVTdHIudHJpbSgpID09PSBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5zZXREZXNjcmlwdG9yKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQVNfTE9DQVRFOlxyXG4gICAgICAgICAgaWYgKCt2YWx1ZVN0ciA9PSAxKVxyXG4gICAgICAgICAgICB0aGlzLmhhc0xvY2F0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQVNfUEFSRU5UOlxyXG4gICAgICAgICAgaWYgKCt2YWx1ZVN0ciA9PSAxKVxyXG4gICAgICAgICAgICB0aGlzLk1vZGVBc1BhcmVudCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19VTklRVUVfU09SVDpcclxuICAgICAgICAgIHRoaXMuVW5pcXVlU29ydCA9IDxVbmlxdWVUc2tTb3J0PnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX0lEOlxyXG4gICAgICAgICAgdGhpcy5zZXRSZW1vdGVUcmFuc2FjdGlvbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUFVCTElDOlxyXG4gICAgICAgICAgdGhpcy5QdWJsaWNOYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSVNfT0ZGTElORTpcclxuICAgICAgICAgIHRoaXMuSXNPZmZsaW5lID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9SRVRVUk5fVkFMVUVfRVhQOlxyXG4gICAgICAgICAgdGhpcy5SZXRydW5WYWx1ZUV4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9NRU5VU19GSUxFX05BTUU6XHJcbiAgICAgICAgICAvLyBUT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5wb3NzaWJsZSB0YWcgbmFtZSAsIG5hbWUgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgYXN5bmMgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgc3dpdGNoIChmb3VuZFRhZ05hbWUpIHtcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBUQUJMRTpcclxuICAgICAgICBpZiAodGhpcy5faGVscFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5faGVscFRhYiA9IG5ldyBIZWxwcygpO1xyXG5cclxuICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVscFRhYi5maWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSOlxyXG4gICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG5cclxuICAgICAgICB0aGlzLkRhdGFWaWV3LmZpbGxIZWFkZXJEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfUFJPUDpcclxuICAgICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdUJywgcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19GT1JNOlxyXG4gICAgICAgIHRoaXMuRm9ybSA9IHRoaXMuRm9ybUluaXREYXRhKHBhcmVudEZvcm0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9NRU5VX0NPTlRFTlQ6XHJcbiAgICAgICAgLy8gVE9ETyAtIG5vdCB0byBzZXJpYWxpemUgW1N0b3J5IDE1NDU0N11cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJhc3NlbWJsaWVzXCI6XHJcbiAgICAgICAgbGV0IGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoJy9hc3NlbWJsaWVzJywgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19GT1JNUzpcclxuICAgICAgICB0aGlzLl9mb3JtcyA9IG5ldyBGb3Jtc1RhYmxlKHRoaXMsIHBhcmVudEZvcm0pO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IC4uLlwiLCBmb3VuZFRhZ05hbWUpKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9mb3Jtcy5maWxsRGF0YSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSzpcclxuICAgICAgICBpZiAodGhpcy5TdWJUYXNrcyA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5TdWJUYXNrcyA9IG5ldyBUYXNrc1RhYmxlKCk7XHJcbiAgICAgICAgbGV0IHN1YnRhc2sgPSBuZXcgVGFzayh0aGlzKTtcclxuICAgICAgICBzdWJ0YXNrLkluaXQoKTtcclxuICAgICAgICB0aGlzLlN1YlRhc2tzLmFkZFRhc2soc3VidGFzayk7XHJcbiAgICAgICAgbGV0IG1nZDogTUdEYXRhID0gdGhpcy5fbWdEYXRhO1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICAgIG1nZCA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNR0RhdGFGb3JTdGFydHVwUHJvZ3JhbSgpO1xyXG4gICAgICAgIGF3YWl0IHN1YnRhc2suZmlsbERhdGEobWdkLCBuZXcgT3BlbmluZ1Rhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMOlxyXG4gICAgICAgIGF3YWl0IFRhc2suUHJvY2Vzc1Rhc2tVUkwoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRVhQVEFCTEU6XHJcbiAgICAgICAgaWYgKHRoaXMuRXhwVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLkV4cFRhYiA9IG5ldyBFeHBUYWJsZSgpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byBleHBcIik7XHJcbiAgICAgICAgdGhpcy5FeHBUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfVVNFUl9FVkVOVFM6XHJcbiAgICAgICAgaWYgKHRoaXMuVXNlckV2dFRhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5Vc2VyRXZ0VGFiID0gbmV3IFVzZXJFdmVudHNUYWJsZSgpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiZ29lcyB0byB1c2VyIGV2ZW50IHRhYlwiKTtcclxuICAgICAgICB0aGlzLlVzZXJFdnRUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfTElOS1M6XHJcbiAgICAgICAgdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZSA9IG5ldyBEYXRhdmlld0hlYWRlcnModGhpcyk7XHJcbiAgICAgICAgdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZS5maWxsRGF0YShwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TT1JUUzpcclxuICAgICAgICB0aGlzLlJ1bnRpbWVTb3J0cyA9IG5ldyBTb3J0Q29sbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuUnVudGltZVNvcnRzLmZpbGxEYXRhKCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFUzpcclxuICAgICAgICB0aGlzLkZpbGxUYXNrVGFibGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19SRUNPTVBVVEU6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHJlY29tcHV0ZVwiKTtcclxuICAgICAgICB0aGlzLlJlY29tcHV0ZUZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5USEFORExFUlM6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV2ZW50aGFuZGxlcnNcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuSGFuZGxlcnNUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuSGFuZGxlcnNUYWIgPSBuZXcgSGFuZGxlcnNUYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuSGFuZGxlcnNUYWIuZmlsbERhdGEodGhpcywgcGFyc2VyKTtcclxuICAgICAgICB0aGlzLmFkZEV4cEhhbmRsZXJzVG9NR0RhdGEoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spKSB7XHJcbiAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gVGFzay5pbml0SW5uZXJPYmplY3RzIC4gRW50ZXIgY2FzZSBmb3IgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgUmVjb21wdXRlRmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCByZWNvbXB1dGVUYWJsZTogUmVjb21wdXRlVGFibGUgPSBuZXcgUmVjb21wdXRlVGFibGUoKTtcclxuICAgIHJlY29tcHV0ZVRhYmxlLmZpbGxEYXRhXzEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcsIHRoaXMsIHBhcnNlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxUYXNrVGFibGVzXzEoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgLy8gR2V0IHRoZSBlbmQgb2YgdGhlIHRhc2sgdGFibGUgZWxlbWVudFxyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS19UQUJMRVNfRU5ELCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBlbmRDb250ZXh0KSArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UubGVuZ3RoO1xyXG4gICAgLy8gZ2V0IHRoZSB0YXNrIHRhYmxlIHhtbCBzdHJpbmdcclxuICAgIGxldCB0YXNrVGFibGVzRGF0YTogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgIHRoaXMuRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGEpO1xyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0KTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGhhbmRsZXJzIHRyaWdnZXJlZCBieSBleHByZXNzaW9ucyB0byBtZ2RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpOiB2b2lkIHtcclxuICAgIGxldCBpZHg6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0aGlzLkhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgIGxldCBldnQ6IEV2ZW50ID0gaGFuZGxlci5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8XHJcbiAgICAgICAgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04pKSB7XHJcbiAgICAgICAgdGhpcy5fbWdEYXRhLmFkZEV4cEhhbmRsZXIoaGFuZGxlciwgaWR4KTtcclxuICAgICAgICBpZHgrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcmVmcmVzaCBvbiB2YXJpYWJsZSBsaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgU2V0UmVmcmVzaE9uVmFycyh2YXJpYWJsZXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHN0clRvazogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhcmlhYmxlcywgXCIsXCIpO1xyXG4gICAgbGV0IGZsZE51bTogbnVtYmVyO1xyXG4gICAgbGV0IGludFZhbHMgPSBuZXcgTGlzdDxudW1iZXI+KCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHN0clRvay5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmbGROdW0gPSBOTnVtYmVyLlBhcnNlKHN0clRva1tpXSk7XHJcbiAgICAgIGludFZhbHMucHVzaChmbGROdW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5SZWZyZXNoT25WYXJzID0gbmV3IEFycmF5KGludFZhbHMubGVuZ3RoKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBpbnRWYWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IGludFZhbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHRoaXMuUmVmcmVzaE9uVmFyc1tpXSA9IGZsZE51bTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIERhdGFTeW5jZWQgcHJvcGVydHkgb2YgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGF0YVN5bmNlZChzeW5jZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVN5bmNlZCA9IHN5bmNlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+b2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBmaWVsZCBieSBpdHMgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZChmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaWVsZEJ5TmFtZShmbGROYW1lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYW4gZXhwcmVzc2lvbiBieSBpdHMgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pZCBvZiB0aGUgZXhwcmVzc2lvbjwvcGFyYW0+XHJcbiAgZ2V0RXhwQnlJZChpZDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XHJcbiAgICBpZiAodGhpcy5FeHBUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkV4cFRhYi5nZXRFeHBCeUlkKGlkKTtcclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gVGFzay5HZXRFeHBCeUlkKCk6IG5vIGV4cHJlc3Npb24gdGFibGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldEV4cE9iamVjdEJ5SWQoaWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRFeHBCeUlkKGlkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGV4cEJ5SWQuR2V0U3RvcmFnZUF0dHJpYnV0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsY3VsYXRlIGV4cHJlc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhwSWRcIj5UaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVHlwZVwiPlRoZSBleHBlY3RlZCByZXN1bHQgdHlwZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPlRoZSBleHBlY3RlZCBsZW5ndGggb2YgdGhlIHJlc3VsdC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPkRlbm90ZXMgd2hldGhlciB0aGUgcmVzdWx0IGlzIGV4cGVjdGVkIHRvIGJlIGEgdW5pY29kZSBzdHJpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNDZWxsVHlwZVwiPk5vdCB1c2VkLjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDYWxjdWxhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIGxldCBleHBCeUlkOiBFeHByZXNzaW9uID0gdGhpcy5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgRGVidWcuQXNzZXJ0KGV4cEJ5SWQgIT09IG51bGwpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBleHBCeUlkLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgocmVzVHlwZSwgbGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5zZXJ0IFJlY29yZCBUYWJsZSB0byBkYXRhdmlldyBvZiB0aGUgdGFzayBpZiBpdCBjYW1lIGFmdGVyIGNsb3NpbmcgdGFzayB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGluc2VydFJlY29yZFRhYmxlKGludmFsaWRhdGU6IGJvb2xlYW4sIHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjaGVjayBjYWNoZSBsb2dpYyBvbmx5IGZvciBzdWItZm9ybXNcclxuICAgIGlmIChhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgbGV0IGZpcnN0VGltZTogYm9vbGVhbiA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Rmlyc3REdigpO1xyXG4gICAgICAvLyBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgdGFzayBnZXQgZHYgb3IgdGhlIG9sZCBkdiBpcyBub3QgaW52YWxpZGF0ZWQgb3JcclxuICAgICAgLy8gdGhlIG9sZCBkdiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCByZWNvcmQgZG8gbm90IHB1dCBpbiBjYWNoZVxyXG4gICAgICBpZiAoIWZpcnN0VGltZSAmJiBpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0xvY2F0ZSkge1xyXG4gICAgICAgICAgLy8gdGhlIG9sZCBkLnYgd2FzIG5vdCB1cGRhdGVkIHB1dCBpdCBpbiBjYWNoZSAoaXRzIHJlcGxpY2F0ZSlcclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkluY2x1ZGVzRmlyc3QoKSkge1xyXG4gICAgICAgICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwYXJzZSB0aGUgbmV3IGRhdGF2aWV3XHJcbiAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmZpbGxEYXRhKHBhcnNlcik7XHJcblxyXG4gICAgaWYgKGludmFsaWRhdGUpXHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0Q2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBoYW5kbGVycyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SGFuZGxlcnNUYWIoKTogSGFuZGxlcnNUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5IYW5kbGVyc1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLklzQWZ0ZXJSZXRyeUJlZm9yZUJ1aWxkWE1MID0gdGhpcy5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICBpZiAodGhpcy5Lbm93blRvU2VydmVyICYmICF0aGlzLklzT2ZmbGluZSkge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQgKyBcIj1cXFwiXCIgKyB0aGlzLmdldFRhc2tUYWcoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tfTUFJTkxFVkVMICsgXCI9XFxcIlwiICsgdGhpcy5nZXRNYWluTGV2ZWwoKSArIFwiXFxcIlwiKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuYnVpbGRYTUwobWVzc2FnZSk7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbCAmJiB0aGlzLkZvcm0uT3BlbmVkKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCg8TWdGb3JtPnRoaXMuRm9ybSkuR2V0SGlkZGVuQ29udHJvbExpc3RYTUwoKSk7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgPC9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgcmFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTEZvclJuZ3MobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgVXNlclJhbmdlczogTGlzdDxVc2VyUmFuZ2U+LCBsb2NhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZmxkOiBGaWVsZDtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDtcclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IChFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXREZWJ1Z0xldmVsKCkgPD0gMSk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgVXNlclJhbmdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9STkcpO1xyXG5cclxuICAgICAgbGV0IHJuZzogVXNlclJhbmdlID0gVXNlclJhbmdlcy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBybmcudmVlSWR4ICsgXCJcXFwiXCIpO1xyXG5cclxuICAgICAgZmxkID0gPEZpZWxkPnRoaXMuRGF0YVZpZXcuZ2V0RmllbGQoPG51bWJlcj5ybmcudmVlSWR4IC0gMSk7XHJcbiAgICAgIGxldCBmbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1pbilcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUlOX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNaW4gJiYgcm5nLm1pbiAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5taW4sIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NSU5fUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocm5nLm51bGxNYXgpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5OVUxMX01BWF9STkcgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAoIXJuZy5kaXNjYXJkTWF4ICYmIHJuZy5tYXggIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IFJlY29yZFV0aWxzLml0ZW1WYWxUb1hNTChybmcubWF4LCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUFYX1JORyArIFwiPVxcXCJcIiArIHZhbCArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhdGUpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9SQU5HRVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIHVzZXIgYWRkZWQgc29ydHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yU29ydHMobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVXNlclNvcnRzICE9IG51bGwgJiYgdGhpcy5Vc2VyU29ydHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5Vc2VyU29ydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgICBsZXQgc3J0OiBTb3J0ID0gdGhpcy5Vc2VyU29ydHMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5TT1JUKTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEICsgXCI9XFxcIlwiICsgc3J0LmZsZElkeCArIFwiXFxcIlwiKTtcclxuICAgICAgICBpZiAoc3J0LmRpcilcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9ESVIgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5Vc2VyU29ydHMuQ2xlYXIoKTtcclxuICAgICAgdGhpcy5Vc2VyU29ydHMgPSBudWxsO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuRU5EX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19TT1JUUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSB1c2VyIGV2ZW50IGJ5IGl0cyBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBldmVudDwvcGFyYW0+XHJcbiAgZ2V0VXNlckV2ZW50KGlkeDogbnVtYmVyKTogRXZlbnQge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbCk7XHJcbiAgICBsZXQgcmV0RXZlbnQ6IEV2ZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLlVzZXJFdnRUYWIgIT09IG51bGwpXHJcbiAgICAgIHJldEV2ZW50ID0gdGhpcy5Vc2VyRXZ0VGFiLmdldEV2ZW50KGlkeCk7XHJcbiAgICByZXR1cm4gcmV0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFNldCB0aGUgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKG1vdmVUb0ZpcnN0Q29udHJvbCB8fCAhdGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIHRoaXMgaXMgYSBjYWxsIGRlc3RpbmF0aW9uLyBzdWJmb3JtIGNhbGxcclxuICAgICAgICAvLyBXZSBwZXJmb3JtIG1vdmUgdG8gZmlyc3QgY29udHJvbCBvbmx5IHRvIG9uZSBjb250cm9sIGZvcm0gcGVyIHJlcXVlc3QgLSB0aGUgZmlyc3Qgb25lIHRoYXQgd2UgcmVjZWl2ZVxyXG4gICAgICAgIGxldCBhbHJlYWR5TW92ZWQ6IGJvb2xlYW4gPSAoPE1nRm9ybT50aGlzLkZvcm0pLmFscmVhZHlNb3ZlZFRvRmlyc3RDb250cm9sKCk7XHJcbiAgICAgICAgaWYgKCFhbHJlYWR5TW92ZWQpXHJcbiAgICAgICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLk1vdmVkVG9GaXJzdENvbnRyb2wgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RhcnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayBhbmQgaXRzIHN1YlRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBTdGFydChtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxJVGFzaz4ge1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFzazogVGFzayA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pc1N0YXJ0ZWQpIHtcclxuICAgICAgdGhpcy5faXNTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuSW5pdGlhbGl6ZUV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IHRydWU7XHJcbiAgICAgIGxldCByZXN1bHQ6IFJldHVyblJlc3VsdCA9IGF3YWl0IHRoaXMuU2V0dXAoKTtcclxuXHJcbiAgICAgIC8vIHRhc2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gY2xvc2UgdGhlIHRhc2tcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuX2luUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrU2F2ZWQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuRW5hYmxlQWN0aW9ucygpO1xyXG5cclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5Jbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmICF0aGlzLl9pc01haW5QcmcpXHJcbiAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdGhpcztcclxuXHJcbiAgICAgIHRoaXMuRGF0YVZpZXdXYXNSZXRyaWV2ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gUUNSICMgMTY3MzMyIDpcclxuICAgICAgLy8gSWYgd2Ugc3RhcnQgcG9yZ3JhbSBQMSwgZm9yIHdoaWNoIE1QIGlzIHN0YXJ0ZWQuIE1QIGlzIGNhbGxpbmcgUDIgZnJvbSBpdCdzIFRQLiBTbywgd2hlbiBpdCBjYWxscyBQMlxyXG4gICAgICAvLyBhZ2FpbiBpdCBzdGFydHMgTVAsIGJ1dCBmcm9tIE1QIGl0IGFnYWluIHN0YXJ0cyBQMS4gYXMgUDEgaXMgaW4gaXQncyBzdWJ0YXNrIGFuZCBpdCBpcyBub3QgeWV0IHN0YXJ0ZWQuXHJcbiAgICAgIC8vIFNvLCBpdCdzIHdyb25nIHRvIHN0YXJ0IFAxIHdoaWxlIGV4ZWN1dGluZyBUUCBvZiBNUC4gSXQgc2hvdWxkIGV4ZWN1dGUgb25seSBQMi5cclxuICAgICAgLy8gU28sIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMsIHNldCBNUCdzIHN1YnRhc2tzIHRvIG51bGwgYmVmb3JlIGVudGVyaW5nIFRQLiBhbmQgYWdhaW4gcmVzdG9yZSBpdCBiYWNrLCBpbiBvcmRlciB0b1xyXG4gICAgICAvLyBzdGFydCBQMSBwcm9wZXJseS5cclxuICAgICAgbGV0IHN1YlRhc2tzOiBUYXNrc1RhYmxlID0gdGhpcy5TdWJUYXNrcztcclxuICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgIHRoaXMuU3ViVGFza3MgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IHN1YlRhc2tzO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuX2Fib3J0aW5nKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRmlyc3RDaHVuayk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICB0aGlzLlJlc3VtZVN1YmZvcm1MYXlvdXQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gYXdhaXQgdGhpcy5TdGFydFN1YlRhc2tzKG1vdmVUb0ZpcnN0Q29udHJvbCwgbm9uSW50ZXJhY3RpdmVUYXNrLCBjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGV4ZWN1dGlvbi1yZWxhdGVkIHN0dWZmLlxyXG4gIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIE9OTFkgZnJvbSBUYXNrLlN0YXJ0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEluaXRpYWxpemVFeGVjdXRpb24oKTogdm9pZCB7XHJcbiAgICAvLyBjdXJyZW50bHkgdGhlIGlzIG5vIGNvbnRyb2wgZXhlY3V0aW5nIHRoZXJlIGZvciB0aGVcclxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRyb2wgaW5kZXggaXMgc2V0IHRvIC0xXHJcbiAgICBzdXBlci5zZXRCcmtMZXZlbChDb25zdEludGVyZmFjZS5CUktfTEVWRUxfUkVDX01BSU4sIC0xKTtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlOyAgICAgIC8vIFdoaWxlIHN0YXJ0aW5nIGEgVGFzaywgc2V0IGZpcnN0UmVjb3JkQ3ljbGUgPSBUUlVFXHJcblxyXG4gICAgdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID0gKCh0aGlzLklzU3ViRm9ybSAmJiAoPE1nRm9ybT50aGlzLmdldFBhcmVudCgpLmdldEZvcm0oKSkuYWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKSlcclxuICAgICAgPyAoPFRhc2s+dGhpcy5nZXRQYXJlbnQoKSkuX2N1cnJTdGFydFByb2dMZXZlbFxyXG4gICAgICA6IFRhc2suU3RhcnRQcm9nTGV2ZWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0aWFsaXplIGZvcm0tcmVsYXRlZCBzdHVmZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSW5pdGlhbGl6ZUZvcm0obW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxSZXR1cm5SZXN1bHQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgLy8gc2V0IE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnIG9uIHRoZSBmb3JtLlxyXG4gICAgICB0aGlzLlNldE1vdmVUb0ZpcnN0Q29udHJvbChtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgICAgLy8gdGhlIEluaXRGb3JtIG1pZ2h0IGNhdXNlIGV4ZWN1dGlvbiBvZiBjb2RlICh2YXJpYWJsZSBjaGFuZ2UpIHNvIHdlIHNob3VsZCBkbyBpdCB3aXRoIGEgbmV3IHNlcnZlciBleGVjdXRpb24gc3RhY2tcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMucm91dGVQYXJhbXMgPSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkdldFJvdXRlUGFyYW1zKCk7XHJcblxyXG4gICAgICAvLyBpbml0aWFsaXplIHRoZSBjdXJyZW50IHRhc2sncyBmb3JtLlxyXG4gICAgICBhd2FpdCB0aGlzLkluaXRGb3JtKCk7XHJcblxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICB0aGlzLmdldE1HRGF0YSgpLlN0YXJ0VGltZXJzKCk7XHJcbiAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBSZXR1cm5SZXN1bHQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc3RhcnQgc3ViIHRhc2tzIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTdGFydFN1YlRhc2tzKG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgbm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIGxldCB0bXBOb25JbnRlcmFjdGl2ZVRhc2s6IFRhc2sgPSAgPFRhc2s+IGF3YWl0IHRhc2suU3RhcnQobW92ZVRvRmlyc3RDb250cm9sLCBjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFzayA9PT0gbnVsbClcclxuICAgICAgICAgIG5vbkludGVyYWN0aXZlVGFzayA9IHRtcE5vbkludGVyYWN0aXZlVGFzaztcclxuICAgICAgICBlbHNlIGlmICh0bXBOb25JbnRlcmFjdGl2ZVRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UsIFwibW9yZSB0aGFuIDEgbm9uIGludGVyYWN0aXZlIGluIHRhc2suc3RhcnRcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBFbmFibGVBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGFjdExpc3Q6IG51bWJlcltdID0gQWN0aW9uTWFuYWdlci5hY3RFbmFibGVkO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZUxpc3QoYWN0TGlzdCwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCwgdHJ1ZSk7XHJcblxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGRlcGVuZGluZyBvbiB0YXNrIHByb3BlcnRpZXNcclxuICAgIGF3YWl0IHRoaXMuZW5hYmxlTW9kZXMoKTtcclxuICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKSkge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBlbmFibGVQcmludGRhdGE6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBLCBmYWxzZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QUklOVF9EQVRBLCBlbmFibGVQcmludGRhdGEpO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2hvdyBlcnJvciBvbiB0YXNrJ3MgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU2hvd0Vycm9yKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1sc1RyYW5zVGV4dDogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLnRyYW5zbGF0ZSh0ZXh0KTtcclxuICAgIGxldCBtbHNUcmFuc1RpdGxlOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKENvbnN0SW50ZXJmYWNlLkVSUk9SX1NUUklORyk7XHJcbiAgICAvLyBtbHMgPz8/XHJcbiAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWxzVHJhbnNUaXRsZSwgbWxzVHJhbnNUZXh0LCBTdHlsZXMuTVNHQk9YX0lDT05fRVJST1IgfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9PSyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIHRoZSByZXN1bHQuIElmIGZhaWxlZCAtIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2Vib3ggYW5kIGVuZCB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEVuZFRhc2tPbkVycm9yKHJlc3VsdDogUmV0dXJuUmVzdWx0LCBkaXNwbGF5RXJyb3I6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MgJiYgIXRoaXMuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgdGhpcy5JblN0YXJ0UHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNwbGF5RXJyb3IpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLlNob3dFcnJvcihyZXN1bHQuRXJyb3JEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBTZXR1cCgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0O1xyXG4gICAgdGhpcy5UYXNrU2VydmljZS5Jbml0VGFza1ByZWZpeEV4ZWN1dGVkRmxhZyh0aGlzKTtcclxuICAgIHRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkID0gZmFsc2U7XHJcblxyXG4gICAgVGFza1NlcnZpY2VCYXNlLkNyZWF0ZUZpcnN0UmVjb3JkKHRoaXMpO1xyXG5cclxuICAgIC8vIGluaXQgZGF0YSB2aWV3XHJcbiAgICAvLyBOb3RlOiBFdmVuIGlmIHRoZSByZXN1bHRJbml0TW9kZSBpcyBmYWxzZSB3ZSBNVVNUIGluaXQgdGhlIGRhdGEgdmlld1xyXG4gICAgbGV0IGRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdCk7XHJcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcblxyXG4gICAgLy8gbmVlZCB0byBjaGVjayByZXN1bHQob2YgdGhlIGRhdGEgdmlldyBpbml0IGFuZCBpZiBub3Qgc3VjY2VzcyB0aGVuIHJldHVybiB0aGlzIGVycm9yXHJcbiAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kLCB3aG9zZSBleGVjdXRpb24gd2FzIGRlbGF5ZWQgYmVjdWFzZSB0YXNrIHdhcyBub3Qgc3RhcnRlZC4gU28gRXhjdXRlIHRob3NlIGNvbW1hbmRzIGFmdGVyIHRhc2sgc3RhcnRlZC5cclxuICAgICAgbGV0IGNvbW1hbmRzOiBMaXN0PElDbGllbnRUYXJnZXRlZENvbW1hbmQ+ID0gR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLmdldENvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBjbWRJZHg6IG51bWJlciA9IDA7IGNtZElkeCA8IGNvbW1hbmRzLmxlbmd0aDsgY21kSWR4KyspIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudFRhcmdldGVkQ29tbWFuZCA9IChjb21tYW5kcy5nZXRfSXRlbShjbWRJZHgpKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLmdldFRhc2tUYWcoKSkge1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZC5FeGVjdXRlKG51bGwpO1xyXG4gICAgICAgICAgR2xvYmFsQ29tbWFuZHNNYW5hZ2VyLkluc3RhbmNlLnJlbW92ZUNvbW1hbmRzRXhlY3V0ZWRBZnRlclRhc2tTdGFydGVkKGNvbW1hbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZGF0YVZpZXdDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLlByZXBhcmUpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuVGFza1NlcnZpY2UuUHJlcGFyZVRhc2sodGhpcyk7XHJcbiAgICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5FbmRUYXNrT25FcnJvcihyZXN1bHQsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQuU3VjY2Vzcykge1xyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuSW5pdERhdGFDb250cm9sVmlld3MpO1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gZmlyc3QgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeFxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgb25seSBmb3IgY29ubmVjdGVkIHRhc2suXHJcbiAgLy8vICAgRm9yIG9mZmxpbmUgdGFzayB3ZSBydW4gRW50ZXJGaXJzdFJlY29yZCBmdW5jdGlvbi4gVGhlcmUgd2UgZXhlY3V0ZSBSUCBhbmQgb3BlbiBzdWJmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGRvRmlyc3RSZWNvcmRDeWNsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5faXNNYWluUHJnKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUU7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCB0aGlzLklzU3ViRm9ybSk7XHJcblxyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgaWYgKHN1YlRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICAoPE1nRm9ybT5zdWJUYXNrLmdldEZvcm0oKSkuSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzdWJUYXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuU3ViZm9ybUV4ZWNNb2RlID0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUztcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgYSBzdWIgZm9ybSBieSBpdHMgbWdkIGRlZmluaXRpb24gKHVzZWQgb25seSB3aGlsZSBpbml0aWF0aW5nIHRhc2sgZm9yIHNldHRpbmcgaXNTdWJmb3JtKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBDaGVja0FuZFNldFN1YkZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLklzU3ViRm9ybSA9ICghc3VwZXIuaXNNYWluUHJvZygpICYmIHRoaXMgIT09IHRoaXMuX21nRGF0YS5nZXRGaXJzdFRhc2soKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgSXNSb3V0ZSgpIHtcclxuICAgIHJldHVybiAodGhpcy5Sb3V0ZXJQYXRoICE9IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzaztcclxuICAgIGlmICh0aGlzLl9hYm9ydGluZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKDApKSAhPSBudWxsKSB7XHJcbiAgICAgICAgdGFzay5zZXREZXN0aW5hdGlvblN1YmZvcm0odGhpcy5fZGVzdGluYXRpb25TdWJmb3JtKTtcclxuICAgICAgICBhd2FpdCB0YXNrLnN0b3AoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5faXNNYWluUHJnKVxyXG4gICAgICB0aGlzLl9hYm9ydGluZyA9IHRydWU7XHJcblxyXG4gICAgLy8gaWYgdGhpcyB0YXNrIGFuZCBpdHMgcGFyZW50IGFyZSBmcm9tIGRpZmZlcmVudCBNR0RBVEEgb2JqZWN0cyB0aGVuIGRpc2Nvbm5lY3RcclxuICAgIC8vIHRoZW0gYnkgcmVtb3ZpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGlzIHRhc2sgZnJvbSBpdHMgcGFyZW50XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudFRhc2sucmVtb3ZlU3ViVGFzayh0aGlzKTtcclxuICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IG9sZFRpbWVyczogTGlzdDxudW1iZXI+ID0gbmV3IExpc3Q8bnVtYmVyPigpLCBuZXdUaW1lcnMgPSBuZXcgTGlzdDxudW1iZXI+KCk7XHJcbiAgICAgICAgbGV0IG1nZCA9IHRoaXMuZ2V0TUdEYXRhKCk7XHJcblxyXG4gICAgICAgIGlmIChtZ2QuZ2V0VGltZXJIYW5kbGVycygpICE9IG51bGwpXHJcbiAgICAgICAgICBvbGRUaW1lcnMgPSBtZ2QuZ2V0VGltZXJIYW5kbGVycygpLmdldFRpbWVyc1ZlY3RvcigpO1xyXG4gICAgICAgIG1nZC5yZW1vdmVUaW1lckhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgbWdkLnJlbW92ZUV4cHJlc3Npb25IYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIGlmIChtZ2QuZ2V0VGltZXJIYW5kbGVycygpICE9IG51bGwpXHJcbiAgICAgICAgICBuZXdUaW1lcnMgPSBtZ2QuZ2V0VGltZXJIYW5kbGVycygpLmdldFRpbWVyc1ZlY3RvcigpO1xyXG4gICAgICAgIG1nZC5jaGFuZ2VUaW1lcnMob2xkVGltZXJzLCBuZXdUaW1lcnMpO1xyXG5cclxuICAgICAgICBtZ2QucmVtb3ZlVGFzayh0aGlzKTtcclxuICAgICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmFib3J0KDxNZ0Zvcm0+dGhpcy5nZXRGb3JtKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5BYm9ydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgLy8gSWYgdGhlIHRhc2sgZ290IGNsb3NlZCBkdWUgdG8gYSBjbGljayBvbiBzYW1lIHRhc2ssIHRoZW4gc2V0IEN1cnJlbnRDbGlja2VkQ3RybCB0byBudWxsXHJcbiAgICBpZiAodGhpcy5nZXRDbGlja2VkQ29udHJvbCgpICE9IG51bGwpXHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsKVxyXG4gICAgICAoPE1nRm9ybT50aGlzLkZvcm0pLnJlbW92ZVJlZnNUb0N0cmxzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgIGxldCBzdWJGb3JtID0gPE1nQ29udHJvbD50aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuXHJcbiAgICAgIHN1YkZvcm0uc2V0U3ViZm9ybVRhc2tJZChudWxsKTtcclxuICAgICAgc3ViRm9ybS5pbml0U3ViZm9ybVRhc2soKTtcclxuXHJcbiAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgPT09IHRoaXMpXHJcbiAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLnNldExhc3RGb2N1c2VkVGFzayh0aGlzLl9wYXJlbnRUYXNrKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjMzEwMTEzLiBJZiB0aGUgc3ViZm9ybSB0YXNrIGZvciB3YXMgbm90IGxvYWRlZCB5ZXQsIGRvIG5vdCByZWZyZXNoIGl0LlxyXG4gICAgICBpZiAoc3ViRm9ybS5TdWJmb3JtTG9hZGVkKVxyXG4gICAgICAgIGF3YWl0IChzdWJGb3JtLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSkpLlJlZnJlc2hEaXNwbGF5KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjbGVhckRhdGFWaWV3Q29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuQ2xlYXIpO1xyXG4gICAgYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbGVhckRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGFib3J0IHRoZSBNZ0RhdGEgdG8gd2hpY2ggdGhlIHRhc2sgYmVsb25nc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYWJvcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldE1HRGF0YSgpLmFib3J0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGhhcyBzdWItdGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGhhc1N1YlRhc2tzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuU3ViVGFza3MgIT09IG51bGwgJiYgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEEgbnVtYmVyLCAxLTI0LCB0aGUgY3VycmVudCB0YXNrJ3MgZGVwdGggaW4gdGhlIHRhc2sgZXhlY3V0aW9uIGhpZXJhcmNoeS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkZXB0aCBvZiB0aGUgdGFzaywgMSBpZiBjYWxsZWQgZnJvbSB0aGUgcm9vdCB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldFRhc2tEZXB0aChieVBhcmVudE9yZGVyOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChieVBhcmVudE9yZGVyKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXIpO1xyXG5cclxuXHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9ICg8VGFzaz4gdGhpcy5HZXRDb250ZXh0VGFzaygpKS5nZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXIpO1xyXG5cclxuICAgIC8vIFFDUiAzNjY3NDggaWYgd2UgYXJlIGluIGEgY29tcG9uZW50IGhhbmRsZXIgYWRkIGl0IHRvIHRoZSBwYXRoXHJcbiAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gQ29uc3RJbnRlcmZhY2UuVE9QX0xFVkVMX0NPTlRBSU5FUilcclxuICAgICAgZGVwdGggPSBkZXB0aCArIDE7XHJcblxyXG4gICAgcmV0dXJuIGRlcHRoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhlbHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBnZXRUYXNrRGVwdGggcmVjdXJzaW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJieVBhcmVudE9yZGVyXCI+aWYgdHJ1ZSwgd2UgdHJhdmVsIHRoZSBwYXJlbnRzLCBvdGhlcndpc2Ugd2UgdHJhdmVsIHRoZSB0cmlnZ2VyaW5nIHRhc2tzPC9wYXJhbT5cclxuICBwcml2YXRlIGdldFRhc2tEZXB0aF8oYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wVGFzazogVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuICAgIGlmICh0bXBUYXNrID09IG51bGwgfHwgYnlQYXJlbnRPcmRlcilcclxuICAgICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLyogaWYgdGhlIGN0bElkeCBvZiB0aGUgY3VycmVudCB0YXNrIGFuZCB0aGUgcGFyZW50IGFyZSBkaWZmZXJlbnQsICAgKi9cclxuICAgICAgICAvKiB0aGF0IGlzIHRoZSBjdXJyZW50IHRhc2sgaXMgZnJvbSBhIGNvbXBvbmVudCwgYWRkIHRoZSBjb21wb25lbnQncyAqL1xyXG4gICAgICAgIC8qIE1haW4gUHJnIGFzIHdlbGwuICovXHJcbiAgICAgICAgaWYgKGJ5UGFyZW50T3JkZXIgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRDdGxJZHgoKSlcclxuICAgICAgICAgIHJldHVybiAyICsgdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXIpO1xyXG4gICAgICAgIHJldHVybiAxICsgdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXIpO1xyXG4gICAgICB9XHJcbiAgICByZXR1cm4gMSArICh0bXBUYXNrKS5nZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYW5jZXN0b3Igb2YgdGhlIFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ2VuZXJhdGlvblwiPm9mIHRoZSBhbmNlc3RvciB0YXNrPC9wYXJhbT5cclxuICBHZXRUYXNrQW5jZXN0b3IoZ2VuZXJhdGlvbjogbnVtYmVyKTogSVRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza0FuY2VzdG9yXyhnZW5lcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0VGFza0FuY2VzdG9yXyhnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzayB7XHJcbiAgICBsZXQgcmV0VGFzazogSVRhc2sgPSBudWxsO1xyXG5cclxuICAgIGlmIChnZW5lcmF0aW9uID09PSAwKVxyXG4gICAgICByZXRUYXNrID0gdGhpcztcclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgdG1wVGFzazogVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuICAgICAgaWYgKHRtcFRhc2sgPT09IG51bGwpXHJcbiAgICAgICAgdG1wVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgICAgIGlmICh0bXBUYXNrICE9PSBudWxsKVxyXG4gICAgICAgIHJldFRhc2sgPSB0bXBUYXNrLmdldFRhc2tBbmNlc3Rvcl8oLS1nZW5lcmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0YXNrIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFRhc2tEZXB0aCgpOiBudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUYXNrRGVwdGgoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWZmIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IHRhc2sgY29udGFpbnMgdGhlIHRhc2sgcGFzc2VkIGFzIHBhcmFtZXRlcjwvcmV0dXJucz5cclxuICBwYXRoQ29udGFpbnModGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90YXNrUGF0aC5Db250YWlucyg8VGFzaz50YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBjb250ZXh0IHRhc2sgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbnRleHRcIj50aGUgbmV3IGNvbnRleHQgdGFzayBvZiB0aGUgY3VycmVudCB0YXNrPC9wYXJhbT5cclxuICBTZXRDb250ZXh0VGFzayhjb250ZXh0OiBUYXNrQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5Db250ZXh0VGFzayA9IDxUYXNrPmNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdGFzayB3aGljaCBpcyB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBoYW5kbGVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0Q29udGV4dFRhc2soKTogSVRhc2sge1xyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9ICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEN1cnJSZWMoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuSW5TdGFydFByb2Nlc3NcclxuICAgICAgfHwgY3VyclJlYyAhPT0gbnVsbCAmJiAoY3VyclJlYy5JbkNvbXB1dGUgfHwgY3VyclJlYy5JblJlY29tcHV0ZSlcclxuICAgICAgfHwgdGhpcy5Gb3JtICE9PSBudWxsICYmIHRoaXMuRm9ybS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG5cclxuICAgIHJldHVybiB0aGlzLkNvbnRleHRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgdGFzayB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlciB3aGljaCBjcmVhdGVkIG1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUcmlnZ2VyaW5nVGFzaygpOiBUYXNrIHtcclxuICAgIC8vIFRoaXMgaXMgYSBzZW1pIHBhdGNoIHdoaWNoIGZpeGVzIHByb2JsZW1zIHN1Y2ggYXMgdGhlIG9uZXMgaW4gUUNSICMyOTY0MjhcclxuICAgIC8vIFdoZW4gYSBtb2RhbCB0YXNrIGdldHMgb3BlbmVkLCBpdCBtaWdodCBzZXQgaXRzIHRyaWdnZXJpbmcgdGFzayB0byBhIHRhc2tcclxuICAgIC8vIHdob3NlICdhYm9ydCcgY29tbWFuZCBhcnJpdmVkIGFuZCBpcyBwZW5kaW5nIGZvciBleGVjdXRpb24uIFVuZGVyIHRoZXNlXHJcbiAgICAvLyBjaXJjdW1zdGFuY2VzLCB3ZSBtdXN0IGNoZWNrIGV2ZXJ5IGFjY2VzcyB0byB0cmlnZ2VyaW5nVGFzayBhbmQgbWFrZSBzdXJlXHJcbiAgICAvLyBpdCBwb2ludHMgdG8gYSB2YWxpZCB0YXNrLlxyXG4gICAgaWYgKHRoaXMuX3RyaWdnZXJpbmdUYXNrICE9PSBudWxsICYmIHRoaXMuX3RyaWdnZXJpbmdUYXNrLmdldE1HRGF0YSgpLklzQWJvcnRpbmcpXHJcbiAgICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlcmluZ1Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBsYXN0IHBhcmtlZCBjb250cm9sIGluIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+bGFzdCBmb2N1c2VkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHNldExhc3RQYXJrZWRDdHJsKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHN1cGVyLnNldExhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0aGlzLCBjdHJsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBRdWVyeSBUYXNrIFBhdGggUmV0dXJucyB0aGUgdGFzayBwYXRoIHRoYXQgbGVhZHMgdG8gdGhlIGN1cnJlbnQgdGFzay4gVGhlIHJlc3VsdGluZyBhbHBoYSBzdHJpbmdcclxuICAvLy8gICBjb250YWlucyB0aGUgdGFzayBuYW1lcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBuYW1lIG9mIHRoZSB0YXNrLiBOYW1lcyBhcmUgc2VwYXJhdGVkIGJ5IHRoZSAnOydcclxuICAvLy8gICBjaGFyYWN0ZXIuIEZvciBQUk9HKCkgdXNpbmcuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBxdWVyeVRhc2tQYXRoKCk6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGluc2VydGVkTmFtZXM6IG51bWJlciA9IDA7ICAgICAgICAvLyBob3cgbWFjaCBuYW1lcyBpbnNlcnRlZCB0byB0aGUgb3V0cHV0IHN0cmluZ1xyXG4gICAgbGV0IHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKDc5MzYpOyAvLyAzMSAqIDI1NiAqL1xyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aChmYWxzZSkpO1xyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgZmFsc2UpO1xyXG4gICAgZm9yIChsZXQgdHNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdHNrID49IDA7IHRzay0tKSB7XHJcbiAgICAgIGxldCBjdXJyVHNrOiBUYXNrID0gdHJlZVJvdXRlW3Rza107XHJcbiAgICAgIGlmIChjdXJyVHNrLmlzTWFpblByb2coKSlcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgbGV0IG5hbWVQcm9wOiBQcm9wZXJ0eSA9IGN1cnJUc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKTtcclxuICAgICAgaWYgKG5hbWVQcm9wID09IG51bGwpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSBuYW1lUHJvcC5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgb25seSAxIG5hbWUgLT4gZG9uJ3QgaW5zZXJ0ICc7J1xyXG4gICAgICAgIC8vIGFmdGVyIGxhc3QgbmFtZSBkb24ndCBpbnNlcnQgJzsnIHRvby5cclxuICAgICAgICBpZiAoaW5zZXJ0ZWROYW1lcysrICE9PSAwKVxyXG4gICAgICAgICAgcmVzdWx0LkFwcGVuZCgnOycpO1xyXG4gICAgICAgIHJlc3VsdC5BcHBlbmQobmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IEZpZWxkIHdoaWNoIGNvbnRhaW4gaXRlbSBudW1iZXIgaXRtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjdGxfaXRtXzJfcGFyZW50X3ZlZShpdG06IG51bWJlcik6IEZpZWxkIHtcclxuICAgIGxldCBjdXJyVHNrOiBUYXNrO1xyXG4gICAgbGV0IGN1cnJJdG06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGFzdEl0bTogbnVtYmVyID0gMDsgICAgICAvLyBzdGFydCBvZiB0aGUgZmllbGQgaW4gZmllbGRlVGFiIG51bWJlciBmb3IgY2hlY2tlZCB0YXNrXHJcbiAgICAvLyBzYXZlIHRoZSByb3V0ZSB0byB0aGUgcm9vdCBpbiB0aGUgdHJlZVJvdXRlIGFycmF5XHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoLTFdXHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICBmb3IgKGxldCB0c2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0c2sgPj0gMDsgdHNrLS0pIHtcclxuICAgICAgY3VyclRzayA9IHRyZWVSb3V0ZVt0c2tdO1xyXG5cclxuICAgICAgY3Vyckl0bSArPSBjdXJyVHNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgIC8vIGZvdW5kIHRhc2sgd2hpY2ggY29udGFpbnMgdGhlIG5lZWRlZCBmaWVsZFxyXG4gICAgICBpZiAoaXRtIDwgY3Vyckl0bSkge1xyXG4gICAgICAgIC8vIG51bWJlciBvZiBGaWVsZCBpbiBmb3VuZCB0YXNrXHJcbiAgICAgICAgaXRtIC09IGxhc3RJdG07XHJcbiAgICAgICAgcmV0dXJuIDxGaWVsZD5jdXJyVHNrLkRhdGFWaWV3LmdldEZpZWxkKGl0bSk7XHJcbiAgICAgIH1cclxuICAgICAgbGFzdEl0bSA9IGN1cnJJdG07XHJcbiAgICB9XHJcbiAgICAvLyBub3QgZm91bmQgdGhlIGZpZWxkXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250cm9sIGlkIHdoaWNoIGNvbnRhaW4gZmllbGQgYXR0YWNoZWQgdG8gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRlbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb250cm9sSURGcm9tVmFySXRlbShpdGVtOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGN1cnJJdGVtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxhc3RJdGVtOiBudW1iZXIgPSAwOyAgIC8vIHN0YXJ0IG9mIHRoZSBmaWVsZCBpbiBmaWVsZGVUYWIgbnVtYmVyIGZvciBjaGVja2VkIHRhc2tcclxuICAgIGxldCBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzazogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBzYXZlIHRoZSByb3V0ZSB0byB0aGUgcm9vdCBpbiB0aGUgdHJlZVJvdXRlIGFycmF5XHJcbiAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoIC0gMV1cclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIHRydWUpO1xyXG5cclxuICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0YXNrID49IDA7IHRhc2stLSkge1xyXG4gICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuICAgICAgY3Vyckl0ZW0gKz0gY3VyclRhc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgLy8gRm91bmQgdGhlIHRhc2sgd2hpY2ggY29udGFpbnMgdGhlIG5lZWRlZCBjb250cm9sICYgZmllbGRcclxuICAgICAgaWYgKGl0ZW0gPCBjdXJySXRlbSkge1xyXG4gICAgICAgIC8vIE51bWJlciBvZiBmaWVsZHMgaW4gZm91bmQgdGFza1xyXG4gICAgICAgIGl0ZW0gLT0gbGFzdEl0ZW07XHJcblxyXG4gICAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+Y3VyclRhc2suRGF0YVZpZXcuZ2V0RmllbGQoaXRlbSk7XHJcbiAgICAgICAgaWYgKGZpZWxkLmdldEN0cmwoKSAhPSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrID0gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2sgKyBjdXJyVGFzay5Gb3JtLmdldENvbnRyb2xJZHgoZmllbGQuZ2V0Q3RybCgpKSArIDE7XHJcblxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3VyclRhc2suRm9ybSAhPSBudWxsKVxyXG4gICAgICAgIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICs9IGN1cnJUYXNrLkZvcm0uZ2V0Q3RybENvdW50KCk7XHJcblxyXG4gICAgICBsYXN0SXRlbSA9IGN1cnJJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnRyb2wgYXR0YWNoZWQgdG8gdGhlIHZhcmlhYmxlIGluIHNhbWUgdGFzayBub3QgZm91bmRcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGNvbnRyb2wgZnJvbSBjb250cm9sSURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb250cm9sRnJvbUNvbnRyb2xJRChjb250cm9sSUQ6IG51bWJlciwgcGFyZW50OiBSZWZQYXJhbTxudW1iZXI+KTogTWdDb250cm9sIHtcclxuICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgcGFyZW50LnZhbHVlID0gLTE7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xJRCA+PSAwKSB7XHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgIGxldCBjYWxsZXJUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgICAgbGV0IG5vT2ZDb250cm9sc0luQ3VycnRhc2s6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzazogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGNvbnRyb2xJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAvLyBzYXZlIHRoZSByb3V0ZSB0byB0aGUgcm9vdCBpbiB0aGUgdHJlZVJvdXRlIGFycmF5XHJcbiAgICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSkpO1xyXG5cclxuICAgICAgLy8gdGhlIHJvdXRlIHVwLCB0aGUgaW5zZXJ0IChvdXIgdGFzaykgaXMgWzBdLCBhbmQgZXhpdCAocm9vdCkgaXMgW3RyZWVSb3V0ZS5sZW5ndGggLSAxXVxyXG4gICAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0YXNrID49IDA7IHRhc2stLSkge1xyXG5cclxuICAgICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJUYXNrLkZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgbm9PZkNvbnRyb2xzSW5DdXJydGFzayA9IGN1cnJUYXNrLkZvcm0uZ2V0Q3RybENvdW50KCk7XHJcblxyXG4gICAgICAgICAgLy8gRm91bmQgdGhlIHRhc2sgd2hpY2ggY29udGFpbnMgdGhlIG5lZWRlZCBjb250cm9sXHJcbiAgICAgICAgICBpZiAoY29udHJvbElEIDwgKG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICsgbm9PZkNvbnRyb2xzSW5DdXJydGFzaykpIHtcclxuICAgICAgICAgICAgLy8gSWR4IG9mIHRoZSBjb250cm9sIGluIGN1cnJlbnQgdGFza1xyXG4gICAgICAgICAgICBjb250cm9sSWR4ID0gY29udHJvbElEIC0gbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s7XHJcbiAgICAgICAgICAgIGNvbnRyb2wgPSA8TWdDb250cm9sPmN1cnJUYXNrLkZvcm0uQ3RybFRhYi5nZXRDdHJsKGNvbnRyb2xJZHgpO1xyXG4gICAgICAgICAgICBjYWxsZXJUYXNrID0gY3VyclRhc2s7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICs9IG5vT2ZDb250cm9sc0luQ3VycnRhc2s7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBHZXQgcGFyZW50XHJcbiAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICBwYXJlbnQudmFsdWUgPSAwO1xyXG4gICAgICAgIGxldCBwcmV2Q3RsSWR4OiBudW1iZXIgPSB0cmVlUm91dGVbMF0uVGFza0RlZmluaXRpb25JZC5DdGxJbmRleDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgdGFzazogbnVtYmVyID0gMDsgdGFzayA8IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyB0YXNrKyspIHtcclxuICAgICAgICAgIGN1cnJUYXNrID0gdHJlZVJvdXRlW3Rhc2tdO1xyXG5cclxuICAgICAgICAgIGlmIChwcmV2Q3RsSWR4ICE9PSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4KVxyXG4gICAgICAgICAgICBwYXJlbnQudmFsdWUrKztcclxuXHJcbiAgICAgICAgICBpZiAoY2FsbGVyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4ID09PSBjdXJyVGFzay5UYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4KVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBwcmV2Q3RsSWR4ID0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBDb250cm9sSURcclxuICAgIHJldHVybiBjb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3RsX2l0bV80X3BhcmVudF92ZWUocGFyZW50OiBudW1iZXIsIHZlZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0c2s6IFRhc2s7XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpO1xyXG5cclxuICAgIGlmIChwYXJlbnQgIT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRCAmJiBkZXB0aCA8PSBwYXJlbnQpXHJcbiAgICAgIHJldHVybiB2ZWU7XHJcblxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheShkZXB0aCk7XHJcblxyXG4gICAgaWYgKHZlZSAhPT0gMCkge1xyXG4gICAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICAgIC8vIGdldCB0aGUgaW5kZXggb2YgcGFyZW50IGluIHRoZSB0YXNrIHRyZWVcclxuICAgICAgbGV0IGluZE9mUGFyZW50SW5UYXNrVHJlZTogbnVtYmVyID0gdGhpcy5nZXRJbmRPZlBhcmVudEluVGFza1RyZWUocGFyZW50LCB0cmVlUm91dGUpO1xyXG5cclxuICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgZm9yIChpID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IGkgPiBpbmRPZlBhcmVudEluVGFza1RyZWU7IGktLSkge1xyXG4gICAgICAgIHRzayA9IHRyZWVSb3V0ZVtpXTtcclxuICAgICAgICB2ZWUgKz0gdHNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZlZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tUcmVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEluZE9mUGFyZW50SW5UYXNrVHJlZShwYXJlbnQ6IG51bWJlciwgdGFza1RyZWU6IFRhc2tbXSk6IG51bWJlciB7XHJcbiAgICBsZXQgaW5kT2ZQYXJlbnRJblRhc2tUcmVlOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHBhcmVudCA9PT0gVGFza0Jhc2UuTUFJTl9QUkdfUEFSRU5UX0lEKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCB0YXNrVHJlZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmICh0YXNrVHJlZVtpXS5pc01haW5Qcm9nKCkgJiYgdGhpcy5fY3RsSWR4ID09PSB0YXNrVHJlZVtpXS5nZXRDdGxJZHgoKSkge1xyXG4gICAgICAgICAgaW5kT2ZQYXJlbnRJblRhc2tUcmVlID0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBpbmRPZlBhcmVudEluVGFza1RyZWUgPSBwYXJlbnQ7XHJcblxyXG4gICAgcmV0dXJuIGluZE9mUGFyZW50SW5UYXNrVHJlZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbnRyeSBwb2ludCB0byB0aGUgcmVjdXJzaW9uIGluZHVjZWQgYnkgZ2V0RmllbGRCeU5hbWVfLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIGZpZWxkIHdoaWNoIGJlbG9uZ3MgdG8gbWUgb3IgdG8gbXkgcGFyZW50cyB3aXRoIHRoZSBtYXRjaGluZyBuYW1lPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkQnlOYW1lKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuICAgIHJldHVybiAoPFRhc2s+ICh0aGlzLkdldENvbnRleHRUYXNrKCkpKS5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmluZCBmaWVsZCB3aXRoIHRoZSBuYW1lIGluIHRhc2sgb3IgaXRzIGFuY2VzdG9yc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+bmFtZSwgdGhlIG5hbWUgY2FuIGJlIGVtcHR5IHN0cmluZyB0b288L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbm90IGZvdW5kIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIE5VTEwuPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxke1xyXG4gICAgbGV0IHRtcFRhc2s6IFRhc2s7XHJcblxyXG4gICAgaWYgKGZsZE5hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmxkTmFtZSk7XHJcblxyXG4gICAgLy8gaWYgdGhlIGZpZWxkIGlzIG5vdCBvdXJzIC0gcmVjdXJzaXZlIGNoZWNrIHRoZSBhbmNlc3RvcnNcclxuICAgIGlmIChmbGQgPT0gbnVsbCkge1xyXG4gICAgICB0bXBUYXNrID0gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpICE9IG51bGwgPyB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCkgOiB0aGlzLl9wYXJlbnRUYXNrO1xyXG5cclxuICAgICAgaWYgKHRtcFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc01haW5Qcm9nKCkgJiYgdGhpcy5nZXRDdGxJZHgoKSAhPT0gdG1wVGFzay5nZXRDdGxJZHgoKSkge1xyXG4gICAgICAgICAgbGV0IG1haW5Qcmc6IFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgdGhpcy5nZXRDdGxJZHgoKSk7XHJcbiAgICAgICAgICBmbGQgPSBtYWluUHJnLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmbGQgPT0gbnVsbClcclxuICAgICAgICAgIGZsZCA9IHRtcFRhc2suZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBpbmRleCBvZiB0aGUgZmllbGQgaW4gdGhlIHRhc2sgb3IgaXRzIGFuY2VzdG9yc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+bmFtZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFplcm8uPC9yZXR1cm5zPlxyXG4gIGdldEluZGV4T2ZGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSB0aGlzLmdldFRhc2tEZXB0aCh0cnVlKTtcclxuICAgIGxldCBpbmRleDogbnVtYmVyID0gMDtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gdGhpcy5nZXRGaWVsZEJ5TmFtZShmbGROYW1lKTtcclxuICAgIGxldCBmbGRUYWI6IEZpZWxkc1RhYmxlO1xyXG5cclxuICAgIGlmIChmbGQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIDA7XHJcblxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheShkZXB0aCk7XHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuICAgIGZvciAobGV0IGN1cnI6IG51bWJlciA9IGRlcHRoIC0gMTsgY3VyciA+PSAwOyBjdXJyLS0pIHtcclxuICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gdHJlZVJvdXRlW2N1cnJdO1xyXG4gICAgICBpZiAoY3VyclRhc2sgPT09IGZsZC5nZXRUYXNrKCkpIHtcclxuICAgICAgICBjdXJyID0gZmxkLmdldElkKCk7XHJcbiAgICAgICAgaW5kZXggKz0gKytjdXJyOyAgICAgICAgIC8vIHN0YXJ0IGluZGV4IGluIE1hZ2ljIGZyb20gMSBhbmQgbm90IGZyb20gMFxyXG4gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAvLyBnZXQgb3V0IG9mIHRoZSB0YXNrIHRyZWUgLSB0aGUgaW5kZXggaXMgZm91bmRcclxuICAgICAgfVxyXG4gICAgICBmbGRUYWIgPSA8RmllbGRzVGFibGU+Y3VyclRhc2suRGF0YVZpZXcuR2V0RmllbGRzVGFiKCk7XHJcbiAgICAgIGluZGV4ICs9IGZsZFRhYi5nZXRTaXplKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsY3VsYXRlIHRoZSBwYXRoIGZyb20gdGhpcyB0YXNrIHRvIHRoZSByb290IG9mIHRoZSB0YXNrcyB0cmVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhdGhcIj5hcnJheSBvZiB0YXNrcywgdGhlIHJvdXRlIHVwLiBUaGUgMCBpdGVtIGlzIHN0YXJ0IHBvaW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgcGF0aFRvUm9vdChwYXRoOiBUYXNrW10sIGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gKGJ5UGFyZW50T3JkZXIgPyB0aGlzIDogPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcGF0aFtpXSA9IHRhc2s7XHJcbiAgICAgIGxldCBjdGxJZHg6IG51bWJlciA9IHRhc2suZ2V0Q3RsSWR4KCk7XHJcblxyXG4gICAgICBsZXQgdG1wVGFzazogVGFzayA9IGJ5UGFyZW50T3JkZXIgPyBudWxsIDogdGFzay5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG5cclxuICAgICAgaWYgKHRtcFRhc2sgIT0gbnVsbClcclxuICAgICAgICB0YXNrID0gdG1wVGFzaztcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrID09IG51bGwpIHtcclxuICAgICAgICAgIC8vIFFDUiAzNjY3NDggaWYgd2UgYXJlIGluIGEgY29tcG9uZW50IGdsb2JhbCBoYW5kbGVyIGFkZCBpdCB0byB0aGUgcGF0aFxyXG4gICAgICAgICAgaWYgKCFieVBhcmVudE9yZGVyICYmIHRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IENvbnN0SW50ZXJmYWNlLlRPUF9MRVZFTF9DT05UQUlORVIpXHJcbiAgICAgICAgICAgIHBhdGhbaSArIDFdID0gdGhpcztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJ5UGFyZW50T3JkZXIgJiYgY3RsSWR4ICE9PSB0YXNrLmdldEN0bElkeCgpKVxyXG4gICAgICAgICAgcGF0aFsrK2ldID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGN0bElkeCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIHRhc2sgc2hvdWxkIGJlIHJlZnJlc2hlZCAtIGNvbXBhcmUgdGhlIFwicmVmcmVzaCBvblwiIGZpZWxkcyBvZiB0aGUgY3VycmVudCByZWNvcmQgdG8gdGhlXHJcbiAgLy8vICAgcHJldmlvdXMgcmVjb3JkIGFuZCBpZiBkaWZmZXJlbnQgdmFsdWVzIGFyZSBmb3VuZCByZXR1cm5zIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2hvdWxkQmVSZWZyZXNoZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZGF0YVZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3BhcmVudFRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gcHJldkN1cnJSZWMgaXMgbnVsbCBvbmx5IGlmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIG9yIGFmdGVyIENhbmNlbC5cclxuICAgIC8vIEFmdGVyIENhbmNlbCBpbiB0aGUgcGFyZW50IHRhc2sgU3ViZm9ybSByZWZyZXNoIG11c3QgYmUgZG9uZSBhbHdheXNcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsIHx8IGRhdGFWaWV3LmlzUHJldkN1cnJSZWNOdWxsKCkgfHxcclxuICAgICAgKHRoaXMuUmVmcmVzaE9uVmFycyAhPT0gbnVsbCAmJiAhZGF0YVZpZXcuY3VyckVxdWFsc1ByZXYodGhpcy5SZWZyZXNoT25WYXJzKSkpXHJcbiAgICAgIHJlc3VsdCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHN1YlRhc2tzIChzdWJmb3Jtcykgc2hvdWxkIGJlIHJlZnJlc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgQ2hlY2tSZWZyZXNoU3ViVGFza3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmV0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZG8gbm90IHJlZnJlc2ggc3ViZm9ybXMgYmVmb3JlIHRoZSBmaXJzdCByZWNvcmQgcHJlZml4LiBUaGUgc2VydmVyIHNlbnQgdXMgdGhlaXIgZGF0YXZpZXchXHJcbiAgICBpZiAodGhpcy5fZW50ZXJlZFJlY0xldmVsKSB7XHJcbiAgICAgIGxldCBzdWJmb3Jtc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IGF3YWl0IHRoaXMuR2V0U3ViZm9ybXNUb1JlZnJlc2goKTtcclxuXHJcbiAgICAgIGlmIChzdWJmb3Jtc1RvUmVmcmVzaC5sZW5ndGggPiAwKVxyXG4gICAgICAgIHJldCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIGEgbGlzdCBvZiBzdWJ0YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmEgbGlzdCBvZiBzdWJ0YXNrczwvcmV0dXJucz5cclxuICBwcml2YXRlIEdldFN1YlRhc2tzKCk6IExpc3Q8VGFzaz4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKVxyXG4gICAgICAgIHN1YlRhc2tzLnB1c2goPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3ViVGFza3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgYSBsaXN0IG9mIHRob3NlIHN1YmZvcm1zIHRoYXQgbXVzdCBiZSByZWZyZXNoZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+bGlzdCBvZiBzdWJmb3JtcyB0byByZWZyZXNoPC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldFN1YmZvcm1zVG9SZWZyZXNoKCk6IFByb21pc2U8TGlzdDxUYXNrPj4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG4gICAgbGV0IHN1YlRhc2tzVG9SZWZyZXNoOiBMaXN0PFRhc2s+ID0gbmV3IExpc3Q8VGFzaz4oKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKGF3YWl0IHRoaXMuU2hvdWxkUmVmcmVzaFN1YmZvcm1UYXNrKHN1YlRhc2spKVxyXG4gICAgICAgIHN1YlRhc2tzVG9SZWZyZXNoLnB1c2goc3ViVGFzaylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3ViVGFza3NUb1JlZnJlc2g7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayBpZiB0aGUgc3BlY2lmaWMgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBTaG91bGRSZWZyZXNoU3ViZm9ybVRhc2soc3ViVGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5zdWJUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG5cclxuICAgIHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcbiAgICAvLyBEZWZlY3QgNzY5NzkuIFN1YmZvcm0gY2FuIGV4ZWN1dGUgcmVmcmVzaCBvbmx5IGFmdGVyIGl0IGhhcyBUYXNrVmlldy5cclxuICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsICYmICFzdWJUYXNrLkluU2VsZWN0ICYmIHN1YlRhc2suQWZ0ZXJGaXJzdFJlY29yZFByZWZpeCkge1xyXG4gICAgICBsZXQgcGFyZW50TW9kZTogc3RyaW5nID0gdGhpcy5nZXRNb2RlKCk7XHJcbiAgICAgIGxldCBtb2RlUHJvcGVydHk6IG51bWJlciA9IChwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZID8gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUVVFUllcclxuICAgICAgICA6IHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFKTtcclxuXHJcbiAgICAgIC8vIEZvciBhIHN1YmZvcm0gd2l0aCAnQXNQYXJlbnQnIG1vZGUgd2UgYWxzbyBtdXN0IHJlZnJlc2ggdGhlIHN1YmZvcm1cclxuICAgICAgLy8gYWZ0ZXIgdGhlIHBhcmVudCByZWNvcmQgcHJlZml4LiBJZiB0aGUgc3BlY2lmaWMgbW9kZSBpcyBub3QgYWxsb3dlZFxyXG4gICAgICAvLyB0aGUgc3ViZm9ybSBjb250aW51ZXMgaW4gdGhlIG9sZCBtb2RlLlxyXG4gICAgICBpZiAoc3ViVGFzay5Nb2RlQXNQYXJlbnQgJiYgcGFyZW50TW9kZSAhPT0gc3ViVGFzay5nZXRNb2RlKCkgJiZcclxuICAgICAgICB0aGlzLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCAmJlxyXG4gICAgICAgIGF3YWl0IChzdWJUYXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkgJiZcclxuICAgICAgICBhd2FpdCBzdWJUYXNrLmNoZWNrUHJvcChtb2RlUHJvcGVydHksIHRydWUpKSB7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgIWF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUZSRVNIX1dIRU5fSElEREVOLCBmYWxzZSkpIHtcclxuICAgICAgICAgIHN1YmZvcm1DdHJsLlJlZnJlc2hPblZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgcmVmcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZWZyZXNoID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgYXdhaXQgc3ViVGFzay5TZXRNb2RlQXNQYXJlbnQocGFyZW50TW9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVmcmVzaCA9IGF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0gsIHRydWUpICYmIHN1YlRhc2suc2hvdWxkQmVSZWZyZXNoZWQoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcclxuICAgICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICAgIWF3YWl0IHN1YmZvcm1DdHJsLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUZSRVNIX1dIRU5fSElEREVOLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgc3ViZm9ybUN0cmwuUmVmcmVzaE9uVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZWZyZXNoKVxyXG4gICAgICAgIHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZWZyZXNoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXRzIHRoZSB0YXNrIG1vZGUgYXMgcGFyZW50IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudE1vZGVcIj48L3BhcmFtPlxyXG4gIGFzeW5jIFNldE1vZGVBc1BhcmVudChwYXJlbnRNb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZW5hYmxlTW9kZXMoKTtcclxuXHJcbiAgICBpZiAocGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFKTtcclxuICAgICAgYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgbGV0IHN1YlRhc2tEdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5EYXRhVmlldztcclxuICAgICAgaWYgKCFzdWJUYXNrRHYuaXNFbXB0eSgpICYmIChzdWJUYXNrRHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgdGhpcy5zZXRNb2RlKHBhcmVudE1vZGUpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGhpcy5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnNldE1vZGUocGFyZW50TW9kZSk7XHJcblxyXG4gICAgdGhpcy5zZXRPcmlnaW5hbFRhc2tNb2RlKHBhcmVudE1vZGUpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vIGFmdGVyIGNvbXB1dGUgZG8gc3ViZm9ybSB0YXNrIHJlY29yZCBwcmVmaXggJiBzdWZmaXhcclxuICBhc3luYyBkb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcblxyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBpZiAoc3ViVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXgpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDbGVhbiBmbGFnIGZvciBTdWJmb3JtIHJlY29yZCBjeWNsZSA8L3N1bW1hcnk+XHJcbiAgQ2xlYW5Eb1N1YmZvcm1QcmVmaXhTdWZmaXgoKTogdm9pZCB7XHJcbiAgICBsZXQgc3ViVGFza3M6IExpc3Q8VGFzaz4gPSB0aGlzLkdldFN1YlRhc2tzKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIG11c3QgZGlzcGxheSBjb25maXJtYXRpb24gd2luZG93IHByaW9yIHRvIGRlbGV0aW5nIGEgcmVjb3JkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbXVzdENvbmZpcm1JbkRlbGV0ZU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUpO1xyXG5cclxuICAgIC8vIEFzIHN0cmFuZ2UgYXMgaXQgc291bmRzLCBpZiB0aGUgcHJvcGVydHkgaXMgYW4gZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG9cclxuICAgIC8vIEZhbHNlLCB0aGVuIG5vIG5lZWQgdG8gZGlzcGxheSBjb25maXJtYXRpb24uLi5cclxuICAgIHJldHVybiAhcHJvcC5pc0V4cHJlc3Npb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSBzdWItdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJUYXNrXCI+dGhlIHN1YiB0YXNrIHRvIGFkZDwvcGFyYW0+XHJcbiAgYWRkU3ViVGFzayhzdWJUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TdWJUYXNrcyA9PT0gbnVsbClcclxuICAgICAgdGhpcy5TdWJUYXNrcyA9IG5ldyBUYXNrc1RhYmxlKCk7XHJcbiAgICB0aGlzLlN1YlRhc2tzLmFkZFRhc2soc3ViVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlIG9uZSBvZiB0aGlzIHRhc2tzIHN1Yi10YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YlRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgc3ViLXRhc2sgdG8gcmVtb3ZlPC9wYXJhbT5cclxuICByZW1vdmVTdWJUYXNrKHN1YlRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlN1YlRhc2tzICE9PSBudWxsKVxyXG4gICAgICB0aGlzLlN1YlRhc2tzLnJlbW92ZVRhc2soc3ViVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gZmFpbGVkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0VHJhbnNhY3Rpb25GYWlsZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZCA9IHZhbDtcclxuXHJcbiAgICBpZiAoIXZhbClcclxuICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBcImR5bmFtaWNEZWYudHJhbnNhY3Rpb24gZmFpbGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZXZlbFwiPmlzIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGxldmVsIHdlIGFyZSBpbnRlcmVzdGVkIGluIGNoZWNraW5nLiBUUkFOU19OT05FIC0tPiBjaGVjayBmb3IgYW55XHJcbiAgLy8vICAgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBsZXZlbCBmYWlsdXJlIFRSQU5TX1JFQ09SRC9UQVNLX1BSRUZJWCAtLT4gY2hlY2sgZm9yIGEgZmFpbHVyZSBpbiB0aGF0IHNwZWNpZmljXHJcbiAgLy8vICAgbGV2ZWw8L3BhcmFtPlxyXG4gIHRyYW5zYWN0aW9uRmFpbGVkKGxldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChsZXZlbCA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfTk9ORSB8fFxyXG4gICAgICAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gbGV2ZWwpKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQ7XHJcbiAgICBlbHNlIGlmIChsZXZlbCA9PT0gQ29uc3RJbnRlcmZhY2UuVFJBTlNfTk9ORSB8fFxyXG4gICAgICAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRMZXZlbCgpID09PSBsZXZlbCkpXHJcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbkZhaWxlZDtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGZsYWcgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIHJldHJ5IG9uIHRoZSB0YXNrJ3MgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj52YWx1ZSBvZiBmbGFnPC9wYXJhbT5cclxuICBzZXRBZnRlclJldHJ5KHZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICB0aGlzLlRyYW5zYWN0aW9uLnNldEFmdGVyUmV0cnkodmFsKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpIHtcclxuICAgICAgaWYgKHZhbCA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSlcclxuICAgICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSA9IG51bGw7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5zZXRBZnRlclJldHJ5KHZhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBZnRlclJldHJ5KCk6IGJvb2xlYW47XHJcbiAgZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeTogc3RyaW5nKTogYm9vbGVhbjtcclxuICBnZXRBZnRlclJldHJ5KHJlY292ZXJ5Pzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRBZnRlclJldHJ5XzAoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmdldEFmdGVyUmV0cnlfMShyZWNvdmVyeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhpcyB0YXNrIGlzIHBhcnQgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGN1cnJlbnRseSBiZWluZyByZXRyaWVkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0QWZ0ZXJSZXRyeV8wKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb24uZ2V0QWZ0ZXJSZXRyeSgpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldEFmdGVyUmV0cnkoKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGlzIHRhc2sgaXMgcGFydCBvZiBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gY3VycmVudGx5IGJlaW5nIHJldHJpZWQgd2l0aCBhIHNwZWNpZmljIHJlY292ZXJ5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0QWZ0ZXJSZXRyeV8xKHJlY292ZXJ5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uLmdldEFmdGVyUmV0cnkocmVjb3ZlcnkpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5LmdldEFmdGVyUmV0cnkocmVjb3ZlcnkpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgRXhlY0VuZFRhc2sgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgX2JFeGVjRW5kVGFzayB2YWx1ZTwvcmV0dXJucz5cclxuICBnZXRFeGVjRW5kVGFzaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9iRXhlY0VuZFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwiZXhlY3V0ZSBlbmQgdGFza1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0RXhlY0VuZFRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl9iRXhlY0VuZFRhc2sgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJleGVjdXRlIGVuZCB0YXNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RXhlY0VuZFRhc2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl9iRXhlY0VuZFRhc2sgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGVcIj50aGUgbW9kZSB0byBjb21wYXJlIHRvPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHNob3VsZCB3ZSBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbj88L3JldHVybnM+XHJcbiAgYXN5bmMgZXZhbEVuZENvbmQobW9kZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZW5kVGFza0NvbmRQcm9wOiBQcm9wZXJ0eTtcclxuICAgIGxldCBldmFsRW5kQ29uZFByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VWQUxfRU5EX0NPTkRJVElPTik7XHJcblxyXG4gICAgLy8gRG9udCBldmFsdWF0ZSBlbmQgY29uZGl0aW9uIGlmIHdlIGFyZSBhbHJlYWR5IGNsb3NpbmcgdGhlIHRhc2tcclxuICAgIGlmICh0aGlzLkluRW5kVGFzaylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9iRXhlY0VuZFRhc2spXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmIChldmFsRW5kQ29uZFByb3AgIT0gbnVsbCAmJiAoIE5TdHJpbmcuQ29tcGFyZShhd2FpdCBldmFsRW5kQ29uZFByb3AuZ2V0VmFsdWUoKSwgQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUsXHJcbiAgICAgICAgdHJ1ZSkgPT09IDAgfHwgKChhd2FpdCBldmFsRW5kQ29uZFByb3AuZ2V0VmFsdWUoKSkudG9Mb3dlckNhc2UoKSA9PT0gbW9kZS50b0xvd2VyQ2FzZSgpKSkpIHtcclxuICAgICAgLy8gY2hlY2sgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgZW5kVGFza0NvbmRQcm9wID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VORF9DT05ESVRJT04pO1xyXG4gICAgICBpZiAoZW5kVGFza0NvbmRQcm9wID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBsZXQgZW5kVGFzazogc3RyaW5nID0gYXdhaXQgZW5kVGFza0NvbmRQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgIC8vIHNpZ25hbCB3ZSBuZWVkIHRvIHBlcmZvcm0gYW4gZW5kIHRhc2sgYWZ0ZXIgd2UgZ2V0IG91dCBvZiB0aGUgbG9vcFxyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4oZW5kVGFzaykpIHtcclxuICAgICAgICB0aGlzLl9iRXhlY0VuZFRhc2sgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwidHJ5aW5nIHRvIHN0b3BcIiBmbGFnIGZvciB0aGUgdGFzayBhbmQgaXQncyBzdWJUYXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0VHJ5aW5nVG9TdG9wKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRhc2suc2V0VHJ5aW5nVG9TdG9wKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuSXNUcnlpbmdUb1N0b3AgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBiSW5SZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgZ2V0SW5SZWNvcmRTdWZmaXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZWNvcmRTdWZmaXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBiSW5SZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluUmVjb3JkU3VmZml4KGJWYWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGJWYWx1ZSAhPT0gdGhpcy5faW5SZWNvcmRTdWZmaXgpIHtcclxuICAgICAgdGhpcy5faW5SZWNvcmRTdWZmaXggPSBiVmFsdWU7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYkV2YWxPbGRWYWx1ZXMgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJiRmxhZ1wiPnRydWUvZmFsc2UgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZS9mbGFzZSAtIHZhbHVlIHVwZGF0ZWQ8L3JldHVybnM+XHJcbiAgc2V0RXZhbE9sZFZhbHVlcyhiRmxhZzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGJGbGFnICE9PSB0aGlzLl9ldmFsT2xkVmFsdWVzKSB7XHJcbiAgICAgIHRoaXMuX2V2YWxPbGRWYWx1ZXMgPSBiRmxhZztcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBiRXZhbE9sZFZhbHVlcyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlL2ZhbHNlIC0gbG9vayBhdCBvbGQgdmFsdWVzIHdoZW4gZ2V0dGluZyB0aGUgZmllbGQgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0RXZhbE9sZFZhbHVlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmFsT2xkVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgIGFzeW5jIGVuZFRhc2socmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIG9ubHlEZXNjczogYm9vbGVhbiwgZHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbiwgc3ViZm9ybURlc3RpbmF0aW9uPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHN1YmZvcm1EZXN0aW5hdGlvbikpXHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdCwgb25seURlc2NzLCBmYWxzZSwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmVuZFRhc2tfMShyZXZlcnNpYmxlRXhpdCwgb25seURlc2NzLCBzdWJmb3JtRGVzdGluYXRpb24sIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQgaW4gZW5kaW5nIHRoZSB0YXNrIGFuZCBpdHMgc3ViIHRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldmVyc2libGVFeGl0XCI+aWYgdHJ1ZSB0aGVuIHRoZSBleGl0IGlzIHJldmVyc2libGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seURlc2NzXCI+aWYgdHJ1ZSB0aGVuIGVuZCBvbmx5IHRoZSBzdWIgdGFza3MgYW5kIGhhbmRsZSByZWMgc3VmZml4IGZvciB0aGlzIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViZm9ybURlc3RpbmF0aW9uXCI+aWYgdHJ1ZSB0aGVuIGVuZCBvbmx5IHRoaXMgdGFzazwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBlbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIG9ubHlEZXNjczogYm9vbGVhbiwgc3ViZm9ybURlc3RpbmF0aW9uOiBib29sZWFuLCBkdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VlZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjbG9zZWRTdWJGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG5cclxuICAgIGlmICgodGhpcy5Jc1N1YkZvcm0gJiYgIXN1YmZvcm1EZXN0aW5hdGlvbikgJiYgIXRoaXMuX3BhcmVudFRhc2suSW5FbmRUYXNrKSB7XHJcbiAgICAgIC8vIGlmIHRoaXMgdGFzayBpcyBhIHN1YmZvcm0gYW5kIGl0cyBwYXJlbnQgaXMgbm90IHRyeWluZyB0byBzdG9wIHRoZW5cclxuICAgICAgLy8gc3RhcnQgc3RvcHBpbmcgdGhlIHRhc2tzIHN1YiB0cmVlIGZyb20gdGhlIHBhcmVudCBmb3JtXHJcbiAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHRoaXMuX3BhcmVudFRhc2suZW5kVGFzayhyZXZlcnNpYmxlRXhpdCwgb25seURlc2NzLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCF0aGlzLmlzQWJvcnRpbmcoKSAmJiAhdGhpcy5JbkVuZFRhc2spIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLkluRW5kVGFzayA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIEluIGNhc2Ugb2YgZXJyb3IgYW5kIGJyb3dzZXIgY2xvc2UsIGludGltYXRlIHNlcnZlciBhYm91dCBicm93c2VyIGNsb3NlXHJcbiAgICAgICAgaWYoKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpICYmIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVVbmxvYWRDb21tYW5kKCk7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YSgwKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5Jc1RyeWluZ1RvU3RvcClcclxuICAgICAgICAgIHRoaXMuc2V0VHJ5aW5nVG9TdG9wKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBleGl0IGZyb20gc3ViVGFza3MgaW4gYSBwcmVmaXggbWFubmVyXHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpIHtcclxuICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aGUgc3ViIHRhc2tzXHJcbiAgICAgICAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBlbmRpbmdUcmFuc2FjdGlvbnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGxldCBjbGllbnRPcGVyRXhpc3Q6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyh0aGlzLFxyXG4gICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY2xpZW50T3BlckV4aXN0ID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3ModGhpcyxcclxuICAgICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0KVxyXG4gICAgICAgICAgICAgICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdGhpcy5DaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyh0aGlzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QgJiYgIXBlbmRpbmdUcmFuc2FjdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpICYmIHN1Y2NlZWRlZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgICAgICBjbG9zZWRTdWJGb3JtID0gY2xvc2VkU3ViRm9ybSB8fCBzdWJUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCh0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGV4aXQgZm9yIHRoZSBmaXJzdCB0YXNrIG11c3QgZW5kIGFsbCB0YXNrc1xyXG4gICAgICAgICAgaWYgKHRoaXMgPT09IG1nZFRhYi5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpKSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IG1nZFRhYi5nZXRTaXplKCkgLSAxOyBpID4gMCAmJiBzdWNjZWVkZWQ7IGktLSkge1xyXG4gICAgICAgICAgICAgIGlmIChtZ2RUYWIuZ2V0TUdEYXRhKGkpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhtZ2RUYWIuZ2V0TUdEYXRhKGkpLmdldEZpcnN0VGFzaygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdWNjZWVkZWQpIHtcclxuICAgICAgICAgIC8vIGlmIGNsb3NpbmcgdGhlIHN1YiB0YXNrcyB3YXMgc3VjY2Vzc2Z1bCB0aGVuIGV4ZWN1dGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmICFkdWVUb1ZlcmlmeUVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBmb3Igbm9uIGludGVyYWN0aXZlLCB0dXJuIG9mZiB0aGUgZm9yY2UgcmVjb3JkIHN1ZmZpeCxcclxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGFuIHVud2FudGVkIHVwZGF0ZSBtaWdodCBiZSBzZW50IHdoZW4gdGFzayBlbmRzLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSAmJiBmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSAmJiB0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgXCIwXCIpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGZvcmNlIHN1ZmZpeCwgZm9yIGp1c3QgaW4gY2FzZS5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgZm9yY2VTdWZmaXggPT09IHRydWUgJiYgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIFwiMVwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcblxyXG4gICAgICAgICAgaWYgKHN1Y2NlZWRlZCAmJiAhb25seURlc2NzKVxyXG4gICAgICAgICAgICB0aGlzLkhhbmRsZVRyYW5zYWN0aW9uSW5mbygpO1xyXG5cclxuICAgICAgICAgIGxldCBwcmVUc2tTdWZmaXg6IGJvb2xlYW4gPSBzdWNjZWVkZWQ7XHJcblxyXG4gICAgICAgICAgLy8gbm93IHBlcmZvcm0gdGFzayBzdWZmaXhcclxuICAgICAgICAgIGlmIChzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcyAmJiByZXZlcnNpYmxlRXhpdCAmJiAhZHVlVG9WZXJpZnlFcnJvciAmJlxyXG4gICAgICAgICAgICAoIXRoaXMuSXNTdWJGb3JtIHx8IHN1YmZvcm1EZXN0aW5hdGlvbikgJiZcclxuICAgICAgICAgICAgdGhpcy5UYXNrUHJlZml4RXhlY3V0ZWQgJiYgIXRoaXMuVGFza1N1ZmZpeEV4ZWN1dGVkKVxyXG4gICAgICAgICAgICBzdWNjZWVkZWQgPSBhd2FpdCB0aGlzLmhhbmRsZVRhc2tTdWZmaXgodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIGV4aXQgZnJvbSBhbnkgc3ViVGFza3Mgb3BlbmVkIGR1cmluZyB0aGUgbGFzdCByZWMtc3VmZml4IG9yIHRhc2sgc3VmZml4XHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgdGhpcy5oYXNTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXN1YlRhc2suSXNTdWJGb3JtKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlTm9uUmV2ZXJzaWJsZUV2ZW50KHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGRvbnQgY29udGludWUgd2l0aCB0YXNrIGV4aXQgaWYgYSBkYXRhIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRhc2sgc3VmZml4IChlLmcuIHJvbGxiYWNrKCkpXHJcbiAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQpXHJcbiAgICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuXHJcbiAgICAgICAgICAvLyB0YXNrIHN1ZmZpeCBvbmx5IHN0b3BzIGV4ZWN1dGlvbiBmb3IgY3VycmVudCB0YXNrLCB3aGljaCBpcyBiZWluZyBjbG9zZWRcclxuICAgICAgICAgIGlmIChwcmVUc2tTdWZmaXgpXHJcbiAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBYm9ydGluZygpICYmIHN1Y2NlZWRlZCAmJiAhb25seURlc2NzKSB7XHJcbiAgICAgICAgICAgIC8vIFRyeSBjbG9zaW5nIGFueSB0YXNrIGxldmVsIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAgICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLmNoZWNrQW5kQ29tbWl0KGZhbHNlLCBDb25zdEludGVyZmFjZS5UUkFOU19UQVNLX1BSRUZJWCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHN1Y2NlZWRlZCA9ICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCBkdWVUb1ZlcmlmeUVycm9yKSAmJiAhdGhpcy5pc0Fib3J0aW5nKCkgJiYgIXRoaXMudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfVEFTS19QUkVGSVgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5EZWxheUNvbW1hbmRFeGVjdXRpb24pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCBiYXNlTWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuU3RhcnR1cE1nRGF0YTtcclxuICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgY2xvc2luZyB0aGUgdG9wbW9zdCB0YXNrIC0gZG9udCBsb29zZSBhbnkgZXZlbnRzLCBsZWZ0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiBiYXNlTWdkLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSA9PT0gdGhpcy5nZXRUYXNrVGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50cyhiYXNlTWdkLCAwKTtcclxuICAgICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHN0ID0gbmV3IFNlc3Npb25TdGF0aXN0aWNzRm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gc3QuV3JpdGVUb0Zsb3dNb25pdG9yKChGbG93TW9uaXRvclF1ZXVlKV9mbG93TW9uaXRvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vYWJvcnRpbmcgdGFzayBjbG9zdXJlXHJcbiAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IFRhc2tTZXJ2aWNlQmFzZS5FeGl0KHRoaXMsIHJldmVyc2libGVFeGl0LCBzdWJmb3JtRGVzdGluYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgICAvLyBXaGVuIGNsb3NpbmcgYSB0YXNrIHdob3NlIHBhcmVudCBpcyBhIG1haW4gcHJvZ3JhbSwgY2hlY2sgdGhlIG1haW4gcHJvZ3JhbSdzIGVuZFxyXG4gICAgICAgICAgICAgIC8vIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWFpblByZ1Rhc2s6IFRhc2sgPSBtZ2QuZ2V0TWFpblByb2coMCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vdFRhc2s6IFRhc2sgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKTtcclxuICAgICAgICAgICAgICAgIGxldCBlbmRNYWluUHJnOiBib29sZWFuID0gYXdhaXQgbWFpblByZ1Rhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VORF9DT05ESVRJT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGVuZCB0aGUgcm9vdCB0YXNrIGlmIHdlIGFyZSBhbHJlYWR5IGRvaW5nIGl0LlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMgIT09IHJvb3RUYXNrICYmIGVuZE1haW5QcmcpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChyb290VGFzayk7XHJcbiAgICAgICAgICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcbiAgICAgICAgICAgICAgICAgIHJ0RXZ0LnNldEN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIE1nRm9ybS5DcmVhdGVkRm9ybXMucmVtb3ZlKDxNZ0Zvcm0+dGhpcy5Gb3JtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLklzU3ViRm9ybSB8fCBzdWJmb3JtRGVzdGluYXRpb24pXHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZCwgcmV2ZXJzaWJsZUV4aXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUWNyICM5MTQ2NDUgOiByZXR1cm4gZmFsc2UgaW4gYSByZWN1cnNpdmUgY2FsbC5cclxuICAgIC8vIG90aGVyd2lzZSBjb21tb25IYW5kbGVyQWZ0ZXIoZXZlbnRNYW5hZ2VyKSB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZiB0aGUgY2FsbCBpcyByZWN1cnNpdmVseSBtYWRlIGZyb20gaGFuZGxlRXZlbnQuXHJcbiAgICAvLyBmb3IgZXhhbXBsZSA6IHRhc2sgY29uZCBmdWxmaWxsZWQuIGhhbmRsZUludGVybmFsRXZlbnQodGhpcywgTUdfQUNUX1JFQ19TVUZGSVgpIGlzIGNhbGxlZC5cclxuICAgIC8vIHdoaWxlIGluIHJlYyBzdWYgaGFuZGxlciwgZW5kVGFzayBpcyBjYWxsZWQgYWdhaW4uLmlmIHdlIHJldHVybiB0cnVlIHRoZW4gdGhlIGNvbW1vbkhhbmRsZXJBZnRlciBpcyBub3QgZXhlY3V0ZWQuXHJcbiAgICAvLyBpZiB0aGUgcmVjIHN1ZmZpeCBoYW5kbGVyIGRpZCBub3QgZXhpc3QsIHRoZXJlIHdpbGwgYmUgbm8gY2FsbCB0byBlbmRUYXNrIGFuZCB0aGUgY29tbW9uSGFuZGxlckFmdGVyIHdpbGwgYmUgZXhlY3V0ZWQuXHJcbiAgICAvLyBUaGUgbmFtZSAnc3VjY2VlZGVkJyBpcyBhIGJpdCBtaXNsZWFkaW5nLi5pdHMgbW9yZSBsaWtlICdleGVjdXRlZCcuLmJ1dCB3ZSBkZWNpZGVkIHRvIGtlZXAgaXQuXHJcbiAgICBlbHNlIGlmICh0aGlzLkluRW5kVGFzaylcclxuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gcmVzdG9yZSB0aGUgZmxhZy5cclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayh0aGlzLl9pblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1NhdmVkKTtcclxuXHJcbiAgICByZXR1cm4gc3VjY2VlZGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCgpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIFNldFNlcnZlclNpZGVUYXNrU3VmZml4ICh0YXNrIDogVGFzaykgOiB2b2lkXHJcbiAge1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcblxyXG4gICAgbGV0ICBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggaGFuZGxlciBleGlzdHM/XHJcbiAgICB2YXIgZXZ0SGFuUG9zID0gbmV3IEV2ZW50SGFuZGxlclBvc2l0aW9uKCk7XHJcbiAgICBldnRIYW5Qb3MuaW5pdChydEV2dCk7XHJcbiAgICBoYW5kbGVyID0gZXZ0SGFuUG9zLmdldE5leHQoKTtcclxuXHJcbiAgICBpZiAoaGFuZGxlciAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGxldCAgaSA9IDA7IGkgPCBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldFNpemUoKTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG9wZXIgPSBoYW5kbGVyLmdldE9wZXJhdGlvblRhYigpLmdldE9wZXJhdGlvbihpKTtcclxuICAgICAgICBvcGVyLnNldEV4ZWNPblNlcnZlcih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suaGFzU3ViVGFza3MoKSkgICB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFzay5HZXRTdWJUYXNrcygpLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgdGhpcy5TZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeChzdWJUYXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzICh0YXNrOiBUYXNrLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2UgPGJvb2xlYW4+IHtcclxuICAgIGxldCBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGZhbHNlO1xyXG4gICAgdmFyIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICAvLyBmaW5kIGlmIE1HX0FDVF9UQVNLX1NVRkZJWCAvIE1HX0FDVF9SRUNfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICBsZXQgY3VyclJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgY3JlYXRlIG1vZGUgdGFzay4gIGZvcmNlIHJlY29yZCBzdWZmaXggaXMgY2FuY2VsbGVkXHJcblxyXG4gICAgICAgIGlmIChmb3JjZVN1ZmZpeCA9PT0gdHJ1ZSlcclxuICAgICAgICBpZiAodGFzay5Jc0ludGVyYWN0aXZlIHx8ICB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbCAmJiAhY2xpZW50T3BlcmF0aW9uRXhpc3QpIHtcclxuICAgICAgICBsZXQgY250ID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY250OyBpKyspIHtcclxuICAgICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgICBpZiAob3Blci5nZXRFeGVjT25DbGllbnQoKSkge1xyXG4gICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvcGVyLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX1JBSVNFX0VWRU5UKXtcclxuICAgICAgICAgICAgICBpZiAob3Blci5HZXRSdW50aW1lRXZlbnQoKS5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJlxyXG4gICAgICAgICAgICAgIG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJhdGlvbkV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCAmJiB0YXNrLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgKCFjbGllbnRPcGVyYXRpb25FeGlzdCAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHN1YlRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHN1YlRhc2ssIGV2ZW50Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2xpZW50T3BlcmF0aW9uRXhpc3Q7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIENoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHRhc2sgOiBUYXNrKTogYm9vbGVhblxyXG4gIHtcclxuICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zID0gZmFsc2U7XHJcbiAgICBsZXQgY3VyclJlY29yZCA9ICAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLm1vZGlmaWVkUmVjb3Jkc051bWJlcigpID4gMCB8fCAoY3VyclJlY29yZCAhPSBudWxsICYmIGN1cnJSZWNvcmQuTW9kaWZpZWQpKVxyXG4gICAgICBwZW5kaW5nVHJhbnNhY3Rpb25zID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIXBlbmRpbmdUcmFuc2FjdGlvbnMgJiYgdGFzay5oYXNTdWJUYXNrcygpKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIGkgPCB0YXNrLmdldFN1YlRhc2tzKCkuZ2V0U2l6ZSgpKTsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IHN1YlRhc2sgPSA8VGFzaz50YXNrLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVuZGluZ1RyYW5zYWN0aW9ucztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9ubHlEZXNjc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEhhbmRsZVRyYW5zYWN0aW9uSW5mbygpOiB2b2lkIHtcclxuICAgIC8vIHdoaWxlIHJlbW90ZSB0YXNrIHdpdGhvdXQgbG9jYWwgZGF0YSwgaGFzIHN1YmZvcm0gdGhhdCBoYXMgbG9jYWwgZGF0YSA6IFJlbW90ZSB0cmFuc2FjdGlvbiBpcyBzZXQgb24gdGhlIHBhcmVudCB0YXNrIGFuZCBsb2NhbCBUcmFuc2FjdGlvbiBpcyBzZXQgb24gc3ViZm9ybS5cclxuICAgIC8vIFRoZSBtZW1iZXIgdGFzay5UcmFuc2FjdGlvbiBpcyBnZXQgdGhlIERhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igc3ViZm9ybSA6ICB0aGUgQ3VycmVudERhdGF2aWV3TWFuYWdlciBpcyB0aGUgbG9jYWxEYXRhdmlldyBzbyB0aGUgdHJhbnNhY3Rpb24gaXMgdGhlIGxvY2FsIHRyYW5zYWN0aW9uIHRoYXQgdGhlIHN1YmZvcm0gaXMgdGhlIG93bmVyIGJ1dCBub3QgdGhlIG93bmVyIG9mIHRoZSByZW1vdGUgdHJhbnNhY3Rpb25cclxuICAgIC8vIFRoZSBtZXRob2Qgc2V0VHJhbnNDbGVhcmVkKCkgbmVlZCB0byBiZSBjYWxsZWQgb25seSBmb3IgcmVtb3RlIHRyYW5zYWN0aW9uIHRoYXQgaXMgdGhlIG93bmVyIHRhc2sgLiAoX3RyYW5zQ2xlYXJlZCBpcyBzZW5kIHRvIHRoZSBzZXJ2ZXIgKVxyXG5cclxuICAgIC8vIGNoZWNrIHRoZSByZW1vdGUgdHJhbnNhY3Rpb25cclxuICAgIGxldCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb247XHJcbiAgICBpZiAodHJhbnNhY3Rpb24gIT09IG51bGwgJiYgdHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSAmJiB0cmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSAnUCcpIHtcclxuICAgICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gbnVsbDtcclxuICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRUcmFuc0NsZWFyZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBleGl0IGNvbW1hbmQsIGFkZHMgaXQgdG8gY29tbWFuZHMgZm9yIGV4ZWN1dGlvbiBhbmQgZXhlY3V0ZSBpdCBpZiBpdCdzIG5lZWRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmV2ZXJzaWJsZUV4aXRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1EZXN0aW5hdGlvblwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRXhpdChyZXZlcnNpYmxlRXhpdDogYm9vbGVhbiwgc3ViZm9ybURlc3RpbmF0aW9uOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiByZWNvcmQgc3VmZml4IHdhcyBzdWNjZXNzZnVsIGFuZCB0aGlzIHRhc2sgaXMgbm90IGEgc3ViIGZvcm1cclxuICAgIC8vIHRoZW4gZW5kIHRoZSB0YXNrIGF0IHRoZSBzZXJ2ZXIgc2lkZVxyXG5cclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gcmV2ZXJzaWJsZUV4aXQgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlQnJvd3NlckVzY0V2ZW50Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybURlc3RpbmF0aW9uKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ2xpZW50Q29tbWFuZD5Db21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbik7XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGlmICghc3ViZm9ybURlc3RpbmF0aW9uKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgQnJvd2VyRXNjQ29tbWFuZCBpbW1lZGlhdGVseSBvbmx5IGlmXHJcbiAgICAgICAgLy8gMS4gSWYgd2UgYXJlIHRyeWluZyB0byBjbG9zZSB0aGUgYnJvd3NlciBhbmQgdGhlIHRvcG1vc3QgdGFzayBpcyBjbG9zaW5nXHJcbiAgICAgICAgLy8gMi4gSWYgdXNlciBleHBsaWNpdGx5IGNsb3NlcyB0aGUgY3VycmVudCB0YXNrIChsaWtlIGNsb3Npbmcgb3ZlcmxheSlcclxuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIEV4aXQoKSBjb21tYW5kcywganVzdCBhZGQgdGhlIEJyb3dzZXJFc2NDb21tYW5kIHRvIENtZHNUb1NlcnZlci5cclxuICAgICAgICBpZih0aGlzLmdldFRhc2tUYWcoKSA9PSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpIHx8XHJcbiAgICAgICAgICAgIShNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSlcclxuICAgICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIC8vIElmIHRoZSBjbG9zaW5nIG9mIE1haW4gUHJvZ3JhbSBkaWRuJ3Qgc3VjY2VlZCBvbiBzZXJ2ZXIsIGNsb3NlIGl0IGhlcmUgLS0tIG9mY291cnNlIGl0XHJcbiAgICAgICAgLy8gaW5jbHVkZXMgdGhlIGV4ZWN1dGlvbiBvZiBUUyBhcyB3ZWxsLlxyXG4gICAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSkge1xyXG4gICAgICAgICAgdGhpcy5fbWdEYXRhLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJlY3Vyc2l2ZSBmdW5jdGlvbiBmb3IgZmluYWxseSBvcGVyYXRpb24gb2YgZW5kVGFzayBmdW5jdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWNjZWVkZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV2ZXJzaWJsZUV4aXRcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZDogYm9vbGVhbiwgcmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBzdWJUYXNrID0gPFRhc2s+dGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHN1YlRhc2suaGFuZGxlRmluYWxseUVuZFRhc2soc3VjY2VlZGVkLCByZXZlcnNpYmxlRXhpdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkluRW5kVGFzayA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzdWNjZWVkZWQpXHJcbiAgICAgIHRoaXMuX2lzU3RhcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghc3VjY2VlZGVkICYmIHJldmVyc2libGVFeGl0ICYmIHRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgIHRoaXMuc2V0VHJ5aW5nVG9TdG9wKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIFRhc2sgUHJlZml4IGV4ZWN1dGlvbiBmb3IgYWxsIHN1YmZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3VjY2VlZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzdWJUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmICh3aXRoU3ViVGFza3MpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgIHN1Y2NlZWRlZCA9IGF3YWl0IHN1YlRhc2suaGFuZGxlVGFza1N1ZmZpeCh3aXRoU3ViVGFza3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdWNjZWVkZWQpXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG4gICAgc3VjY2VlZGVkID0gIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcbiAgICB0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gc3VjY2VlZGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaWYgdGhlIHRhc2sgaW50byBjcmVhdGUgbGluZSBwcm9jZXNzaW5nIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5DcmVhdGVMaW5lKGluQ3JlYXRlTGluZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5DcmVhdGVMaW5lID0gaW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBpZiB0aGUgdGFzayBpcyBpbnRvIENyZWF0ZSBsaW5lIHByb2Nlc3NpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEluQ3JlYXRlTGluZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkNyZWF0ZUxpbmU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBhbiBpbnRlcm5hbCBldmVudCBvbiB0aGlzIHRhc2tzIHNsYXZlIHRhc2tzLiBTbGF2ZSB0YXNrcyBhcmU6ICgxKSBJZiB0aGlzIHRhc2sgaXMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vICAgb3duZXIgLSBhbGwgdGFza3MgcGFydGljaXBhdGluZyBpbiB0aGUgdHJhbnNhY3Rpb25zIGFyZSBpdHMgc2xhdmVzLiAoMikgSWYgdGhpcyB0YXNrIGlzIG5vdCBhbiBvd25lciAtXHJcbiAgLy8vICAgYWxsIGl0cyBzdWJmb3JtcyBhcmUgY29uc2lkZXJlZCBzbGF2ZXMuIGlmIG9uZSBvZiB0aGUgc3ViIHRhc2tzIGZhaWxlZCBoYW5kbGluZyB0aGUgZXZlbnQgdGhlbiBhXHJcbiAgLy8vICAgcmVmZXJlbmNlIHRvIHRoYXQgdGFzayBpcyByZXR1cm5lZCBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG51bGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50ZXJuYWxFdnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGludGVybmFsIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoaW50ZXJuYWxFdnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZmFpbHVyZVRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcbiAgICBsZXQgdHJpZ2dlcmVkVGFza3M6IExpc3Q8VGFza0Jhc2U+ID0gbWdkVGFiLmdldFRyaWdnZXJlZFRhc2tzKHRoaXMpO1xyXG4gICAgbGV0IG9ycGhhbnM6IExpc3Q8VGFzaz4gPSBudWxsO1xyXG4gICAgbGV0IHNhbWVUcmFuczogYm9vbGVhbjtcclxuICAgIGxldCBoYXNTbGF2ZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpc093bmVyOiBib29sZWFuID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKTtcclxuXHJcbiAgICAvLyBldmVudCBvbiB0cmFucy1vd25lciBzaG91bGQgYmUgcHJvcG9nYXRlZCB0byBhbGwgb3RoZXIgdGFza3MgaW4gdGhlIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24uXHJcbiAgICBpZiAoaXNPd25lcikge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRFdmVudFNjb3BlVHJhbnMoKTtcclxuICAgICAgb3JwaGFucyA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgICAvLyBJbiBjYXNlIGEgY2hhbmdlIG9mIHRyYW5zLW93bmVyc2hpcCBwcmV2aW91c2x5IHRvb2sgcGxhY2UsIHRoZXJlIG1pZ2h0IGJlIHRhc2tzXHJcbiAgICAgIC8vIHdoaWNoIGJlbG9uZyB0byB0aGUgY3VycmVudCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGJ1dCB0aGVpciBwYXJlbnQgaXMgZ29uZS4gVGhlc2UgYXJlIG9ycGhhbiB0YXNrc1xyXG4gICAgICAvLyBhbmQgd2UgbmVlZCB0byBwcm9wb2dhdGUgdGhlIGV2ZW50IHRvIHRoZW0gdG9vLlxyXG4gICAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgICB3aGlsZSAoKHRhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHNhbWVUcmFucyA9IHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcbiAgICAgICAgaWYgKHRhc2sgIT09IHRoaXMgJiYgc2FtZVRyYW5zICYmIHRhc2suUHJldmlvdXNseUFjdGl2ZVRhc2tJZCAhPSBudWxsICYmIG1nZFRhYi5HZXRUYXNrQnlJRCh0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQpID09IG51bGwpXHJcbiAgICAgICAgICBvcnBoYW5zLnB1c2godGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2NvcGVUcmFuczogYm9vbGVhbiA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmlzRXZlbnRTY29wZVRyYW5zKCk7XHJcblxyXG4gICAgLy8gUHJvcGFnYXRlIHRoZSBldmVudCBhY2NvcmRpbmcgdG8gdGhlIHNjb3BlLCBvbiBhbGwgdGFza3MgdHJpZ2dlcmVkIGJ5IG1lXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpZ2dlcmVkVGFza3MubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnRyaWdnZXJlZFRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzYW1lVHJhbnMgPSB0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGFzay5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpID09PSB0YXNrLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKTtcclxuXHJcbiAgICAgIGlmICghdGFzay5Jc1N1YkZvcm0gJiYgKHNjb3BlVHJhbnMgJiYgc2FtZVRyYW5zKSAmJiB0YXNrLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgICAgLy8gUUNSIDQzODUzMCBHdWFyYW50ZWUgdGhhdCBiZWZvcmUgcHJlZml4IGNvbXB1dGUgd2lsbCBiZSBleGVjdXRlZFxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5jdXJyUmVjQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIGludGVybmFsRXZ0Q29kZSk7XHJcbiAgICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgb24gb3JwaGFucyB0b28uXHJcbiAgICBmb3IgKDsgaXNPd25lciAmJiBpIDwgb3JwaGFucy5sZW5ndGggJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7IGkrKykge1xyXG4gICAgICB0YXNrID0gb3JwaGFucy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpLkZvcm1SZWZyZXNoZWQgJiYgaW50ZXJuYWxFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5jdXJyUmVjQ29tcHV0ZShmYWxzZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICBoYXNTbGF2ZXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNTbGF2ZXMgJiYgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgZmFpbHVyZVRhc2sgPSB0YXNrO1xyXG5cclxuICAgIGlmIChpc093bmVyKVxyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5jbGVhckV2ZW50U2NvcGUoKTtcclxuXHJcbiAgICByZXR1cm4gZmFpbHVyZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW5hYmxlLWRpc2FibGUgYWN0aW9ucyBmb3IgYSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZVJlY29yZEFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGF0YXZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpIHx8IGRhdGF2aWV3LklzT25lV2F5S2V5KSB7XHJcbiAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCBkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgPT09IDApIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChkYXRhdmlldy5Jc09uZVdheUtleSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZMSU5FLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAoZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB8fCAoZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkgPT09IDApKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzTGFzdCgpKSB7XHJcbiAgICAgIGlmICgoKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKSB8fCBkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fFxyXG4gICAgICAgICAgKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpICYmXHJcbiAgICAgICAgICAgICghRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpIHx8XHJcbiAgICAgICAgICAgICAgIWF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpKSkgJiYgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSArIDEpID09PSBkYXRhdmlldy5nZXRTaXplKCkpIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKChkYXRhdmlldy5nZXRTaXplKCkgLSBkYXRhdmlldy5nZXRUb3BSZWNJZHgoKSkgPD0gdGhpcy5Gb3JtLmdldFJvd3NJblBhZ2UoKSkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBmYWxzZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgdHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkcsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PX1BST0dfRVhFX1JJR0hUUywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGlzIHN0YXJ0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzU3RhcnRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1N0YXJ0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgc3ViIHRhc2tzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTdWJUYXNrcygpOiBUYXNrc1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhc2tzIHJlZnJlc2hlcyBvbiBhIGNoYW5nZSBvZiBvbmUgb2YgaXRzIHBhcmVudCBmaWVsZHMgd2l0aCB0aGUgZ2l2ZW4gaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWRcIj50aGUgaWQgb2YgdGhlIHBhcmVudCBmaWVsZDwvcGFyYW0+XHJcbiAgcmVmcmVzaGVzT24oZmxkSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7ICFyZXN1bHQgJiYgdGhpcy5SZWZyZXNoT25WYXJzICE9PSBudWxsICYmIGkgPCB0aGlzLlJlZnJlc2hPblZhcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuUmVmcmVzaE9uVmFyc1tpXSA9PT0gZmxkSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgdGhpcyB0YXNrIGZyb20gdGhlIGFjdGl2ZSB0cmFuc2FjdGlvbnMgYWNjb3VudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBBYm9ydFRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdmFsdWUgb2YgcHJldmVudFJlY29yZFN1ZmZpeCB0byB2YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dHJ1ZSBpZiB3ZSBhbHJlYWR5IHBlcmZvcm1lZCByZWNvcmQgc3VmZml4PC9wYXJhbT5cclxuICBzZXRQcmV2ZW50UmVjb3JkU3VmZml4KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldmVudFJlY29yZFN1ZmZpeCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdmFsdWUgb2YgcHJldmVudFJlY29yZFN1ZmZpeFxyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBnZXRQcmV2ZW50UmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXg7XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2ZW50Q29udHJvbENoYW5nZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudENvbnRyb2xDaGFuZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2lnbmFsIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRLbm93blRvU2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fa25vd25Ub1NlcnZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGR2UG9zIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIi1cIj5ldmFsdWF0ZXMgdGhlIGRlcmNyaXB0b3IgYW5kIHJldHVybiB0aGUgbm9uLWhhdmUgZHZQb3MgdmFsdWU8L3BhcmFtPlxyXG4gIGV2YWx1YXRlRGVzY3JpcHRvcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCByZXM6IE5VTV9UWVBFO1xyXG4gICAgaWYgKHRoaXMuRHZQb3NEZXNjcmlwdG9yID09IG51bGwpXHJcbiAgICAgIHJldHVybiBIYXNoVXRpbHMuR2V0SGFzaENvZGUocmVzdWx0KTtcclxuXHJcbiAgICBsZXQgZmlyc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIGdvIG92ZXIgdGhlIGxpc3Qgb2YgdGhlIGRlc2NyaXB0b3JcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkR2UG9zRGVzY3JpcHRvci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWZpcnN0KVxyXG4gICAgICAgIHJlc3VsdCArPSBcIjtcIjtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50Q2VsbDogc3RyaW5nW10gPSB0aGlzLkR2UG9zRGVzY3JpcHRvci5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIC8vIHBhcnNlIHRoZSBjdXJyZW50IHRhc2sgYW5kIGZpZWxkIG51bWJlclxyXG4gICAgICBsZXQgY3VycmVudFRhZzogc3RyaW5nID0gY3VycmVudENlbGxbMF07XHJcbiAgICAgIGxldCBjdXJyZW50VmVlSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJlbnRDZWxsWzFdKTtcclxuICAgICAgbGV0IGN1cnJlbnRUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldFRhc2tCeUlEKGN1cnJlbnRUYWcpO1xyXG4gICAgICBsZXQgY3VycmVudEZpZWxkID0gPEZpZWxkPmN1cnJlbnRUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGN1cnJlbnRWZWVJZHgpO1xyXG4gICAgICBsZXQgZGlzcFZhbDogc3RyaW5nID0gY3VycmVudEZpZWxkLmdldERpc3BWYWx1ZSgpO1xyXG5cclxuICAgICAgLy8gUUNSIDk3ODU2NlxyXG4gICAgICBpZiAoY3VycmVudEZpZWxkLmlzTnVsbCgpKVxyXG4gICAgICAgIGRpc3BWYWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUUNSIDc0MzI5MFxyXG4gICAgICBsZXQgcGljOiBQSUM7XHJcbiAgICAgIHN3aXRjaCAoY3VycmVudEZpZWxkLmdldFR5cGUoKSkge1xyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIC8vIGJvb2xlYW4gaXMgc3RvcmVkIGFzIFwib1wiIG9yIFwiMVwiIHNvIHdlIGp1c3QgYWRkIHRoZW0gYXMgd2VcclxuICAgICAgICAvLyBkbyBpbiB0aGUgc2VydmVyXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgIHJlc3VsdCArPSBkaXNwVmFsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgLy8gUUNSIDc0Mjk2NiBkYXRlIGFuZCB0aW1lIHNwZWNpYWwgdHJlYXRtZW50XHJcbiAgICAgICAgICBpZiAoZGlzcFZhbCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICBsZXQgY29udjogRGlzcGxheUNvbnZlcnRvciA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2U7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb252Lm1nMmRpc3AoZGlzcFZhbCwgXCJcIiwgcGljLCBmYWxzZSwgdGhpcy5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgIC8vIFFDUiA1NDMyMDQgd2hlbiB0aGVyZSBpcyBhbiBlbXB0eSBzdHJpbmcgKGFscGhhKWFwcGVuZCBub3RoaW5nXHJcbiAgICAgICAgICBpZiAoZGlzcFZhbCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICByZXMgPSBuZXcgTlVNX1RZUEUoZGlzcFZhbCk7XHJcbiAgICAgICAgICAgIHBpYyA9IG5ldyBQSUMoY3VycmVudEZpZWxkLmdldFBpY3R1cmUoKSwgY3VycmVudEZpZWxkLmdldFR5cGUoKSwgMCk7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSByZXMudG9fYShwaWMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRtcFN0cjI6IHN0cmluZyA9IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChyZXN1bHQsIDQpO1xyXG5cclxuICAgIHJldHVybiBIYXNoVXRpbHMuR2V0SGFzaENvZGUodG1wU3RyMik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGRzIHRoZSBkdlBvcyBkZXNjcmlwdG9yIHZlY3RvciBlYWNoIG9mIHRoZSBkdlBvc0Rlc2NyaXB0b3IgdmVjdG9yIGVsZW1lbnRzIGlzIGEgU3RyaW5nIGFycmF5IG9mIHNpemVcclxuICAvLy8gICAyIGluIHRoZSBmaXJzdCBjZWxsIG9mIGVhY2ggYXJyYXkgd2UgaGF2ZSB0aGUgdGFnIGFuZCBpbiB0aGUgc2Vjb25kIHdlIGhhdmUgdGhlIHZlZSBpaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERlc2NyaXB0b3IobmV3RGVzYzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIShuZXdEZXNjLnRyaW0oKSA9PT0gXCJcIikpIHtcclxuICAgICAgbGV0IGRlc2M6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShuZXdEZXNjLCBcIjtcIik7XHJcbiAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yID0gbmV3IExpc3Q8c3RyaW5nW10+KCk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGVzYy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBjZWxsOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDIpO1xyXG4gICAgICAgIGxldCB0YWdWZWVQYWlyOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoZGVzY1tpXSwgXCIsXCIpO1xyXG4gICAgICAgIGNlbGxbMF0gPSB0YWdWZWVQYWlyWzBdO1xyXG4gICAgICAgIGNlbGxbMV0gPSB0YWdWZWVQYWlyWzFdO1xyXG5cclxuICAgICAgICAvLyBwdXQgdGhlIGNlbGwgdmFsdWUgaW50byB0aGUgdmVjdG9yXHJcbiAgICAgICAgdGhpcy5EdlBvc0Rlc2NyaXB0b3IucHVzaChjZWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNhY2hlIG9iamVjdCBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2tDYWNoZSgpOiBEdkNhY2hlIHtcclxuICAgIHJldHVybiB0aGlzLl9kdkNhY2hlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByZXBhcmUgYWxsIHN1Yi1mb3JtIHRyZWUncyB0byBlaXRoZXIgZ28gdG8gc2VydmVyIChhZnRlciBkZWxldGluZyByZWxldmFudCBlbnRyaWVzKSBvciB0byB0YWtlIGQudiBmcm9tXHJcbiAgLy8vICAgY2FjaGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgc3ViZm9ybSBjYW4gZG8gbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGJlY2F1c2Ugb2YgdXBkYXRlczwvcmV0dXJucz5cclxuICBhc3luYyBwcmVwYXJlQ2FjaGUoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIGNoZWNraW5nIG15c2VsZiBpZiBpIGFtIGEgc3ViZm9ybVxyXG4gICAgaWYgKCFpZ25vcmVDdXJyKSB7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgICBpZiAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpIHtcclxuICAgICAgICAgIC8vIGlzIHRoZSBjdXJyZW50IHVwZGF0ZSBkYXRhdmlldyB3ZXJlIHByZXZpb3VzbHkgdGFrZW4gZnJvbSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIGNoZWNrcyB0aGF0IGkgYW0gYSBzdWIgZm9ybSBidXQgaSBhbSBub3QgY2FjaGVkXHJcbiAgICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtICYmICEgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGN1cnJldFRhc2s6IFRhc2s7XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIG15IHN1YiBmb3Jtc1xyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgbXVzdCBydW4gdG8gaXRzIGVuZCBzbyBhbGwgdXBkYXRlZCBkLnYgd2lsbCBiZSBkZWxldGVkXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgY3VycmV0VGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAvLyBpZiBvbmUgb2YgbXkgc3ViLWZvcm1zIG5lZWRzIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgLSBzbyBkbyBpXHJcbiAgICAgICAgaWYgKCEgYXdhaXQgY3VycmV0VGFzay5wcmVwYXJlQ2FjaGUoZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VzcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgd2UgY2FuIHRha2UgdGhlIGQudiBvZiB0aGUgdGFzayBhbmQgYWxsIGhpcyBzdWItZm9ybXMgZnJvbSBjYWNoZSBpcyB3ZSBjYW4gLSB0YWtlIHRoZW0gYW5kXHJcbiAgLy8vICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIGN1cnJlbnQgZC52IG9mIGVhY2ggdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIGFsbCBkLnYncyB3ZXJlIGZvdW5kIGFuZCBzZXQ8L3JldHVybnM+XHJcbiAgYXN5bmMgdGVzdEFuZFNldChpZ25vcmVDdXJyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBjaGVjayBjdXJyZW50IHRhc2tcclxuICAgIGlmICghaWdub3JlQ3VyciAmJiBhd2FpdCB0aGlzLmlzQ2FjaGVkKCkpIHtcclxuICAgICAgbGV0IHJlcXVlc3RlZER2OiBudW1iZXIgPSB0aGlzLmV2YWx1YXRlRGVzY3JpcHRvcigpO1xyXG5cclxuICAgICAgLy8gdHJ5IHRvIHRha2UgZnJvbSBjYWNoZSBvbmx5IGlmIHJlcXVlc3RlZCBpcyBub3QgY3VycmVudFxyXG4gICAgICBpZiAocmVxdWVzdGVkRHYgIT09ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpKSB7XHJcbiAgICAgICAgbGV0IGZyb21DYWNoZTogRGF0YVZpZXcgPSB0aGlzLl9kdkNhY2hlLmdldENhY2hlZERhdGFWaWV3KHJlcXVlc3RlZER2KTtcclxuICAgICAgICBpZiAoZnJvbUNhY2hlID09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VEdihmcm9tQ2FjaGUpOyAgICAgLy8gY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCB0aGUgb25lIHRha2VuIGZyb20gY2FjaGUgZG8gbm90IGZvcmdldCB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjdXJyZW50IG5lZWRzIHRvIGJlIGluc2VydGVkIHRvIHRoZSBjYWNoZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBRQ1IgIzQzMDA0NS4gSW5kaWNhdGUgdGhhdCBSUCBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGdldCBmcm9tIHRoZSBjYWNoZS5cclxuICAgICAgdGhpcy5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBzdWItZm9ybXMgdGFza3NkXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIC8vIHRoaXMgbG9vcCBkb2VzIG5vdCBuZWVkIHRvIHJlYWNoIGl0cyBlbmRcclxuICAgICAgLy8gdGhlIG1vbWVudCBvbmUgdGhhdCBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgaXMgZGlzY292ZXJlZCBhbGwgbmVlZCB0byBnbyBhbHNvXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgLy8gZG9lcyB0aGUgaS10aCBzb24gbmVlZCB0byBnbyB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLlN1YlRhc2tzLmdldFRhc2soaSkudGVzdEFuZFNldChmYWxzZSkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGFuZ2VzIHRoZSBjdXJyZW50IGQudiB3aXRoIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGluIHRoaXMgbWV0aG9kIHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHVwZGF0ZXNcclxuICAvLy8gICBvZiB0aGUgY3VycmVudCBkYXRhdmlldyBzaW5jZSB0aGUgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGZyb20gdGVzdEFuZFNldCB0aGF0IGluIHR1cm4gaXMgb25seSB1c2VkIGFmdGVyXHJcbiAgLy8vICAgYSBTdWNjZXNzZnVsIHJ1biBwcmFwcmVDYWNoZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgZm9yIHVwZGF0ZXMgaW4gdGhlIGN1cnJlbnQgZGF0YXZpZXcgb2ZcclxuICAvLy8gICBlYWNoIHJlbGF0ZWQgdGFzay4gaG93ZXZlciB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIGNoZWNrIGl0IGFueXdheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmcm9tQ2FjaGVcIj50aGUgbmV3IGQudjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VEdihmcm9tQ2FjaGU6IERhdGFWaWV3KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGF0YXZpZXc6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAvLyB0aGUgZGF0YSB2aWV3IHdlIHJlY2VpdmUgaXMgQ2VydGFpbmx5IGZyb20gdGhlIGNhY2hlXHJcblxyXG4gICAgaWYgKCF0aGlzLmhhc0xvY2F0ZSkge1xyXG4gICAgICBpZiAoIWRhdGF2aWV3LmdldENoYW5nZWQoKSAmJiBkYXRhdmlldy5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKGRhdGF2aWV3LnJlcGxpY2F0ZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5sb2NhdGVQdXRJbkNhY2hlKCk7XHJcblxyXG4gICAgLy8gc2V0IHRoZSBkYXRhIHZpZXcgZnJvbSB0aGUgY2FjaGUgYXMgdGhlIGN1cnJlbnRcclxuICAgIGF3YWl0IGRhdGF2aWV3LnNldFNhbWVBcyhmcm9tQ2FjaGUpO1xyXG4gICAgZGF0YXZpZXcudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG5cclxuICAgIHRoaXMuRm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcbiAgICAoPE1nRm9ybT50aGlzLkZvcm0pLnNldFRhYmxlSXRlbXNDb3VudChmYWxzZSk7XHJcblxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgIC8vIFFDUiA5MjQ4MDk0XHJcbiAgICB0aGlzLnNldE9yaWdpbmFsVGFza01vZGUodGhpcy5nZXRNb2RlKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0T3JpZ2luYWxUYXNrTW9kZShvcmlnaW5hbFRhc2tNb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX29yaWdpbmFsVGFza01vZGUgPSBvcmlnaW5hbFRhc2tNb2RlLmNoYXJBdCgwKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IG1vZGUgb2YgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0T3JpZ2luYWxUYXNrTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVGFza01vZGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaXMgQ2FjaGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIHN1YiBmb3JtIGNvbnRyb2wgdGhpcyB0YXNrIENvcnJlbGF0ZXMgd2l0aCB0aGlzIG1ldGhvZFxyXG4gIC8vLyAgIGFjdHVhbGx5IGNvbWJpbmVzIHR3byB0ZXN0IGZpcnN0IHRoYXQgdGhlIHRhc2sgaXMgYSBzdWIgZm9ybSBzZWNvbmQgdGhhdCB0aGUgc3ViIHRoYXQgdGhlIHN1YiBmb3JtIGhhc1xyXG4gIC8vLyAgIHRoZSBpcyBjYWNoZWQgcHJvcGVydHkgc2V0IHRvIHllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNDYWNoZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1N1YkZvcm0gJiYgYXdhaXQgKDxNZ0NvbnRyb2xCYXNlPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpKS5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVELCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG9lcyB0aGUgaW5zZXJ0IGluIGNhY2hlIGxvZ2ljIGluIGNhc2UgdGhlIHRhc2sgaGFzIGxvY2F0ZSBleHByZXNzaW9uc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBsb2NhdGVQdXRJbkNhY2hlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNhY2hlZDogRGF0YVZpZXcgPSB0aGlzLl9kdkNhY2hlLmdldENhY2hlZERhdGFWaWV3KCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpKTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGRhdGEgdmlldyBoYXMgYmVlbiBpbnNlcnRlZCB0byB0aGUgY2FjaGUgYmVmb3JlXHJcbiAgICBpZiAoY2FjaGVkICE9IG51bGwpIHtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY2hlY2tGaXJzdChjYWNoZWQuZ2V0TG9jYXRlRmlyc3RSZWMoKSkgJiYgISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRMb2NhdGVGaXJzdFJlYyhjYWNoZWQuZ2V0TG9jYXRlRmlyc3RSZWMoKSk7XHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnJlbW92ZUR2RnJvbUNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0RHZQb3NWYWx1ZSgpLCB0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIHB1dCBpdCBpbiB0aGUgY2FjaGUgaWYgaXQgaXMgbm90IHVwZGF0ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoISg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBoYXNMb2NhdGUgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSGFzTG9hY3RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzTG9jYXRlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG9wZW5zIGEgbmV3IFRyYW5zYWN0aW9uIG9yIHNldCByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIFRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFJlbW90ZVRyYW5zYWN0aW9uKHRyYW5zSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IG1nZFRhYjogSU1HRGF0YUNvbGxlY3Rpb24gPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGU7XHJcbiAgICBsZXQgdHJhbnNUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGlzRmluZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIG1nZFRhYi5zdGFydFRhc2tzSXRlcmF0aW9uKCk7XHJcbiAgICB3aGlsZSAoKHRyYW5zVGFzayA9IDxUYXNrPm1nZFRhYi5nZXROZXh0VGFzaygpKSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHRyYW5zYWN0aW9uIG1pZ2h0IGJlIG51bGwgd2hlbiB0YXNrIGlzIGFib3J0aW5nIGJ1dCBub3QgeWV0IHVubG9hZGVkLlxyXG4gICAgICBpZiAodHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJlxyXG4gICAgICAgIHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdHJhbnNJZCkge1xyXG4gICAgICAgIGlzRmluZCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gPSAoaXNGaW5kID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKHRoaXMsIHRyYW5zSWQpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBuZXcgVHJhbnNhY3Rpb24gT3duZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRyYW5zT3duZXJUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRPd25lclRhc2sodGhpcyk7XHJcbiAgICB0aGlzLlRyYW5zYWN0aW9uLnNldFRyYW5zQmVnaW4oJ1QnKS8qJ1QnKi87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBhY2NvcmRpbmcgdG8gdGhlIHRvcG1vc3QgdmFsdWUgaW4gdGhlIHN0YWNrIGFuZCB0aGUgc3RhdHVzIG9mIHRoZVxyXG4gIC8vLyAgIFwidXNlTG9vcFN0YWNrXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fdXNlTG9vcFN0YWNrICYmIHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSkge1xyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wZWVrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyB0aGUgdmFsdWUgMCBvbiB0aGUgdG9wIG9mIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbnRlckxvb3AoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9sb29wU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB0b3Btb3N0IGVudHJ5IGZyb20gdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGxlYXZlTG9vcCgpOiB2b2lkIHtcclxuICAgIHRoaXMucG9wTG9vcENvdW50ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBjb3VudGVyIGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm5zIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BMb29wQ291bnRlcigpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsICYmICEodGhpcy5fbG9vcFN0YWNrLmNvdW50KCkgPT09IDApKVxyXG4gICAgICByZXN1bHQgPSA8bnVtYmVyPnRoaXMuX2xvb3BTdGFjay5wb3AoKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluY3JlYXNlcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jcmVhc2VMb29wQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xvb3BTdGFjay5wdXNoKHRoaXMucG9wTG9vcENvdW50ZXIoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMb29wU3RhY2tTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbG9vcFN0YWNrICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fbG9vcFN0YWNrLmNvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJ1c2UgbG9vcCBzdGFja1wiIHZhcmlhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgdG8gc2V0PC9wYXJhbT5cclxuICBzZXRVc2VMb29wU3RhY2sodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl91c2VMb29wU3RhY2sgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsaW5rcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGF0YXZpZXdIZWFkZXJzKCk6IERhdGF2aWV3SGVhZGVycyB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhdmlld0hlYWRlcnNUYWJsZTtcclxuICB9XHJcblxyXG4gIGlzRmlyc3RSZWNvcmRDeWNsZShWYWx1ZV8/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RSZWNvcmRDeWNsZV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlY29yZEN5Y2xlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVjb3JkQ3ljbGVfMShWYWx1ZV86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0UmVjb3JkQ3ljbGUgPSBWYWx1ZV87XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIGludGVybmFsIG5hbWU8L3N1bW1hcnk+XHJcbiAgZ2V0UHVibGljTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuUHVibGljTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgQWxsb3dFdmVudHM8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaXNBbGxvd0V2ZW50cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfRVZFTlRTKTtcclxuICAgIHJldHVybiBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSB0YXNrIGlkPC9zdW1tYXJ5PlxyXG4gIGdldEV4dGVybmFsVGFza0lkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGFza0lkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfSUQpO1xyXG5cclxuICAgIGlmIChwcm9wICE9IG51bGwpXHJcbiAgICAgIHRhc2tJZCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG5cclxuICAgIHJldHVybiB0YXNrSWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiB0aGlzIHRhc2sgb3ducyBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzVHJhbnNhY3Rpb25Pd25lcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RyYW5zT3duZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRoaXMuVHJhbnNhY3Rpb24uaXNPd25lcih0aGlzKSlcclxuICAgICAgaXNUcmFuc093bmVyID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gaXNUcmFuc093bmVyO1xyXG4gIH1cclxuXHJcbiAgaXNUcmFuc2FjdGlvbk9uTGV2ZWwobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2FjdGlvbk93bmVyKCkgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRMZXZlbCgpID09PSBsZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgd2hldGhlciB0aGUgdGFzayBpcyB0aGUgUHJvZ3JhbSAoaS5lLiBub3QgYSBzdWJ0YXNrKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNQcm9ncmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIHRhc2sgbW9kZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVuYWJsZU1vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTU9ESUZZLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUkFOR0UsIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFLCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19MT0NBVEUsIGVuYWJsZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNILCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU09SVF9SRUNPUkRTLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19JTkRFWCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WSUVXX0JZX0tFWSwgZW5hYmxlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVU1QX0VOVklST05NRU5ULCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaGFzWm9vbUhhbmRsZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmFibGVab29tSGFuZGxlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgaGFzWm9vbUhhbmRsZXJcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldEVuYWJsZVpvb21IYW5kbGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZVpvb21IYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBpc0Rlc3RpbmF0aW9uU3ViZm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZvciBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVzdGluYXRpb25TdWJmb3JtXCI+PC9wYXJhbT5cclxuICBzZXREZXN0aW5hdGlvblN1YmZvcm0oZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0aW5hdGlvblN1YmZvcm0gPSBkZXN0aW5hdGlvblN1YmZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGlzIHRoZSB0YXNrIGlzIGEgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldElzRGVzdGluYXRpb25DYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzRGVzdGluYXRpb25DYWxsXCI+PC9wYXJhbT5cclxuICBzZXRJc0Rlc3RpbmF0aW9uQ2FsbChpc0Rlc3RpbmF0aW9uQ2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faXNEZXN0aW5hdGlvbkNhbGwgPSBpc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHNldENhbmNlbFdhc1JhaXNlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbmNlbFdhc1JhaXNlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNhbmNlbFdhc1JhaXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5jZWxXYXNSYWlzZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVDcmVhdGVBY3RzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSwgdmFsKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFLCAgKHRoaXMuZ2V0Rm9ybSgpLkhhc1RhYmxlKCkgKSA/IHZhbCA6IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyBvZiBjcmVhdGUgYW5kIGRlbGV0ZSBhY3Rpb25zXHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGFzeW5jIHNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKHRoaXMuRGF0YVZpZXcpLmlzRW1wdHlEYXRhdmlldygpICYmIGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkgJiZcclxuICAgICAgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZICYmICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ERUxMSU5FLCB0cnVlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICgoYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSkgJiZcclxuICAgICAgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSGFzTWFpblRhYmxlICYmXHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiBFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd0NyZWF0ZUluTW9kaWZ5TW9kZSh0aGlzLmdldENvbXBJZHgoKSkpIHx8XHJcbiAgICAgICAgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkpKVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHModHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVtcHR5RGF0YXZpZXdcIj50aGUgZW1wdHlEYXRhdmlldyB0byBzZXQgPC9wYXJhbT5cclxuICBzZXRFbXB0eURhdGF2aWV3KGVtcHR5RGF0YXZpZXc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgc3RhcnRzIGl0cyBleGVjdXRpb24gaW4gRW1wdHkgRGF0YXZpZXcgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG4gICAgICAvLyBpZiB0aGUgdGFzayBpcyBhIHN1YmZvcm0gYW5kIHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLCBzbyBleGVjdXRlIHRoZSBlbXB0eSBkYXRhdHZpZXcgaGFuZGxlcixcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgbm90IGEgc3ViZm9ybSwgcHV0IHRoZSBlbXB0eSBkYXRhdmlldyBldmVudCBvbiB0aGUgcXVldWVcclxuICAgICAgaWYgKHRoaXMuSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgaWYgKChydEV2bnQgIT0gbnVsbCAmJiBydEV2bnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVykgfHwgc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRoaXMpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuICAgICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZSh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU1QVFlfREFUQVZJRVcpO1xyXG5cclxuICAgICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZm9yIHN1YmZvcm0gbW9kZSAnQXNQYXJlbnQnLiBJZiB0aGUgcGFyZW50IHRhc2sgdGhhdCBpbiAnRW1wdHkgRGF0YXZpZXcnIHN0YXRlIGNoYW5nZXMgaXRzIG1vZGVcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gYWxzbyBtdXN0IGNoYW5nZSBtb2RlLlxyXG4gICAgICAvLyBRQ1IgIzI4MTg2Mi4gSWYgdGhlIHN1YmZvcm0gdGFzayBpcyBvcGVuZWQgaW4gdGhlIGZpcnN0IHRpbWUgZG8gbm90IHJlZnJlc2ggaXQncyBzdWJmb3JtcyxcclxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3ZlIHJlY2VpdmVkIHRoZWlyIGRhdGF2aWV3cyBhbHJlYWR5LlxyXG4gICAgICAvLyBXZSBtdXN0IHJlZnJlc2ggdGhlbSB3aGVuIHRoZSBzdWJmb3JtIHRhc2sgcGFzc2VzIHRvIGVtcHR5IERWLlxyXG4gICAgICBpZiAodGhpcy5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FICYmIHN1YmZvcm1SZWZyZXNoICYmIGF3YWl0IHRoaXMuQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5kb1N1YmZvcm1SZWNQcmVmaXhTdWZmaXgoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRhc2sgZW5kcyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGVtcHR5RGF0YXZpZXdDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCBmYWxzZSk7XHJcbiAgICB0aGlzLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JELCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICBhc3luYyBTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzazogVGFza0Jhc2UsIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgIGxldCBpc0luc2lkZTogYm9vbGVhbiA9IGF3YWl0ICg8VGFzaz5zdWJmb3JtVGFzaykuRXhlY3V0ZU5lc3RlZFJTKGN1cnJUYXNrKTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiAjNDM0NDY3LiBFeGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHN1YmZvcm0gaWYgaXQncyB0aGUgY3VycmVudCAobGFzdCBmb2N1c2VkKSB0YXNrLlxyXG4gICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYLCB0cnVlKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0luc2lkZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgNzc0ODMuIERvIG5vdCBjb250aW51ZSBpZiB0aGUgcmVjb3JkIHN1ZmZpeCBleGVjdXRpb24gaXMgZmFpbGVkLlxyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGNvbW1hbmQgZm9yIHRoZSBzZXJ2ZXJcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybVJlZnJlc2hDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksIGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIGlmIChzdWJmb3JtVGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAvLyBRQ1IgIzQyOTExMi4gUHVzaCBleGVjdXRpb24gc3RhY2sgYmVmb3JlIFJQIGV4ZWN1dGlvbi5cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIC8vIERlZmVjdCAjNzcwNDkuIERvIG5vdCBleGVjdXRlIHBhcmVudCBSUC4gV2UgbmVlZCBpdCBvbmx5IHdoZW4gY2xpY2sgb24gc3ViZm9ybXdhcyBkb25lLlxyXG4gICAgICBsZXQgcGVyZm9ybVBhcmVudFJlY29yZFByZWZpeE9yZzogYm9vbGVhbiA9ICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeDtcclxuICAgICAgKDxUYXNrPnN1YmZvcm1UYXNrKS5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgdHJ1ZSk7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIFN1YmZvcm1SZWZyZXNoIGV2ZW50IHRvIGl0c2VsZiBzbyB0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wgb2YgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICAvLyBhcyBmb3IgVmlld1JlZnJlc2ggZXZlbnQuXHJcbiAgICBpZiAoaXNJbnNpZGUpIHtcclxuICAgICAgLy8gRGVmZWN0IDExNTc5My4gY3VyclRhc2sgY2FuJ3QgYmUgbnVsbC5cclxuICAgICAgLy8gaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICFzdWJmb3JtVGFzay5nZXRQcmV2ZW50Q29udHJvbENoYW5nZSgpICYmIGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgIC8vICAgY3VyclRhc2subW92ZVRvRmlyc3RDdHJsKGZhbHNlKTtcclxuICAgICAgLy8gVE9ETzogVGFiYmluZyAmIEZvY3VzaW5nOiBIYW5kbGUgdGhpcyBzaXR1YXRpb25cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAoZXhwbGljaXRTdWJmb3JtUmVmcmVzaCkge1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAoY3VyclRhc2sgIT0gbnVsbClcclxuICAgICAgICAgICAgKDxEYXRhVmlldz5jdXJyVGFzay5EYXRhVmlldykuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHN1YmZvcm1UYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyBSZWNvcmQgU3VmZml4ZXMgb2YgYWxsIG5lc3RlZCBzdWJmb3JtcyBmcm9tIGJvdHRvbSB0byB0b3AuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3VyclRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXhlY3V0ZU5lc3RlZFJTKGxhc3RUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaXNFeGVjdXRlTmVzdGVkUlM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBRQ1IgIzE2ODM0Mi4gQSBuZXcgdGFzayBpcyBzZXQgYXMgZm9jdXNlZCB0YXNrIGFmdGVyIHRoZSBmaXJzdCBDUC5cclxuICAgIC8vIFNvIGlmIGluIENQIFVwZGF0ZSBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgY3VyclRhc2sgaXMgbnVsbC4gQnV0IHdlIG11c3QgcmVmcmVzaCB0aGUgc3ViZm9ybS5cclxuICAgIGlmIChsYXN0VGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgLy8gRG8gbm90IGV4ZWN1dGUgc3ViZm9ybSByZWZyZXNoIHdoZW4gdGhlIGZvY3VzZWQgdGFzayBpcyBub3Qgb3BlbmVkIGFzIGEgc3ViZm9ybSAoaXQgd2FzIG9wZW5lZCBmcm9tIGNhbGwgb3BlcmF0aW9uKSxcclxuICAgIC8vIGJ1dCB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHN1YmZvcm0gdGFzay4gU2VlIGZvciBleGFtcGxlIFFDUiAjNDMxODUwLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyAmJiBsYXN0VGFzay5nZXRNZ2RJRCgpICE9PSB0aGlzLmdldE1nZElEKCkpXHJcbiAgICAgIHJldHVybiBpc0V4ZWN1dGVOZXN0ZWRSUztcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBUYXNrID0gbGFzdFRhc2s7IHRhc2sgIT09IHRoaXMgJiYgdGFzay5wYXRoQ29udGFpbnModGhpcykgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLOyB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlzRXhlY3V0ZU5lc3RlZFJTID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgUmVjIHN1ZmZpeCBmb3IgYWxsIG5lc3RlZCBzdWJmb3JtcyB1bnRpbGwgc3ViZm9ybSB0YXNrIHRoYXQgY29udGFpbnMgdGhlc2UgMiBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV4ZWNTdWJmb3JtUmVjU3VmZml4KG5ld1Rhc2s6IFRhc2spOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHN1YmZUYXNrOiBUYXNrO1xyXG4gICAgbGV0IGk6IG51bWJlciwgaWR4ID0gMDtcclxuICAgIGZvciAoaSA9IHRoaXMuX3Rhc2tQYXRoLmxlbmd0aDsgaSA+IDA7IGktLSkge1xyXG4gICAgICBzdWJmVGFzayA9IHRoaXMuX3Rhc2tQYXRoLmdldF9JdGVtKGkgLSAxKTtcclxuICAgICAgaWYgKCFuZXdUYXNrLl90YXNrUGF0aC5Db250YWlucyhzdWJmVGFzaykpIHtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIENyZWF0ZSBtb2RlIHRvIE1vZGlmeSBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgbm90IGEgbmV3IHJlY29yZC5cclxuICAgICAgICAvLyBTbyB0aGUgbW9kZSBpcyBjaGFuZ2VkIG9ubHkgZm9yIHRoZSBmaXJzdCByZWNvcmQgdGhhdCB3YXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgaWYgKHN1YmZUYXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgISgoPERhdGFWaWV3PnN1YmZUYXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLmlzTmV3UmVjKCkpXHJcbiAgICAgICAgICBzdWJmVGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZHggPSBuZXdUYXNrLl90YXNrUGF0aC5pbmRleE9mKHN1YmZUYXNrKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgRGVidWcuQXNzZXJ0KGkgPiAwKTtcclxuICAgIHJldHVybiBpZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb3VudGVyIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+Y291bnRlcjwvcmV0dXJucz5cclxuICBnZXRDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZSB0aGUgdGFza3MgY291bnRlciBieSAxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgaW5jcmVhc2VDb3VudGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IHRoaXMuX2NvdW50ZXIgKyAxO1xyXG4gIH1cclxuXHJcbiAgc2V0Q291bnRlcihjbnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY291bnRlciA9IGNudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICAhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPT09IFRhc2suU3RhcnRQcm9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrIGlmIHJlZmVyZW5jZSB0byBtYWluIHByb2dyYW0gZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRTdHJcIj5hIHJlZmVyZW5jZSB0byB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzTWFpblByb2dyYW1GaWVsZChmaWVsZFN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgRmllbGQ6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMoZmllbGRTdHIsICcsJyk7XHJcbiAgICBsZXQgbWFpblByb2dGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChGaWVsZC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgbGV0IHBhcmVudDogbnVtYmVyID0gTk51bWJlci5QYXJzZShGaWVsZC5nZXRfSXRlbSgwKSk7XHJcbiAgICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRClcclxuICAgICAgICBtYWluUHJvZ0ZpZWxkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpblByb2dGaWVsZDtcclxuICB9XHJcblxyXG4gIGdldFRhc2tJbmZvKCk6IHN0cmluZyB7XHJcbiAgICAvLyBHZXQgdGhlIHRhc2sgbmFtZSB1c2luZyB0aGUgZ2V0UHJvcCgpIGFzIG5hbWUgaXMgb25seSBzZXJpYWxpemVkIGZvciBkZWJ1Z1xyXG4gICAgbGV0IHRhc2tOYW1lOiBzdHJpbmcgPSAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoJ3swfSB7MX0nLHRoaXMuaXNQcm9ncmFtKCkgPyAnUHJvZ3JhbSc6ICdTdWJ0YXNrJywgdGFza05hbWUpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIih0YXNrIHswfS1cXFwiezF9XFxcInsyfSlcIiwgdGhpcy5fdGFza1RhZywgdGhpcy5OYW1lLCBzdXBlci5pc01haW5Qcm9nKCkgPyAoXCIgY3RsIFwiICsgdGhpcy5fY3RsSWR4KSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ29uc3RydWN0TWdGb3JtKGFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPik6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IG5ldyBNZ0Zvcm0oKTtcclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuUGFyZW50VGFzayAhPSBudWxsID8gdGhpcy5QYXJlbnRUYXNrLmdldEZvcm0oKSA6IG51bGwpO1xyXG5cclxuICAgIC8vIFBhcmVudEZvcm0gb2YgYW55IGZvcm0gc2hvdWxkIGJlIGEgdmlzaWJsZSBvbmUuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHRoZSBQYXJlbnRUYXNrXHJcbiAgICAvLyBpcyBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIHdpdGggT3BlbldpbmRvdz1Oby4gSW4gdGhpcyBjYXNlLCB0aGUgUGFyZW50IG9mIHRoZSBub24taW50ZXJhY3RpdmVcclxuICAgIC8vIHRhc2ssIHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGZvcm0uXHJcbiAgICB3aGlsZSAocGFyZW50Rm9ybSAhPSBudWxsICYmICFwYXJlbnRGb3JtLmdldFRhc2soKS5pc09wZW5XaW4oKSkge1xyXG4gICAgICBwYXJlbnRGb3JtID0gcGFyZW50Rm9ybS5QYXJlbnRGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm0uUGFyZW50Rm9ybSA9IHBhcmVudEZvcm07XHJcbiAgICBhbHJlYWR5U2V0UGFyZW50Rm9ybS52YWx1ZSA9IHRydWU7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBtZ2RhdGEgSUQgdG8gd2hpY2ggdGFzayBiZWxvbmdzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNZ2RJRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YS5HZXRJZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCByZWZlcmVuY2UgdG8gY3VycmVudCBNR0RhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1HRGF0YSgpOiBNR0RhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuX21nRGF0YTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVmcmVzaCB0aGUgZGlzcGxheSwgcGFpbnQgdGhlIGNvbnRyb2xzIGFuZCB0aGVpciBwcm9wZXJ0aWVzIGFnYWluIDwvc3VtbWFyeT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmIHRoaXMuaXNTdGFydGVkKCkpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJTdGFydCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcblxyXG4gICAgICAvLyByZWNvcmRzIGZyb20gdGhlIERhdGFWaWV3IGFuZCByZWZyZXNoZXMgdGhlIHJvd3MuXHJcbiAgICAgIC8vIE5vdywgVGFzay5SZWZyZXNoRGlzcGxheSgpIGlzIGNhbGxlZCBmcm9tIDIgcGxhY2VzOlxyXG4gICAgICAvLyAxLiB3aGlsZSBpbml0aW5nIHRoZSBmb3JtXHJcbiAgICAgIC8vIDIuIHdoZW4gY29taW5nIGJhY2sgZnJvbSBzZXJ2ZXJcclxuICAgICAgLy8gSW4gY2FzZSAjMSwgd2UgZG8gbm90IG5lZWQgdG8gcmVmcmVzaCB0aGUgdGFibGUgYXMgaXQgaXMgZG9uZSBmcm9tIGZpcnN0VGFibGVSZWZyZXNoKCkuXHJcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2FuIGJlIGVsaW1pbmF0ZWQuXHJcbiAgICAgIGlmICh0aGlzLl9yZWZyZXNoVHlwZSAhPT0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FKSB7XHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5Gb3JtO1xyXG4gICAgICAgIGxldCB3YXNSZWZyZXNoZWQ6IGJvb2xlYW4gPSBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgaWYgKHdhc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIHRhc2suUmVmcmVzaERpc3BsYXkoKVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vIFRPRE8gc2FkaGFuIHJlbW92ZSB1bnVzZWRcclxuICAvLyBhc3luYyBnZXRGaWVsZFZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIHZhbHVlLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuZ2V0VmFsdWUoZmFsc2UpO1xyXG4gIC8vICAgaXNOdWxsLnZhbHVlID0gYXdhaXQgKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgZGlzcGxheSB2YWx1ZSBvZiBhIGZpZWxkLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmllbGREZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIGdldEZpZWxkRGlzcGxheVZhbHVlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIHZhbHVlLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICBpc051bGwudmFsdWUgPSAoPEZpZWxkPmZpZWxkRGVmKS5pc051bGwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdXBkYXRlcyB0aGUgZmllbGQncyB2YWx1ZSBhbmQgc3RhcnRzIHJlY29tcHV0ZS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBVcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLlRhc2tQcmVmaXhFeGVjdXRlZCkge1xyXG4gICAgICBhd2FpdCAoPEZpZWxkPmZpZWxkRGVmKS5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbHVlLCBpc051bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBhIHJpY2hjbGllbnQgdGFza3MsIGNoZWNrIGlmIE5vbi1JbnRlcmFjdGl2ZSB0YXNrIGNoaWxkIHNob3VsZCBiZSBNb2RhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz50cnVlPC9yZXR1cm5zPlxyXG4gIFNob3VsZE5vbkludGVyYWN0aXZlQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuU2hvdWxkQ2hpbGRCZU1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrIGlmIGEgdGFza3MgY2hpbGQgc2hvdWxkIGJlIG1vZGFsXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQ2hpbGRCZU1vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHdpbmRvdyBpcyBvcGVuZWQgYW5kIG9mIG1vZGFsIHR5cGUgKGRvZXNuJ3QgbWF0dGVyIGlmIGludGVyYWN0aXZlIG9yIG5vdClcclxuICAgIGlmICgodGhpcy5Gb3JtLkNvbmNyZXRlV2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KSAmJiB0aGlzLmdldEZvcm0oKS5PcGVuZWQpXHJcbiAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwYXJlbnQgdGFzayBvZiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFBhcmVudCgpOiBUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyB0YXNrIGlzIHRoZSBjaGVja2VkIHRhc2sgb3IgYSBkZXNjZW5kYW50IG9mIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0Rlc2NlbmRlbnRPZihjaGtUYXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNoa1Rhc2sgPT09IHRoaXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoY2hrVGFzayA9PT0gbnVsbCB8fCB0aGlzLl9wYXJlbnRUYXNrID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2suaXNEZXNjZW5kZW50T2YoY2hrVGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBzdWJmb3JtQ3RybCB3aGljaCBpcyBNb2RhbCBpbiBjdXJyZW50IHJ1bnRpbWUgdHJlZSBpZiB0aGVyZSBpcyBhbnk/LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIEdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAoY3VyclRhc2suX3BhcmVudFRhc2sgIT0gbnVsbCAmJiBjdXJyVGFzay5fcGFyZW50VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD4oY3VyclRhc2suX3BhcmVudFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCkpO1xyXG4gICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN1YmZvcm1DdHJsO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJUYXNrID0gY3VyclRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGZvciByZW1vdGUgdGFzayBmb3IgZXhwcmVzc2lvbiB0aGF0IHdhcyBjb21wdXRlZCBvbmNlIG9uIHNlcnZlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuVGFza1NlcnZpY2UuU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgcnVucyBhY3Rpb25zIGFmdGVyIHRoZSAnZm9ybScgdGFnIGlzIGhhbmRsZWQuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBFbnN1cmVWYWxpZEZvcm0oKTogdm9pZCB7XHJcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2Q6XHJcbiAgICAvLyBJZiB0aGlzIHRhc2sgaXMgdGhlIG1haW4gcHJvZ3JhbSBhbmQgX29wZW5XaW4gZXZhbHVhdGVzIHRvICdmYWxzZScsIHRoZW5cclxuICAgIC8vIHByZXZlbnQgdGhlIGRpc3BsYXkgb2YgdGhlIGZvcm0sIGJ5IHNldHRpbmcgaXQgdG8gJ251bGwnLlxyXG4gICAgaWYgKHRoaXMuX2lzTWFpblByZyAmJiB0aGlzLkZvcm0gIT09IG51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLl9vcGVuV2luIHx8ICF0aGlzLkZvcm0uaXNMZWdhbEZvcm0pIHsgICAvLyBUaGlzIGNhbiBiZSBtZGkgZnJhbWVcclxuICAgICAgICB0aGlzLkZvcm0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNvbXB1dGUgdGhlIG1haW4gZGlzcGxheSBvbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENvbXB1dGVNYWluRGlzcGxheSgpOlByb21pc2U8dm9pZD4gIHtcclxuICAgIGxldCBwcm9wTWFpbkRpc3BsYXk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01BSU5fRElTUExBWSk7XHJcbiAgICAvLyBnZXQgdGhlIHZhbHVlIG9mIG1haW4gZGlzcGxheVxyXG4gICAgbGV0IG1haW5EaXNwbGF5SW5kZXg6IG51bWJlciA9IGF3YWl0IHByb3BNYWluRGlzcGxheS5nZXRWYWx1ZUludCgpO1xyXG5cclxuICAgIG1haW5EaXNwbGF5SW5kZXggPSB0aGlzLkdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRGlzcGxheUluZGV4KTtcclxuXHJcbiAgICB0aGlzLl9mb3Jtcy5Jbml0Rm9ybUZyb21YbWxTdHJpbmcobWFpbkRpc3BsYXlJbmRleCk7XHJcbiAgICB0aGlzLkVuc3VyZVZhbGlkRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcmVwYXJlIHRhc2sgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUHJlcGFyZVRhc2tGb3JtKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuUHJlcGFyZVByb3BPcGVuVGFza1dpbmRvdyh0aGlzKTtcclxuICAgIHJldHVybiBhd2FpdCBSZW1vdGVUYXNrU2VydmljZS5QcmVwYXJlUHJvcE1haW5EaXNwbGF5KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBmb3JtIGlzIGxlZ2FsXHJcbiAgLy8vIHdlIGFyZSBub3QgZ2V0IHRvIHRoYXQgbWV0aG9kIGZvciBtYWluIGRpc3BsYXkgdGhhdCBvcGVuIHdpbmRvdyBpcyBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBGb3JtSXNMZWdhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0Zvcm1Jc0xlZ2FsOiBib29sZWFuID0gc3VwZXIuaXNNYWluUHJvZygpO1xyXG4gICAgcmV0dXJuIGlzRm9ybUlzTGVnYWwgfHwgc3VwZXIuZ2V0Rm9ybSgpLmlzTGVnYWxGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIG1haW4gZGlzcGxheSBvbiBzdHVkaW8gZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1haW5Ec3BJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmVhbE1haW5EaXNwbGF5SW5kZXhPbkRlcHRoKG1haW5Ec3BJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBtYWluRHNwSWR4ICs9IHRhc2suX2Zvcm1zLkNvdW50O1xyXG4gICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpbkRzcElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBtYWluIGRpc3BsYXkgb24gc3R1ZGlvIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYWluRHNwSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlYWxNYWluRGlzcGxheUluZGV4T25DdXJyZW50VGFzayhtYWluRHNwSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKG1haW5Ec3BJZHggPiAxKSB7XHJcblxyXG4gICAgICBsZXQgdGFzazogVGFzayA9IHRoaXMuTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcblxyXG4gICAgICB3aGlsZSAodGFzayAhPSBudWxsKSB7XHJcbiAgICAgICAgbWFpbkRzcElkeCAtPSB0YXNrLl9mb3Jtcy5Db3VudDtcclxuICAgICAgICB0YXNrID0gdGFzay5Mb2dpY2FsU3R1ZGlvUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWluRHNwSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgQW5jZXN0b3IgdGFzayAob24gcnVudGltZSB0cmVlKSBvZiB0aGUgc2VuZCB0YXNrIGRlZmluaXRpb24gaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpbmRUYXNrRGVmaW5pdGlvbklkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEFuY2VzdG9yVGFza0J5VGFza0RlZmluaXRpb25JZChmaW5kVGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IFRhc2sge1xyXG4gICAgbGV0IGN1cnJlbnRUYXNrOiBUYXNrID0gdGhpcztcclxuXHJcbiAgICAvLyBGaXhlZCBidWcgIzoxNzI5NTlcclxuICAgIC8vIGlmIHRoZSBmaW5kVGFza0RlZmluaXRpb25JZCBpcyBtYWluIHByb2dyYW0gKGNhbiBiZSBvZiBjb21wb25lbnQpIHdlIHdpbGwgbm90IGZvdW5kIGl0IGluIHRoZSBfcGFyZW50VGFza1xyXG4gICAgLy8gc28gd2Ugd2lsbCB0YWtlIHRoZSB0YXNrIGZyb20gdGhlIE1HRGF0YVRhYmxlXHJcbiAgICBpZiAoZmluZFRhc2tEZWZpbml0aW9uSWQuSXNNYWluUHJvZ3JhbSgpKVxyXG4gICAgICByZXR1cm4gPFRhc2s+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgZmluZFRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXgpO1xyXG5cclxuICAgIHdoaWxlIChjdXJyZW50VGFzayAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChjdXJyZW50VGFzay5UYXNrRGVmaW5pdGlvbklkLkVxdWFscyhmaW5kVGFza0RlZmluaXRpb25JZCkpXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXNrO1xyXG5cclxuICAgICAgY3VycmVudFRhc2sgPSBjdXJyZW50VGFzay5fcGFyZW50VGFzaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIFNldERhdGFDb250cm9sVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZDogbnVtYmVyLCBkY1ZhbHVlc0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gc3VwZXIuZ2V0Rm9ybSgpLmdldEN0cmwoY29udHJvbElkKTtcclxuICAgIGN0cmwuc2V0RGNWYWxJZChkY1ZhbHVlc0lkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZGlzcGxheSB0ZXN0IG9uIHN0YXR1cyBiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIERpc3BsYXlNZXNzYWdlVG9TdGF0dXNCYXIodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBRY3IgIzc5ODMxMS4gaWYgc2VydmVyIHNpZGUgaGFkIE1QIGRvaW5nIHZlcmlmeSB0byBwYW5lIGFuZCBNUCBoYXMgbm8gZm9ybVxyXG4gICAgLy8gd2Ugd2lsbCBnZXQgYW4gZXhjZXB0aW9uLiBzbyBpbiBjYXNlIG9mIG5vIGZvcm0sIGdldCBpdCBmcm9tIGxhc3QgZm9jdXNlZCB0YXNrLlxyXG4gICAgbGV0IHRhc2tUb1ZlcmlmeU9uOiBUYXNrID0gPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKTtcclxuICAgIGlmICh0YXNrVG9WZXJpZnlPbi5nZXRGb3JtKCkgPT0gbnVsbClcclxuICAgICAgdGFza1RvVmVyaWZ5T24gPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcblxyXG4gICAgdGFza1RvVmVyaWZ5T24uV3JpdGVUb01lc3NhZ2VQYW5lKHRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyID0gKDxNZ0Zvcm0+dGhpcy5nZXRGb3JtKCkpLmlzVGFibGVXaXRoQWJzb2x1dGVTY3JvbGxiYXIoKTtcclxuXHJcbiAgICByZXR1cm4gaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXI7XHJcbiAgfVxyXG5cclxuICBHZXRUYXNrRGV0YWlscygpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWVzID0gICh0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGhpcztcclxuICAgIHdoaWxlICh0YXNrLlBhcmVudFRhc2sgIT09IG51bGwgJiYgIXRhc2suUGFyZW50VGFzay5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnRhc2suUGFyZW50VGFzaztcclxuICAgICAgbmFtZXMgPSAgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpICsgXCIuXCIgKyBuYW1lcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIHRhc2tVUkwgdGFnXHJcbiAgLy8vIGV2ZXJ5IHRhc2tVUkwgdGFnIGlzIHJlcGxhY2VkIGJ5IHRoZSBkYXRhIG9mIHRoZSB4bWwgaXNsYW5kIGl0IHJlZmVycyB0bzwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgUHJvY2Vzc1Rhc2tVUkwoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgeG1sRGF0YTogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxkYXRhKCk7XHJcbiAgICBsZXQgZW5kVGFza1VybElkeDogbnVtYmVyID0geG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgRGVidWcuQXNzZXJ0KGVuZFRhc2tVcmxJZHggIT09IC0xICYmIGVuZFRhc2tVcmxJZHggPCB4bWxEYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gZXh0cmFjdCB0aGUgdGFzayB1cmwgYW5kIHRoZSByZWYgbGlzdFxyXG4gICAgbGV0IHRhZzogc3RyaW5nID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kVGFza1VybElkeCk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoKTtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZFRhc2tVcmxJZHgpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgbGV0IHRhc2tDYWNoZVVSTDogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKDEpO1xyXG4gICAgbGV0IHJlZkxpc3RTdHI6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbSgzKTtcclxuXHJcbiAgICBsZXQgdGFza0NvbnRlbnRPcmlnaW5hbDogc3RyaW5nID0gXCJcIjsgLy8gZGF0YSBvZiB0aGUgdGFzayByZWFkIGZyb20gdGFza0NhY2hlVVJMXHJcblxyXG4gICAgaWYodGFza0NhY2hlVVJMLnRyaW0oKSAhPSBcIlwiKSB7XHJcbiAgICAgIC8vIGJyaW5nIHRoZSBkYXRhXHJcblxyXG4gICAgICBpZih0YXNrQ2FjaGVVUkwuc3RhcnRzV2l0aChcIi4vXCIpKVxyXG4gICAgICAgdGFza0NhY2hlVVJMPSBOU3RyaW5nLlJlcGxhY2UodGFza0NhY2hlVVJMLCAnLi8nLCBDbGllbnRNYW5hZ2VyLkdldEFzc2V0c1VSTCgpICsgJy9jYWNoZS8nKTtcclxuXHJcbiAgICAgIHRhc2tDb250ZW50T3JpZ2luYWwgPSBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkdldENvbnRlbnQodGFza0NhY2hlVVJMLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmVmaXggdGhlIG9yaWdpbmFsIGRhdGEgdGlsbCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgPHRhc2tVUkw+XHJcbiAgICBsZXQgdGFza0NvbnRlbnRGaW5hbDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHhtbERhdGEuc3Vic3RyKDAsIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpLCB0YXNrQ29udGVudE9yaWdpbmFsLmxlbmd0aCk7XHJcbiAgICAvLyB0aGUgbnVtYmVyIG9mIHRva2VucyBpbiByZWZMaXN0IGFuZCB0aGUgbnVtYmVyIG9mIGxvY2F0aW9uIGluIHRoZSB4bWwgdG8gYmUgcmVwbGFjZWQgKGkuZS4gdGhlIHBsYWNlcyB3aXRoIFs6KSBzaG91bGQgYmUgZXF1YWxcclxuICAgIGxldCByZWZsaXN0OiBMaXN0PHN0cmluZz4gPSB0aGlzLmdldFJlZmxpc3QocmVmTGlzdFN0ciwgJzsnLCB0cnVlLCAtMSk7XHJcbiAgICBsZXQgcmVmTGlzdElkeCA9IDA7XHJcblxyXG4gICAgbGV0IGN1cnJJZHg6IG51bWJlciA9IHRhc2tDb250ZW50T3JpZ2luYWwuaW5kZXhPZihcIls6XCIpO1xyXG4gICAgbGV0IHByZXZJZHg6IG51bWJlciA9IDA7XHJcbiAgICB3aGlsZSAoY3VycklkeCAhPT0gLTEpIHtcclxuICAgICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQodGFza0NvbnRlbnRPcmlnaW5hbC5zdWJzdHIocHJldklkeCwgY3VycklkeCAtIHByZXZJZHgpKTtcclxuICAgICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQocmVmbGlzdC5nZXRfSXRlbShyZWZMaXN0SWR4KyspKTtcclxuICAgICAgY3VycklkeCArPSAyO1xyXG4gICAgICBwcmV2SWR4ID0gY3VycklkeDtcclxuICAgICAgY3VycklkeCA9IHRhc2tDb250ZW50T3JpZ2luYWwuaW5kZXhPZihcIls6XCIsIHByZXZJZHgpO1xyXG4gICAgfVxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQodGFza0NvbnRlbnRPcmlnaW5hbC5zdWJzdHIocHJldklkeCkpO1xyXG5cclxuICAgIC8vIHN1ZmZpeCB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgeG1sIGZyb20gdGhlIGVuZCBvZiB0aGUgY3VycmVudCA8L3Rhc2tVUkw+XHJcbiAgICB0YXNrQ29udGVudEZpbmFsLkFwcGVuZCh4bWxEYXRhLnN1YnN0cih4bWxEYXRhLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgZW5kVGFza1VybElkeCArIDEpICsgMSkpO1xyXG4gICAgeG1sRGF0YSA9IHRhc2tDb250ZW50RmluYWwuVG9TdHJpbmcoKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAtLS0tLS0tPiB7MX1cIiwgdGFza0NhY2hlVVJMLCB4bWxEYXRhKSk7XHJcblxyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRYTUxkYXRhKHhtbERhdGEpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRDdXJySW5kZXgoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXRDdXJySW5kZXgoKSAtIChDb25zdEludGVyZmFjZS5NR19UQUdfVEFTS1VSTC5sZW5ndGggKyAxKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHBhcnNlcyB0aGUgZGF0YSBhY29yZGluZyB0byB0aGUgZGVsaW1ldGVyIGFuZCB0aGUgcmVmbGlzdCBkZWxpbWV0ZXJzIGxvZ2ljPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlbGltXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0cnVuY1wiPmlmIHRydWUgdHJ1Y2F0ZSBmaXJzdCAnXFxcXCcgKGluIHVzZSBmb3IgaXNsYW5kIGRhdGEgcGFyc2luZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWF4VG9rZW5zXCI+aWYgLTEgYWxsIHRva2VucyBhdmlhbGFibGUgZWxzZSB0aGUgbnVtYmVyIG9mIHRva2VucyB0byBzZWFyY2g8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRhdGFcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZmxpc3QoZGF0YTogc3RyaW5nLCBkZWxpbTogc3RyaW5nLCB0cnVuYzogYm9vbGVhbiwgbWF4VG9rZW5zOiBudW1iZXIpOiBMaXN0PHN0cmluZz4ge1xyXG4gICAgbGV0IGN1cnJTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCB0b2tlbnNDbnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2luY2UgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhbHdheXMgJzsnIHdlIHN0YXJ0IGZyb20gMVxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGN1cnI6IHN0cmluZyA9IGRhdGEuY2hhckF0KGkpO1xyXG5cclxuICAgICAgaWYgKGN1cnIgIT09ICdcXFxcJyAmJiBjdXJyICE9PSBkZWxpbSlcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChjdXJyKTtcclxuICAgICAgZWxzZSBpZiAoY3VyciA9PT0gZGVsaW0pIHtcclxuICAgICAgICBsaXN0LnB1c2goY3VyclN0ci5Ub1N0cmluZygpKTtcclxuICAgICAgICBjdXJyU3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICB0b2tlbnNDbnQrKztcclxuXHJcbiAgICAgICAgaWYgKHRva2Vuc0NudCA9PT0gbWF4VG9rZW5zKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoY3VyciA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgLy8gdGhlIGZvcm1hdCAnXFxcXGRlbGltaXRlcicgaXMgYWx3YXlzIHRydW5jYXRlZFxyXG4gICAgICAgIGlmICghdHJ1bmMgJiYgZGF0YS5jaGFyQXQoaSArIDEpICE9PSBkZWxpbSlcclxuICAgICAgICAgIGN1cnJTdHIuQXBwZW5kKGRhdGEuY2hhckF0KGkpKTtcclxuXHJcbiAgICAgICAgaSsrO1xyXG4gICAgICAgIGN1cnJTdHIuQXBwZW5kKGRhdGEuY2hhckF0KGkpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGFwcGVuZCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSByZWYgbGlzdFxyXG4gICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgcmV0dXJuIGxpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHN0YXJ0IHRoZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gYW5kIHNldCBmb2N1cyB0byB0aGUgZmlyc3QgY29udHJvbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBTdGFydFByb2dyYW0oY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4sIG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbik6IFByb21pc2U8VGFzaz4ge1xyXG4gICAgbGV0IG9yZ1N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgYWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0QWxsb3dFdmVudHMoKTtcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEFsbG93RXZlbnRzKEV2ZW50c0FsbG93ZWRUeXBlLkFMTCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJTdGFydCBcXFwic3RhcnRQcm9nXFxcIlwiKTtcclxuICAgIFRhc2suU3RhcnRQcm9nTGV2ZWwrKztcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpOyAvLyBRQ1IgIzc2OTczNCAtIG5vdGhpbmcgY2FuIHN0b3AgYSB0YXNrIGZyb20gc3RhcnRpbmcgdXAuXHJcblxyXG4gICAgLy8gRml4ZWQgYnVnICMyODM2NDcgZXhlY3V0ZSBjb21wb25lbnRzIG1haW4gcHJvZ3JhbXMgLSAgaW4gdGhlIHNlcnZlciB3ZSBleGVjdXRlIHRoZSBzYW1lIHNlZSBpbmkuY3BwIG1ldGhvZCBleGVjdXRlX21haW5fcHJvZ3MoKVxyXG4gICAgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkID0gYXdhaXQgdGhpcy5FeGVjdXRlQ29tcG9uZW50TWFpblByb2dyYW1zKGNhbGxCeURlc3RTdWJGb3JtLCBtb3ZlVG9GaXJzdENvbnRyb2wpO1xyXG5cclxuICAgIC8vIGV4ZWN1dGUgaW50ZXJuYWwgbWFpbiBwcm9ncmFtc1xyXG4gICAgbGV0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFJlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkKTtcclxuICAgIGxldCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrUmVmOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGF3YWl0IFRhc2suRXhlY3V0ZU1haW5Qcm9ncmFtKDAsIGNhbGxCeURlc3RTdWJGb3JtLCBtb3ZlVG9GaXJzdENvbnRyb2wsIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFJlZiwgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZiwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlKTtcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFJlZi52YWx1ZTtcclxuXHJcbiAgICBpZiAoIVRhc2suX2lkbGVUaW1lclN0YXJ0ZWQpIHtcclxuICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5zdGFydFRpbWVyKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCksIEVudmlyb25tZW50Lkluc3RhbmNlLmdldElkbGVUaW1lKDApLCB0cnVlKTtcclxuICAgICAgVGFzay5faWRsZVRpbWVyU3RhcnRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5PcGVuRm9ybXMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG4gICAgYXdhaXQgdGhpcy5Eb0ZpcnN0UmVjb3JkQ3ljbGUoKTtcclxuICAgIGF3YWl0IHRoaXMuTW92ZVRvRmlyc3RDb250cm9scyhjYWxsQnlEZXN0U3ViRm9ybSk7XHJcblxyXG5cclxuICAgIC8vIEhhbmRsZSB0aGUgZXZlbnRzIG9ubHkgd2hlbiBhbGwgdGhlIHRhc2tzIGFuZCB0aGVpciBmb3JtcyBhcmUgb3BlbmVkLlxyXG4gICAgaWYgKFRhc2suU3RhcnRQcm9nTGV2ZWwgPT09IDEpIHtcclxuICAgICAgbGV0IHJlc2V0QWxsb3dFdmVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgbGV0IGNhbkV4ZWN1dGVFdmVudHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgLy8gc2V0IHRoZSB3aXRoaW4gbm9uIGludGVyYWN0aXZlIHNpbmNlIHRoZSBoYW5kbGVFdmVudHMgbWlnaHQgdHJ5IHRvIGV4ZWN1dGUgYW4gZXZlbnRcclxuICAgICAgLy8gdGhhdCB3YXMgcmFpc2VkIGluIHRoZSAxc3QgcmVjIHByZWYgKGFkZGVkIGluIG1vdmVUb0ZpcnN0Y29udHJvbHMpLlxyXG4gICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkICE9PSBudWxsICYmIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIHJlc2V0QWxsb3dFdmVudHMgPSB0cnVlO1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoYXdhaXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLmlzQWxsb3dFdmVudHMoKSk7XHJcblxyXG4gICAgICAgIC8vIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggYWxsb3cgZXZlbnRzID0gTk8gaXMgYWJvdXQgdG8gcnVuLlxyXG4gICAgICAgIC8vIGRvbid0IHRyeSB0byBleGVjdXRlIHRoZSBldmVudHMgYmVmb3JlIGl0IHN0YXJ0cyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBsb3N0LiAoIzEzODQ5MylcclxuICAgICAgICBjYW5FeGVjdXRlRXZlbnRzID0gYXdhaXQgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBpdCBpcyBhIHN1YmZvcm0gd2l0aCB2aXNpYmlsaXR5IGV4cHJlc3Npb24gZXZhbHVhdGVkIHRvIFRSVUUsXHJcbiAgICAgIC8vIHNvIGFmdGVyIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIgZG8gbm90IGV4ZWN1dGUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlLlxyXG4gICAgICAvLyBUaGVzZSBldmVudHMgd2lsbCBiZSBleGVjdXRlZCBmcm9tIHRoZSAnc3RhcnRQcm9nJyBvZiB0aGUgcGFyZW50IHRhc2suXHJcbiAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgIT09IG51bGwgJiYgY2FuRXhlY3V0ZUV2ZW50cykge1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlRXZlbnRzKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCksIDApO1xyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzdG9yZS4ganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBpdCB3aWxsIGJlIHNldCBhZ2FpbiBvbmNlIGluIHRoZSBjb3JyZWN0IGV2ZW50c0xvb3AuXHJcbiAgICAgIGlmIChyZXNldEFsbG93RXZlbnRzKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldEFsbG93RXZlbnRzKGFsbG93RXZlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsLS07XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJFbmQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcblxyXG4gICAgLy8gSWYgb3JpZ2luYWxseSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gc3RvcCBldmVudHMgZXhlY3V0aW9uLCB0aGVuIHJlc3RvcmUgdGhpc1xyXG4gICAgaWYgKG9yZ1N0b3BFeGVjdXRpb24gJiYgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24ob3JnU3RvcEV4ZWN1dGlvbik7XHJcblxyXG4gICAgcmV0dXJuIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGV4ZWN1dGUgY29tcG9uZW50J3MgbWFpbiBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIG5vbiBpbnRlcmFjdGl2ZSB0YXNrIGlmIGFueSB0aGF0IGV4ZWN1dGVkPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBhc3luYyBFeGVjdXRlQ29tcG9uZW50TWFpblByb2dyYW1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHsgLy8gZ28gd2l0aCBTdGFydFByb2dyYW1cclxuICAgIGxldCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG51bGwpO1xyXG5cclxuICAgIGxldCBtYXhDdGxJZHg6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuZ2V0TWF4Q3RsSWR4KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBtYXhDdGxJZHg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgY29tcG9uZW50TWFpblByb2dyYW06IFRhc2sgPSA8VGFzaz5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgaSk7XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50TWFpblByb2dyYW0gIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5FeGVjdXRlTWFpblByb2dyYW0oaSwgY2FsbEJ5RGVzdFN1YkZvcm0sIG1vdmVUb0ZpcnN0Q29udHJvbCwgY3VycmVudE5vbkludGVyYWN0aXZlVGFzaywgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIG1haW4gcHJvZ3JhbSBvZiBDdGxJbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ3RsSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNhbGxCeURlc3RTdWJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgRXhlY3V0ZU1haW5Qcm9ncmFtKEN0bEluZGV4OiBudW1iZXIsIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4sIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2s6IFJlZlBhcmFtPFRhc2s+LCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFJlZlBhcmFtPFRhc2s+LCBtZ0RhdGFUYWJsZTogSU1HRGF0YUNvbGxlY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtYWluUHJvZ3JhbVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBDdGxJbmRleCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCIgIENsaWVudE1hbmFnZXIuc3RhcnRQcm9nOiBjdGxJZHg9ezB9LCB0YXNrPXsxfVwiLCBDdGxJbmRleCwgbWFpblByb2dyYW1UYXNrKSk7XHJcblxyXG4gICAgY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSA9ICA8VGFzaz4oYXdhaXQgbWFpblByb2dyYW1UYXNrLlN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbCwgY2FsbEJ5RGVzdFN1YkZvcm0pKTtcclxuICAgIGlmIChub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPT09IG51bGwpXHJcbiAgICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC52YWx1ZSA9IGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWU7XHJcbiAgICBlbHNlIGlmIChjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgdGFza3MgaW4gc3RhcnRQcm9nXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBPcGVuIGFsbCB0aGUgZm9ybSB0aGF0IGFyZSBwZW5kaW5nIGluIENyZWF0ZWRGb3JtcyB2ZWN0b3IuIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3JlYXRlZEZvcm1zOiBDcmVhdGVkRm9ybVZlY3RvciA9IE1nRm9ybS5DcmVhdGVkRm9ybXM7XHJcblxyXG4gICAgaWYgKGNyZWF0ZWRGb3Jtcy5Db3VudCgpID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgd2hpbGUgKGkgPCBjcmVhdGVkRm9ybXMuQ291bnQoKSkge1xyXG4gICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IGNyZWF0ZWRGb3Jtcy5nZXQoaSk7XHJcbiAgICAgICAgbGV0IGNhbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gT3BlbiBhIHN1YmZvcm0gb25seSBpZiBpdHMgY29udGFpbmVyIGZvcm0gaXMgT3BlbmVkLlxyXG4gICAgICAgIC8vIGlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgZG9lc24ndCBnbyB3ZWxsIGZvciBzdWJmb3JtcyAoUUNSICM5MTkxMTkpLlxyXG4gICAgICAgIGlmIChtZ0Zvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICAgIGxldCBvcGVuZWQ6IGJvb2xlYW4gPSAoPE1nRm9ybUJhc2U+bWdGb3JtLmdldFN1YkZvcm1DdHJsKCkuZ2V0Rm9ybSgpKS5PcGVuZWQ7XHJcbiAgICAgICAgICBpZiAob3BlbmVkKSB7XHJcbiAgICAgICAgICAgIGNhbk9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICgoPFRhc2s+bWdGb3JtLmdldFRhc2soKSkuaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW5PcGVuKSB7XHJcbiAgICAgICAgICBNYW5hZ2VyLk9wZW5Gb3JtKG1nRm9ybSk7XHJcbiAgICAgICAgICBhd2FpdCBNYW5hZ2VyLkRvRmlyc3RSZWZyZXNoVGFibGUobWdGb3JtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtZ0Zvcm0uT3BlbmVkKSB7XHJcblxyXG4gICAgICAgICAgY3JlYXRlZEZvcm1zLnJlbW92ZShtZ0Zvcm0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR29lcyBvdmVyIGZvcm1zIGlzIGNyZWF0ZWRGb3JtVmVjIGFuZCBwZXJmb3JtcyBtb3ZlIHRvIGZpcnN0IHJlY29yZCBjeWNsZSBjb250cm9sPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBhc3luYyBEb0ZpcnN0UmVjb3JkQ3ljbGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkID09PSBudWxsIHx8IG1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IG1nZC5nZXRUYXNrc0NvdW50KCk7IGorKykge1xyXG4gICAgICAgIGxldCB0YXNrOiBUYXNrID0gbWdkLmdldFRhc2soaik7XHJcblxyXG4gICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgICAgIGlmIChtZ0Zvcm0gIT09IG51bGwgJiYgdGFzay5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpICYmICFtZ0Zvcm0uSWdub3JlRmlyc3RSZWNvcmRDeWNsZSkge1xyXG4gICAgICAgICAgICBtZ0Zvcm0uSWdub3JlRmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBldmVyeSBtZ2RhdGEgcGVyZm9ybSBtb3ZlIHRvIGZpcnN0IGNvbnRyb2wgdG8gdGhlIGZvcm1cclxuICAvLy8gdGhhdCB3ZSBtYXJrZWQgYmVmb3JlIHdpdGggTW92ZVRvRmlyc3RDb250cm9sIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIE1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoaSk7XHJcblxyXG4gICAgICBpZiAobWdkID09PSBudWxsIHx8IG1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgbGV0IHRhc2tzQ291bnQ6IG51bWJlciA9IG1nZC5nZXRUYXNrc0NvdW50KCk7XHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0YXNrc0NvdW50OyBqKyspIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IG1nZC5nZXRUYXNrKGopO1xyXG4gICAgICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkgJiYgbWdGb3JtICE9PSBudWxsICYmIG1nRm9ybS5Nb3ZlZFRvRmlyc3RDb250cm9sKSB7XHJcbiAgICAgICAgICBtZ0Zvcm0uTW92ZWRUb0ZpcnN0Q29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgICAgIGF3YWl0IG1nRm9ybS5tb3ZlVG9GaXJzdFBhcmthYmVsQ29udHJvbChjYWxsQnlEZXN0U3ViRm9ybSk7XHJcbiAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==