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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/esm2020/index.mjs +190 -0
  2. package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
  3. package/esm2020/src/AccessHelper.mjs +3 -0
  4. package/esm2020/src/ClientManager.mjs +403 -0
  5. package/esm2020/src/CommandsProcessorBase.mjs +58 -0
  6. package/esm2020/src/CommandsProcessorManager.mjs +26 -0
  7. package/esm2020/src/CommandsTable.mjs +163 -0
  8. package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
  9. package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
  10. package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
  11. package/esm2020/src/GUIManager.mjs +63 -0
  12. package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
  13. package/esm2020/src/GuiEventsProcessor.mjs +171 -0
  14. package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
  15. package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
  16. package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
  17. package/esm2020/src/bridge/MagicBridge.mjs +41 -0
  18. package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
  19. package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
  20. package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
  21. package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
  22. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
  23. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
  24. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -0
  26. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
  27. package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
  28. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
  29. package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
  30. package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -0
  31. package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
  32. package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
  33. package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +2 -2
  34. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
  35. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
  38. package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
  39. package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
  40. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
  41. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
  43. package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
  44. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -0
  48. package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
  49. package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
  50. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
  51. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
  56. package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
  57. package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
  58. package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
  59. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
  61. package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
  62. package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
  63. package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
  64. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
  65. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
  67. package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
  68. package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
  69. package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
  70. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
  72. package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
  73. package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
  74. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
  75. package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
  76. package/esm2020/src/data/DataView.mjs +1634 -0
  77. package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
  78. package/esm2020/src/data/DataviewManager.mjs +28 -0
  79. package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
  80. package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
  81. package/esm2020/src/data/Field.mjs +645 -0
  82. package/esm2020/src/data/FieldBase.mjs +18 -0
  83. package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
  84. package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
  85. package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
  86. package/esm2020/src/data/Record.mjs +846 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/esm2020/src/data/RecordsTable.mjs +267 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
  91. package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
  92. package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2020/src/env/Environment.mjs +554 -0
  94. package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
  95. package/esm2020/src/env/LanguageData.mjs +222 -0
  96. package/esm2020/src/env/MirrorString.mjs +66 -0
  97. package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
  98. package/esm2020/src/event/Event.mjs +1436 -0
  99. package/esm2020/src/event/EventHandler.mjs +773 -0
  100. package/esm2020/src/event/EventHandlerPosition.mjs +201 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/esm2020/src/event/IEventsManager.mjs +7 -0
  103. package/esm2020/src/event/RunTimeEvent.mjs +406 -0
  104. package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
  105. package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
  106. package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
  107. package/esm2020/src/exp/Expression.mjs +200 -0
  108. package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
  109. package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
  110. package/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
  112. package/esm2020/src/exp/YesNoExp.mjs +41 -0
  113. package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
  114. package/esm2020/src/gui/FormsTable.mjs +66 -0
  115. package/esm2020/src/gui/MgControl.mjs +357 -0
  116. package/esm2020/src/gui/MgForm.mjs +1195 -0
  117. package/esm2020/src/http/HttpManager.mjs +97 -0
  118. package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
  119. package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
  120. package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
  121. package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
  122. package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
  123. package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
  124. package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
  125. package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
  126. package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
  127. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
  128. package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
  129. package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
  130. package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
  131. package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
  132. package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
  133. package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
  134. package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
  135. package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
  136. package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
  137. package/esm2020/src/remote/ServerError.mjs +44 -0
  138. package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
  139. package/esm2020/src/rt/Argument.mjs +274 -0
  140. package/esm2020/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2020/src/rt/Boundary.mjs +158 -0
  142. package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
  143. package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
  144. package/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -0
  147. package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
  148. package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
  149. package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
  150. package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
  151. package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
  152. package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
  153. package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
  154. package/esm2020/src/rt/Operation.mjs +745 -0
  155. package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
  156. package/esm2020/src/rt/Recompute.mjs +355 -0
  157. package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
  158. package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
  159. package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
  160. package/esm2020/src/rt/TableCache.mjs +177 -0
  161. package/esm2020/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2020/src/rt/Transaction.mjs +54 -0
  163. package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
  164. package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
  165. package/esm2020/src/tasks/MGData.mjs +552 -0
  166. package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
  167. package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
  168. package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
  169. package/esm2020/src/tasks/RemoteTaskService.mjs +45 -0
  170. package/esm2020/src/tasks/Task.mjs +2501 -0
  171. package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
  172. package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
  173. package/esm2020/src/tasks/TasksTable.mjs +80 -0
  174. package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
  175. package/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
  178. package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
  179. package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
  180. package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
  181. package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
  182. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
  183. package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
  184. package/esm2020/src/util/ParamParseResult.mjs +8 -0
  185. package/esm2020/src/util/PrmMap.mjs +151 -0
  186. package/esm2020/src/util/Process.mjs +7 -0
  187. package/esm2020/src/util/ReturnResult.mjs +46 -0
  188. package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
  189. package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
  190. package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
  191. package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
  192. package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +267 -254
  193. package/fesm2015/magic-xpa-engine.mjs.map +1 -0
  194. package/fesm2020/magic-xpa-engine.mjs +30705 -0
  195. package/fesm2020/magic-xpa-engine.mjs.map +1 -0
  196. package/index.d.ts +2 -0
  197. package/package.json +27 -13
  198. package/src/AccessHelper.d.ts +1 -1
  199. package/src/CommandsProcessorBase.d.ts +3 -3
  200. package/src/GuiEventsProcessor.d.ts +1 -1
  201. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
  202. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
  203. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
  204. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
  205. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
  206. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
  207. package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
  208. package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
  209. package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
  210. package/src/commands/ClientToServer/ExecOperCommand.d.ts +1 -2
  211. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
  212. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
  213. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
  214. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
  215. package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
  216. package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
  217. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
  218. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
  219. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
  220. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
  221. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
  222. package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
  223. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
  224. package/src/commands/DataViewCommandBase.d.ts +2 -2
  225. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  226. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  227. package/src/data/FieldBase.d.ts +3 -3
  228. package/src/data/Record.d.ts +2 -9
  229. package/src/data/RecordsTable.d.ts +1 -2
  230. package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
  231. package/src/env/EnvVariablesTable.d.ts +2 -15
  232. package/src/env/Environment.d.ts +0 -3
  233. package/src/env/MirrorString.d.ts +15 -0
  234. package/src/event/Event.d.ts +0 -3
  235. package/src/event/EventsManager.d.ts +7 -8
  236. package/src/event/IEventsManager.d.ts +5 -6
  237. package/src/exp/ExpressionEvaluator.d.ts +2 -2
  238. package/src/exp/ExpressionLocalJpn.d.ts +2 -2
  239. package/src/exp/GlobalParamsTable.d.ts +2 -1
  240. package/src/gui/MgControl.d.ts +0 -2
  241. package/src/gui/MgForm.d.ts +4 -4
  242. package/src/http/client/HttpClientAsync.d.ts +2 -2
  243. package/src/http/client/HttpClientBase.d.ts +3 -3
  244. package/src/http/client/HttpClientSync.d.ts +2 -2
  245. package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
  246. package/src/rt/DataviewHeaderBase.d.ts +2 -2
  247. package/src/rt/DataviewHeaderFactory.d.ts +1 -1
  248. package/src/rt/Operation.d.ts +3 -1
  249. package/src/rt/RemoteDataviewHeader.d.ts +1 -2
  250. package/src/rt/Transaction.d.ts +1 -1
  251. package/src/tasks/RemoteTaskService.d.ts +2 -3
  252. package/src/tasks/Task.d.ts +1 -1
  253. package/src/tasks/TaskBase.d.ts +7 -7
  254. package/src/tasks/TaskServiceBase.d.ts +2 -4
  255. package/src/tasks/sort/SortCollection.d.ts +2 -3
  256. package/src/util/FlowMonitorQueue.d.ts +1 -1
  257. package/src/util/IMirrorXML.d.ts +1 -1
  258. package/src/util/ParamParseResult.d.ts +6 -0
  259. package/src/util/PrmMap.d.ts +0 -6
  260. package/src/util/Process.d.ts +1 -1
  261. package/bundles/magic-xpa-engine.umd.js +0 -38066
  262. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  263. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  264. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  265. package/esm2015/index.js +0 -188
  266. package/esm2015/src/AccessHelper.js +0 -3
  267. package/esm2015/src/ClientManager.js +0 -412
  268. package/esm2015/src/CommandsProcessorBase.js +0 -54
  269. package/esm2015/src/CommandsProcessorManager.js +0 -31
  270. package/esm2015/src/CommandsTable.js +0 -166
  271. package/esm2015/src/GUIManager.js +0 -72
  272. package/esm2015/src/GuiEventsProcessor.js +0 -171
  273. package/esm2015/src/bridge/MagicBridge.js +0 -44
  274. package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
  275. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
  276. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
  277. package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
  278. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  279. package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
  280. package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
  281. package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
  282. package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
  283. package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
  284. package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -67
  285. package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
  286. package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
  287. package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
  288. package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
  289. package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
  290. package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
  291. package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
  292. package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
  293. package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
  294. package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
  295. package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
  296. package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
  297. package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
  298. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  299. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  300. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  301. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  302. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  303. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  304. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  305. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  306. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  307. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  308. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  309. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  310. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  311. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  312. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  313. package/esm2015/src/data/DataView.js +0 -1693
  314. package/esm2015/src/data/DataviewManager.js +0 -31
  315. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  316. package/esm2015/src/data/Field.js +0 -672
  317. package/esm2015/src/data/FieldBase.js +0 -9
  318. package/esm2015/src/data/Record.js +0 -914
  319. package/esm2015/src/data/RecordsTable.js +0 -267
  320. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  321. package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
  322. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  323. package/esm2015/src/env/Environment.js +0 -563
  324. package/esm2015/src/env/LanguageData.js +0 -230
  325. package/esm2015/src/event/Event.js +0 -1449
  326. package/esm2015/src/event/EventHandler.js +0 -787
  327. package/esm2015/src/event/EventHandlerPosition.js +0 -201
  328. package/esm2015/src/event/EventsManager.js +0 -3107
  329. package/esm2015/src/event/IEventsManager.js +0 -7
  330. package/esm2015/src/event/RunTimeEvent.js +0 -406
  331. package/esm2015/src/exp/Expression.js +0 -209
  332. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4441
  333. package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
  334. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  335. package/esm2015/src/exp/YesNoExp.js +0 -44
  336. package/esm2015/src/gui/FormsTable.js +0 -73
  337. package/esm2015/src/gui/MgControl.js +0 -438
  338. package/esm2015/src/gui/MgForm.js +0 -1292
  339. package/esm2015/src/http/HttpManager.js +0 -100
  340. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  341. package/esm2015/src/http/client/HttpClientBase.js +0 -148
  342. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  343. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  344. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  345. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  346. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -903
  347. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  348. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  349. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  350. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  351. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  352. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  353. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  354. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  355. package/esm2015/src/remote/ServerError.js +0 -45
  356. package/esm2015/src/rt/Argument.js +0 -281
  357. package/esm2015/src/rt/ArgumentsList.js +0 -108
  358. package/esm2015/src/rt/Boundary.js +0 -161
  359. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  360. package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
  361. package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
  362. package/esm2015/src/rt/Operation.js +0 -769
  363. package/esm2015/src/rt/Recompute.js +0 -372
  364. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  365. package/esm2015/src/rt/TableCache.js +0 -182
  366. package/esm2015/src/rt/TableCacheManager.js +0 -70
  367. package/esm2015/src/rt/Transaction.js +0 -54
  368. package/esm2015/src/tasks/MGData.js +0 -561
  369. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  370. package/esm2015/src/tasks/RemoteTaskService.js +0 -45
  371. package/esm2015/src/tasks/Task.js +0 -2593
  372. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  373. package/esm2015/src/tasks/TasksTable.js +0 -87
  374. package/esm2015/src/tasks/sort/SortCollection.js +0 -72
  375. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  376. package/esm2015/src/util/PrmMap.js +0 -157
  377. package/esm2015/src/util/Process.js +0 -7
  378. package/esm2015/src/util/ReturnResult.js +0 -46
  379. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -1,914 +0,0 @@
1
- import { DataModificationTypes, EMPTY_DCREF, ExpVal, ObjectReferenceBase, ObjectReferencesCollection, RecordUtils } from '@magic-xpa/gui';
2
- import { ApplicationException, Int32, ISO_8859_1_Encoding, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { Base64, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
- import { ExpressionEvaluator, NullValueException } from '../exp/ExpressionEvaluator';
5
- import { ConstInterface } from '../ConstInterface';
6
- import { Environment } from '../env/Environment';
7
- import { DataViewBase } from './DataViewBase';
8
- import { isNullOrUndefined } from 'util';
9
- import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
10
- export class Record {
11
- constructor(dvOrTableCacheOrCIdOrRecord, dataview) {
12
- this._id = Int32.MinValue;
13
- this.dbViewRowIdx = 0;
14
- this._mode = DataModificationTypes.None;
15
- this._dcRefs = null;
16
- this._inCompute = false;
17
- this._inRecompute = false;
18
- this._newRec = false;
19
- this._dataview = null;
20
- this._sendToServer = true;
21
- if (dvOrTableCacheOrCIdOrRecord instanceof Record)
22
- Object.assign(this, dvOrTableCacheOrCIdOrRecord);
23
- else if (arguments.length === 1)
24
- this.constructor_0(dvOrTableCacheOrCIdOrRecord);
25
- else
26
- this.constructor_1(dvOrTableCacheOrCIdOrRecord, dataview);
27
- }
28
- get InCompute() {
29
- return this._inCompute;
30
- }
31
- get InRecompute() {
32
- return this._inRecompute;
33
- }
34
- constructor_0(dvOrTableCache) {
35
- if (dvOrTableCache instanceof DataViewBase)
36
- this._dataview = dvOrTableCache;
37
- else
38
- this._tableCache = dvOrTableCache;
39
- this._fieldsData = new Array(this.getFieldsTab().getSize());
40
- this._flags = new Uint8Array(this.getFieldsTab().getSize());
41
- this._flagsHistory = new Uint8Array(this.getFieldsTab().getSize());
42
- this._dcRefs = new ObjectReferencesCollection();
43
- }
44
- Initialize() {
45
- for (let i = 0; i < this._flags.length; i = i + 1) {
46
- let field = this.getFieldsTab().getField(i);
47
- this._flags[i] = ((field.isNullDefault() || field.getType() === StorageAttribute.BLOB_VECTOR) ? Record.FLAG_NULL : 0);
48
- if (this._dataview !== null && field.IsVirtual) {
49
- let record = this._dataview.getCurrRec();
50
- if (record != null && record.IsFldModifiedAtLeastOnce(i)) {
51
- this.setFlag(i, Record.FLAG_MODIFIED_ATLEAST_ONCE);
52
- }
53
- }
54
- this._flagsHistory[i] = this._flags[i];
55
- }
56
- this.setNewRec();
57
- }
58
- constructor_1(cId, dataview) {
59
- this.constructor_0(dataview);
60
- this.setId(cId);
61
- }
62
- get Modified() {
63
- return this._modified;
64
- }
65
- get Updated() {
66
- return this._updated;
67
- }
68
- get SendToServer() {
69
- return this._sendToServer;
70
- }
71
- CompareTo(obj) {
72
- let res = 0;
73
- let compTo = obj;
74
- let key = this._tableCache.GetKeyById(this._tableCache.GetCurrSortKey());
75
- if (key != null) {
76
- for (let i = 0; i < key.Columns.length; i++) {
77
- let currFld = key.Columns.get_Item(i);
78
- let currFldId = currFld.getId();
79
- if (this.IsNull(currFldId) && compTo.IsNull(currFldId))
80
- continue;
81
- else if (this.IsNull(currFldId) && !compTo.IsNull(currFldId)) {
82
- res = 1;
83
- break;
84
- }
85
- else if (!this.IsNull(currFldId) && compTo.IsNull(currFldId)) {
86
- res = -1;
87
- break;
88
- }
89
- else {
90
- try {
91
- let first = new ExpVal(currFld.getType(), false, this.GetFieldValue(currFldId));
92
- let second = new ExpVal(currFld.getType(), false, compTo.GetFieldValue(currFldId));
93
- res = ExpressionEvaluator.val_cmp_any(first, second, false);
94
- if (res !== 0)
95
- break;
96
- }
97
- catch (err) {
98
- if (err instanceof NullValueException)
99
- Logger.Instance.WriteExceptionToLogWithMsg(" in Record.CompareTo null value was reached");
100
- }
101
- }
102
- }
103
- return res;
104
- }
105
- else {
106
- res = -1;
107
- return res;
108
- }
109
- }
110
- getMode() {
111
- return this._mode;
112
- }
113
- getId() {
114
- return this._id;
115
- }
116
- isNewRec() {
117
- return this._newRec;
118
- }
119
- getFieldDataXML(fldIdx, getOldVal) {
120
- if (arguments.length === 2)
121
- return this.getFieldDataXML_0(fldIdx, getOldVal);
122
- else
123
- return this.getFieldDataXML_1(fldIdx);
124
- }
125
- getFieldDataXML_0(fldIdx, getOldVal) {
126
- let fldVal;
127
- if (!getOldVal)
128
- fldVal = this.GetFieldValue(fldIdx);
129
- else
130
- fldVal = (this.getFieldsTab().getField(fldIdx)).getOriginalValue();
131
- if (fldVal == null)
132
- throw new ApplicationException("in Record.buildFieldsData() null field value!\nField id: " + fldIdx);
133
- let tmpBuf = this.getXMLForValue(fldIdx, fldVal);
134
- return XmlParser.escape(tmpBuf.toString()).toString();
135
- }
136
- getFieldDataXML_1(fldIdx) {
137
- let fieldValue = this.GetFieldValue(fldIdx);
138
- if (fieldValue === null) {
139
- throw new ApplicationException("in Record.buildFieldsData() null field value!\nField id: " + fldIdx);
140
- }
141
- let type = this.getFieldsTab().getType(fldIdx);
142
- return RecordUtils.serializeItemVal(fieldValue, type);
143
- }
144
- getFieldsTab() {
145
- if (this._dataview !== null)
146
- return this._dataview.GetFieldsTab();
147
- else
148
- return this._tableCache.FldsTab;
149
- }
150
- setInitialFldVals(clobberedOnly, isNewRec) {
151
- let i, size;
152
- let fld = null;
153
- size = this.getSizeFld(true);
154
- for (i = 0; i < size; i++) {
155
- if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined") {
156
- fld = this.getFieldsTab().getField(i);
157
- this._fieldsData[i] = fld.getNewRecValue(clobberedOnly);
158
- if (isNewRec && fld.IsVirtual && !fld.isNull())
159
- this.clearFlag(fld.getId(), Record.FLAG_NULL);
160
- if (fld.IsVirtual && fld.getModifiedAtLeastOnce())
161
- this.setFlag(fld.getId(), Record.FLAG_MODIFIED_ATLEAST_ONCE);
162
- if (this._fieldsData[i] === null || typeof this._fieldsData[i] === "undefined")
163
- this._fieldsData[i] = fld.getDefaultValue();
164
- }
165
- }
166
- }
167
- setId(cId) {
168
- this._id = cId;
169
- this._hashKey = this._id;
170
- }
171
- setDBViewRowIdx(rowId) {
172
- this.dbViewRowIdx = rowId;
173
- }
174
- getDBViewRowIdx() {
175
- return this.dbViewRowIdx;
176
- }
177
- fillData(parser) {
178
- let isCurrRec = false;
179
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
180
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
181
- let tag = parser.getXMLsubstring(endContext);
182
- parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_REC) + ConstInterface.MG_TAG_REC.length);
183
- let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
184
- isCurrRec = this.initElements(tokensVector);
185
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
186
- }
187
- else
188
- Logger.Instance.WriteExceptionToLogWithMsg("in Record.FillInnerData() out of bounds");
189
- return isCurrRec;
190
- }
191
- initElements(tokensVector) {
192
- let attribute, valueStr;
193
- let recFieldsData = null;
194
- let recFlags = null;
195
- let j = 0;
196
- let isCurrRec;
197
- isCurrRec = this.peekIsCurrRec(tokensVector);
198
- for (; j < tokensVector.length; j += 2) {
199
- attribute = (tokensVector.get_Item(j));
200
- valueStr = (tokensVector.get_Item(j + 1));
201
- switch (attribute) {
202
- case ConstInterface.MG_ATTR_MODE:
203
- this._mode = valueStr[0];
204
- break;
205
- case XMLConstants.MG_ATTR_ID:
206
- this.setId(XmlParser.getInt(valueStr));
207
- break;
208
- case XMLConstants.MG_ATTR_VB_VIEW_ROWIDX:
209
- this.setDBViewRowIdx(XmlParser.getInt(valueStr));
210
- break;
211
- case XMLConstants.MG_ATTR_VALUE:
212
- if (this.ValueInBase64) {
213
- recFieldsData = Base64.decode(valueStr);
214
- }
215
- else {
216
- recFieldsData = XmlParser.unescape(valueStr);
217
- }
218
- break;
219
- case ConstInterface.MG_ATTR_CURR_REC:
220
- {
221
- }
222
- break;
223
- case ConstInterface.MG_ATTR_ADD_AFTER:
224
- this._addAfter = XmlParser.getInt(valueStr);
225
- break;
226
- case ConstInterface.MG_ATTR_FLAGS:
227
- recFlags = valueStr;
228
- break;
229
- case ConstInterface.MG_ATTR_MODIFIED:
230
- this._modified = true;
231
- break;
232
- case ConstInterface.MG_ATTR_DC_REFS:
233
- this.fillDCRef(valueStr);
234
- break;
235
- case ConstInterface.MG_ATTR_DBPOS:
236
- this._dbPosBase64Val = valueStr;
237
- break;
238
- default:
239
- Logger.Instance.WriteExceptionToLogWithMsg("in Record.initElements() unknown attribute: " + attribute);
240
- break;
241
- }
242
- }
243
- if (this.ValueInBase64) {
244
- let fldValInBytes = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(recFieldsData);
245
- this.fillFieldsData(fldValInBytes, recFlags);
246
- }
247
- else {
248
- this.fillFieldsData(recFieldsData, recFlags, isCurrRec);
249
- }
250
- return isCurrRec;
251
- }
252
- peekIsCurrRec(tokensVector) {
253
- let attribute;
254
- let valueStr;
255
- for (let j = 0; j < tokensVector.length; j += 2) {
256
- attribute = (tokensVector.get_Item(j));
257
- if (attribute === ConstInterface.MG_ATTR_CURR_REC) {
258
- valueStr = (tokensVector.get_Item(j + 1));
259
- return XmlParser.getBoolean(valueStr);
260
- }
261
- }
262
- return false;
263
- }
264
- fillFieldsData(fldValInBytesOrFldsVal, recFlags, isCurrRec) {
265
- if (isNullOrUndefined(isCurrRec))
266
- this.fillFieldsData_0(fldValInBytesOrFldsVal, recFlags);
267
- else
268
- this.fillFieldsData_1(fldValInBytesOrFldsVal, recFlags, isCurrRec);
269
- }
270
- fillFieldsData_0(fldValInBytes, recFlags) {
271
- }
272
- fillFieldsData_1(fldsVal, recFlags, isCurrRec) {
273
- let val = null;
274
- let tmp = null;
275
- let parsedLen = new RefParam(0);
276
- let i, j = 0, from, size;
277
- let currType;
278
- let useHex;
279
- let fld = null;
280
- let valueNotPassed;
281
- from = this.getFromFldIdx(isCurrRec);
282
- size = this.getSizeFld(isCurrRec);
283
- for (i = from; j < size; i++, j++) {
284
- fld = this.getFieldsTab().getField(i);
285
- currType = fld.getType();
286
- useHex = (Environment.Instance.GetDebugLevel() > 1 ||
287
- currType === StorageAttribute.ALPHA ||
288
- currType === StorageAttribute.UNICODE ||
289
- StorageAttributeCheck.isTypeLogical(currType));
290
- if (recFlags[j] === '.')
291
- this._flags[i] = 0;
292
- else if (recFlags[j] === '/')
293
- this._flags[i] = 1;
294
- else {
295
- tmp = recFlags.substr(j * 2, 2);
296
- this._flags[i] = parseInt(tmp, 16);
297
- }
298
- valueNotPassed = Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED);
299
- this._flags[i] = this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED;
300
- this._flagsHistory[i] = this._flags[i];
301
- if (Record.FLAG_UPDATED === (this._flags[i] & Record.FLAG_UPDATED))
302
- this._updated = true;
303
- if (valueNotPassed) {
304
- if (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL)) {
305
- val = fld.getDefaultValue();
306
- }
307
- else {
308
- val = this._dataview.getCurrRec().GetFieldValue(i);
309
- }
310
- }
311
- else {
312
- val = RecordUtils.deSerializeItemVal(fldsVal, currType, fld.getSize(), useHex, fld.getCellsType(), parsedLen);
313
- fldsVal = fldsVal.substr(parsedLen.value);
314
- }
315
- this._fieldsData[i] = val;
316
- }
317
- this.setInitialFldVals(false, false);
318
- }
319
- fillDCRef(valueStr) {
320
- if (!NString.IsNullOrEmpty(valueStr)) {
321
- let couples = StrUtil.tokenize(valueStr, "$");
322
- let size = couples.length;
323
- for (let i = 0; i < size; i = i + 1) {
324
- this._dcRefs.Add(DcValuesReference.Parse(couples[i], this._dataview));
325
- }
326
- }
327
- }
328
- buildFieldsData(message, isCurrRec, getOldVal) {
329
- if (arguments.length === 3)
330
- this.buildFieldsData_0(message, isCurrRec, getOldVal);
331
- else
332
- this.buildFieldsData_1(message);
333
- }
334
- buildFieldsData_0(message, isCurrRec, getOldVal) {
335
- let tmpStr = new StringBuilder();
336
- let from = this.getFromFldIdx(isCurrRec);
337
- let size = this.getSizeFld(isCurrRec);
338
- for (let i = from; i < from + size; i = i + 1) {
339
- let fld = this.getFieldsTab().getField(i);
340
- if (fld.IsExposedToClient === false)
341
- this.setShrinkFlag(i);
342
- if (Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED))
343
- continue;
344
- tmpStr.Append(this.getFieldDataXML(i, getOldVal).toString());
345
- }
346
- if (tmpStr.Length === 0) {
347
- tmpStr.Append(" ");
348
- }
349
- message.Append(tmpStr.ToString());
350
- }
351
- buildFieldsData_1(message) {
352
- let i, from, size;
353
- let fieldValue = new List();
354
- from = this.getFromFldIdx(false);
355
- size = this.getSizeFld(false);
356
- for (i = 0; i < from + size; i++) {
357
- if (Record.FLAG_VALUE_NOT_PASSED === (this._flags[i] & Record.FLAG_VALUE_NOT_PASSED))
358
- continue;
359
- let tmp = this.getFieldDataXML(i);
360
- tmp.forEach(x => fieldValue.push(x));
361
- }
362
- let fieldValuesInBytes = new Uint8Array(fieldValue.length);
363
- for (i = 0; i < fieldValue.length; i++)
364
- fieldValuesInBytes[i] = fieldValue.get_Item(i);
365
- let encodedfieldValuesInBytes = Base64.encode(fieldValuesInBytes);
366
- let tmpStr = Environment.Instance.GetEncoding().GetString(encodedfieldValuesInBytes, 0, encodedfieldValuesInBytes.length);
367
- message.Append(tmpStr);
368
- }
369
- getXMLForValue(fldIdx, fldVal) {
370
- let cellAttr = StorageAttribute.SKIP;
371
- let fldAttr = this.getFieldsTab().getType(fldIdx);
372
- if (fldAttr === StorageAttribute.BLOB_VECTOR)
373
- cellAttr = this.getFieldsTab().getField(fldIdx).getCellsType();
374
- let toBase64 = Environment.Instance.GetDebugLevel() <= 1;
375
- return Record.serializeItemVal(fldVal, fldAttr, cellAttr, toBase64);
376
- }
377
- getFromFldIdx(isCurrRec) {
378
- if (isCurrRec)
379
- return 0;
380
- else
381
- return this.getFieldsTab().getRMIdx();
382
- }
383
- getSizeFld(isCurrRec) {
384
- if (isCurrRec)
385
- return this.getFieldsTab().getSize();
386
- else
387
- return this.getFieldsTab().getRMSize();
388
- }
389
- buildXML(message, isCurrRec, forceBuild) {
390
- if (isNullOrUndefined(forceBuild))
391
- this.buildXML_0(message, isCurrRec);
392
- else
393
- this.buildXML_1(message, isCurrRec, forceBuild);
394
- }
395
- buildXML_0(message, isCurrRec) {
396
- this.buildXML_1(message, isCurrRec, false);
397
- }
398
- buildXML_1(message, isCurrRec, forceBuild) {
399
- let recFlags;
400
- let from, size, i;
401
- let aFlag;
402
- let hexFlag;
403
- if (!forceBuild)
404
- if (this._mode !== DataModificationTypes.Insert && this._mode !== DataModificationTypes.Update &&
405
- this._mode !== DataModificationTypes.Delete && !isCurrRec)
406
- return;
407
- message.Append("\n <" + ConstInterface.MG_TAG_REC);
408
- if (this._id > Int32.MinValue)
409
- message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
410
- message.Append(" " + ConstInterface.MG_ATTR_MODE + "=\"" + this._mode + "\"");
411
- if (this._mode === DataModificationTypes.Insert && this._prev != null)
412
- message.Append(" " + ConstInterface.MG_ATTR_ADD_AFTER + "=\"" + this._prev.getId() + "\"");
413
- if (!forceBuild && !isCurrRec)
414
- this.clearMode();
415
- message.Append(" " + XMLConstants.MG_ATTR_VALUE + "=\"");
416
- if (!forceBuild && isCurrRec)
417
- this.setShrinkFlags();
418
- let getOldVal;
419
- if (this.Synced)
420
- getOldVal = false;
421
- else {
422
- let task = this._dataview.getTask();
423
- getOldVal = (!isCurrRec && (task.getLevel() === Constants.TASK_LEVEL_RECORD ||
424
- task.getLevel() === Constants.TASK_LEVEL_CONTROL) &&
425
- this._dataview.getCurrRec() != null && this._dataview.getCurrRec().getId() === this._id);
426
- }
427
- this.buildFieldsData(message, isCurrRec, getOldVal);
428
- message.Append("\"");
429
- recFlags = new StringBuilder();
430
- from = this.getFromFldIdx(isCurrRec);
431
- size = this.getSizeFld(isCurrRec);
432
- for (i = from; i < from + size; i++) {
433
- aFlag = this._flagsHistory[i];
434
- aFlag = aFlag & Record.FLAG_CRSR_MODIFIED;
435
- aFlag = aFlag | this._flags[i];
436
- hexFlag = NNumber.ToString(aFlag, "X2");
437
- recFlags.Append(hexFlag);
438
- if (isCurrRec)
439
- this._flags[i] = (this._flags[i] & ~Record.FLAG_VALUE_NOT_PASSED);
440
- }
441
- message.Append(" " + ConstInterface.MG_ATTR_FLAGS + "=\"" + recFlags.ToString() + "\"");
442
- if (isCurrRec) {
443
- message.Append(" " + ConstInterface.MG_ATTR_CURR_REC + "=\"1\"");
444
- if (this.Modified)
445
- message.Append(" " + ConstInterface.MG_ATTR_MODIFIED + "=\"1\"");
446
- }
447
- if (this._linksFldsPos != null)
448
- message.Append(" " + ConstInterface.MG_ATTR_DBPOS + "=\"" + XmlParser.escape(this._linksFldsPos) + "\" ");
449
- message.Append(XMLConstants.TAG_TERM);
450
- }
451
- buildXMLForDataViewToDataSource(message) {
452
- let recFlags;
453
- let from, size, i;
454
- let aFlag;
455
- let hexFlag;
456
- message.Append("\n <" + ConstInterface.MG_TAG_REC);
457
- if (this._id > Int32.MinValue)
458
- message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
459
- message.Append(" " + ConstInterface.MG_ATTR_MODE + "=\"" + this._mode + "\"");
460
- if (this._mode === DataModificationTypes.Insert && this._prev != null)
461
- message.Append(" " + ConstInterface.MG_ATTR_ADD_AFTER + "=\"" + this._prev.getId() + "\"");
462
- message.Append(" " + XMLConstants.MG_ATTR_VALUE + "=\"");
463
- this.buildFieldsData(message);
464
- message.Append("\"");
465
- recFlags = new StringBuilder();
466
- from = this.getFromFldIdx(false);
467
- size = this.getSizeFld(false);
468
- for (i = from; i < from + size; i++) {
469
- aFlag = this._flagsHistory[i];
470
- aFlag = aFlag & Record.FLAG_CRSR_MODIFIED;
471
- aFlag = aFlag | this._flags[i];
472
- hexFlag = NNumber.ToString(aFlag, 'X2');
473
- recFlags.Append(hexFlag);
474
- }
475
- message.Append(" " + ConstInterface.MG_ATTR_FLAGS + "=\"" + recFlags + "\"");
476
- if (this._linksFldsPos != null)
477
- message.Append(" " + ConstInterface.MG_ATTR_DBPOS + "=\"" + XmlParser.escape(this._linksFldsPos) + "\" ");
478
- message.Append(XMLConstants.TAG_TERM);
479
- }
480
- setShrinkFlags() {
481
- let i;
482
- let size = this.getSizeFld(true);
483
- let serverCurrRec = this._dataview.getServerCurrRec();
484
- if (serverCurrRec == null)
485
- return;
486
- for (i = 0; i < size; i++) {
487
- if (this.fldValsEqual(serverCurrRec, i) || (Record.FLAG_NULL === (this._flags[i] & Record.FLAG_NULL))) {
488
- this._flags[i] = this._flags[i] | Record.FLAG_VALUE_NOT_PASSED;
489
- }
490
- }
491
- }
492
- setShrinkFlag(fldIdx) {
493
- this._flags[fldIdx] |= Record.FLAG_VALUE_NOT_PASSED;
494
- }
495
- SetFieldValue(idx, isNull, value) {
496
- let field = this.getFieldsTab().getField(idx);
497
- field.UpdateNull(isNull, this);
498
- value = this.CheckMgValue(value, isNull, field);
499
- this._fieldsData[idx] = value;
500
- field.takeValFromRec();
501
- this.clearFlag(field.getId(), Record.FLAG_INVALID);
502
- field.invalidate(true, false);
503
- }
504
- setFieldValue(fldIdx, mgVal, setRecordUpdated) {
505
- let fld = this.getFieldsTab().getField(fldIdx);
506
- if (fld.PrevIsNull() === fld.isNull() && mgVal === this.GetFieldValue(fldIdx))
507
- return;
508
- mgVal = this.CheckMgValue(mgVal, fld.isNull(), fld);
509
- if (fldIdx >= 0 && fldIdx < this.getFieldsTab().getSize()) {
510
- this._fieldsData[fldIdx] = mgVal;
511
- if (setRecordUpdated) {
512
- if (fld.PartOfDataview)
513
- this._modified = true;
514
- if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
515
- RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
516
- this._dataview.getTask().DelayCommandExecution = true;
517
- }
518
- this._dataview.setChanged(true);
519
- this.setMode(DataModificationTypes.Update);
520
- }
521
- }
522
- else
523
- Logger.Instance.WriteExceptionToLogWithMsg("in Record.setFieldValue() illegal field index: " + fldIdx);
524
- }
525
- CheckMgValue(mgVal, isNull, fld) {
526
- if (mgVal === null || isNull) {
527
- mgVal = fld.getNullValue();
528
- if (mgVal === null)
529
- mgVal = fld.getMagicDefaultValue();
530
- }
531
- let size = fld.getSize();
532
- if (UtilStrByteMode.isLocaleDefLangDBCS() && fld.getType() !== StorageAttribute.UNICODE) {
533
- if (mgVal !== null && UtilStrByteMode.lenB(mgVal) > size)
534
- mgVal = UtilStrByteMode.leftB(mgVal, size);
535
- }
536
- else {
537
- if (mgVal !== null && mgVal.length > size)
538
- mgVal = mgVal.substr(0, size);
539
- }
540
- return mgVal;
541
- }
542
- setModified() {
543
- this._modified = true;
544
- }
545
- resetModified() {
546
- this._modified = false;
547
- }
548
- setUpdated() {
549
- this._updated = true;
550
- }
551
- resetUpdated() {
552
- this._updated = false;
553
- }
554
- GetFieldValue(fldIdx) {
555
- let val = null;
556
- if (fldIdx >= 0 && fldIdx < this._fieldsData.length)
557
- val = this._fieldsData[fldIdx];
558
- return val.toString();
559
- }
560
- replicate() {
561
- let record = new Record(this);
562
- record._fieldsData = this._fieldsData.slice();
563
- record._flags = this._flags.subarray(0);
564
- record._flagsHistory = this._flagsHistory.subarray(0);
565
- record._dcRefs = this._dcRefs.Clone();
566
- return record;
567
- }
568
- setSameAs(rec, realOnly, rId) {
569
- if (arguments.length === 3)
570
- this.setSameAs_0(rec, realOnly, rId);
571
- else
572
- this.setSameAs_1(rec, realOnly);
573
- }
574
- setSameAs_0(rec, realOnly, rId) {
575
- this.setSameAs(rec, realOnly);
576
- this.setId(rId);
577
- }
578
- setSameAs_1(rec, realOnly) {
579
- this._id = rec._id;
580
- this._hashKey = rec._hashKey;
581
- if (!this._dataview.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX))
582
- this.setMode(rec._mode);
583
- this._addAfter = rec._addAfter;
584
- if (realOnly) {
585
- for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
586
- let afield = rec.getFieldsTab().getField(i);
587
- if (!afield.IsVirtual) {
588
- this._fieldsData[i] = rec._fieldsData[i];
589
- this._flags[i] = rec._flags[i];
590
- this._flagsHistory[i] = rec._flagsHistory[i];
591
- }
592
- }
593
- }
594
- else {
595
- this._fieldsData = rec._fieldsData;
596
- this._flags = rec._flags;
597
- this._flagsHistory = rec._flagsHistory;
598
- }
599
- this._modified = rec._modified;
600
- this._dataview = rec._dataview;
601
- this._computed = rec._computed;
602
- this._updated = rec._updated;
603
- this.setDcRefs(rec._dcRefs);
604
- if (rec._next !== this) {
605
- this._next = rec._next;
606
- }
607
- if (rec._prev !== this) {
608
- this._prev = rec._prev;
609
- }
610
- }
611
- IsNull(fldIdx) {
612
- this.checkFlags(fldIdx);
613
- return ((this._flags[fldIdx] & Record.FLAG_NULL) === Record.FLAG_NULL);
614
- }
615
- isLinkInvalid(fldIdx) {
616
- this.checkFlags(fldIdx);
617
- return ((this._flags[fldIdx] & Record.FLAG_INVALID) === Record.FLAG_INVALID);
618
- }
619
- isFldModified(fldIdx) {
620
- this.checkFlags(fldIdx);
621
- return ((this._flags[fldIdx] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED);
622
- }
623
- IsFldModifiedAtLeastOnce(fldIdx) {
624
- this.checkFlags(fldIdx);
625
- return ((this._flags[fldIdx] & Record.FLAG_MODIFIED_ATLEAST_ONCE) === Record.FLAG_MODIFIED_ATLEAST_ONCE);
626
- }
627
- isFldUpdated(fldIdx) {
628
- this.checkFlags(fldIdx);
629
- return ((this._flags[fldIdx] & Record.FLAG_UPDATED) === Record.FLAG_UPDATED);
630
- }
631
- setFlag(fldIdx, aFlag) {
632
- this.checkFlags(fldIdx);
633
- this._flags[fldIdx] = this._flags[fldIdx] | aFlag;
634
- if (aFlag === Record.FLAG_CRSR_MODIFIED)
635
- this._flagsHistory[fldIdx] = this._flagsHistory[fldIdx] | aFlag;
636
- }
637
- clearFlag(fldIdx, aFlags) {
638
- this.checkFlags(fldIdx);
639
- this._flags[fldIdx] = this._flags[fldIdx] & ~aFlags;
640
- }
641
- clearFlagsHistory() {
642
- for (let i = 0; i < this._flags.length; i = i + 1)
643
- this._flagsHistory[i] = 0;
644
- }
645
- clearFlags(aFlags) {
646
- for (let i = 0; i < this._flags.length; i = i + 1)
647
- this.clearFlag(i, aFlags);
648
- }
649
- clearFlagsForRealOnly(aFlags) {
650
- for (let i = 0; i < this._flags.length; i = i + 1) {
651
- let field = this.getFieldsTab().getField(i);
652
- if (!field.IsVirtual) {
653
- this.clearFlag(i, aFlags);
654
- }
655
- }
656
- }
657
- clearHistoryFlag(fldIdx) {
658
- if (this._flagsHistory !== null && fldIdx < this.getFieldsTab().getSize() && fldIdx >= 0) {
659
- this._flagsHistory[fldIdx] = 0;
660
- }
661
- }
662
- checkFlags(fldIdx) {
663
- if (this._flags === null || fldIdx >= this.getFieldsTab().getSize() || fldIdx < 0) {
664
- throw new ApplicationException("Cannot find flags");
665
- }
666
- }
667
- restart(oldMode) {
668
- let task = this._dataview.getTask();
669
- if (oldMode === DataModificationTypes.None) {
670
- let rec = this._dataview.getCurrRec();
671
- let isCurrRec = (rec != null && rec.getId() === this._id);
672
- if ((this._dataview.getTask()).getMode() === Constants.TASK_MODE_CREATE)
673
- if (isCurrRec && !task.getAfterRetry() && task.TryingToCommit && !this._dataview.inRollback())
674
- oldMode = DataModificationTypes.Update;
675
- else
676
- oldMode = DataModificationTypes.Insert;
677
- else
678
- oldMode = DataModificationTypes.Update;
679
- }
680
- this.setMode(oldMode);
681
- if (oldMode === DataModificationTypes.Insert)
682
- this.setNewRec();
683
- }
684
- setLateCompute(val) {
685
- this._lateCompute = val;
686
- }
687
- lateCompute() {
688
- return this._lateCompute;
689
- }
690
- setInDeleteProcess(val) {
691
- this._inDeleteProcess = val;
692
- }
693
- inDeleteProcess() {
694
- return this._inDeleteProcess;
695
- }
696
- removeRecFromDc() {
697
- if (this._dcRefs !== null) {
698
- this._dcRefs.Dispose();
699
- }
700
- }
701
- isSameRecData(rec, currRec, checkOnlyParetOfDataview) {
702
- let size = this.getSizeFld(currRec);
703
- let start = this.getFromFldIdx(currRec);
704
- let i;
705
- let field;
706
- if (this === rec)
707
- return true;
708
- try {
709
- if (rec.getSizeFld(currRec) !== size)
710
- return false;
711
- if (rec.getFromFldIdx(currRec) !== start)
712
- return false;
713
- for (i = 0; i < start + size; i++) {
714
- field = this.getFieldsTab().getField(i);
715
- if (checkOnlyParetOfDataview && !field.PartOfDataview)
716
- continue;
717
- if (!this.fldValsEqual(rec, i))
718
- return false;
719
- }
720
- }
721
- catch (err) {
722
- if (err instanceof ApplicationException)
723
- return false;
724
- throw err;
725
- }
726
- return true;
727
- }
728
- fldValsEqual(rec, fldIdx) {
729
- let type = this.getFieldsTab().getField(fldIdx).getType();
730
- return ExpressionEvaluator.mgValsEqual(this.GetFieldValue(fldIdx), this.IsNull(fldIdx), type, rec.GetFieldValue(fldIdx), rec.IsNull(fldIdx), type);
731
- }
732
- getHashKey() {
733
- return this._hashKey;
734
- }
735
- setNextRec(nextRec) {
736
- this._next = nextRec;
737
- }
738
- setPrevRec(prevRec) {
739
- this._prev = prevRec;
740
- }
741
- getPrevRec() {
742
- return this._prev;
743
- }
744
- getNextRec() {
745
- return this._next;
746
- }
747
- getDcRefs() {
748
- return this._dcRefs.Clone();
749
- }
750
- setDcRefs(newDcRefs) {
751
- this.removeRecFromDc();
752
- this._dcRefs = newDcRefs.Clone();
753
- this.SetDcValueId();
754
- }
755
- realModified() {
756
- let bRc = false;
757
- let tabSize = this.getFieldsTab().getSize();
758
- let j;
759
- for (j = 0; j < tabSize; j++) {
760
- if ((this._flags[j] & Record.FLAG_MODIFIED) === Record.FLAG_MODIFIED) {
761
- if (!(this.getFieldsTab().getField(j).IsVirtual)) {
762
- bRc = true;
763
- break;
764
- }
765
- }
766
- }
767
- return bRc;
768
- }
769
- ToString() {
770
- let str = new StringBuilder();
771
- this.buildXML(str, (this._dataview.getCurrRec()).getId() === this._id, true);
772
- return str.ToString();
773
- }
774
- setSendToServer(val) {
775
- this._sendToServer = val;
776
- }
777
- getRecSize() {
778
- let sum = 0;
779
- for (let i = 0; i < this.getFieldsTab().getSize(); i = i + 1) {
780
- let field = this.getFieldsTab().getField(i);
781
- sum = sum + field.getSize();
782
- }
783
- return sum;
784
- }
785
- copyCrsrModifiedFlags(rec) {
786
- let tabSize = this.getFieldsTab().getSize();
787
- let j;
788
- for (j = 0; j < tabSize; j++) {
789
- this._flags[j] = rec._flags[j];
790
- this._flags[j] = this._flags[j] & Record.FLAG_CRSR_MODIFIED;
791
- }
792
- }
793
- getDbPosVal() {
794
- return this._dbPosBase64Val;
795
- }
796
- buildLinksPosStr() {
797
- let tbl = this._dataview.getTask().getDataviewHeaders();
798
- if (tbl !== null) {
799
- this._linksFldsPos = tbl.buildDbPosString();
800
- }
801
- }
802
- setForceSaveOrg(val) {
803
- this._forceSaveOrg = val;
804
- }
805
- getForceSaveOrg() {
806
- return this._forceSaveOrg;
807
- }
808
- isCauseInvalidation() {
809
- return this._causeInvalidation;
810
- }
811
- setCauseInvalidation(causeInvalidation) {
812
- this._causeInvalidation = causeInvalidation;
813
- }
814
- isComputed() {
815
- return this._computed;
816
- }
817
- setComputed(val) {
818
- this._computed = val;
819
- }
820
- setInCompute(val) {
821
- if (!val)
822
- this.setComputed(true);
823
- this._inCompute = val;
824
- }
825
- setInRecompute(val) {
826
- this._inRecompute = val;
827
- }
828
- setMode(newMode) {
829
- switch (newMode) {
830
- case DataModificationTypes.None:
831
- case DataModificationTypes.Insert:
832
- case DataModificationTypes.Update:
833
- case DataModificationTypes.Delete:
834
- if (this._mode === DataModificationTypes.None ||
835
- this._mode === DataModificationTypes.Update && newMode === DataModificationTypes.Delete)
836
- this._mode = newMode;
837
- break;
838
- default:
839
- Logger.Instance.WriteExceptionToLogWithMsg("in Record.setMode(): illegal mode: " + newMode);
840
- break;
841
- }
842
- }
843
- clearMode() {
844
- this._mode = DataModificationTypes.None;
845
- }
846
- setOldRec() {
847
- this._newRec = false;
848
- }
849
- setNewRec() {
850
- this._newRec = true;
851
- }
852
- static serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64) {
853
- return RecordUtils.serializeItemVal(itemVal, itemAttr, cellAttr, ToBase64);
854
- }
855
- SetDcValueId() {
856
- let form = this._dataview.getTask().getForm();
857
- let mgControl = null;
858
- if (form != null && this._dcRefs != null) {
859
- this._dcRefs.Refs.forEach((dcRef) => {
860
- mgControl = form.getCtrl(dcRef.ditIdx);
861
- if (mgControl != null)
862
- mgControl.setDcValId(dcRef.DcValues.getId());
863
- });
864
- }
865
- }
866
- resetDcValueId() {
867
- let form = this._dataview.getTask().getForm();
868
- let mgControl = null;
869
- if (form != null && this._dcRefs != null) {
870
- this._dcRefs.Refs.forEach(function (dcRef) {
871
- mgControl = form.getCtrl(dcRef.ditIdx);
872
- if (mgControl != null)
873
- mgControl.setDcValId(EMPTY_DCREF);
874
- });
875
- }
876
- }
877
- AddDcValuesReference(controlId, dcValuesId) {
878
- let dcValues = this._dataview.getDcValues(dcValuesId);
879
- let dcRef = new DcValuesReference(controlId, dcValues);
880
- if (this._dcRefs === null) {
881
- this._dcRefs = new ObjectReferencesCollection();
882
- }
883
- this._dcRefs.Add(dcRef);
884
- }
885
- }
886
- Record.FLAG_NULL = (0x01);
887
- Record.FLAG_INVALID = (0x02);
888
- Record.FLAG_MODIFIED = (0x04);
889
- Record.FLAG_UPDATED = (0x08);
890
- Record.FLAG_CRSR_MODIFIED = (0x10);
891
- Record.FLAG_VALUE_NOT_PASSED = (0x20);
892
- Record.FLAG_MODIFIED_ATLEAST_ONCE = (0x40);
893
- Record.INCREASE = true;
894
- Record.DECREASE = false;
895
- export class DcValuesReference extends ObjectReferenceBase {
896
- constructor(controlId, referencedDcValues) {
897
- super(referencedDcValues);
898
- this.ditIdx = 0;
899
- this.ditIdx = controlId;
900
- }
901
- get DcValues() {
902
- return this.Referent;
903
- }
904
- Clone() {
905
- return new DcValuesReference(this.ditIdx, this.Referent);
906
- }
907
- static Parse(couple, dcValuesOwner) {
908
- let commaPos = couple.indexOf(",");
909
- let controlId = NNumber.Parse(couple.substr(0, commaPos));
910
- let dcId = NNumber.Parse(couple.substr(commaPos + 1));
911
- return new DcValuesReference(controlId, dcValuesOwner.getDcValues(dcId));
912
- }
913
- }
914
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9kYXRhL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLFdBQVcsRUFDWCxNQUFNLEVBR04sbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixXQUFXLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXJGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQU8xRSxNQUFNLE9BQU8sTUFBTTtJQXNFakIsWUFBWSwyQkFBZ0MsRUFBRSxRQUF1QjtRQXJEM0QsUUFBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0IsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsVUFBSyxHQUEwQixxQkFBcUIs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QUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBZXhELFlBQVksU0FBaUIsRUFBRSxrQkFBNEI7UUFDekQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFmNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQWdCakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQVhELElBQUksUUFBUTtRQUNWLE9BQWlCLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDakMsQ0FBQztJQVdELEtBQUs7UUFDSCxPQUFPLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQVVELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBYyxFQUFFLGFBQTJCO1FBQ3RELElBQUksUUFBUSxHQUFXLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxTQUFTLEdBQVcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksSUFBSSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RCxPQUFPLElBQUksaUJBQWlCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERhdGFNb2RpZmljYXRpb25UeXBlcyxcclxuICBEY1ZhbHVlcyxcclxuICBFTVBUWV9EQ1JFRixcclxuICBFeHBWYWwsXHJcbiAgRmllbGREZWYsXHJcbiAgSVJlY29yZCxcclxuICBPYmplY3RSZWZlcmVuY2VCYXNlLFxyXG4gIE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uLFxyXG4gIFJlY29yZFV0aWxzXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIElDb21wYXJhYmxlLFxyXG4gIEludDMyLFxyXG4gIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBCYXNlNjQsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIExvZ2dlcixcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjayxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxTdHJCeXRlTW9kZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQgeyBUYWJsZUNhY2hlIH0gZnJvbSAnLi4vcnQvVGFibGVDYWNoZSc7XHJcbmltcG9ydCB7IEV4cHJlc3Npb25FdmFsdWF0b3IsIE51bGxWYWx1ZUV4Y2VwdGlvbiB9IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uRXZhbHVhdG9yJztcclxuaW1wb3J0IHsgS2V5IH0gZnJvbSAnLi9LZXknO1xyXG5pbXBvcnQgeyBGaWVsZHNUYWJsZUV4dCBhcyBGaWVsZHNUYWJsZSB9IGZyb20gJy4vRmllbGRzVGFibGUnO1xyXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBNZ0Zvcm0gfSBmcm9tICcuLi9ndWkvTWdGb3JtJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IERhdGF2aWV3SGVhZGVycyB9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHsgRGF0YVZpZXdCYXNlIH0gZnJvbSAnLi9EYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSByZWNvcmQgb2JqZWN0XHJcbi8vLyAgIGl0IHBhcnNlcyB0aGUgPHJlYy4uLj4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBSZWNvcmQgaW1wbGVtZW50cyBJQ29tcGFyYWJsZSwgSVJlY29yZCB7XHJcbiAgLy8gQVRURU5USU9OICEhISB3aGVuIHlvdSBhZGQvbW9kaWZ5L2RlbGV0ZSBhIG1lbWJlciB2YXJpYWJsZSBkb24ndCBmb3JnZXQgdG8gdGFrZSBjYXJlXHJcbiAgLy8gYWJvdXQgdGhlIFwic2V0U2FtZUFzKClcIiBmdW5jdGlvblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ09OU1RBTlRTXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX05VTEw6IG51bWJlciA9ICgweDAxKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX0lOVkFMSUQ6IG51bWJlciA9ICgweDAyKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRUQ6IG51bWJlciA9ICgweDA0KTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfVVBEQVRFRDogbnVtYmVyID0gKDB4MDgpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19DUlNSX01PRElGSUVEOiBudW1iZXIgPSAoMHgxMCk7XHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX1ZBTFVFX05PVF9QQVNTRUQ6IG51bWJlciA9ICgweDIwKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFOiBudW1iZXIgPSAoMHg0MCk7XHJcblxyXG4gIHByb3RlY3RlZCBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByb3RlY3RlZCBkYlZpZXdSb3dJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJvdGVjdGVkIF9tb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGNSZWZzOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbiA9IG51bGw7XHJcbiAgX2luQ29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9pblJlY29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9uZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldCBJbkNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5Db21wdXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBJblJlY29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29tcHV0ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdGF0aWMgSU5DUkVBU0U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgREVDUkVBU0U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJvdGVjdGVkIF90YWJsZUNhY2hlOiBUYWJsZUNhY2hlOyAvLyB9XHJcbiAgLy8gfSBmb3IgdXNlIGlmIHRoZSByZWNvcmQgaXMgcGFydCBvZiB0YWJsZSBjYWNoZSAodGhlcmUgaXMgbm8gd2F5IGJvdGggZHYgYW5kIHRhYmxlY2FjaGUgYXJlIG5vdCBudWxsIGF0IHRoZSBzYW1lIHRpbWUgLVxyXG5cclxuICBwcm90ZWN0ZWQgX2luRGVsZXRlUHJvY2VzczogYm9vbGVhbjsgLy8gd2lsbCBiZSBzZXQgdG8gdHJ1ZSBiZWZvcmUgcmVjIHN1ZmZpeCBmcm9tIGRlbGxpbmUuXHJcbiAgcHJvdGVjdGVkIF9hZGRBZnRlcjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfY2F1c2VJbnZhbGlkYXRpb246IGJvb2xlYW47IC8vIEV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByb3RlY3RlZCBfZGJQb3NCYXNlNjRWYWw6IHN0cmluZzsgLy8gdXNlZCBvbmx5IGluIHRhYmxlIGNhY2hlIHJlY29yZHMgaG9sZHMgdGhlIHRhYmxlcyBkYl9wb3MgdmFsdWUgaW4gdGhlIGN1cnNvclxyXG4gIC8vIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgYXJlIE11dHVhbGx5IGV4Y2x1c2l2ZSkuXHJcbiAgcHJvdGVjdGVkIF9kYXRhdmlldzogRGF0YVZpZXdCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9maWVsZHNEYXRhOiBTdHJpbmdbXTtcclxuICBwcm90ZWN0ZWQgX2ZsYWdzOiBVaW50OEFycmF5O1xyXG4gIHByb3RlY3RlZCBfZmxhZ3NIaXN0b3J5OiBVaW50OEFycmF5OyAvLyBIaXN0b3J5IG9mIGZsYWdzLCB1c2VkIHdoZW4gY29udGFjdGluZyB0aGUgc2VydmVyXHJcbiAgcHJvdGVjdGVkIF9mb3JjZVNhdmVPcmc6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9oYXNoS2V5OiBudW1iZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfY29tcHV0ZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9sYXRlQ29tcHV0ZTogYm9vbGVhbjsgLy8gdGhpcyByZWNvcmQgbXVzdCBiZSBjb21wdXRlZCBuZXh0IHRpbWUgd2UgZW50ZXIgdGhlIHJlY29yZCwgYnV0IG5vdCBiZWZvcmVcclxuXHJcbiAgcHJvdGVjdGVkIF9saW5rc0ZsZHNQb3M6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX21vZGlmaWVkOiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgX25leHQ6IFJlY29yZDsgIC8vIFBvaW50cyB0byB0aGUgbmV4dCByZWNvcmQsIHdoZW4gaXRzIHBhcnQgb2YgYSBsaXN0XHJcbiAgcHJvdGVjdGVkIF9wcmV2OiBSZWNvcmQ7ICAvLyBQb2ludHMgdG8gdGhlIHByZXYgcmVjb3JkLCB3aGVuIGl0cyBwYXJ0IG9mIGEgbGlzdFxyXG4gIHByb3RlY3RlZCBfc2VuZFRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgLy8gSWYgZmFsc2UsIGRvbid0IHNlbmQgdGhpcyByZWNvcmQgdG8gdGhlIHNlcnZlciwgYXMgcGFydCBvZiB0aGUgbW9kaWZpZWQgbGlzdFxyXG4gIHByb3RlY3RlZCBfdXBkYXRlZDogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIEluRm9yY2VVcGRhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIFN5bmNlZDogYm9vbGVhbjtcclxuICBwdWJsaWMgVmFsdWVJbkJhc2U2NDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGU6IERhdGFWaWV3QmFzZSB8IFRhYmxlQ2FjaGUpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBkYXRhdmlldzogRGF0YVZpZXdCYXNlKTtcclxuICBjb25zdHJ1Y3RvcihSZWNvcmQ6IFJlY29yZCk7XHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkOiBhbnksIGRhdGF2aWV3PzogRGF0YVZpZXdCYXNlKVxyXG4gIHtcclxuICAgIGlmKGR2T3JUYWJsZUNhY2hlT3JDSWRPclJlY29yZCBpbnN0YW5jZW9mICBSZWNvcmQpXHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkKTtcclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkLCBkYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29uc3RydWN0cyBhIG5ldyByZWNvcmQgdG8gYmUgdXNlZCBieSB0aGUgdGFibGUgY2FjaGUgb25seSEhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKGR2T3JUYWJsZUNhY2hlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChkdk9yVGFibGVDYWNoZSBpbnN0YW5jZW9mIERhdGFWaWV3QmFzZSlcclxuICAgICAgdGhpcy5fZGF0YXZpZXcgPSA8RGF0YVZpZXdCYXNlPmR2T3JUYWJsZUNhY2hlO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl90YWJsZUNhY2hlID0gPFRhYmxlQ2FjaGU+ZHZPclRhYmxlQ2FjaGU7XHJcblxyXG4gICAgdGhpcy5fZmllbGRzRGF0YSA9IG5ldyBBcnJheTxzdHJpbmc+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpKTtcclxuICAgIHRoaXMuX2ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZmxhZ3NIaXN0b3J5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZGNSZWZzID0gbmV3IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkRGVmID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgdGhpcy5fZmxhZ3NbaV0gPSAoKGZpZWxkLmlzTnVsbERlZmF1bHQoKSB8fCBmaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gUmVjb3JkLkZMQUdfTlVMTCA6IDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2RhdGF2aWV3ICE9PSBudWxsICYmICg8RmllbGQ+ZmllbGQpLklzVmlydHVhbCkge1xyXG4gICAgICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKTtcclxuICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgJiYgcmVjb3JkLklzRmxkTW9kaWZpZWRBdExlYXN0T25jZShpKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGksIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TmV3UmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmdFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZHMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoY0lkOiBudW1iZXIsIGRhdGF2aWV3OiBEYXRhVmlld0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMChkYXRhdmlldyk7XHJcbiAgICB0aGlzLnNldElkKGNJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGlmaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBVcGRhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IFNlbmRUb1NlcnZlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZW5kVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29tcGFyZVRvKG9iajogT2JqZWN0KTogbnVtYmVyIHtcclxuICAgIGxldCByZXM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY29tcFRvID0gPFJlY29yZD5vYmo7XHJcblxyXG4gICAgLy8gZ2V0IHRoZSBrZXkgYnkgd2hpY2ggd2UgYXJlIGRvaW5nIHRoZSBDb21wYXJpc29uXHJcbiAgICBsZXQga2V5OiBLZXkgPSB0aGlzLl90YWJsZUNhY2hlLkdldEtleUJ5SWQodGhpcy5fdGFibGVDYWNoZS5HZXRDdXJyU29ydEtleSgpKTtcclxuXHJcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBrZXkgdG8gY29tcGFyZSBieSB0aGVuIHRoZSByZWNvcmRzIGFyZSB1bmNvbXBhcmFibGVcclxuICAgIGlmIChrZXkgIT0gbnVsbCkge1xyXG4gICAgICAvLyBhbGwgd2UgbmVlZCBmcm9tIHRoZSBrZXkgaW4gdGhlIG9yZGVyIG9mIGNvbXBhcmluZyB0aGUgdGhlIHJlY29yZCBmaWVsZHNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGtleS5Db2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGN1cnJGbGQgPSBrZXkuQ29sdW1ucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgY3VyckZsZElkOiBudW1iZXIgPSBjdXJyRmxkLmdldElkKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLklzTnVsbChjdXJyRmxkSWQpICYmIGNvbXBUby5Jc051bGwoY3VyckZsZElkKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuSXNOdWxsKGN1cnJGbGRJZCkgJiYgIWNvbXBUby5Jc051bGwoY3VyckZsZElkKSkge1xyXG4gICAgICAgICAgLy8gbnVsbCBpcyB0aGUgZ3JlYXRlc3QgdmFsdWUgdGhlcmVmb3JlIHdlIGFyZSB0aGUgZ3JlYXRlclxyXG4gICAgICAgICAgcmVzID0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdGhpcy5Jc051bGwoY3VyckZsZElkKSAmJiBjb21wVG8uSXNOdWxsKGN1cnJGbGRJZCkpIHtcclxuICAgICAgICAgIHJlcyA9IC0xO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGJvdGggYXJlIG5vdCBudWxsXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICB0aGlzLkdldEZpZWxkVmFsdWUoY3VyckZsZElkKSk7XHJcbiAgICAgICAgICAgIGxldCBzZWNvbmQgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICBjb21wVG8uR2V0RmllbGRWYWx1ZShjdXJyRmxkSWQpKTtcclxuXHJcbiAgICAgICAgICAgIHJlcyA9IEV4cHJlc3Npb25FdmFsdWF0b3IudmFsX2NtcF9hbnkoZmlyc3QsIHNlY29uZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlcyAhPT0gMClcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChlcnIpXHJcbiAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgdmFsdWVzIHdlIGFyZSBjb21wYXJpbmcgdXNpbmcgdmxfY21wX2FueSAgaXMgbnVsbCB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmVcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE51bGxWYWx1ZUV4Y2VwdGlvbilcclxuICAgICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCIgaW4gUmVjb3JkLkNvbXBhcmVUbyBudWxsIHZhbHVlIHdhcyByZWFjaGVkXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSAtMTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1vZGUoKTogRGF0YU1vZGlmaWNhdGlvblR5cGVzIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJlY29yZCBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIG5ldyByZWNvcmQganVzdCBjcmVhdGVkIGFuZCBubyByZWNvcmQgc3VmZml4IHdhcyB5ZXRcclxuICAvLy8gICBwcm9jZXNzZWQgb24gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTmV3UmVjKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25ld1JlYztcclxuICB9XHJcblxyXG4gIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nO1xyXG4gIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlcik6IFVpbnQ4QXJyYXk7XHJcbiAgZ2V0RmllbGREYXRhWE1MKGZsZElkeDogbnVtYmVyLCBnZXRPbGRWYWw/OiBib29sZWFuKTogc3RyaW5nIHwgVWludDhBcnJheSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGREYXRhWE1MXzAoZmxkSWR4LCBnZXRPbGRWYWwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZERhdGFYTUxfMShmbGRJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+aW5kZXggb2YgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERhdGFYTUxfMChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGRWYWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWdldE9sZFZhbClcclxuICAgICAgZmxkVmFsID0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGZsZFZhbCA9ICg8RmllbGQ+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KSkpLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmIChmbGRWYWwgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUmVjb3JkLmJ1aWxkRmllbGRzRGF0YSgpIG51bGwgZmllbGQgdmFsdWUhXFxuRmllbGQgaWQ6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSB0aGlzLmdldFhNTEZvclZhbHVlKGZsZElkeCwgZmxkVmFsKTtcclxuICAgIHJldHVybiBYbWxQYXJzZXIuZXNjYXBlKHRtcEJ1Zi50b1N0cmluZygpKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+aW5kZXggb2YgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERhdGFYTUxfMShmbGRJZHg6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xyXG4gICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpO1xyXG5cclxuICAgIGlmIChmaWVsZFZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5idWlsZEZpZWxkc0RhdGEoKSBudWxsIGZpZWxkIHZhbHVlIVxcbkZpZWxkIGlkOiBcIiArIGZsZElkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFR5cGUoZmxkSWR4KTtcclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsKGZpZWxkVmFsdWUsIHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgZmllbGQgdGFibGUgZWl0aGVyIG9mIERhdGFWaWV3Um9vdCAoJ2R2SGVhZGVyJykgb3Igb2YgVGFibGVDYWNoZVxyXG4gIC8vLyBkdiBhbmQgdGFibGVDYWNoZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGZpZWxkVGFibGUgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkc1RhYigpOiBGaWVsZHNUYWJsZSB7XHJcbiAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiA8RmllbGRzVGFibGU+dGhpcy5fZGF0YXZpZXcuR2V0RmllbGRzVGFiKCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fdGFibGVDYWNoZS5GbGRzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyA6IGNoZWNrIGhvdyB0byBpbXBsZW1lbnQgZGVzdHJ1Y3RvcnNcclxuICAvLyB+UmVjb3JkKClcclxuICAvLyB7XHJcbiAgLy8gXHR0aGlzLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgaW5pdGlhbCBmaWVsZCB2YWx1ZXMgZm9yIGZpZWxkcyB0aGF0IGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0SW5pdGlhbEZsZFZhbHMoY2xvYmJlcmVkT25seTogYm9vbGVhbiwgaXNOZXdSZWM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIHNpemU7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IG51bGw7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBmaWVsZHMgdXNpbmcgdGhlIE1hZ2ljIGRlZmF1bHQgdmFsdWVcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBmbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gZmxkLmdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHkpO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXdSZWMgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxkLmdldElkKCksIFJlY29yZC5GTEFHX05VTEwpO1xyXG5cclxuICAgICAgICBpZiAoZmxkLklzVmlydHVhbCAmJiBmbGQuZ2V0TW9kaWZpZWRBdExlYXN0T25jZSgpKVxyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGZsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgaWQgb2YgdGhlIHJlY29yZCBhbmQgYW4gYXBwcm9wcmlhdGUgaGFzaCBrZXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY0lkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyB0aGUgZGJWaWV3Um93SWQgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgc2V0REJWaWV3Um93SWR4KHJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZGJWaWV3Um93SWR4ID0gcm93SWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiBkYlZpZXdSb3dJZCBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBnZXREQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRiVmlld1Jvd0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YSAtIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZWNvcmQgaXMgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ3VyclJlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlzQ3VyclJlYyA9IHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuRmlsbElubmVyRGF0YSgpIG91dCBvZiBib3VuZHNcIik7XHJcbiAgICByZXR1cm4gaXNDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSByZWNvcmQgLSByZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj50aGUgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzPC9wYXJhbT5cclxuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBTdHJpbmcsIHZhbHVlU3RyO1xyXG4gICAgbGV0IHJlY0ZpZWxkc0RhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW47XHJcblxyXG4gICAgaXNDdXJyUmVjID0gdGhpcy5wZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3Rvcik7XHJcblxyXG4gICAgZm9yICg7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERTpcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSA8RGF0YU1vZGlmaWNhdGlvblR5cGVzPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQl9WSUVXX1JPV0lEWDpcclxuICAgICAgICAgIHRoaXMuc2V0REJWaWV3Um93SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5WYWx1ZUluQmFzZTY0KSB7XHJcbiAgICAgICAgICAgIHJlY0ZpZWxkc0RhdGEgPSBCYXNlNjQuZGVjb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWNGaWVsZHNEYXRhID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQzoge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSOlxyXG4gICAgICAgICAgdGhpcy5fYWRkQWZ0ZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUzpcclxuICAgICAgICAgIHJlY0ZsYWdzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQ6XHJcbiAgICAgICAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRENfUkVGUzpcclxuICAgICAgICAgIHRoaXMuZmlsbERDUmVmKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUzpcclxuICAgICAgICAgIHRoaXMuX2RiUG9zQmFzZTY0VmFsID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLmluaXRFbGVtZW50cygpIHVua25vd24gYXR0cmlidXRlOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuVmFsdWVJbkJhc2U2NCkge1xyXG4gICAgICBsZXQgZmxkVmFsSW5CeXRlczogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhyZWNGaWVsZHNEYXRhKTtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShmbGRWYWxJbkJ5dGVzLCByZWNGbGFncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShyZWNGaWVsZHNEYXRhLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0N1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVlayB0aGUgY3Vycl9yZWMgdmFsdWUgZnJvbSB0aGUgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRoZVwiPnRva2VucyBvZiB0aGUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRoZSB0YWc8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBwZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcbiAgICAgICAgcmV0dXJuIFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkVmFsSW5CeXRlczogVWludDhBcnJheSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQ7XHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkc1ZhbDogc3RyaW5nLCByZWNGbGFnczogc3RyaW5nLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZFZhbEluQnl0ZXNPckZsZHNWYWw6IGFueSwgcmVjRmxhZ3M6IHN0cmluZywgaXNDdXJyUmVjPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGlzQ3VyclJlYykpXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMChmbGRWYWxJbkJ5dGVzT3JGbGRzVmFsLCByZWNGbGFncyk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMShmbGRWYWxJbkJ5dGVzT3JGbGRzVmFsLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsbEZpZWxkc0RhdGFfMChmbGRWYWxJbkJ5dGVzOiBudW1iZXJbXSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbGwgRmllbGRzRGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRzVmFsXCI+LSBzdHJpbmcgZm9yIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+dHJ1ZSBpZiB0aGlzIHJlY29yZCBpcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEZpZWxkc0RhdGFfMShmbGRzVmFsOiBzdHJpbmcsIHJlY0ZsYWdzOiBTdHJpbmcsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHZhbDogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCB0bXA6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcGFyc2VkTGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oMCk7XHJcbiAgICBsZXQgaTogbnVtYmVyLCBqID0gMCwgZnJvbSwgc2l6ZTtcclxuICAgIGxldCBjdXJyVHlwZTogU3RvcmFnZUF0dHJpYnV0ZTtcclxuICAgIGxldCB1c2VIZXg6IGJvb2xlYW47XHJcbiAgICBsZXQgZmxkOiBGaWVsZERlZiA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVOb3RQYXNzZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIGZvciAoaSA9IGZyb207IGogPCBzaXplOyBpKyssIGorKykge1xyXG4gICAgICBmbGQgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBjdXJyVHlwZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICB1c2VIZXggPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpID4gMSB8fFxyXG4gICAgICAgIGN1cnJUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8XHJcbiAgICAgICAgY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSB8fFxyXG4gICAgICAgIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKGN1cnJUeXBlKSk7XHJcblxyXG4gICAgICAvLyBRY3IgIzk0MDQ0MyA6IE9sZCBmYXNoaW9uIGZsYWdzIGFyZSBzdGlsbCBiZWluZyB1c2VkIGJ5IHJlc2lkZW50IHRhYmxlLiBTbyBjaGVjayB0aGVtIDFzdCBjb3ogd2UgIG1pZ2h0IGdldCBleGNlcHRpb24gb3RoZXJ3aXNlLlxyXG4gICAgICAvLyBUaGUgZmxhZ3MgZm9yIHJlc2lkZW50IGFyZSB2ZXJ5IHNpbXBsZSwgb25seSAyIG9wdGlvbnMuICcuJyA9IGZhbHNlLCAnLycgPSB0cnVlLlxyXG4gICAgICAvLyBXZSBrZWVwIHVzaW5nIGl0IGZvciByZXNpZGVudCwgc2luY2UgaW4gdGhlIHNlcnZlciBzaWRlIHdlIGRvIG5vdCBrbm93IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgeG1sIGZvciByaWNoY2xpZW50IG9yIGZvciBCQyBhdCB0aGUgY3JlYXRpb24gc3RhZ2UuXHJcbiAgICAgIC8vIFNpbmNlIHdlIGNvdWxkbid0IGNyZWF0ZSBkaWZmZXJlbnQgZmxhZ3MgZm9yIHJpY2gsIHdlIHdpbGwgdXNlIHRoZSBvbGQgZmxhZ3MgaGVyZS5cclxuXHJcbiAgICAgIGlmIChyZWNGbGFnc1tqXSA9PT0gJy4nKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gMDtcclxuICAgICAgZWxzZSBpZiAocmVjRmxhZ3Nbal0gPT09ICcvJylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEVhY2ggZmxhZyB3aWxsIGFwcGVhciBpbiB0aGUgeG1sIGluIDIgY2hhcnMgcmVwcmVzZW50aW5nIGhleCB2YWx1ZSAoXCI0MlwiIGZvciAweDQyKS5cclxuICAgICAgICB0bXAgPSByZWNGbGFncy5zdWJzdHIoaiAqIDIsIDIpO1xyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gcGFyc2VJbnQodG1wLCAxNik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIGluZCB0aGF0IHRoZSB2YWx1ZSB3YXMgbm90IHBhc3NlZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgIHZhbHVlTm90UGFzc2VkID0gUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCk7XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2ldID0gdGhpcy5fZmxhZ3NbaV0gJiB+UmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG5cclxuICAgICAgaWYgKFJlY29yZC5GTEFHX1VQREFURUQgPT09ICh0aGlzLl9mbGFnc1tpXSAmIFJlY29yZC5GTEFHX1VQREFURUQpKVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodmFsdWVOb3RQYXNzZWQpIHtcclxuICAgICAgICBpZiAoUmVjb3JkLkZMQUdfTlVMTCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfTlVMTCkpIHtcclxuICAgICAgICAgIC8vIG51bGwgaW5kIGlzIG9uLCBqdXN0IHB1dCBhbnkgdmFsdWUgaW4gdGhlIGZpZWxkLlxyXG4gICAgICAgICAgdmFsID0gZmxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGNvcHkgdGhlIGV4aXN0aW5nIHZhbHVlIGZyb20gdGhlIGV4aXN0aW5nIGN1cnIgcmVjLlxyXG4gICAgICAgICAgdmFsID0gKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkuR2V0RmllbGRWYWx1ZShpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsID0gUmVjb3JkVXRpbHMuZGVTZXJpYWxpemVJdGVtVmFsKGZsZHNWYWwsIGN1cnJUeXBlLCBmbGQuZ2V0U2l6ZSgpLCB1c2VIZXgsIGZsZC5nZXRDZWxsc1R5cGUoKSwgcGFyc2VkTGVuKTtcclxuICAgICAgICBmbGRzVmFsID0gZmxkc1ZhbC5zdWJzdHIocGFyc2VkTGVuLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0SW5pdGlhbEZsZFZhbHMoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdCBkY1JlZnMgdmVjdG9yIGFuZCBpbmNyZWFzZSByZWZlcmVuY2UgY291bnRlciB0byBEYXRhVmlld1Jvb3QuY291bnRlckFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+aW4gZm9ybSBcImRpdF9pZHgsZGNfaWQkZGl0X2lkeCxkY19pZCQuLi5cIjwvcGFyYW0+XHJcbiAgZmlsbERDUmVmKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlU3RyKSkge1xyXG4gICAgICBsZXQgY291cGxlczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIiRcIik7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSBjb3VwbGVzLmxlbmd0aDtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaXplOyBpID0gaSArIDEpIHtcclxuICAgICAgICB0aGlzLl9kY1JlZnMuQWRkKERjVmFsdWVzUmVmZXJlbmNlLlBhcnNlKGNvdXBsZXNbaV0sIHRoaXMuX2RhdGF2aWV3KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGdldE9sZFZhbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkO1xyXG4gIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM/OiBib29sZWFuLCBnZXRPbGRWYWw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5idWlsZEZpZWxkc0RhdGFfMChtZXNzYWdlLCBpc0N1cnJSZWMsIGdldE9sZFZhbCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhXzEobWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIGZpZWxkcyB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYnVpbGRGaWVsZHNEYXRhXzAobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBnZXRPbGRWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCB0bXBTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSB0aGlzLmdldEZyb21GbGRJZHgoaXNDdXJyUmVjKTtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQoaXNDdXJyUmVjKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgLy8gRG8gbm90IHNlcmlhbGl6ZSB0aGUgZmllbGQgdmFsdWUgd2hpY2ggaXMgbm90IGV4cG9zZWQgdG8gY2xpZW50LlxyXG4gICAgICBsZXQgZmxkOiBGaWVsZCA9ICA8RmllbGQ+IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmIChmbGQuSXNFeHBvc2VkVG9DbGllbnQgPT09IGZhbHNlKVxyXG4gICAgICAgIHRoaXMuc2V0U2hyaW5rRmxhZyhpKTtcclxuXHJcbiAgICAgIC8vIGRvIG5vdCB3cml0ZSB0aGUgdmFsdWUgaWYgdGhlIHNocmluayBmbGFnIGlzIG9uLlxyXG4gICAgICBpZiAoUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCkpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICB0bXBTdHIuQXBwZW5kKHRoaXMuZ2V0RmllbGREYXRhWE1MKGksIGdldE9sZFZhbCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGlmIG5vbmUgb2YgdGhlIHZhbHVlcyBoYWQgY2hhbmdlZC4gcGFzcyBcIiBcIiBpbnN0ZWFkIG9mIFwiXCIuXHJcbiAgICBpZiAodG1wU3RyLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0bXBTdHIuQXBwZW5kKFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZCh0bXBTdHIuVG9TdHJpbmcoKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWVzc2FnZVwiPjwvcGFyYW0+XHJcbiAgcHJvdGVjdGVkIGJ1aWxkRmllbGRzRGF0YV8xKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIGZyb20sIHNpemU7XHJcblxyXG4gICAgbGV0IGZpZWxkVmFsdWU6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgIGZyb20gPSB0aGlzLmdldEZyb21GbGRJZHgoZmFsc2UpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChmYWxzZSk7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IGZyb20gKyBzaXplOyBpKyspIHtcclxuICAgICAgLy8gZG8gbm90IHdyaXRlIHRoZSB2YWx1ZSBpZiB0aGUgc2hyaW5rIGZsYWcgaXMgb24uXHJcbiAgICAgIGlmIChSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKSlcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCB0bXA6IFVpbnQ4QXJyYXkgPSB0aGlzLmdldEZpZWxkRGF0YVhNTChpKTtcclxuICAgICAgdG1wLmZvckVhY2goeCA9PiBmaWVsZFZhbHVlLnB1c2goeCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmaWVsZFZhbHVlc0luQnl0ZXM6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShmaWVsZFZhbHVlLmxlbmd0aCk7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGRWYWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgZmllbGRWYWx1ZXNJbkJ5dGVzW2ldID0gZmllbGRWYWx1ZS5nZXRfSXRlbShpKTtcclxuXHJcblxyXG4gICAgbGV0IGVuY29kZWRmaWVsZFZhbHVlc0luQnl0ZXM6IFVpbnQ4QXJyYXkgPSBCYXNlNjQuZW5jb2RlKGZpZWxkVmFsdWVzSW5CeXRlcyk7XHJcbiAgICBsZXQgdG1wU3RyOiBzdHJpbmcgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXRFbmNvZGluZygpLkdldFN0cmluZyhlbmNvZGVkZmllbGRWYWx1ZXNJbkJ5dGVzLCAwLCBlbmNvZGVkZmllbGRWYWx1ZXNJbkJ5dGVzLmxlbmd0aCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZCh0bXBTdHIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0WE1MRm9yVmFsdWUoZmxkSWR4OiBudW1iZXIsIGZsZFZhbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDsgLy8gY2VsbCdzIGF0dHJpYnV0ZSwgaWYgdGhlIGZpZWxkJ3MgYXR0cmlidXRlIGlzIGEgdmVjdG9yXHJcbiAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0VHlwZShmbGRJZHgpOyAvLyBmaWVsZCdzIGF0dHJpYnV0ZVxyXG4gICAgaWYgKGZsZEF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgIGNlbGxBdHRyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpLmdldENlbGxzVHlwZSgpO1xyXG5cclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxO1xyXG4gICAgcmV0dXJuIFJlY29yZC5zZXJpYWxpemVJdGVtVmFsKGZsZFZhbCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgZmllbGQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5zaG91bGQgYmUgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgcmVjPC9wYXJhbT5cclxuICBnZXRGcm9tRmxkSWR4KGlzQ3VyclJlYzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0Uk1JZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+c2hvdWxkIGJlIHRydWUgZm9yIHRoZSBjdXJyZW50IHJlYzwvcGFyYW0+XHJcbiAgZ2V0U2l6ZUZsZChpc0N1cnJSZWM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRSTVNpemUoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQ7XHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBmb3JjZUJ1aWxkOiBib29sZWFuKTogdm9pZDtcclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGZvcmNlQnVpbGQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZm9yY2VCdWlsZCkpXHJcbiAgICAgIHRoaXMuYnVpbGRYTUxfMChtZXNzYWdlLCBpc0N1cnJSZWMpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmb3JjZUJ1aWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRYTUxfMChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiAgdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZXNzYWdlXCI+dGhlIHhtbCBtZXNzYWdlIHRvIGFwcGVuZCB0bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5pbmRpY2F0ZSB0aGlzIHJlY29yZCBhcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBidWlsZFhNTF8xKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbiwgZm9yY2VCdWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJlY0ZsYWdzOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgbGV0IGZyb206IG51bWJlciwgc2l6ZSwgaTtcclxuICAgIGxldCBhRmxhZzogbnVtYmVyO1xyXG4gICAgbGV0IGhleEZsYWc6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQpXHJcbiAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUgJiZcclxuICAgICAgICB0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpc0N1cnJSZWMpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgICAgICAgICAgPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQyk7XHJcbiAgICBpZiAodGhpcy5faWQgPiBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIHRoaXMuX2lkICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PREUgKyBcIj1cXFwiXCIgKyA8c3RyaW5nPnRoaXMuX21vZGUgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fcHJldiAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSICsgXCI9XFxcIlwiICsgdGhpcy5fcHJldi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIC8vIGN1cnJlbnQgcmVjb3JkJ3MgbW9kZSBpcyBuZXZlciBjbGVhcmVkLCB0aGUgd2hvbGUgcmVjb3JkIGlzIGNsZWFyZWQgd2hlbiB3ZSBtb3ZlIG9uLlxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmICFpc0N1cnJSZWMpXHJcbiAgICAgIHRoaXMuY2xlYXJNb2RlKCk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9WQUxVRSArIFwiPVxcXCJcIik7XHJcblxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmIGlzQ3VyclJlYylcclxuICAgICAgdGhpcy5zZXRTaHJpbmtGbGFncygpO1xyXG5cclxuICAgIGxldCBnZXRPbGRWYWw6IGJvb2xlYW47XHJcbiAgICBpZiAodGhpcy5TeW5jZWQpXHJcbiAgICAgIGdldE9sZFZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpO1xyXG4gICAgICBnZXRPbGRWYWwgPSAoIWlzQ3VyclJlYyAmJiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgfHxcclxuICAgICAgICB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpICYmXHJcbiAgICAgICB0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCkgIT0gbnVsbCAmJiAoKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkpLmdldElkKCkgPT09IHRoaXMuX2lkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkRmllbGRzRGF0YShtZXNzYWdlLCBpc0N1cnJSZWMsIGdldE9sZFZhbCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIlxcXCJcIik7XHJcbiAgICByZWNGbGFncyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIC8vIFFDUiA0Nzk2ODY6IHNlbmQgRkxBR19DUlNSX01PRCBmcm9tIHRoZSBoaXN0b3J5LCB0aHVzIGxldCB0aGUgc2VydmVyIGtub3cgaWYgYSBmaWVsZFxyXG4gICAgLy8gd2FzIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzZW50IGl0IHRvIElUIChoZW5jZSwgYSBEQk1TIGFjdGlvbiBpcyBuZWVkZWQpLlxyXG4gICAgZm9yIChpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpKyspIHtcclxuICAgICAgYUZsYWcgPSB0aGlzLl9mbGFnc0hpc3RvcnlbaV07XHJcbiAgICAgIGFGbGFnID0gYUZsYWcgJiBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEO1xyXG4gICAgICBhRmxhZyA9IGFGbGFnIHwgdGhpcy5fZmxhZ3NbaV07XHJcblxyXG4gICAgICAvLyBFYWNoIGZsYWcgd2lsbCBhcHBlYXIgaW4gdGhlIHhtbCBpbiAyIGNoYXJzIHJlcHJlc2VudGluZyBoZXggdmFsdWUgKFwiNDJcIiBmb3IgMHg0MikuXHJcbiAgICAgIGhleEZsYWcgPSBOTnVtYmVyLlRvU3RyaW5nKGFGbGFnLCBcIlgyXCIpO1xyXG4gICAgICByZWNGbGFncy5BcHBlbmQoaGV4RmxhZyk7XHJcblxyXG4gICAgICAvLyBjbGVhciB0aGUgc2hyaW5rIGZsYWdcclxuICAgICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDxudW1iZXI+KHRoaXMuX2ZsYWdzW2ldICYgflJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUyArIFwiPVxcXCJcIiArIHJlY0ZsYWdzLlRvU3RyaW5nKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKGlzQ3VyclJlYykge1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuTW9kaWZpZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PRElGSUVEICsgXCI9XFxcIjFcXFwiXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2xpbmtzRmxkc1BvcyAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREJQT1MgKyBcIj1cXFwiXCIgKyBYbWxQYXJzZXIuZXNjYXBlKHRoaXMuX2xpbmtzRmxkc1BvcykgKyBcIlxcXCIgXCIpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIG9mIHRoZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWVzc2FnZVwiPnRoZSB4bWwgbWVzc2FnZSB0byBhcHBlbmQgdG88L3BhcmFtPlxyXG4gIHB1YmxpYyBidWlsZFhNTEZvckRhdGFWaWV3VG9EYXRhU291cmNlKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiB2b2lkIHtcclxuICAgIGxldCByZWNGbGFnczogU3RyaW5nQnVpbGRlcjtcclxuICAgIGxldCBmcm9tOiBudW1iZXIsIHNpemUsIGk7XHJcbiAgICBsZXQgYUZsYWc6IG51bWJlcjtcclxuICAgIGxldCBoZXhGbGFnOiBzdHJpbmc7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICAgICAgICAgICA8XCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDKTtcclxuICAgIGlmICh0aGlzLl9pZCA+IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgXCI9XFxcIlwiICsgdGhpcy5faWQgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERSArIFwiPVxcXCJcIiArIHRoaXMuX21vZGUgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fcHJldiAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSICsgXCI9XFxcIlwiICsgdGhpcy5fcHJldi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUgKyBcIj1cXFwiXCIpO1xyXG5cclxuICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2UpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxcIlwiKTtcclxuICAgIHJlY0ZsYWdzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGZhbHNlKTtcclxuICAgIHNpemUgPSB0aGlzLmdldFNpemVGbGQoZmFsc2UpO1xyXG5cclxuICAgIGZvciAoaSA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSsrKSB7XHJcbiAgICAgIGFGbGFnID0gdGhpcy5fZmxhZ3NIaXN0b3J5W2ldO1xyXG4gICAgICBhRmxhZyA9IGFGbGFnICYgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRDtcclxuICAgICAgYUZsYWcgPSBhRmxhZyB8IHRoaXMuX2ZsYWdzW2ldO1xyXG4gICAgICBoZXhGbGFnID0gTk51bWJlci5Ub1N0cmluZyhhRmxhZywgJ1gyJyk7XHJcbiAgICAgIHJlY0ZsYWdzLkFwcGVuZChoZXhGbGFnKTtcclxuICAgIH1cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUyArIFwiPVxcXCJcIiArIHJlY0ZsYWdzICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rc0ZsZHNQb3MgIT0gbnVsbClcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RCUE9TICsgXCI9XFxcIlwiICsgWG1sUGFyc2VyLmVzY2FwZSh0aGlzLl9saW5rc0ZsZHNQb3MpICsgXCJcXFwiIFwiKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzY2FuIHRoZSByZWNvcmQgYW5kIGNvbXBhcmUgZmllbGRzIHdpdGggcGFyYWxsZWwgc2VydmVyIGN1cnIgcmVjLFxyXG4gIC8vLyAgIHNldCBzaHJpbmsgZmxhZyBvbiBpZiBmaWVsZHMgYXJlIGVxdWFsLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIHByb3RlY3RlZCBzZXRTaHJpbmtGbGFncygpOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGxldCBzZXJ2ZXJDdXJyUmVjOiBSZWNvcmQgPSB0aGlzLl9kYXRhdmlldy5nZXRTZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgICAvLyBjYW5ub3Qgc2hyaW5rIGlmIHdlIGRvIG5vdCBrbm93IHdoYXQgY3VyciByZWMgdGhlIHNlcnZlciBob2xkcy5cclxuICAgIGlmIChzZXJ2ZXJDdXJyUmVjID09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuZmxkVmFsc0VxdWFsKHNlcnZlckN1cnJSZWMsIGkpIHx8IChSZWNvcmQuRkxBR19OVUxMID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19OVUxMKSkpIHtcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IHRoaXMuX2ZsYWdzW2ldIHwgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IHNocmluayBmbGFnIGZvciBzcGVjaWZpYyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkSWR4XCI+PC9wYXJhbT5cclxuICBzZXRTaHJpbmtGbGFnKGZsZElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdIHw9IFJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgZmllbGQgdmFsdWUgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIGZyb20gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+PC9wYXJhbT5cclxuICBTZXRGaWVsZFZhbHVlKGlkeDogbnVtYmVyLCBpc051bGw6IGJvb2xlYW4sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpZHgpO1xyXG4gICAgZmllbGQuVXBkYXRlTnVsbChpc051bGwsIHRoaXMpO1xyXG5cclxuICAgIHZhbHVlID0gdGhpcy5DaGVja01nVmFsdWUodmFsdWUsIGlzTnVsbCwgZmllbGQpO1xyXG4gICAgdGhpcy5fZmllbGRzRGF0YVtpZHhdID0gdmFsdWU7XHJcbiAgICBmaWVsZC50YWtlVmFsRnJvbVJlYygpO1xyXG4gICAgdGhpcy5jbGVhckZsYWcoZmllbGQuZ2V0SWQoKSwgUmVjb3JkLkZMQUdfSU5WQUxJRCk7XHJcbiAgICBmaWVsZC5pbnZhbGlkYXRlKHRydWUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGZpZWxkIGluZGV4PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmllbGQuIG11c3QgYmUgaW4gdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNldFJlY29yZFVwZGF0ZWRcIj50ZWxscyB3aGV0aGVyIHRvIGRlZmluZSB0aGlzIHJlY29yZCBhcyB1cGRhdGVkPC9wYXJhbT5cclxuICBzZXRGaWVsZFZhbHVlKGZsZElkeDogbnVtYmVyLCBtZ1ZhbDogc3RyaW5nLCBzZXRSZWNvcmRVcGRhdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCk7XHJcblxyXG4gICAgLy8gZG9uJ3QgY2hhbmdlIHZhbHVlIHdoZW4gcmVmZXJlbmNlcyBhcmUgZXF1YWwgb3IgaWYgdGhlIHRhc2sgbW9kZSBpcyBRdWVyeVxyXG4gICAgaWYgKGZsZC5QcmV2SXNOdWxsKCkgPT09IGZsZC5pc051bGwoKSAmJiBtZ1ZhbCA9PT0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcblxyXG4gICAgbWdWYWwgPSB0aGlzLkNoZWNrTWdWYWx1ZShtZ1ZhbCwgZmxkLmlzTnVsbCgpLCBmbGQpO1xyXG5cclxuICAgIGlmIChmbGRJZHggPj0gMCAmJiBmbGRJZHggPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSkge1xyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhW2ZsZElkeF0gPSBtZ1ZhbDtcclxuXHJcbiAgICAgIC8vIFFDUiAjOTg2NzE1OiBUaGUgZm9sbG93aW5nIHNldEZsYWcoKSBjYWxsIHdhcyByZW1vdmVkIHRvIHNvbHZlIHRoZSBidWcuXHJcbiAgICAgIC8vIGl0IGNhdXNlZCBtYXJraW5nIGEgdmFyaWFibGUgYXMgbW9kaWZpZWQgZXZlbiBpZiB0aGUgY2hhbmdlIGlzIGR1ZSB0byB0aGVcclxuICAgICAgLy8gY29tcHV0ZSBvZiB0aGUgcmVjb3JkLiBUaGUgRkxBR19NT0RJRklFRCBmbGFnIGlzIHNldCBjb3JyZWN0bHkgaW4gdGhlXHJcbiAgICAgIC8vIEZpZWxkLnNldFZhbHVlKCkgbWV0aG9kLlxyXG4gICAgICAvLyBzZXRGbGFnKGZsZElkeCwgRkxBR19NT0RJRklFRCk7XHJcbiAgICAgIGlmIChzZXRSZWNvcmRVcGRhdGVkKSB7XHJcbiAgICAgICAgLy8gc2V0IG1vZGlmeSBvbmx5IGlmIHRoZSBmaWVsZCBpcyBwYXJ0IG9mIHRoZSBkYXRhdmlldy5cclxuICAgICAgICBpZiAoZmxkLlBhcnRPZkRhdGF2aWV3KVxyXG4gICAgICAgICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSBkdWUgdG8gdGFzayBjbG9zaW5nICwgYW5kIGZvdW5kIHRoYXQgdGhlIGN1cnJlbnQgcmVjJ3MgZmxkIGlzIHVwZGF0ZWRcclxuICAgICAgICAvLyB0aGVuIHNldCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlXHJcblx0XHQvLyBTbyB0aGF0IGNvbW1pdCB0cmFuc2FjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgc2VwYXJhdGVseSBhdCBzZXJ2ZXIgc2lkZS5cclxuICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAoPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kYXRhdmlldy5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuc2V0RmllbGRWYWx1ZSgpIGlsbGVnYWwgZmllbGQgaW5kZXg6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrIG1ndmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBDaGVja01nVmFsdWUobWdWYWw6IHN0cmluZywgaXNOdWxsOiBib29sZWFuLCBmbGQ6IEZpZWxkKTogc3RyaW5nIHtcclxuICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCB8fCBpc051bGwpIHtcclxuICAgICAgbWdWYWwgPSBmbGQuZ2V0TnVsbFZhbHVlKCk7XHJcbiAgICAgIGlmIChtZ1ZhbCA9PT0gbnVsbClcclxuICAgICAgICBtZ1ZhbCA9IGZsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpO1xyXG5cclxuICAgIH1cclxuICAgIGxldCBzaXplOiBudW1iZXIgPSBmbGQuZ2V0U2l6ZSgpO1xyXG5cclxuICAgIC8vIHRydW5jYXRlIHZhbHVlcyB0aGF0IGFyZSBsb25nZXIgdGhhbiB0aGUgc3RvcmFnZSBzaXplXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBmbGQuZ2V0VHlwZSgpICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBieXRlcywgbm90IGNoYXJhY3RlcnMgKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgICBpZiAobWdWYWwgIT09IG51bGwgJiYgVXRpbFN0ckJ5dGVNb2RlLmxlbkIobWdWYWwpID4gc2l6ZSlcclxuICAgICAgICBtZ1ZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihtZ1ZhbCwgc2l6ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsLmxlbmd0aCA+IHNpemUpXHJcbiAgICAgICAgbWdWYWwgPSBtZ1ZhbC5zdWJzdHIoMCwgc2l6ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcIm1vZGlmaWVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TW9kaWZpZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwibW9kaWZpZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwidXBkYXRlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFVwZGF0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJtb2RpZmllZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0ZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgZmllbGQgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gU3RyaW5nIHRoZSBmaWVsZCB2YWx1ZTwvcmV0dXJucz5cclxuICBHZXRGaWVsZFZhbHVlKGZsZElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCB2YWw6IFN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgaWYgKGZsZElkeCA+PSAwICYmIGZsZElkeCA8IHRoaXMuX2ZpZWxkc0RhdGEubGVuZ3RoKVxyXG4gICAgICB2YWwgPSB0aGlzLl9maWVsZHNEYXRhW2ZsZElkeF07XHJcbiAgICByZXR1cm4gdmFsLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIGNvcHkgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlcGxpY2F0ZSgpOiBSZWNvcmQge1xyXG4gICAgbGV0IHJlY29yZDogUmVjb3JkID0gbmV3IFJlY29yZCh0aGlzKTtcclxuICAgIHJlY29yZC5fZmllbGRzRGF0YSA9IHRoaXMuX2ZpZWxkc0RhdGEuc2xpY2UoKTtcclxuICAgIHJlY29yZC5fZmxhZ3MgPSB0aGlzLl9mbGFncy5zdWJhcnJheSgwKTtcclxuICAgIHJlY29yZC5fZmxhZ3NIaXN0b3J5ID0gdGhpcy5fZmxhZ3NIaXN0b3J5LnN1YmFycmF5KDApO1xyXG4gICAgcmVjb3JkLl9kY1JlZnMgPSB0aGlzLl9kY1JlZnMuQ2xvbmUoKTtcclxuICAgIHJldHVybiByZWNvcmQ7XHJcbiAgfVxyXG5cclxuICBzZXRTYW1lQXMocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuLCBySWQ6IG51bWJlcik6IHZvaWQ7XHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbiwgcklkPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMylcclxuICAgICAgdGhpcy5zZXRTYW1lQXNfMChyZWMsIHJlYWxPbmx5LCBySWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnNldFNhbWVBc18xKHJlYywgcmVhbE9ubHkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyByZWNvcmQgdG8gYmUgdGhlIHNhbWUgYXMgdGhvc2VcclxuICAvLy8gICBvZiB0aGUgZ2l2ZW4gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBzb3VyY2UgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJJZFwiPnRoZSBuZXcgSWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRTYW1lQXNfMChyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4sIHJJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFNhbWVBcyhyZWMsIHJlYWxPbmx5KTtcclxuICAgIHRoaXMuc2V0SWQocklkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIHRoaXMgcmVjb3JkIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlXHJcbiAgLy8vICAgb2YgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgc291cmNlIHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRTYW1lQXNfMShyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lkID0gcmVjLl9pZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSByZWMuX2hhc2hLZXk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkvKidQJyovKVxyXG4gICAgICB0aGlzLnNldE1vZGUocmVjLl9tb2RlKTtcclxuXHJcbiAgICB0aGlzLl9hZGRBZnRlciA9IHJlYy5fYWRkQWZ0ZXI7XHJcblxyXG4gICAgaWYgKHJlYWxPbmx5KSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGFmaWVsZDogRmllbGQgPSA8RmllbGQ+cmVjLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICAgIGlmICghYWZpZWxkLklzVmlydHVhbCkge1xyXG4gICAgICAgICAgdGhpcy5fZmllbGRzRGF0YVtpXSA9IHJlYy5fZmllbGRzRGF0YVtpXTtcclxuICAgICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gcmVjLl9mbGFnc1tpXTtcclxuICAgICAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHJlYy5fZmxhZ3NIaXN0b3J5W2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc0RhdGEgPSByZWMuX2ZpZWxkc0RhdGE7XHJcbiAgICAgIHRoaXMuX2ZsYWdzID0gcmVjLl9mbGFncztcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5ID0gcmVjLl9mbGFnc0hpc3Rvcnk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb2RpZmllZCA9IHJlYy5fbW9kaWZpZWQ7XHJcbiAgICB0aGlzLl9kYXRhdmlldyA9IHJlYy5fZGF0YXZpZXc7XHJcbiAgICB0aGlzLl9jb21wdXRlZCA9IHJlYy5fY29tcHV0ZWQ7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gcmVjLl91cGRhdGVkO1xyXG4gICAgdGhpcy5zZXREY1JlZnMocmVjLl9kY1JlZnMpO1xyXG5cclxuICAgIC8vIFFDUiAjNDIzNTUyOiBwYXJ0aWFsIGZpeCAtIHdlIG5lZWQgdG8gZ28gb3ZlciBhbGwgdGhlIHJlYy5uZXh0L3ByZXYgYW5kIG1ha2Ugc3VyZSB0aGlzIHJlY29yZCBkb2VzIG5vdCBhcHBlYXJcclxuICAgIGlmIChyZWMuX25leHQgIT09IHRoaXMpIHtcclxuICAgICAgdGhpcy5fbmV4dCA9IHJlYy5fbmV4dDtcclxuICAgIH1cclxuICAgIGlmIChyZWMuX3ByZXYgIT09IHRoaXMpIHtcclxuICAgICAgdGhpcy5fcHJldiA9IHJlYy5fcHJldjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIElzTnVsbChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfTlVMTCkgPT09IFJlY29yZC5GTEFHX05VTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNMaW5rSW52YWxpZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfSU5WQUxJRCkgPT09IFJlY29yZC5GTEFHX0lOVkFMSUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0ZsZE1vZGlmaWVkKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19NT0RJRklFRCkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgbW9kaWZpZWQgYXQgbGVhc3Qgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBJc0ZsZE1vZGlmaWVkQXRMZWFzdE9uY2UoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzRmxkVXBkYXRlZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfVVBEQVRFRCkgPT09IFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIGZpZWxkIHRvIGhhdmUgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIHB1YmxpYyBzZXRGbGFnKGZsZElkeDogbnVtYmVyLCBhRmxhZzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHRoaXMuX2ZsYWdzW2ZsZElkeF0gPSB0aGlzLl9mbGFnc1tmbGRJZHhdIHwgYUZsYWc7XHJcbiAgICAvLyBOb3RlOiB3ZSBvbmx5IHNldCB0aGUgaGlzdG9yeSBmbGFncy4gV2UgZG9udCBjbGVhciB0aGVtIGhlcmUuIFdlIG9ubHkgY2xlYXIgdGhlbSBhZnRlciBYTUwgd2FzIGR1bXBlZC5cclxuICAgIGlmIChhRmxhZyA9PT0gUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRClcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gPSB0aGlzLl9mbGFnc0hpc3RvcnlbZmxkSWR4XSB8IGFGbGFnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIGZpZWxkIHRvIGhhdmUgYSBub24tbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICBjbGVhckZsYWcoZmxkSWR4OiBudW1iZXIsIGFGbGFnczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHRoaXMuX2ZsYWdzW2ZsZElkeF0gPSB0aGlzLl9mbGFnc1tmbGRJZHhdICYgfmFGbGFncztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciB0aGUgZmxhZ3MgaGlzdG9yeS4gVGhpcyBzaG91bGQgb25seSBiZSBkb25lIGFmdGVyIGEgY29tbWl0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFnc0hpc3RvcnkoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZmxhZ3MubGVuZ3RoOyBpID0gaSArIDEpXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgZmxhZyBmb3IgYWxsIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFncyhhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKVxyXG4gICAgICB0aGlzLmNsZWFyRmxhZyhpLCBhRmxhZ3MpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIGZsYWcgZm9yIGFsbCByZWFsIGZpZWxkc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJGbGFnc0ZvclJlYWxPbmx5KGFGbGFnczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZmxhZ3MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBpZiAoIWZpZWxkLklzVmlydHVhbCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJGbGFnKGksIGFGbGFncyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciBhIHNwZWNpZmljIGZpZWxkIGZsYWcgZnJvbSB0aGUgaGlzdG9yeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJIaXN0b3J5RmxhZyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZsYWdzSGlzdG9yeSAhPT0gbnVsbCAmJiBmbGRJZHggPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSAmJiBmbGRJZHggPj0gMCkge1xyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbZmxkSWR4XSA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgZmxhZ3MgYW5kIHRoZSB2YWxpZGl0eSBvZiB0aGUgZmllbGQgaW5kZXhcclxuICAvLy8gICB0aHJvd3MgYW4gZXJyb3IgaW4gY2FzZSBvZiBhIGZhaWx1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgY2hlY2tGbGFncyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ZsYWdzID09PSBudWxsIHx8IGZsZElkeCA+PSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSB8fCBmbGRJZHggPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIkNhbm5vdCBmaW5kIGZsYWdzXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RhcnQgdGhlIHJlY29yZCdzIHNldHRpbmdzLiBUaGlzIG1pZ2h0IGJlIG5lZWRlZCBhZnRlciBhIHNlcnZlcidzIHJvbGxiYWNrXHJcbiAgLy8vICAgb3IgcmVzdGFydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbGRNb2RlXCI+dGhlIG9sZCByZWNvcmQgbW9kZTwvcGFyYW0+XHJcbiAgcmVzdGFydChvbGRNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpO1xyXG5cclxuICAgIGlmIChvbGRNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSkge1xyXG4gICAgICBsZXQgcmVjOiBSZWNvcmQgPSB0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW4gPSAocmVjICE9IG51bGwgJiYgcmVjLmdldElkKCkgPT09IHRoaXMuX2lkKTtcclxuXHJcbiAgICAgIGlmICgodGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgIGlmIChpc0N1cnJSZWMgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpICYmIHRhc2suVHJ5aW5nVG9Db21taXQgJiYgIXRoaXMuX2RhdGF2aWV3LmluUm9sbGJhY2soKSlcclxuICAgICAgICAgIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlO1xyXG4gICAgICAgIGVsc2Ugb2xkTW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQ7XHJcblxyXG4gICAgICBlbHNlIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRNb2RlKG9sZE1vZGUpO1xyXG4gICAgaWYgKG9sZE1vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgIHRoaXMuc2V0TmV3UmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgdmFsdWUgb2YgbGF0ZUNvbXB1dGUgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRMYXRlQ29tcHV0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2xhdGVDb21wdXRlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwibGF0ZUNvbXB1dGVcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsYXRlQ29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXRlQ29tcHV0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gXCJpbiBkZWxldGUgcHJvY2Vzc1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgc2V0SW5EZWxldGVQcm9jZXNzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5EZWxldGVQcm9jZXNzID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgaW5EZWxldGVQcm9jZXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luRGVsZXRlUHJvY2VzcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZW1vdmluZyB0aGUgcmVjb3JkLCBpdCB3aWxsIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRcclxuICAvLy8gICBvZiBpdHMgZGF0YSBjb250cm9scyB0byB0aGVpciBkY1ZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVjRnJvbURjKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RjUmVmcyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9kY1JlZnMuRGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXBhcmUgdGhlIGRhdGEgb2YgdGhpcyByZWNvcmQgd2l0aCB0aGUgZGF0YSBvZiBhIGRpZmZlcmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIG90aGVyIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyUmVjXCI+VFJVRSBpZiB3ZSBhcmUgY29tcGFyaW5nIHR3byAnY3VycmVudCByZWNvcmRzJyBvdGhlcndpc2Ugc2hvdWxkIGJlIGZhbHNlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja09ubHlQYXJldE9mRGF0YXZpZXdcIj5GQUxTRSBpZiB3ZSB3YW50IHRvIGNoZWNrIGFsbCB0aGUgZmllbGRzICwgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGRhdGEgdmlldy48L3BhcmFtPlxyXG4gIGlzU2FtZVJlY0RhdGEocmVjOiBSZWNvcmQsIGN1cnJSZWM6IGJvb2xlYW4sIGNoZWNrT25seVBhcmV0T2ZEYXRhdmlldzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZChjdXJyUmVjKTtcclxuICAgIGxldCBzdGFydDogbnVtYmVyID0gdGhpcy5nZXRGcm9tRmxkSWR4KGN1cnJSZWMpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmaWVsZDogRmllbGQ7XHJcblxyXG4gICAgLy8gY29tcGFyZSByZWZlcmVuY2VzXHJcbiAgICBpZiAodGhpcyA9PT0gcmVjKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocmVjLmdldFNpemVGbGQoY3VyclJlYykgIT09IHNpemUpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHJlYy5nZXRGcm9tRmxkSWR4KGN1cnJSZWMpICE9PSBzdGFydClcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQgKyBzaXplOyBpKyspIHtcclxuICAgICAgICBmaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPbmx5UGFyZXRPZkRhdGF2aWV3ICYmICFmaWVsZC5QYXJ0T2ZEYXRhdmlldylcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZmxkVmFsc0VxdWFsKHJlYywgaSkpXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgdGhyb3cgIGVycjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIHR3byBmaWVsZCB2YWx1ZXMgYmV0d2VlbiB0aGlzIHJlY29yZCBhbmQgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgcmVjb3JkIHRvIGNvbXBhcmUgd2l0aDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNvbXBhcmU8L3BhcmFtPlxyXG4gIGZsZFZhbHNFcXVhbChyZWM6IFJlY29yZCwgZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpLmdldFR5cGUoKTtcclxuICAgIHJldHVybiBFeHByZXNzaW9uRXZhbHVhdG9yLm1nVmFsc0VxdWFsKHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpLCB0aGlzLklzTnVsbChmbGRJZHgpLCB0eXBlLCByZWMuR2V0RmllbGRWYWx1ZShmbGRJZHgpLCByZWMuSXNOdWxsKGZsZElkeCksIHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgaGFzaCBrZXkgb2JqZWN0IG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRIYXNoS2V5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzaEtleTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJlY29yZHMgYWZ0ZXIgdGhpcyBvbmUsIGluIGEgbGlzdCBvZiByZWNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXh0UmVjXCI+aXMgdGhlIG5leHQgcmVjb3JkIChvciBudWxsIGZvciB0aGUgbGFzdCByZWNvcmQpPC9wYXJhbT5cclxuICBzZXROZXh0UmVjKG5leHRSZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV4dCA9IG5leHRSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByZWNvcmRzIGJlZm9yZSB0aGlzIG9uZSwgaW4gYSBsaXN0IG9mIHJlY3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByZXZSZWNcIj5pcyB0aGUgcHJldmlvdXMgcmVjb3JkIChvciBudWxsIGZvciB0aGUgZmlyc3QgcmVjb3JkKTwvcGFyYW0+XHJcbiAgc2V0UHJldlJlYyhwcmV2UmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXYgPSBwcmV2UmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVjb3JkIHdob3NlIGxvY2F0aW9uIGlzIGJlZm9yZSB0aGlzIG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UHJldlJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZWNvcmQgd2hpY2ggZm9sbG93cyB0aGlzIG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TmV4dFJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX25leHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIERjUmVmc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGNSZWZzKCk6IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9kY1JlZnMuQ2xvbmUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgRGNSZWZzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREY1JlZnMobmV3RGNSZWZzOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVSZWNGcm9tRGMoKTtcclxuICAgIHRoaXMuX2RjUmVmcyA9IG5ld0RjUmVmcy5DbG9uZSgpO1xyXG4gICAgdGhpcy5TZXREY1ZhbHVlSWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSByZWFsIHZhcmlhYmxlcyB3YXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlYWxNb2RpZmllZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBiUmM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB0YWJTaXplOiBudW1iZXIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gMDsgaiA8IHRhYlNpemU7IGorKykge1xyXG4gICAgICAvLyBmb3IgZXZlcnkgbW9kaWZpZWQgZmllbGQgY2hlY2sgaWYgaXQgaXMgYSByZWFsIGZpZWxkXHJcbiAgICAgIGlmICgodGhpcy5fZmxhZ3Nbal0gJiBSZWNvcmQuRkxBR19NT0RJRklFRCkgPT09IFJlY29yZC5GTEFHX01PRElGSUVEKSB7XHJcbiAgICAgICAgaWYgKCEoKDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGopKS5Jc1ZpcnR1YWwpKSB7XHJcbiAgICAgICAgICBiUmMgPSB0cnVlOyAvLyBpZiBhIHJlYWwgbW9kaWZpZWQgZmllbGQgd2FzIGZvdW5kLCByZXR1cm4gd2l0aCB0cnVlXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBiUmM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgeG1sIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNvcmQgLSB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIHNvIHdlXHJcbiAgLy8vICAgY2FuIHVzZSB0aGUgcmVjb3JkIHJlZmVyZW5jZSBpbiBhIHN0cmluZyBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMgYW5kIHByaW50IGNhbGxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUb1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLmJ1aWxkWE1MKHN0ciwgKHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkuZ2V0SWQoKSA9PT0gdGhpcy5faWQsIHRydWUpO1xyXG4gICAgcmV0dXJuIHN0ci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIHNlbmRUb1NlcnZlciBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTZW5kVG9TZXJ2ZXIodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZW5kVG9TZXJ2ZXIgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBzaXplIGluIGtiIG9mIHRoZSByZWNvcmRzIGUuaS4gdGhlIHN1bSBvZiBhbGwgZmllbGRzIGluIHRoZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJlY1NpemUoKTogbnVtYmVyIHtcclxuICAgIGxldCBzdW06IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBzdW0gPSBzdW0gKyBmaWVsZC5nZXRTaXplKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvcHkgdGhlIG1vZGlmaWVkIGNyc3IgZmxhZ3MgZnJvbSBhIGdpdmVuIHJlYy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHNvdXJjZSByZWNvcmQ8L3BhcmFtPlxyXG4gIGNvcHlDcnNyTW9kaWZpZWRGbGFncyhyZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgbGV0IHRhYlNpemU6IG51bWJlciA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGFiU2l6ZTsgaisrKSB7XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2pdID0gcmVjLl9mbGFnc1tqXTtcclxuICAgICAgdGhpcy5fZmxhZ3Nbal0gPSB0aGlzLl9mbGFnc1tqXSAmIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGEgdGFibGUgY2FjaGUgcmVjb3JkIHJldHVybnMgdGhlIHJlY29yZCdzIGRiX3BvcyB2YWx1ZSBhcyBhIGJhc2U2NCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERiUG9zVmFsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGJQb3NCYXNlNjRWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIHN0cmluZyB0aGF0IHJlcHJlc2VudCB0aGUgY3VycmVudCBsaW5rcyBmaWVsZHMgZGJfcG9zIHZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRMaW5rc1Bvc1N0cigpOiB2b2lkIHtcclxuICAgIGxldCB0Ymw6IERhdGF2aWV3SGVhZGVycyA9ICg8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkpLmdldERhdGF2aWV3SGVhZGVycygpO1xyXG4gICAgaWYgKHRibCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9saW5rc0ZsZHNQb3MgPSB0YmwuYnVpbGREYlBvc1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Rm9yY2VTYXZlT3JnKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VTYXZlT3JnID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHJlbGlua2VkIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZvcmNlU2F2ZU9yZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZVNhdmVPcmc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJ1ZSwgaWYgZXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIHRoZSB0YWJsZSBkdWUgdG8gdml0cnVhbCByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDYXVzZUludmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYXVzZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiBjYXVzZUludmFsaWRhdGlvbiBpcyB0cnVlLCAgZXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIHRoZSB0YWJsZSBkdWUgdG8gdml0cnVhbCByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2F1c2VJbnZhbGlkYXRpb25cIj48L3BhcmFtPlxyXG4gIHNldENhdXNlSW52YWxpZGF0aW9uKGNhdXNlSW52YWxpZGF0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXVzZUludmFsaWRhdGlvbiA9IGNhdXNlSW52YWxpZGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwiY29tcHV0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwiY29tcHV0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldENvbXB1dGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcHV0ZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiBjb21wdXRlXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRJbkNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIXZhbClcclxuICAgICAgdGhpcy5zZXRDb21wdXRlZCh0cnVlKTtcclxuICAgIHRoaXMuX2luQ29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcImluIHJlY29tcHV0ZVwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0SW5SZWNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pblJlY29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3TW9kZVwiPnRoZSBuZXcgbW9kZTogQ3JlYXRlZCwgTW9kaWZpZWQsIERlbGV0ZWQ8L3BhcmFtPlxyXG4gIHNldE1vZGUobmV3TW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG5ld01vZGUpIHtcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTpcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0OlxyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGU6XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZTpcclxuICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmUgfHxcclxuICAgICAgICAgIHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUgJiYgbmV3TW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSBuZXdNb2RlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFJlY29yZC5zZXRNb2RlKCk6IGlsbGVnYWwgbW9kZTogXCIgKyBuZXdNb2RlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHJlY29yZCBtb2RlIHRvIFwibm9uZVwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhck1vZGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3dpdGNoIG9mZiB0aGUgbmV3UmVjIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE9sZFJlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX25ld1JlYyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN3aXRjaCBvbiB0aGUgbmV3UmVjIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE5ld1JlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX25ld1JlYyA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXJpYWxpemUgYW4gaXRlbSAoZmllbGQvZ2xvYmFsIHBhcmFtLy4uLikuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPml0ZW0ncyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGVtQXR0clwiPml0ZW0ncyBhdHRyaWJ1dGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2VsbEF0dHJcIj5jZWxsJ3MgYXR0cmlidXRlIC0gcmVsZXZhbnQgb25seSBpZiAnaXRlbUF0dHInIGlzIHZlY3RvcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJUb0Jhc2U2NFwiPj5kZWNpZGUgQmFzZTY0IGVuY29kaW5nIGlzIHRvIGJlIGRvbmU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5zZXJpYWxpemVkIGl0ZW1WYWwgPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBzZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWw6IHN0cmluZywgaXRlbUF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBUb0Jhc2U2NDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gUmVjb3JkVXRpbHMuc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsLCBpdGVtQXR0ciwgY2VsbEF0dHIsIFRvQmFzZTY0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyBEQ1ZhbCBJZCBpbnRvIE1nQ29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldERjVmFsdWVJZCgpOiB2b2lkIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKS5nZXRGb3JtKCk7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmb3JtIGRvZXNuJ3QgaGF2ZSBhbnkgc2VsZWN0aW9uIGNvbnRyb2wsIGRjUmVmcyB3b3VsZCBiZSBudWxsXHJcbiAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX2RjUmVmcyAhPSBudWxsKSB7XHJcblxyXG4gICAgICB0aGlzLl9kY1JlZnMuUmVmcy5mb3JFYWNoKChkY1JlZjogRGNWYWx1ZXNSZWZlcmVuY2UpID0+IHtcclxuICAgICAgICBtZ0NvbnRyb2wgPSA8TWdDb250cm9sPmZvcm0uZ2V0Q3RybChkY1JlZi5kaXRJZHgpO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICAgIG1nQ29udHJvbC5zZXREY1ZhbElkKGRjUmVmLkRjVmFsdWVzLmdldElkKCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVzZXQgdGhlIERDVmFsIElkIGluIE1nQ29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0RGNWYWx1ZUlkKCk6IHZvaWQge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpLmdldEZvcm0oKTtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgLy8gaWYgdGhlIGZvcm0gZG9lc24ndCBoYXZlIGFueSBzZWxlY3Rpb24gY29udHJvbCwgZGNSZWZzIHdvdWxkIGJlIG51bGxcclxuICAgIGlmIChmb3JtICE9IG51bGwgJiYgdGhpcy5fZGNSZWZzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzLlJlZnMuZm9yRWFjaChmdW5jdGlvbiAoZGNSZWY6IERjVmFsdWVzUmVmZXJlbmNlKSB7XHJcbiAgICAgICAgbWdDb250cm9sID0gPE1nQ29udHJvbD5mb3JtLmdldEN0cmwoZGNSZWYuZGl0SWR4KTtcclxuICAgICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgICBtZ0NvbnRyb2wuc2V0RGNWYWxJZChFTVBUWV9EQ1JFRik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQWRkRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkOiBudW1iZXIsIGRjVmFsdWVzSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGRjVmFsdWVzOiBEY1ZhbHVlcyA9IHRoaXMuX2RhdGF2aWV3LmdldERjVmFsdWVzKGRjVmFsdWVzSWQpO1xyXG4gICAgbGV0IGRjUmVmOiBEY1ZhbHVlc1JlZmVyZW5jZSA9IG5ldyBEY1ZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQsIGRjVmFsdWVzKTtcclxuICAgIGlmICh0aGlzLl9kY1JlZnMgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzID0gbmV3IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kY1JlZnMuQWRkKGRjUmVmKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxpbmsgYmV0d2VlbiBhIGRhdGEgY29udHJvbCBhbmQgaXRzIERjVmFsdWVzIG9iamVjdC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIERjVmFsdWVzUmVmZXJlbmNlIGV4dGVuZHMgT2JqZWN0UmVmZXJlbmNlQmFzZSB7XHJcbiAgZGl0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSByZWZlcmVuY2VkIERjVmFsdWVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0IERjVmFsdWVzKCk6IERjVmFsdWVzIHtcclxuICAgIHJldHVybiA8RGNWYWx1ZXM+dGhpcy5SZWZlcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvdXBsZVwiPmEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgZGl0SWR4ICYgZGNJZCBzZXBhcmF0ZWQgYnkgYSBjb21tYTwvcGFyYW0+XHJcbiAgY29uc3RydWN0b3IoY29udHJvbElkOiBudW1iZXIsIHJlZmVyZW5jZWREY1ZhbHVlczogRGNWYWx1ZXMpIHtcclxuICAgIHN1cGVyKHJlZmVyZW5jZWREY1ZhbHVlcyk7XHJcbiAgICB0aGlzLmRpdElkeCA9IGNvbnRyb2xJZDtcclxuICB9XHJcblxyXG4gIENsb25lKCk6IE9iamVjdFJlZmVyZW5jZUJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBEY1ZhbHVlc1JlZmVyZW5jZSh0aGlzLmRpdElkeCwgPERjVmFsdWVzPnRoaXMuUmVmZXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGEgbmV3IERjVmFsdWVzUmVmZXJlbmNlIGZyb20gYSBzdHJpbmcgY29udGFpbmluZyB0d28gaW50ZWdlcnMsIHdoZXJlIHRoZVxyXG4gIC8vLyBmaXJzdCBpcyB0aGUgaW5kZXggb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm0gKGRpdCBpbmRleCkgYW5kIHRoZSBzZWNvbmQgaXMgdGhlXHJcbiAgLy8vIERjVmFsdWVzIG9iamVjdCBpZGVudGlmaWVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY291cGxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkY1ZhbHVlc093bmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQYXJzZShjb3VwbGU6IHN0cmluZywgZGNWYWx1ZXNPd25lcjogRGF0YVZpZXdCYXNlKTogRGNWYWx1ZXNSZWZlcmVuY2Uge1xyXG4gICAgbGV0IGNvbW1hUG9zOiBudW1iZXIgPSBjb3VwbGUuaW5kZXhPZihcIixcIik7XHJcblxyXG4gICAgbGV0IGNvbnRyb2xJZDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjb3VwbGUuc3Vic3RyKDAsIGNvbW1hUG9zKSk7XHJcbiAgICBsZXQgZGNJZDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjb3VwbGUuc3Vic3RyKGNvbW1hUG9zICsgMSkpO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkLCBkY1ZhbHVlc093bmVyLmdldERjVmFsdWVzKGRjSWQpKTtcclxuICB9XHJcbn1cclxuIl19