@kontur.candy/tools 2.153.0 → 2.155.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 (272) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/distr/Common/AsyncUtils.js +1 -3
  3. package/distr/Common/CandyApiClient/CandyApiClient.js +25 -138
  4. package/distr/Common/CandyApiClient/CandyApiClientContext.js +1 -8
  5. package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +1 -1
  6. package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +1 -1
  7. package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +1 -2
  8. package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +1 -1
  9. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +1 -16
  10. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +1 -12
  11. package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +1 -12
  12. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +1 -1
  13. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +1 -13
  14. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +1 -3
  15. package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +1 -1
  16. package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +1 -8
  17. package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +1 -7
  18. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +9 -12
  19. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +1 -1
  20. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestResponse.js +1 -1
  21. package/distr/Common/CandyApiClient/FakeCandyApiClient.js +4 -72
  22. package/distr/Common/CandyApiClient/ICandyApiClient.js +1 -1
  23. package/distr/Common/CandyApiClient/IsBuffer.js +1 -2
  24. package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +1 -1
  25. package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +1 -1
  26. package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +1 -1
  27. package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +1 -1
  28. package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +1 -1
  29. package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +12 -7
  30. package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +1 -1
  31. package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +1 -1
  32. package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +1 -3
  33. package/distr/Common/CandyApiClient/Types/DraftFullId.js +1 -1
  34. package/distr/Common/CandyApiClient/Types/ErrorLog/CandyPopdProtocol.js +5 -6
  35. package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +9 -12
  36. package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +5 -6
  37. package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +1 -1
  38. package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +1 -1
  39. package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +5 -6
  40. package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +1 -1
  41. package/distr/Common/CandyApiClient/Types/GetInner/ServerRawResponse.js +1 -3
  42. package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +1 -1
  43. package/distr/Common/CandyApiClient/Types/Guid.js +1 -1
  44. package/distr/Common/CandyApiClient/Types/InstancesDeleting/InstancesDeletingRule.js +1 -1
  45. package/distr/Common/CandyApiClient/Types/MassActions/MassActionParameters.js +1 -1
  46. package/distr/Common/CandyApiClient/Types/MassActions/ValueForInstancesSettingRule.js +6 -0
  47. package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +5 -6
  48. package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +1 -1
  49. package/distr/Common/CandyApiClient/Types/Print/PrintResponse.js +1 -1
  50. package/distr/Common/CandyApiClient/Types/Print/PrintType.js +5 -6
  51. package/distr/Common/CandyApiClient/Types/Staff/EmployeeInfo.js +1 -1
  52. package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesOptions.js +1 -1
  53. package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesRequest.js +1 -1
  54. package/distr/Common/CandyApiClient/Types/Staff/StaffInfo.js +1 -1
  55. package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +1 -1
  56. package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +5 -6
  57. package/distr/Common/CandyApiClient/Types/TestClassification.js +1 -1
  58. package/distr/Common/CollectionUtils.js +1 -3
  59. package/distr/Common/CommonConstants/SectionNames.js +1 -3
  60. package/distr/Common/Comparers.js +2 -16
  61. package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +1 -5
  62. package/distr/Common/EndPoints.js +1 -2
  63. package/distr/Common/Enums/ButtonSettingsTypeEnum.js +5 -6
  64. package/distr/Common/Errors.js +1 -19
  65. package/distr/Common/FormActionHandlers/ContextualActionNames.js +1 -3
  66. package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +1 -1
  67. package/distr/Common/Funcs.js +1 -5
  68. package/distr/Common/GFV.js +1 -1
  69. package/distr/Common/Hooks/UseLocalStorage.js +3 -10
  70. package/distr/Common/HttpClient/AuthenticationMode.js +3 -7
  71. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +1 -3
  72. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -3
  73. package/distr/Common/HttpClient/FetchImplementation/Fetch.js +1 -1
  74. package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -1
  75. package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +6 -11
  76. package/distr/Common/HttpClient/HttpClient.js +9 -80
  77. package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +1 -1
  78. package/distr/Common/HttpClient/IHttpClient.js +1 -1
  79. package/distr/Common/IndentString.js +1 -3
  80. package/distr/Common/IntRangeUtils.js +3 -10
  81. package/distr/Common/IterableUtils.js +3 -76
  82. package/distr/Common/KCLangRuntimeUtils.js +1 -87
  83. package/distr/Common/ModelPath/BuildIterationSequence.js +1 -5
  84. package/distr/Common/ModelPath/EachCurrentCollision.js +5 -6
  85. package/distr/Common/ModelPath/IEquatable.js +1 -1
  86. package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +1 -8
  87. package/distr/Common/ModelPath/Map/Map2.js +2 -24
  88. package/distr/Common/ModelPath/Map/ModelPathMap.js +1 -8
  89. package/distr/Common/ModelPath/ModelPath.js +16 -140
  90. package/distr/Common/ModelPath/ModelPathBuilder.js +1 -14
  91. package/distr/Common/ModelPath/ModelPathHelper.js +1 -2
  92. package/distr/Common/ModelPath/PathMatcher.js +5 -24
  93. package/distr/Common/ModelPath/PathSplitHelper.js +1 -6
  94. package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +1 -10
  95. package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +1 -10
  96. package/distr/Common/ModelPath/Set/ModelPathSet.js +1 -10
  97. package/distr/Common/ModelPath/Set/Set2.js +1 -16
  98. package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +1 -9
  99. package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +1 -1
  100. package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +1 -3
  101. package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +1 -17
  102. package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +1 -30
  103. package/distr/Common/NidusClient/INidusClient.js +1 -3
  104. package/distr/Common/NidusClient/NidusClientContext.js +1 -14
  105. package/distr/Common/NidusClient/NidusClientImpl.js +1 -18
  106. package/distr/Common/PathConstants.js +1 -3
  107. package/distr/Common/StringArrayKey.js +1 -8
  108. package/distr/Common/TypingUtils.js +7 -26
  109. package/distr/Common/UUID.js +1 -4
  110. package/distr/Common/UseAsyncEffect.js +3 -7
  111. package/distr/Common/UseShowOnce.js +1 -17
  112. package/distr/Common/UseTypedSelector.js +1 -3
  113. package/distr/Common/getRngSchemaFilename.js +18 -0
  114. package/distr/Common/hashUtils.js +1 -4
  115. package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +1 -23
  116. package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +3 -10
  117. package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +1 -10
  118. package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +5 -23
  119. package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +1 -27
  120. package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +1 -2
  121. package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +3 -10
  122. package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +1 -9
  123. package/distr/Tools/src/BuildTasks/FSTask.js +1 -19
  124. package/distr/Tools/src/BuildTasks/Form/CompileForm.js +1 -19
  125. package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +1 -16
  126. package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +1 -11
  127. package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +1 -10
  128. package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +1 -10
  129. package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +1 -10
  130. package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +5 -26
  131. package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +1 -38
  132. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +2 -42
  133. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +4 -39
  134. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +4 -7
  135. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +4 -10
  136. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +9 -17
  137. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +3 -5
  138. package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +1 -13
  139. package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +1 -20
  140. package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +3 -48
  141. package/distr/Tools/src/BuildTasks/ReadFormSource.js +7 -32
  142. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +5 -32
  143. package/distr/Tools/src/BuildTasks/Version.js +1 -10
  144. package/distr/Tools/src/BuildTasks/WriteFormMeta.js +1 -10
  145. package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +5 -9
  146. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +1 -5
  147. package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +22 -71
  148. package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +1 -12
  149. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +1 -5
  150. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +1 -67
  151. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +3 -28
  152. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +3 -41
  153. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +3 -23
  154. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +3 -20
  155. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +1 -23
  156. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +1 -37
  157. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +1 -13
  158. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +1 -40
  159. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +8 -49
  160. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +1 -13
  161. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +1 -17
  162. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +1 -4
  163. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +10 -19
  164. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +12 -26
  165. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +1 -5
  166. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +1 -1
  167. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +1 -1
  168. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +10 -44
  169. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +1 -17
  170. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +1 -5
  171. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +1 -1
  172. package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +1 -27
  173. package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +11 -16
  174. package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +1 -1
  175. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +1 -1
  176. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +1 -1
  177. package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +1 -4
  178. package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +13 -34
  179. package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +1 -4
  180. package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +1 -15
  181. package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +3 -19
  182. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}.calc.js +1 -2
  183. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/setKppValue.js +1 -2
  184. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +1 -6
  185. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +1 -11
  186. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/kppValue.js +3 -4
  187. package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +1 -4
  188. package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +1 -23
  189. package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +1 -4
  190. package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +7 -23
  191. package/distr/Tools/src/CLICommands/RenameFiles/RenameFilesOptions.js +26 -0
  192. package/distr/Tools/src/CLICommands/RenameFiles/RunRenameFiles.js +48 -0
  193. package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +1 -37
  194. package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +1 -4
  195. package/distr/Tools/src/CandyCLI.js +7 -56
  196. package/distr/Tools/src/CheckNodeJsVersion.js +3 -10
  197. package/distr/Tools/src/Commons/ApiClient/ToolsApiClient.js +1 -10
  198. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +4 -29
  199. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +1 -6
  200. package/distr/Tools/src/Commons/ErrorUntyped.js +1 -1
  201. package/distr/Tools/src/Commons/EventObject.js +10 -20
  202. package/distr/Tools/src/Commons/ExecUtils.js +3 -9
  203. package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +1 -7
  204. package/distr/Tools/src/Commons/FormGlobsUtils.js +1 -33
  205. package/distr/Tools/src/Commons/FsUtils.js +1 -12
  206. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +1 -8
  207. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +4 -15
  208. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +1 -4
  209. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +1 -5
  210. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +1 -1
  211. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +1 -4
  212. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +1 -5
  213. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +2 -5
  214. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +1 -5
  215. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +1 -14
  216. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +1 -4
  217. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +1 -5
  218. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +1 -4
  219. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +1 -4
  220. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +1 -1
  221. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +1 -4
  222. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +1 -4
  223. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +1 -36
  224. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +1 -9
  225. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +5 -35
  226. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +9 -11
  227. package/distr/Tools/src/Commons/Locks/Lock.js +1 -8
  228. package/distr/Tools/src/Commons/Locks/LockHandle.js +1 -5
  229. package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +1 -9
  230. package/distr/Tools/src/Commons/Logging/ELKLogger.js +17 -22
  231. package/distr/Tools/src/Commons/Logging/ILogger.js +1 -5
  232. package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +3 -21
  233. package/distr/Tools/src/Commons/Logging/Logger.js +9 -29
  234. package/distr/Tools/src/Commons/Logging/StaticLogger.js +11 -15
  235. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +1 -1
  236. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +3 -37
  237. package/distr/Tools/src/Commons/PathPattern.js +1 -13
  238. package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +1 -4
  239. package/distr/Tools/src/Commons/TasksCore/BuildTask.js +1 -1
  240. package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +13 -200
  241. package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +1 -20
  242. package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +7 -10
  243. package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +1 -15
  244. package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +1 -15
  245. package/distr/Tools/src/Commons/TasksCore/Observe.js +1 -13
  246. package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +5 -11
  247. package/distr/Tools/src/Commons/TimingUtils.js +1 -2
  248. package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +13 -51
  249. package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +4 -14
  250. package/distr/Tools/src/GenerateReadMe.js +1 -13
  251. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
  252. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js.LICENSE.txt +10 -1
  253. package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
  254. package/distr/Tools/src/LocalServerFrontEndDist/index.js.LICENSE.txt +10 -1
  255. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  256. package/distr/Tools/src/Options/CandyToolOptions.js +3 -11
  257. package/distr/Tools/src/ReadFarmConfig.js +1 -5
  258. package/distr/Tools/src/SelfUpdate.js +4 -28
  259. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1506 -1257
  260. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.LICENSE.txt +1 -0
  261. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
  262. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +843 -623
  263. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.LICENSE.txt +1 -0
  264. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
  265. package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +777 -1117
  266. package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +1665 -2015
  267. package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +9 -55
  268. package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +777 -1117
  269. package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +1665 -2015
  270. package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +9 -55
  271. package/package.json +10 -10
  272. /package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/schemas/{{gfv}.rng.xml → {gfv}.0.rng.xml} +0 -0
@@ -1,83 +1,61 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.TransformValueProducer = exports.SplitToChainsValueProducer = exports.SkipUpdatesUntilNextCompletedProducer = exports.ParallelSplitToChainsValueProducer = exports.ObservableValueProducerBase = exports.ExecuteOnValueProducer = exports.ChainableValueProducer = exports.AttachValueProducer = void 0;
9
-
10
8
  var os = _interopRequireWildcard(require("os"));
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _pLimit = _interopRequireDefault(require("p-limit"));
15
-
16
11
  var _IterableUtils = require("../../../../Common/IterableUtils");
17
-
18
12
  var _TypingUtils = require("../../../../Common/TypingUtils");
19
-
20
13
  var _AggregatedError = require("./AggregatedError");
21
-
22
14
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
-
24
15
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
-
26
- async function noop() {// empty function
16
+ async function noop() {
17
+ // empty function
27
18
  }
28
-
29
19
  class ChainableValueProducer {
30
20
  constructor() {
31
21
  this.errorListeners = [];
32
22
  }
33
-
34
23
  onNext(_listener) {
35
24
  throw new Error("AbstractError");
36
25
  }
37
-
38
26
  onError(listener) {
39
27
  this.errorListeners.push(listener);
40
28
  return () => {
41
29
  const index = this.errorListeners.indexOf(listener);
42
-
43
30
  if (index >= 0) {
44
31
  this.errorListeners.splice(index, 1);
45
32
  }
46
33
  };
47
34
  }
48
-
49
35
  get currentValue() {
50
36
  throw new Error("AbstractError");
51
37
  }
52
-
53
38
  transform(transformFunction) {
54
39
  return new TransformValueProducer(this, transformFunction);
55
40
  }
56
-
57
41
  do(action) {
58
42
  return new ExecuteOnValueProducer(this, action);
59
43
  }
60
-
61
44
  chainWith(nextItemFactory) {
62
45
  return nextItemFactory(this);
63
46
  }
64
-
65
47
  attach(attachFactory, joinValues, evaluateAttachKey) {
66
48
  return new AttachValueProducer(this, attachFactory, joinValues, evaluateAttachKey);
67
49
  }
68
-
69
50
  skipUpdatesUntilNextCompleted() {
70
51
  return new SkipUpdatesUntilNextCompletedProducer(this);
71
52
  }
72
-
73
53
  splitToChains(splitFunction, getKey, factory) {
74
54
  return new SplitToChainsValueProducer(this, splitFunction, getKey, factory);
75
55
  }
76
-
77
56
  splitToParallelChains(splitFunction, getKey, factory) {
78
57
  return new ParallelSplitToChainsValueProducer(this, splitFunction, getKey, factory);
79
58
  }
80
-
81
59
  async observe(listener = noop) {
82
60
  await this.beginObserve();
83
61
  await listener(await this.currentValue);
@@ -87,83 +65,64 @@ class ChainableValueProducer {
87
65
  await this.endObserve();
88
66
  };
89
67
  }
90
-
91
68
  async beginObserve() {
92
69
  throw new Error("AbstractError");
93
70
  }
94
-
95
71
  async endObserve() {
96
72
  throw new Error("AbstractError");
97
- } // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
-
73
+ }
99
74
 
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
76
  async emitError(error) {
101
77
  const errorObject = error instanceof Error ? error : new Error(`${error}`);
102
-
103
78
  for (const errorListener of this.errorListeners) {
104
79
  await errorListener(errorObject);
105
80
  }
106
81
  }
107
-
108
82
  }
109
-
110
83
  exports.ChainableValueProducer = ChainableValueProducer;
111
-
112
84
  class ObservableValueProducerBase extends ChainableValueProducer {
113
85
  constructor(...args) {
114
86
  super(...args);
115
87
  this.listeners = [];
116
88
  }
117
-
118
89
  get currentValue() {
119
90
  return this.getCurrentValue();
120
91
  }
121
-
122
92
  async getCurrentValue() {
123
93
  throw new Error("AbstractError");
124
94
  }
125
-
126
95
  async beginObserve() {
127
96
  await this.beginListening();
128
97
  }
129
-
130
98
  async endObserve() {
131
99
  await this.stopListening();
132
100
  }
133
-
134
101
  async beginListening() {
135
102
  throw new Error("AbstractError");
136
103
  }
137
-
138
104
  async stopListening() {
139
105
  throw new Error("AbstractError");
140
106
  }
141
-
142
107
  async emitUpdate(value) {
143
108
  await this.notifyAllListenersAndWaitForComplete(value);
144
109
  }
145
-
146
110
  onNext(listener) {
147
111
  this.listeners.push(listener);
148
112
  return () => {
149
113
  const index = this.listeners.indexOf(listener);
150
-
151
114
  if (index >= 0) {
152
115
  this.listeners.splice(index, 1);
153
116
  }
154
117
  };
155
118
  }
156
-
157
119
  async notifyAllListenersAndWaitForComplete(nextValue) {
158
120
  for (const listener of this.listeners) {
159
121
  await listener(nextValue);
160
122
  }
161
123
  }
162
-
163
124
  }
164
-
165
125
  exports.ObservableValueProducerBase = ObservableValueProducerBase;
166
-
167
126
  class AttachValueProducer extends ChainableValueProducer {
168
127
  constructor(parent, attachFactory, joinValues, evaluateAttachKey) {
169
128
  super();
@@ -180,172 +139,129 @@ class AttachValueProducer extends ChainableValueProducer {
180
139
  this.lastParentValue = void 0;
181
140
  this.awaitingLastAttachedValue = false;
182
141
  this.isInObserveState = false;
183
-
184
142
  this.handleChangeAttachedValue = async attachedValue => {
185
143
  this.lastAttachedValue = attachedValue;
186
-
187
144
  if (!this.awaitingLastAttachedValue) {
188
145
  if (this.lastParentValue == undefined) {
189
146
  throw new Error("InvalidProgramState");
190
147
  }
191
-
192
148
  await this.emitNextValue(await this.joinValues(this.lastParentValue, attachedValue));
193
149
  }
194
150
  };
195
-
196
151
  this.handleChangeParentValue = async parentValue => {
197
152
  this.lastParentValue = parentValue;
198
153
  const attachKey = await this.evaluateAttachKey(parentValue);
199
-
200
154
  if (this.attachedProducer != undefined && this.detachAttachedListener == undefined) {
201
155
  this.detachAttachedListener = this.attachedProducer.onNext(this.handleChangeAttachedValue);
202
156
  }
203
-
204
157
  if (this.lastAttachKey == undefined || this.lastAttachKey !== attachKey) {
205
158
  this.lastAttachKey = attachKey;
206
-
207
159
  if (this.detachAttachedListener != undefined) {
208
160
  this.detachAttachedListener();
209
161
  }
210
-
211
162
  if (this.attachedProducer != undefined && this.isInObserveState) {
212
163
  await this.attachedProducer.endObserve();
213
164
  }
214
-
215
165
  this.attachedProducer = await this.attachFactory(parentValue);
216
-
217
166
  if (this.isInObserveState) {
218
167
  await this.attachedProducer.beginObserve();
219
168
  }
220
-
221
169
  this.detachAttachedListener = this.attachedProducer.onNext(this.handleChangeAttachedValue);
222
170
  }
223
-
224
171
  if (this.attachedProducer == undefined) {
225
172
  throw new Error("InvalidProgramState");
226
- } // Просто немного обождем, вдруг придёт другое attachedValue
227
-
228
-
173
+ }
174
+ // Просто немного обождем, вдруг придёт другое attachedValue
229
175
  this.awaitingLastAttachedValue = true;
230
176
  await delay(700);
231
177
  this.awaitingLastAttachedValue = false;
232
178
  let attachedValue = this.lastAttachedValue;
233
-
234
179
  if (attachedValue == undefined) {
235
180
  attachedValue = await this.attachedProducer.currentValue;
236
181
  }
237
-
238
182
  await this.emitNextValue(await this.joinValues(parentValue, attachedValue));
239
183
  };
240
-
241
184
  this.parent = parent;
242
- this.attachFactory = attachFactory; // Я не могу победить типизацию в этом месте, слишком много у меня кода получается
185
+ this.attachFactory = attachFactory;
186
+ // Я не могу победить типизацию в этом месте, слишком много у меня кода получается
243
187
  // @ts-ignore
244
-
245
188
  this.joinValues = joinValues || (async x => x);
246
-
247
189
  this.evaluateAttachKey = evaluateAttachKey || (async () => "STATIC-ATTACH-KEY");
248
190
  }
249
-
250
191
  async beginObserve() {
251
192
  this.isInObserveState = true;
252
193
  await this.parent.beginObserve();
253
194
  }
254
-
255
195
  async endObserve() {
256
196
  await this.parent.endObserve();
257
-
258
197
  if (this.attachedProducer != undefined) {
259
198
  await this.attachedProducer.endObserve();
260
199
  }
261
-
262
200
  this.isInObserveState = false;
263
201
  }
264
-
265
202
  get currentValue() {
266
203
  const getCurrentValue = async () => {
267
204
  const parentValue = await this.parent.currentValue;
268
205
  this.lastParentValue = parentValue;
269
206
  const attachKey = await this.evaluateAttachKey(parentValue);
270
-
271
207
  if (this.attachedProducer != undefined && this.detachAttachedListener == undefined) {
272
208
  this.detachAttachedListener = this.attachedProducer.onNext(this.handleChangeAttachedValue);
273
209
  }
274
-
275
210
  if (this.lastAttachKey == undefined || this.lastAttachKey !== attachKey) {
276
211
  this.lastAttachKey = attachKey;
277
-
278
212
  if (this.detachAttachedListener != undefined) {
279
213
  this.detachAttachedListener();
280
214
  }
281
-
282
215
  if (this.attachedProducer != undefined && this.isInObserveState) {
283
216
  await this.attachedProducer.endObserve();
284
217
  }
285
-
286
218
  this.attachedProducer = await this.attachFactory(parentValue);
287
-
288
219
  if (this.isInObserveState) {
289
220
  await this.attachedProducer.beginObserve();
290
221
  }
291
-
292
222
  this.detachAttachedListener = this.attachedProducer.onNext(this.handleChangeAttachedValue);
293
223
  }
294
-
295
224
  if (this.attachedProducer == undefined) {
296
225
  throw new Error("InvalidProgramState");
297
226
  }
298
-
299
227
  const attachedValue = await this.attachedProducer.currentValue;
300
228
  this.lastAttachedValue = attachedValue;
301
229
  return this.joinValues(parentValue, attachedValue);
302
230
  };
303
-
304
231
  return getCurrentValue();
305
232
  }
306
-
307
233
  async emitNextValue(value) {
308
234
  for (const listener of this.listeners) {
309
235
  await listener(value);
310
236
  }
311
237
  }
312
-
313
238
  onNext(listener) {
314
239
  this.listeners.push(listener);
315
-
316
240
  if (this.listeners.length === 1) {
317
241
  if (this.detachParentListener == undefined) {
318
242
  this.detachParentListener = this.parent.onNext(this.handleChangeParentValue);
319
243
  }
320
-
321
244
  if (this.attachedProducer != undefined && this.detachParentListener == undefined) {
322
245
  this.detachParentListener = this.attachedProducer.onNext(this.handleChangeAttachedValue);
323
246
  }
324
247
  }
325
-
326
248
  return () => {
327
249
  const index = this.listeners.indexOf(listener);
328
-
329
250
  if (index >= 0) {
330
251
  this.listeners.splice(index, 1);
331
252
  }
332
-
333
253
  if (this.listeners.length === 0) {
334
254
  if (this.detachParentListener != undefined) {
335
255
  this.detachParentListener();
336
256
  }
337
-
338
257
  if (this.detachAttachedListener != undefined) {
339
258
  this.detachAttachedListener();
340
259
  }
341
260
  }
342
261
  };
343
262
  }
344
-
345
263
  }
346
-
347
264
  exports.AttachValueProducer = AttachValueProducer;
348
-
349
265
  class ExecuteOnValueProducer extends ChainableValueProducer {
350
266
  constructor(parent, action) {
351
267
  super();
@@ -354,25 +270,20 @@ class ExecuteOnValueProducer extends ChainableValueProducer {
354
270
  this.parent = parent;
355
271
  this.action = action;
356
272
  }
357
-
358
273
  async beginObserve() {
359
274
  await this.parent.beginObserve();
360
275
  }
361
-
362
276
  async endObserve() {
363
277
  await this.parent.endObserve();
364
278
  }
365
-
366
279
  get currentValue() {
367
280
  const getCurrentValue = async () => {
368
281
  const value = await this.parent.currentValue;
369
282
  await this.action(value);
370
283
  return value;
371
284
  };
372
-
373
285
  return getCurrentValue();
374
286
  }
375
-
376
287
  onNext(listener) {
377
288
  return this.parent.onNext(async parentValue => {
378
289
  try {
@@ -386,11 +297,8 @@ class ExecuteOnValueProducer extends ChainableValueProducer {
386
297
  }
387
298
  });
388
299
  }
389
-
390
300
  }
391
-
392
301
  exports.ExecuteOnValueProducer = ExecuteOnValueProducer;
393
-
394
302
  class TransformValueProducer extends ChainableValueProducer {
395
303
  constructor(parent, transformFunction) {
396
304
  super();
@@ -399,31 +307,23 @@ class TransformValueProducer extends ChainableValueProducer {
399
307
  this.parent = parent;
400
308
  this.transformFunction = transformFunction;
401
309
  }
402
-
403
310
  async beginObserve() {
404
311
  await this.parent.beginObserve();
405
312
  }
406
-
407
313
  async endObserve() {
408
314
  await this.parent.endObserve();
409
315
  }
410
-
411
316
  get currentValue() {
412
317
  const getCurrentValue = async () => this.transformFunction(await this.parent.currentValue);
413
-
414
318
  return getCurrentValue();
415
319
  }
416
-
417
320
  onNext(listener) {
418
321
  return this.parent.onNext(async parentValue => {
419
322
  await listener(await this.transformFunction(parentValue));
420
323
  });
421
324
  }
422
-
423
325
  }
424
-
425
326
  exports.TransformValueProducer = TransformValueProducer;
426
-
427
327
  class SplitToChainsValueProducer extends ChainableValueProducer {
428
328
  constructor(parent, splitFunction, getKey, factory) {
429
329
  super();
@@ -434,34 +334,24 @@ class SplitToChainsValueProducer extends ChainableValueProducer {
434
334
  this.listeners = [];
435
335
  this.chains = {};
436
336
  this.isInObserveState = false;
437
-
438
337
  this.handleChangeParentChain = async (nextValue, key) => {
439
338
  const chainValue = this.chains[key];
440
-
441
339
  if (chainValue != undefined) {
442
340
  chainValue.lastValue = nextValue;
443
341
  }
444
-
445
342
  await this.emitValue(Object.values(this.chains).map(x => x.lastValue).filter(isNotNullOrUndefined));
446
343
  };
447
-
448
344
  this.handleChangeParent = async input => {
449
345
  const values = this.splitFunction(input);
450
346
  const nextValuesMap = this.toMap(values);
451
-
452
347
  const newKeys = _lodash.default.difference(Object.keys(nextValuesMap), Object.keys(this.chains));
453
-
454
348
  const removedKeys = _lodash.default.difference(Object.keys(this.chains), Object.keys(nextValuesMap));
455
-
456
349
  for (const newKey of newKeys) {
457
350
  var _nextValuesMap$newKey;
458
-
459
351
  const newChain = this.factory((_nextValuesMap$newKey = nextValuesMap[newKey]) !== null && _nextValuesMap$newKey !== void 0 ? _nextValuesMap$newKey : (0, _TypingUtils.reject)());
460
-
461
352
  if (this.isInObserveState) {
462
353
  await newChain.beginObserve();
463
354
  }
464
-
465
355
  try {
466
356
  const newChainValue = await newChain.currentValue;
467
357
  this.chains[newKey] = {
@@ -479,43 +369,34 @@ class SplitToChainsValueProducer extends ChainableValueProducer {
479
369
  };
480
370
  }
481
371
  }
482
-
483
372
  for (const removedKey of removedKeys) {
484
373
  const removedChain = this.chains[removedKey];
485
374
  removedChain === null || removedChain === void 0 ? void 0 : removedChain.detachListener();
486
-
487
375
  if (this.isInObserveState) {
488
376
  await (removedChain === null || removedChain === void 0 ? void 0 : removedChain.valueProducer.endObserve());
489
- } // Я не знаю, как тут правильно
377
+ }
378
+ // Я не знаю, как тут правильно
490
379
  // tslint:disable-next-line:no-dynamic-delete
491
-
492
-
493
380
  delete this.chains[removedKey];
494
381
  }
495
-
496
382
  await this.emitValue(Object.values(this.chains).map(x => x.lastValue).filter(isNotNullOrUndefined));
497
383
  };
498
-
499
384
  this.parent = parent;
500
385
  this.splitFunction = splitFunction;
501
386
  this.getKey = getKey;
502
387
  this.factory = factory;
503
388
  this.parent.onNext(this.handleChangeParent);
504
389
  }
505
-
506
390
  get currentValue() {
507
391
  const getCurrentValue = async () => {
508
392
  const values = this.splitFunction(await this.parent.currentValue);
509
393
  const result = [];
510
394
  const errors = [];
511
-
512
395
  for (const value of values) {
513
396
  const childValueProducer = this.factory(value);
514
-
515
397
  if (this.isInObserveState) {
516
398
  await childValueProducer.beginObserve();
517
399
  }
518
-
519
400
  try {
520
401
  const childValue = await childValueProducer.currentValue;
521
402
  result.push(childValue);
@@ -532,7 +413,6 @@ class SplitToChainsValueProducer extends ChainableValueProducer {
532
413
  } else {
533
414
  errors.push(e);
534
415
  }
535
-
536
416
  const key = this.getKey(value);
537
417
  this.chains[key] = {
538
418
  lastValue: undefined,
@@ -541,66 +421,50 @@ class SplitToChainsValueProducer extends ChainableValueProducer {
541
421
  };
542
422
  }
543
423
  }
544
-
545
424
  if (errors.length === 1) {
546
425
  throw errors[0];
547
426
  } else if (errors.length > 1) {
548
427
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
549
428
  throw new _AggregatedError.AggregatedError("There are errors", ...errors);
550
429
  }
551
-
552
430
  return result;
553
431
  };
554
-
555
432
  return getCurrentValue();
556
433
  }
557
-
558
434
  async beginObserve() {
559
435
  this.isInObserveState = true;
560
436
  await this.parent.beginObserve();
561
437
  }
562
-
563
438
  async endObserve() {
564
439
  await this.parent.endObserve();
565
-
566
440
  for (const value of (0, _IterableUtils.iterateValues)(this.chains)) {
567
441
  await value.valueProducer.endObserve();
568
442
  }
569
-
570
443
  this.isInObserveState = false;
571
444
  }
572
-
573
445
  onNext(listener) {
574
446
  this.listeners.push(listener);
575
447
  return () => {
576
448
  const index = this.listeners.indexOf(listener);
577
-
578
449
  if (index >= 0) {
579
450
  this.listeners.splice(index, 1);
580
451
  }
581
452
  };
582
453
  }
583
-
584
454
  async emitValue(value) {
585
455
  for (const listener of this.listeners) {
586
456
  await listener(value);
587
457
  }
588
458
  }
589
-
590
459
  toMap(values) {
591
460
  const result = {};
592
-
593
461
  for (const value of values) {
594
462
  result[this.getKey(value)] = value;
595
463
  }
596
-
597
464
  return result;
598
465
  }
599
-
600
466
  }
601
-
602
467
  exports.SplitToChainsValueProducer = SplitToChainsValueProducer;
603
-
604
468
  class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
605
469
  constructor(parent, splitFunction, getKey, factory) {
606
470
  super();
@@ -611,34 +475,24 @@ class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
611
475
  this.listeners = [];
612
476
  this.chains = {};
613
477
  this.isInObserveState = false;
614
-
615
478
  this.handleChangeParentChain = async (nextValue, key) => {
616
479
  const chainValue = this.chains[key];
617
-
618
480
  if (chainValue != undefined) {
619
481
  chainValue.lastValue = nextValue;
620
482
  }
621
-
622
483
  await this.emitValue(Object.values(this.chains).map(x => x.lastValue).filter(isNotNullOrUndefined));
623
484
  };
624
-
625
485
  this.handleChangeParent = async input => {
626
486
  const values = this.splitFunction(input);
627
487
  const nextValuesMap = this.toMap(values);
628
-
629
488
  const newKeys = _lodash.default.difference(Object.keys(nextValuesMap), Object.keys(this.chains));
630
-
631
489
  const removedKeys = _lodash.default.difference(Object.keys(this.chains), Object.keys(nextValuesMap));
632
-
633
490
  for (const newKey of newKeys) {
634
491
  var _nextValuesMap$newKey2;
635
-
636
492
  const newChain = await this.factory((_nextValuesMap$newKey2 = nextValuesMap[newKey]) !== null && _nextValuesMap$newKey2 !== void 0 ? _nextValuesMap$newKey2 : (0, _TypingUtils.reject)());
637
-
638
493
  if (this.isInObserveState) {
639
494
  await newChain.beginObserve();
640
495
  }
641
-
642
496
  try {
643
497
  const newChainValue = await newChain.currentValue;
644
498
  this.chains[newKey] = {
@@ -656,30 +510,24 @@ class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
656
510
  };
657
511
  }
658
512
  }
659
-
660
513
  for (const removedKey of removedKeys) {
661
514
  const removedChain = this.chains[removedKey];
662
515
  removedChain === null || removedChain === void 0 ? void 0 : removedChain.detachListener();
663
-
664
516
  if (this.isInObserveState) {
665
517
  await (removedChain === null || removedChain === void 0 ? void 0 : removedChain.valueProducer.endObserve());
666
- } // Я не знаю, как тут правильно
518
+ }
519
+ // Я не знаю, как тут правильно
667
520
  // tslint:disable-next-line:no-dynamic-delete
668
-
669
-
670
521
  delete this.chains[removedKey];
671
522
  }
672
-
673
523
  await this.emitValue(Object.values(this.chains).map(x => x.lastValue).filter(isNotNullOrUndefined));
674
524
  };
675
-
676
525
  this.parent = parent;
677
526
  this.splitFunction = splitFunction;
678
527
  this.getKey = getKey;
679
528
  this.factory = factory;
680
529
  this.parent.onNext(this.handleChangeParent);
681
530
  }
682
-
683
531
  get currentValue() {
684
532
  const getCurrentValue = async () => {
685
533
  const values = this.splitFunction(await this.parent.currentValue);
@@ -688,11 +536,9 @@ class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
688
536
  const concurrencyLimit = (0, _pLimit.default)(os.cpus().length);
689
537
  await Promise.all(values.map((value, index) => concurrencyLimit(async () => {
690
538
  const childValueProducer = await this.factory(value);
691
-
692
539
  if (this.isInObserveState) {
693
540
  await childValueProducer.beginObserve();
694
541
  }
695
-
696
542
  try {
697
543
  const childValue = await childValueProducer.currentValue;
698
544
  result[index] = childValue;
@@ -709,7 +555,6 @@ class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
709
555
  } else {
710
556
  errors.push(e);
711
557
  }
712
-
713
558
  const key = this.getKey(value);
714
559
  this.chains[key] = {
715
560
  lastValue: undefined,
@@ -718,68 +563,51 @@ class ParallelSplitToChainsValueProducer extends ChainableValueProducer {
718
563
  };
719
564
  }
720
565
  })));
721
-
722
566
  if (errors.length === 1) {
723
567
  throw errors[0];
724
568
  } else if (errors.length > 1) {
725
569
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
726
570
  throw new _AggregatedError.AggregatedError("There are errors", ...errors);
727
571
  }
728
-
729
572
  return result;
730
573
  };
731
-
732
574
  return getCurrentValue();
733
575
  }
734
-
735
576
  async beginObserve() {
736
577
  this.isInObserveState = true;
737
578
  await this.parent.beginObserve();
738
579
  }
739
-
740
580
  async endObserve() {
741
581
  await this.parent.endObserve();
742
-
743
582
  for (const key of Object.keys(this.chains)) {
744
583
  var _this$chains$key;
745
-
746
584
  await ((_this$chains$key = this.chains[key]) === null || _this$chains$key === void 0 ? void 0 : _this$chains$key.valueProducer.endObserve());
747
585
  }
748
-
749
586
  this.isInObserveState = false;
750
587
  }
751
-
752
588
  onNext(listener) {
753
589
  this.listeners.push(listener);
754
590
  return () => {
755
591
  const index = this.listeners.indexOf(listener);
756
-
757
592
  if (index >= 0) {
758
593
  this.listeners.splice(index, 1);
759
594
  }
760
595
  };
761
596
  }
762
-
763
597
  async emitValue(value) {
764
598
  for (const listener of this.listeners) {
765
599
  await listener(value);
766
600
  }
767
601
  }
768
-
769
602
  toMap(values) {
770
603
  const result = {};
771
-
772
604
  for (const value of values) {
773
605
  result[this.getKey(value)] = value;
774
606
  }
775
-
776
607
  return result;
777
608
  }
778
-
779
609
  }
780
-
781
610
  exports.ParallelSplitToChainsValueProducer = ParallelSplitToChainsValueProducer;
782
-
783
611
  class SkipUpdatesUntilNextCompletedProducer extends ObservableValueProducerBase {
784
612
  constructor(parent) {
785
613
  super();
@@ -790,56 +618,42 @@ class SkipUpdatesUntilNextCompletedProducer extends ObservableValueProducerBase
790
618
  this.currentlyProcessingEmit = void 0;
791
619
  this.parent = parent;
792
620
  }
793
-
794
621
  async getCurrentValue() {
795
622
  if (this.lastParentValue == undefined) {
796
623
  this.currentlyProcessingEmit = (async () => {
797
624
  this.lastParentValue = await this.parent.currentValue;
798
625
  })();
799
-
800
626
  await this.currentlyProcessingEmit;
801
627
  }
802
-
803
628
  if (this.lastParentValue == undefined) {
804
629
  throw new Error("InvalidProgramState");
805
630
  }
806
-
807
631
  return this.lastParentValue;
808
632
  }
809
-
810
633
  async beginListening() {
811
634
  await this.parent.beginObserve();
812
-
813
635
  if (this.detachFromParent == undefined) {
814
636
  this.detachFromParent = this.parent.onNext(nextValue => this.handleChangeParentValue(nextValue));
815
637
  }
816
638
  }
817
-
818
639
  async stopListening() {
819
640
  if (this.detachFromParent != undefined) {
820
641
  this.detachFromParent();
821
642
  }
822
-
823
643
  await this.parent.endObserve();
824
644
  }
825
-
826
645
  async handleChangeParentValue(nextValue) {
827
646
  this.lastParentValue = nextValue;
828
647
  this.nextEmitToProcess = _lodash.default.once(() => this.emitUpdate(nextValue));
829
-
830
648
  if (this.currentlyProcessingEmit != undefined) {
831
649
  await this.currentlyProcessingEmit;
832
650
  }
833
-
834
651
  this.currentlyProcessingEmit = this.nextEmitToProcess();
835
652
  await this.currentlyProcessingEmit;
836
653
  this.currentlyProcessingEmit = undefined;
837
654
  }
838
-
839
655
  }
840
-
841
656
  exports.SkipUpdatesUntilNextCompletedProducer = SkipUpdatesUntilNextCompletedProducer;
842
-
843
657
  function delay(timeout) {
844
658
  return new Promise(resolve => {
845
659
  setTimeout(() => {
@@ -847,8 +661,7 @@ function delay(timeout) {
847
661
  }, timeout);
848
662
  });
849
663
  }
850
-
851
664
  function isNotNullOrUndefined(input) {
852
665
  return input != undefined;
853
666
  }
854
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9Db21tb25zL1Rhc2tzQ29yZS9DaGFpbmFibGVWYWx1ZVByb2R1Y2VyLnRzIl0sIm5hbWVzIjpbIm5vb3AiLCJDaGFpbmFibGVWYWx1ZVByb2R1Y2VyIiwiZXJyb3JMaXN0ZW5lcnMiLCJvbk5leHQiLCJfbGlzdGVuZXIiLCJFcnJvciIsIm9uRXJyb3IiLCJsaXN0ZW5lciIsInB1c2giLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJjdXJyZW50VmFsdWUiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1GdW5jdGlvbiIsIlRyYW5zZm9ybVZhbHVlUHJvZHVjZXIiLCJkbyIsImFjdGlvbiIsIkV4ZWN1dGVPblZhbHVlUHJvZHVjZXIiLCJjaGFpbldpdGgiLCJuZXh0SXRlbUZhY3RvcnkiLCJhdHRhY2giLCJhdHRhY2hGYWN0b3J5Iiwiam9pblZhbHVlcyIsImV2YWx1YXRlQXR0YWNoS2V5IiwiQXR0YWNoVmFsdWVQcm9kdWNlciIsInNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkIiwiU2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWRQcm9kdWNlciIsInNwbGl0VG9DaGFpbnMiLCJzcGxpdEZ1bmN0aW9uIiwiZ2V0S2V5IiwiZmFjdG9yeSIsIlNwbGl0VG9DaGFpbnNWYWx1ZVByb2R1Y2VyIiwic3BsaXRUb1BhcmFsbGVsQ2hhaW5zIiwiUGFyYWxsZWxTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlciIsIm9ic2VydmUiLCJiZWdpbk9ic2VydmUiLCJkZXRhY2hMaXN0ZW5lciIsImVuZE9ic2VydmUiLCJlbWl0RXJyb3IiLCJlcnJvciIsImVycm9yT2JqZWN0IiwiZXJyb3JMaXN0ZW5lciIsIk9ic2VydmFibGVWYWx1ZVByb2R1Y2VyQmFzZSIsImxpc3RlbmVycyIsImdldEN1cnJlbnRWYWx1ZSIsImJlZ2luTGlzdGVuaW5nIiwic3RvcExpc3RlbmluZyIsImVtaXRVcGRhdGUiLCJ2YWx1ZSIsIm5vdGlmeUFsbExpc3RlbmVyc0FuZFdhaXRGb3JDb21wbGV0ZSIsIm5leHRWYWx1ZSIsImNvbnN0cnVjdG9yIiwicGFyZW50IiwibGFzdEF0dGFjaEtleSIsImF0dGFjaGVkUHJvZHVjZXIiLCJkZXRhY2hQYXJlbnRMaXN0ZW5lciIsImRldGFjaEF0dGFjaGVkTGlzdGVuZXIiLCJsYXN0QXR0YWNoZWRWYWx1ZSIsImxhc3RQYXJlbnRWYWx1ZSIsImF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUiLCJpc0luT2JzZXJ2ZVN0YXRlIiwiaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSIsImF0dGFjaGVkVmFsdWUiLCJ1bmRlZmluZWQiLCJlbWl0TmV4dFZhbHVlIiwiaGFuZGxlQ2hhbmdlUGFyZW50VmFsdWUiLCJwYXJlbnRWYWx1ZSIsImF0dGFjaEtleSIsImRlbGF5IiwieCIsImxlbmd0aCIsImUiLCJjb25zb2xlIiwibG9nIiwiY2hhaW5zIiwiaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4iLCJrZXkiLCJjaGFpblZhbHVlIiwibGFzdFZhbHVlIiwiZW1pdFZhbHVlIiwiT2JqZWN0IiwidmFsdWVzIiwibWFwIiwiZmlsdGVyIiwiaXNOb3ROdWxsT3JVbmRlZmluZWQiLCJoYW5kbGVDaGFuZ2VQYXJlbnQiLCJpbnB1dCIsIm5leHRWYWx1ZXNNYXAiLCJ0b01hcCIsIm5ld0tleXMiLCJfIiwiZGlmZmVyZW5jZSIsImtleXMiLCJyZW1vdmVkS2V5cyIsIm5ld0tleSIsIm5ld0NoYWluIiwibmV3Q2hhaW5WYWx1ZSIsInZhbHVlUHJvZHVjZXIiLCJyZW1vdmVkS2V5IiwicmVtb3ZlZENoYWluIiwicmVzdWx0IiwiZXJyb3JzIiwiY2hpbGRWYWx1ZVByb2R1Y2VyIiwiY2hpbGRWYWx1ZSIsIkFnZ3JlZ2F0ZWRFcnJvciIsImNvbmN1cnJlbmN5TGltaXQiLCJvcyIsImNwdXMiLCJQcm9taXNlIiwiYWxsIiwiZGV0YWNoRnJvbVBhcmVudCIsIm5leHRFbWl0VG9Qcm9jZXNzIiwiY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQiLCJvbmNlIiwidGlt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QkFBTCxHQUErQixLQUFLRCxpQkFBTCxFQUEvQjtBQUNBLFVBQU0sS0FBS0MsdUJBQVg7QUFDQSxTQUFLQSx1QkFBTCxHQUErQmpELFNBQS9CO0FBQ0g7O0FBakR3Rjs7OztBQW9EN0YsU0FBU0ssS0FBVCxDQUFlOEMsT0FBZixFQUErQztBQUMzQyxTQUFPLElBQUlOLE9BQUosQ0FBa0JPLE9BQU8sSUFBSTtBQUNoQ0MsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDYkQsTUFBQUEsT0FBTztBQUNWLEtBRlMsRUFFUEQsT0FGTyxDQUFWO0FBR0gsR0FKTSxDQUFQO0FBS0g7O0FBRUQsU0FBUzlCLG9CQUFULENBQWlDRSxLQUFqQyxFQUEwRTtBQUN0RSxTQUFPQSxLQUFLLElBQUl2QixTQUFoQjtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5cbmltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBwTGltaXQgZnJvbSBcInAtbGltaXRcIjtcblxuaW1wb3J0IHsgUmVhc29uT3JFcnJvciB9IGZyb20gXCIuLi9FcnJvclVudHlwZWRcIjtcbmltcG9ydCB7IGl0ZXJhdGVWYWx1ZXMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vQ29tbW9uL0l0ZXJhYmxlVXRpbHNcIjtcbmltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9Db21tb24vVHlwaW5nVXRpbHNcIjtcblxuaW1wb3J0IHsgQWdncmVnYXRlZEVycm9yIH0gZnJvbSBcIi4vQWdncmVnYXRlZEVycm9yXCI7XG5pbXBvcnQgeyBEZXRhY2hMaXN0ZW5lciwgSVZhbHVlUHJvZHVjZXIsIFZhbHVlTGlzdGVuZXIgfSBmcm9tIFwiLi9CdWlsZFRhc2tcIjtcblxuYXN5bmMgZnVuY3Rpb24gbm9vcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBlbXB0eSBmdW5jdGlvblxufVxuXG5leHBvcnQgY2xhc3MgQ2hhaW5hYmxlVmFsdWVQcm9kdWNlcjxUPiBpbXBsZW1lbnRzIElWYWx1ZVByb2R1Y2VyPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yTGlzdGVuZXJzOiBBcnJheTxWYWx1ZUxpc3RlbmVyPEVycm9yPj4gPSBbXTtcblxuICAgIHB1YmxpYyBvbk5leHQoX2xpc3RlbmVyOiAobmV4dFZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+KTogRGV0YWNoTGlzdGVuZXIge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdEVycm9yXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkVycm9yKGxpc3RlbmVyOiAoZXJyb3I6IEVycm9yKSA9PiBQcm9taXNlPHZvaWQ+KTogRGV0YWNoTGlzdGVuZXIge1xuICAgICAgICB0aGlzLmVycm9yTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVycm9yTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yTGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybTxUTz4odHJhbnNmb3JtRnVuY3Rpb246IChpbnB1dDogVCkgPT4gUHJvbWlzZTxUTz4pOiBUcmFuc2Zvcm1WYWx1ZVByb2R1Y2VyPFQsIFRPPiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtVmFsdWVQcm9kdWNlcih0aGlzLCB0cmFuc2Zvcm1GdW5jdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGRvKGFjdGlvbjogKGlucHV0OiBUKSA9PiBQcm9taXNlPHZvaWQ+KTogRXhlY3V0ZU9uVmFsdWVQcm9kdWNlcjxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZU9uVmFsdWVQcm9kdWNlcih0aGlzLCBhY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGFpbldpdGg8VE8sIFRWUCBleHRlbmRzIElWYWx1ZVByb2R1Y2VyPFRPPj4obmV4dEl0ZW1GYWN0b3J5OiAocHJldkl0ZW06IElWYWx1ZVByb2R1Y2VyPFQ+KSA9PiBUVlApOiBUVlAge1xuICAgICAgICByZXR1cm4gbmV4dEl0ZW1GYWN0b3J5KHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhdHRhY2g8VEEsIFRPID0gVD4oXG4gICAgICAgIGF0dGFjaEZhY3Rvcnk6ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTxJVmFsdWVQcm9kdWNlcjxUQT4+LFxuICAgICAgICBqb2luVmFsdWVzPzogKG9yaWdpbmFsOiBULCBhdHRhY2hlZDogVEEpID0+IFByb21pc2U8VE8+LFxuICAgICAgICBldmFsdWF0ZUF0dGFjaEtleT86ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgKTogQXR0YWNoVmFsdWVQcm9kdWNlcjxULCBUQSwgVE8+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2hWYWx1ZVByb2R1Y2VyKHRoaXMsIGF0dGFjaEZhY3RvcnksIGpvaW5WYWx1ZXMsIGV2YWx1YXRlQXR0YWNoS2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWQoKTogU2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWRQcm9kdWNlcjxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWRQcm9kdWNlcih0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3BsaXRUb0NoYWluczxUSSwgVE8+KFxuICAgICAgICBzcGxpdEZ1bmN0aW9uOiAoaW5wdXQ6IFQpID0+IFRJW10sXG4gICAgICAgIGdldEtleTogKGlucHV0OiBUSSkgPT4gc3RyaW5nLFxuICAgICAgICBmYWN0b3J5OiAoaW5wdXQ6IFRJKSA9PiBJVmFsdWVQcm9kdWNlcjxUTz5cbiAgICApOiBTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcjxULCBUSSwgVE8+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcih0aGlzLCBzcGxpdEZ1bmN0aW9uLCBnZXRLZXksIGZhY3RvcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzcGxpdFRvUGFyYWxsZWxDaGFpbnM8VEksIFRPPihcbiAgICAgICAgc3BsaXRGdW5jdGlvbjogKGlucHV0OiBUKSA9PiBUSVtdLFxuICAgICAgICBnZXRLZXk6IChpbnB1dDogVEkpID0+IHN0cmluZyxcbiAgICAgICAgZmFjdG9yeTogKGlucHV0OiBUSSkgPT4gSVZhbHVlUHJvZHVjZXI8VE8+IHwgUHJvbWlzZTxJVmFsdWVQcm9kdWNlcjxUTz4+XG4gICAgKTogUGFyYWxsZWxTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcjxULCBUSSwgVE8+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbGxlbFNwbGl0VG9DaGFpbnNWYWx1ZVByb2R1Y2VyKHRoaXMsIHNwbGl0RnVuY3Rpb24sIGdldEtleSwgZmFjdG9yeSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9ic2VydmUobGlzdGVuZXI6IFZhbHVlTGlzdGVuZXI8VD4gPSBub29wKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmVnaW5PYnNlcnZlKCk7XG4gICAgICAgIGF3YWl0IGxpc3RlbmVyKGF3YWl0IHRoaXMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgY29uc3QgZGV0YWNoTGlzdGVuZXIgPSB0aGlzLm9uTmV4dChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcigpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmRPYnNlcnZlKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJlZ2luT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBhc3luYyBlbWl0RXJyb3IoZXJyb3I6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBlcnJvck9iamVjdCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihgJHtlcnJvcn1gKTtcbiAgICAgICAgZm9yIChjb25zdCBlcnJvckxpc3RlbmVyIG9mIHRoaXMuZXJyb3JMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGVycm9yTGlzdGVuZXIoZXJyb3JPYmplY3QpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT2JzZXJ2YWJsZVZhbHVlUHJvZHVjZXJCYXNlPFQ+IGV4dGVuZHMgQ2hhaW5hYmxlVmFsdWVQcm9kdWNlcjxUPiB7XG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTxWYWx1ZUxpc3RlbmVyPFQ+PiA9IFtdO1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldEN1cnJlbnRWYWx1ZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZ2luTGlzdGVuaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuZE9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcExpc3RlbmluZygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBiZWdpbkxpc3RlbmluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgc3RvcExpc3RlbmluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZW1pdFVwZGF0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeUFsbExpc3RlbmVyc0FuZFdhaXRGb3JDb21wbGV0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dChsaXN0ZW5lcjogKG5leHRWYWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbm90aWZ5QWxsTGlzdGVuZXJzQW5kV2FpdEZvckNvbXBsZXRlKG5leHRWYWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBsaXN0ZW5lcihuZXh0VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXR0YWNoVmFsdWVQcm9kdWNlcjxUSSwgVEEsIFRPPiBleHRlbmRzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VE8+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VEk+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXR0YWNoRmFjdG9yeTogKHZhbHVlOiBUSSkgPT4gUHJvbWlzZTxJVmFsdWVQcm9kdWNlcjxUQT4+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgam9pblZhbHVlczogKG9yaWdpbmFsOiBUSSwgYXR0YWNoZWQ6IFRBKSA9PiBQcm9taXNlPFRPPjtcbiAgICBwcml2YXRlIGxhc3RBdHRhY2hLZXk/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBhdHRhY2hlZFByb2R1Y2VyPzogSVZhbHVlUHJvZHVjZXI8VEE+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZhbHVhdGVBdHRhY2hLZXk6ICh2YWx1ZTogVEkpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8VmFsdWVMaXN0ZW5lcjxUTz4+ID0gW107XG4gICAgcHJpdmF0ZSBkZXRhY2hQYXJlbnRMaXN0ZW5lcj86IERldGFjaExpc3RlbmVyO1xuICAgIHByaXZhdGUgZGV0YWNoQXR0YWNoZWRMaXN0ZW5lcj86IERldGFjaExpc3RlbmVyO1xuICAgIHByaXZhdGUgbGFzdEF0dGFjaGVkVmFsdWU/OiBUQTtcbiAgICBwcml2YXRlIGxhc3RQYXJlbnRWYWx1ZT86IFRJO1xuICAgIHByaXZhdGUgYXdhaXRpbmdMYXN0QXR0YWNoZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNJbk9ic2VydmVTdGF0ZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFRJPixcbiAgICAgICAgYXR0YWNoRmFjdG9yeTogKHZhbHVlOiBUSSkgPT4gUHJvbWlzZTxJVmFsdWVQcm9kdWNlcjxUQT4+LFxuICAgICAgICBqb2luVmFsdWVzPzogKG9yaWdpbmFsOiBUSSwgYXR0YWNoZWQ6IFRBKSA9PiBQcm9taXNlPFRPPixcbiAgICAgICAgZXZhbHVhdGVBdHRhY2hLZXk/OiAodmFsdWU6IFRJKSA9PiBQcm9taXNlPHN0cmluZz5cbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYXR0YWNoRmFjdG9yeSA9IGF0dGFjaEZhY3Rvcnk7XG4gICAgICAgIC8vINCvINC90LUg0LzQvtCz0YMg0L/QvtCx0LXQtNC40YLRjCDRgtC40L/QuNC30LDRhtC40Y4g0LIg0Y3RgtC+0Lwg0LzQtdGB0YLQtSwg0YHQu9C40YjQutC+0Lwg0LzQvdC+0LPQviDRgyDQvNC10L3RjyDQutC+0LTQsCDQv9C+0LvRg9GH0LDQtdGC0YHRj1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXMgfHwgKGFzeW5jIHggPT4geCk7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVBdHRhY2hLZXkgPSBldmFsdWF0ZUF0dGFjaEtleSB8fCAoYXN5bmMgKCkgPT4gXCJTVEFUSUMtQVRUQUNILUtFWVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmlzSW5PYnNlcnZlU3RhdGUgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmVuZE9ic2VydmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzSW5PYnNlcnZlU3RhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBQcm9taXNlPFRPPiB7XG4gICAgICAgIGNvbnN0IGdldEN1cnJlbnRWYWx1ZSA9IGFzeW5jICgpOiBQcm9taXNlPFRPPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRWYWx1ZSA9IGF3YWl0IHRoaXMucGFyZW50LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubGFzdFBhcmVudFZhbHVlID0gcGFyZW50VmFsdWU7XG4gICAgICAgICAgICBjb25zdCBhdHRhY2hLZXkgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQXR0YWNoS2V5KHBhcmVudFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaGVkUHJvZHVjZXIgIT0gdW5kZWZpbmVkICYmIHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPSB0aGlzLmF0dGFjaGVkUHJvZHVjZXIub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0QXR0YWNoS2V5ID09IHVuZGVmaW5lZCB8fCB0aGlzLmxhc3RBdHRhY2hLZXkgIT09IGF0dGFjaEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEF0dGFjaEtleSA9IGF0dGFjaEtleTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciAhPSB1bmRlZmluZWQgJiYgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXR0YWNoZWRQcm9kdWNlci5lbmRPYnNlcnZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNoZWRQcm9kdWNlciA9IGF3YWl0IHRoaXMuYXR0YWNoRmFjdG9yeShwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbk9ic2VydmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuYmVnaW5PYnNlcnZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lciA9IHRoaXMuYXR0YWNoZWRQcm9kdWNlci5vbk5leHQodGhpcy5oYW5kbGVDaGFuZ2VBdHRhY2hlZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaGVkUHJvZHVjZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZFByb2dyYW1TdGF0ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaGVkVmFsdWUgPSBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5sYXN0QXR0YWNoZWRWYWx1ZSA9IGF0dGFjaGVkVmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5qb2luVmFsdWVzKHBhcmVudFZhbHVlLCBhdHRhY2hlZFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TmV4dFZhbHVlKHZhbHVlOiBUTyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBsaXN0ZW5lcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25OZXh0KGxpc3RlbmVyOiAobmV4dFZhbHVlOiBUTykgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoUGFyZW50TGlzdGVuZXIgPSB0aGlzLnBhcmVudC5vbk5leHQodGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyICE9IHVuZGVmaW5lZCAmJiB0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoUGFyZW50TGlzdGVuZXIgPSB0aGlzLmF0dGFjaGVkUHJvZHVjZXIub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWNoUGFyZW50TGlzdGVuZXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoUGFyZW50TGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSA9IGFzeW5jIChhdHRhY2hlZFZhbHVlOiBUQSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0aGlzLmxhc3RBdHRhY2hlZFZhbHVlID0gYXR0YWNoZWRWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RQYXJlbnRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkUHJvZ3JhbVN0YXRlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TmV4dFZhbHVlKGF3YWl0IHRoaXMuam9pblZhbHVlcyh0aGlzLmxhc3RQYXJlbnRWYWx1ZSwgYXR0YWNoZWRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2hhbmdlUGFyZW50VmFsdWUgPSBhc3luYyAocGFyZW50VmFsdWU6IFRJKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRoaXMubGFzdFBhcmVudFZhbHVlID0gcGFyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IGF0dGFjaEtleSA9IGF3YWl0IHRoaXMuZXZhbHVhdGVBdHRhY2hLZXkocGFyZW50VmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyICE9IHVuZGVmaW5lZCAmJiB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPSB0aGlzLmF0dGFjaGVkUHJvZHVjZXIub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGFzdEF0dGFjaEtleSA9PSB1bmRlZmluZWQgfHwgdGhpcy5sYXN0QXR0YWNoS2V5ICE9PSBhdHRhY2hLZXkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEF0dGFjaEtleSA9IGF0dGFjaEtleTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdHRhY2hlZFByb2R1Y2VyID0gYXdhaXQgdGhpcy5hdHRhY2hGYWN0b3J5KHBhcmVudFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuYmVnaW5PYnNlcnZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPSB0aGlzLmF0dGFjaGVkUHJvZHVjZXIub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWRQcm9ncmFtU3RhdGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0YHRgtC+INC90LXQvNC90L7Qs9C+INC+0LHQvtC20LTQtdC8LCDQstC00YDRg9CzINC/0YDQuNC00ZHRgiDQtNGA0YPQs9C+0LUgYXR0YWNoZWRWYWx1ZVxuICAgICAgICB0aGlzLmF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUgPSB0cnVlO1xuICAgICAgICBhd2FpdCBkZWxheSg3MDApO1xuICAgICAgICB0aGlzLmF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGF0dGFjaGVkVmFsdWUgPSB0aGlzLmxhc3RBdHRhY2hlZFZhbHVlO1xuICAgICAgICBpZiAoYXR0YWNoZWRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF0dGFjaGVkVmFsdWUgPSBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdE5leHRWYWx1ZShhd2FpdCB0aGlzLmpvaW5WYWx1ZXMocGFyZW50VmFsdWUsIGF0dGFjaGVkVmFsdWUpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZU9uVmFsdWVQcm9kdWNlcjxUPiBleHRlbmRzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD4sIGFjdGlvbjogKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBnZXRDdXJyZW50VmFsdWUgPSBhc3luYyAoKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMucGFyZW50LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk5leHQobGlzdGVuZXI6IChuZXh0VmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4pOiBEZXRhY2hMaXN0ZW5lciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5vbk5leHQoYXN5bmMgcGFyZW50VmFsdWUgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBsaXN0ZW5lcih2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtVmFsdWVQcm9kdWNlcjxUSSwgVE8+IGV4dGVuZHMgQ2hhaW5hYmxlVmFsdWVQcm9kdWNlcjxUTz4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUST47XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2Zvcm1GdW5jdGlvbjogKHZhbHVlOiBUSSkgPT4gUHJvbWlzZTxUTz47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUST4sIHRyYW5zZm9ybUZ1bmN0aW9uOiAodmFsdWU6IFRJKSA9PiBQcm9taXNlPFRPPikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1GdW5jdGlvbiA9IHRyYW5zZm9ybUZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBiZWdpbk9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmJlZ2luT2JzZXJ2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmRPYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5lbmRPYnNlcnZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUTz4ge1xuICAgICAgICBjb25zdCBnZXRDdXJyZW50VmFsdWUgPSBhc3luYyAoKTogUHJvbWlzZTxUTz4gPT4gdGhpcy50cmFuc2Zvcm1GdW5jdGlvbihhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWUpO1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dChsaXN0ZW5lcjogKG5leHRWYWx1ZTogVE8pID0+IFByb21pc2U8dm9pZD4pOiBEZXRhY2hMaXN0ZW5lciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5vbk5leHQoYXN5bmMgcGFyZW50VmFsdWUgPT4ge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIoYXdhaXQgdGhpcy50cmFuc2Zvcm1GdW5jdGlvbihwYXJlbnRWYWx1ZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcjxULCBUSSwgVE8+IGV4dGVuZHMgQ2hhaW5hYmxlVmFsdWVQcm9kdWNlcjxUT1tdPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3BsaXRGdW5jdGlvbjogKGlucHV0OiBUKSA9PiBUSVtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2V0S2V5OiAoaW5wdXQ6IFRJKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3J5OiAoaW5wdXQ6IFRJKSA9PiBJVmFsdWVQcm9kdWNlcjxUTz47XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PFZhbHVlTGlzdGVuZXI8VE9bXT4+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFpbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXToge1xuICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogSVZhbHVlUHJvZHVjZXI8VE8+O1xuICAgICAgICAgICAgbGFzdFZhbHVlOiB1bmRlZmluZWQgfCBUTztcbiAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBEZXRhY2hMaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICB9ID0ge307XG4gICAgcHJpdmF0ZSBpc0luT2JzZXJ2ZVN0YXRlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD4sXG4gICAgICAgIHNwbGl0RnVuY3Rpb246IChpbnB1dDogVCkgPT4gVElbXSxcbiAgICAgICAgZ2V0S2V5OiAoaW5wdXQ6IFRJKSA9PiBzdHJpbmcsXG4gICAgICAgIGZhY3Rvcnk6IChpbnB1dDogVEkpID0+IElWYWx1ZVByb2R1Y2VyPFRPPlxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5zcGxpdEZ1bmN0aW9uID0gc3BsaXRGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5nZXRLZXkgPSBnZXRLZXk7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgICAgIHRoaXMucGFyZW50Lm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZVBhcmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUT1tdPiB7XG4gICAgICAgIGNvbnN0IGdldEN1cnJlbnRWYWx1ZSA9IGFzeW5jICgpOiBQcm9taXNlPFRPW10+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuc3BsaXRGdW5jdGlvbihhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBUT1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IFJlYXNvbk9yRXJyb3JbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFZhbHVlUHJvZHVjZXIgPSB0aGlzLmZhY3RvcnkodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2hpbGRWYWx1ZVByb2R1Y2VyLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFZhbHVlID0gYXdhaXQgY2hpbGRWYWx1ZVByb2R1Y2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogY2hpbGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IGNoaWxkVmFsdWVQcm9kdWNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBjaGlsZFZhbHVlUHJvZHVjZXIub25OZXh0KHggPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbih4LCBrZXkpKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogY2hpbGRWYWx1ZVByb2R1Y2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IGNoaWxkVmFsdWVQcm9kdWNlci5vbk5leHQoeCA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudENoYWluKHgsIGtleSkpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZWRFcnJvcihcIlRoZXJlIGFyZSBlcnJvcnNcIiwgLi4uZXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmlzSW5PYnNlcnZlU3RhdGUgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhdGVWYWx1ZXModGhpcy5jaGFpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB2YWx1ZS52YWx1ZVByb2R1Y2VyLmVuZE9ic2VydmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzSW5PYnNlcnZlU3RhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25OZXh0KGxpc3RlbmVyOiAobmV4dFZhbHVlOiBUT1tdKSA9PiBQcm9taXNlPHZvaWQ+KTogRGV0YWNoTGlzdGVuZXIge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbWl0VmFsdWUodmFsdWU6IFRPW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b01hcCh2YWx1ZXM6IFRJW10pOiB7IFtrZXk6IHN0cmluZ106IFRJIH0ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogVEkgfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgcmVzdWx0W3RoaXMuZ2V0S2V5KHZhbHVlKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4gPSBhc3luYyAobmV4dFZhbHVlOiBUTywga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgY2hhaW5WYWx1ZSA9IHRoaXMuY2hhaW5zW2tleV07XG4gICAgICAgIGlmIChjaGFpblZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2hhaW5WYWx1ZS5sYXN0VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0VmFsdWUoXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuY2hhaW5zKVxuICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB4Lmxhc3RWYWx1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTm90TnVsbE9yVW5kZWZpbmVkKVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNoYW5nZVBhcmVudCA9IGFzeW5jIChpbnB1dDogVCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnNwbGl0RnVuY3Rpb24oaW5wdXQpO1xuICAgICAgICBjb25zdCBuZXh0VmFsdWVzTWFwID0gdGhpcy50b01hcCh2YWx1ZXMpO1xuXG4gICAgICAgIGNvbnN0IG5ld0tleXMgPSBfLmRpZmZlcmVuY2UoT2JqZWN0LmtleXMobmV4dFZhbHVlc01hcCksIE9iamVjdC5rZXlzKHRoaXMuY2hhaW5zKSk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRLZXlzID0gXy5kaWZmZXJlbmNlKE9iamVjdC5rZXlzKHRoaXMuY2hhaW5zKSwgT2JqZWN0LmtleXMobmV4dFZhbHVlc01hcCkpO1xuICAgICAgICBmb3IgKGNvbnN0IG5ld0tleSBvZiBuZXdLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdDaGFpbiA9IHRoaXMuZmFjdG9yeShuZXh0VmFsdWVzTWFwW25ld0tleV0gPz8gcmVqZWN0KCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbk9ic2VydmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ld0NoYWluLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDaGFpblZhbHVlID0gYXdhaXQgbmV3Q2hhaW4uY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW25ld0tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogbmV3Q2hhaW5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogbmV3Q2hhaW4sXG4gICAgICAgICAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBuZXdDaGFpbi5vbk5leHQobmV4dFZhbHVlID0+IHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4obmV4dFZhbHVlLCBuZXdLZXkpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNbbmV3S2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IG5ld0NoYWluLFxuICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogbmV3Q2hhaW4ub25OZXh0KG5leHRWYWx1ZSA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudENoYWluKG5leHRWYWx1ZSwgbmV3S2V5KSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJlbW92ZWRLZXkgb2YgcmVtb3ZlZEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRDaGFpbiA9IHRoaXMuY2hhaW5zW3JlbW92ZWRLZXldO1xuICAgICAgICAgICAgcmVtb3ZlZENoYWluPy5kZXRhY2hMaXN0ZW5lcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbk9ic2VydmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZWRDaGFpbj8udmFsdWVQcm9kdWNlci5lbmRPYnNlcnZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDQryDQvdC1INC30L3QsNGOLCDQutCw0Log0YLRg9GCINC/0YDQsNCy0LjQu9GM0L3QvlxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jaGFpbnNbcmVtb3ZlZEtleV07XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0VmFsdWUoXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuY2hhaW5zKVxuICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB4Lmxhc3RWYWx1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGlzTm90TnVsbE9yVW5kZWZpbmVkKVxuICAgICAgICApO1xuICAgIH07XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJhbGxlbFNwbGl0VG9DaGFpbnNWYWx1ZVByb2R1Y2VyPFQsIFRJLCBUTz4gZXh0ZW5kcyBDaGFpbmFibGVWYWx1ZVByb2R1Y2VyPFRPW10+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBzcGxpdEZ1bmN0aW9uOiAoaW5wdXQ6IFQpID0+IFRJW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBnZXRLZXk6IChpbnB1dDogVEkpID0+IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZhY3Rvcnk6IChpbnB1dDogVEkpID0+IElWYWx1ZVByb2R1Y2VyPFRPPiB8IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VE8+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8VmFsdWVMaXN0ZW5lcjxUT1tdPj4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYWluczoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBJVmFsdWVQcm9kdWNlcjxUTz47XG4gICAgICAgICAgICBsYXN0VmFsdWU6IHVuZGVmaW5lZCB8IFRPO1xuICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IERldGFjaExpc3RlbmVyO1xuICAgICAgICB9O1xuICAgIH0gPSB7fTtcbiAgICBwcml2YXRlIGlzSW5PYnNlcnZlU3RhdGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUPixcbiAgICAgICAgc3BsaXRGdW5jdGlvbjogKGlucHV0OiBUKSA9PiBUSVtdLFxuICAgICAgICBnZXRLZXk6IChpbnB1dDogVEkpID0+IHN0cmluZyxcbiAgICAgICAgZmFjdG9yeTogKGlucHV0OiBUSSkgPT4gSVZhbHVlUHJvZHVjZXI8VE8+IHwgUHJvbWlzZTxJVmFsdWVQcm9kdWNlcjxUTz4+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLnNwbGl0RnVuY3Rpb24gPSBzcGxpdEZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgdGhpcy5wYXJlbnQub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBQcm9taXNlPFRPW10+IHtcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudFZhbHVlID0gYXN5bmMgKCk6IFByb21pc2U8VE9bXT4gPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5zcGxpdEZ1bmN0aW9uKGF3YWl0IHRoaXMucGFyZW50LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFRPW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yczogUmVhc29uT3JFcnJvcltdID0gW107XG4gICAgICAgICAgICBjb25zdCBjb25jdXJyZW5jeUxpbWl0ID0gcExpbWl0KG9zLmNwdXMoKS5sZW5ndGgpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgdmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeUxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkVmFsdWVQcm9kdWNlciA9IGF3YWl0IHRoaXMuZmFjdG9yeSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2hpbGRWYWx1ZVByb2R1Y2VyLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFZhbHVlID0gYXdhaXQgY2hpbGRWYWx1ZVByb2R1Y2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gY2hpbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlOiBjaGlsZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBjaGlsZFZhbHVlUHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBjaGlsZFZhbHVlUHJvZHVjZXIub25OZXh0KHggPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbih4LCBrZXkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYWluc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogY2hpbGRWYWx1ZVByb2R1Y2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogY2hpbGRWYWx1ZVByb2R1Y2VyLm9uTmV4dCh4ID0+IHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4oeCwga2V5KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlZEVycm9yKFwiVGhlcmUgYXJlIGVycm9yc1wiLCAuLi5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBiZWdpbk9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaXNJbk9ic2VydmVTdGF0ZSA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmJlZ2luT2JzZXJ2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmRPYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5lbmRPYnNlcnZlKCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY2hhaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFpbnNba2V5XT8udmFsdWVQcm9kdWNlci5lbmRPYnNlcnZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dChsaXN0ZW5lcjogKG5leHRWYWx1ZTogVE9bXSkgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZW1pdFZhbHVlKHZhbHVlOiBUT1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdG9NYXAodmFsdWVzOiBUSVtdKTogeyBba2V5OiBzdHJpbmddOiBUSSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IFRJIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdFt0aGlzLmdldEtleSh2YWx1ZSldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNoYW5nZVBhcmVudENoYWluID0gYXN5bmMgKG5leHRWYWx1ZTogVE8sIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWluVmFsdWUgPSB0aGlzLmNoYWluc1trZXldO1xuICAgICAgICBpZiAoY2hhaW5WYWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoYWluVmFsdWUubGFzdFZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdFZhbHVlKFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNoYWlucylcbiAgICAgICAgICAgICAgICAubWFwKHggPT4geC5sYXN0VmFsdWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZClcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDaGFuZ2VQYXJlbnQgPSBhc3luYyAoaW5wdXQ6IFQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5zcGxpdEZ1bmN0aW9uKGlucHV0KTtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlc01hcCA9IHRoaXMudG9NYXAodmFsdWVzKTtcblxuICAgICAgICBjb25zdCBuZXdLZXlzID0gXy5kaWZmZXJlbmNlKE9iamVjdC5rZXlzKG5leHRWYWx1ZXNNYXApLCBPYmplY3Qua2V5cyh0aGlzLmNoYWlucykpO1xuICAgICAgICBjb25zdCByZW1vdmVkS2V5cyA9IF8uZGlmZmVyZW5jZShPYmplY3Qua2V5cyh0aGlzLmNoYWlucyksIE9iamVjdC5rZXlzKG5leHRWYWx1ZXNNYXApKTtcbiAgICAgICAgZm9yIChjb25zdCBuZXdLZXkgb2YgbmV3S2V5cykge1xuICAgICAgICAgICAgY29uc3QgbmV3Q2hhaW4gPSBhd2FpdCB0aGlzLmZhY3RvcnkobmV4dFZhbHVlc01hcFtuZXdLZXldID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXdDaGFpbi5iZWdpbk9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2hhaW5WYWx1ZSA9IGF3YWl0IG5ld0NoYWluLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWluc1tuZXdLZXldID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IG5ld0NoYWluVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IG5ld0NoYWluLFxuICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogbmV3Q2hhaW4ub25OZXh0KG5leHRWYWx1ZSA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudENoYWluKG5leHRWYWx1ZSwgbmV3S2V5KSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW25ld0tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBuZXdDaGFpbixcbiAgICAgICAgICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IG5ld0NoYWluLm9uTmV4dChuZXh0VmFsdWUgPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbihuZXh0VmFsdWUsIG5ld0tleSkpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZW1vdmVkS2V5IG9mIHJlbW92ZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2hhaW4gPSB0aGlzLmNoYWluc1tyZW1vdmVkS2V5XTtcbiAgICAgICAgICAgIHJlbW92ZWRDaGFpbj8uZGV0YWNoTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVkQ2hhaW4/LnZhbHVlUHJvZHVjZXIuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g0K8g0L3QtSDQt9C90LDRjiwg0LrQsNC6INGC0YPRgiDQv9GA0LDQstC40LvRjNC90L5cbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1keW5hbWljLWRlbGV0ZVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hhaW5zW3JlbW92ZWRLZXldO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdFZhbHVlKFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNoYWlucylcbiAgICAgICAgICAgICAgICAubWFwKHggPT4geC5sYXN0VmFsdWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZClcbiAgICAgICAgKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgU2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWRQcm9kdWNlcjxUPiBleHRlbmRzIE9ic2VydmFibGVWYWx1ZVByb2R1Y2VyQmFzZTxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+O1xuICAgIHByaXZhdGUgZGV0YWNoRnJvbVBhcmVudD86IERldGFjaExpc3RlbmVyO1xuICAgIHByaXZhdGUgbGFzdFBhcmVudFZhbHVlPzogVDtcblxuICAgIHByaXZhdGUgbmV4dEVtaXRUb1Byb2Nlc3M/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIHByaXZhdGUgY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQ/OiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldEN1cnJlbnRWYWx1ZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMubGFzdFBhcmVudFZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdCA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UGFyZW50VmFsdWUgPSBhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYXN0UGFyZW50VmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkUHJvZ3JhbVN0YXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RQYXJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVnaW5MaXN0ZW5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICBpZiAodGhpcy5kZXRhY2hGcm9tUGFyZW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hGcm9tUGFyZW50ID0gdGhpcy5wYXJlbnQub25OZXh0KG5leHRWYWx1ZSA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudFZhbHVlKG5leHRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHN0b3BMaXN0ZW5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRldGFjaEZyb21QYXJlbnQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaEZyb21QYXJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5lbmRPYnNlcnZlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDaGFuZ2VQYXJlbnRWYWx1ZShuZXh0VmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5sYXN0UGFyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICAgIHRoaXMubmV4dEVtaXRUb1Byb2Nlc3MgPSBfLm9uY2UoKCkgPT4gdGhpcy5lbWl0VXBkYXRlKG5leHRWYWx1ZSkpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdCA9IHRoaXMubmV4dEVtaXRUb1Byb2Nlc3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdDtcbiAgICAgICAgdGhpcy5jdXJyZW50bHlQcm9jZXNzaW5nRW1pdCA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlbGF5KHRpbWVvdXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpc05vdE51bGxPclVuZGVmaW5lZDxUPihpbnB1dDogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBpbnB1dCBpcyBUIHtcbiAgICByZXR1cm4gaW5wdXQgIT0gdW5kZWZpbmVkO1xufVxuIl19
667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9sb2Rhc2giLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3BMaW1pdCIsIl9JdGVyYWJsZVV0aWxzIiwiX1R5cGluZ1V0aWxzIiwiX0FnZ3JlZ2F0ZWRFcnJvciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJub29wIiwiQ2hhaW5hYmxlVmFsdWVQcm9kdWNlciIsImNvbnN0cnVjdG9yIiwiZXJyb3JMaXN0ZW5lcnMiLCJvbk5leHQiLCJfbGlzdGVuZXIiLCJFcnJvciIsIm9uRXJyb3IiLCJsaXN0ZW5lciIsInB1c2giLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJjdXJyZW50VmFsdWUiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1GdW5jdGlvbiIsIlRyYW5zZm9ybVZhbHVlUHJvZHVjZXIiLCJkbyIsImFjdGlvbiIsIkV4ZWN1dGVPblZhbHVlUHJvZHVjZXIiLCJjaGFpbldpdGgiLCJuZXh0SXRlbUZhY3RvcnkiLCJhdHRhY2giLCJhdHRhY2hGYWN0b3J5Iiwiam9pblZhbHVlcyIsImV2YWx1YXRlQXR0YWNoS2V5IiwiQXR0YWNoVmFsdWVQcm9kdWNlciIsInNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkIiwiU2tpcFVwZGF0ZXNVbnRpbE5leHRDb21wbGV0ZWRQcm9kdWNlciIsInNwbGl0VG9DaGFpbnMiLCJzcGxpdEZ1bmN0aW9uIiwiZ2V0S2V5IiwiZmFjdG9yeSIsIlNwbGl0VG9DaGFpbnNWYWx1ZVByb2R1Y2VyIiwic3BsaXRUb1BhcmFsbGVsQ2hhaW5zIiwiUGFyYWxsZWxTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlciIsIm9ic2VydmUiLCJiZWdpbk9ic2VydmUiLCJkZXRhY2hMaXN0ZW5lciIsImVuZE9ic2VydmUiLCJlbWl0RXJyb3IiLCJlcnJvciIsImVycm9yT2JqZWN0IiwiZXJyb3JMaXN0ZW5lciIsImV4cG9ydHMiLCJPYnNlcnZhYmxlVmFsdWVQcm9kdWNlckJhc2UiLCJhcmdzIiwibGlzdGVuZXJzIiwiZ2V0Q3VycmVudFZhbHVlIiwiYmVnaW5MaXN0ZW5pbmciLCJzdG9wTGlzdGVuaW5nIiwiZW1pdFVwZGF0ZSIsInZhbHVlIiwibm90aWZ5QWxsTGlzdGVuZXJzQW5kV2FpdEZvckNvbXBsZXRlIiwibmV4dFZhbHVlIiwicGFyZW50IiwibGFzdEF0dGFjaEtleSIsImF0dGFjaGVkUHJvZHVjZXIiLCJkZXRhY2hQYXJlbnRMaXN0ZW5lciIsImRldGFjaEF0dGFjaGVkTGlzdGVuZXIiLCJsYXN0QXR0YWNoZWRWYWx1ZSIsImxhc3RQYXJlbnRWYWx1ZSIsImF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUiLCJpc0luT2JzZXJ2ZVN0YXRlIiwiaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSIsImF0dGFjaGVkVmFsdWUiLCJ1bmRlZmluZWQiLCJlbWl0TmV4dFZhbHVlIiwiaGFuZGxlQ2hhbmdlUGFyZW50VmFsdWUiLCJwYXJlbnRWYWx1ZSIsImF0dGFjaEtleSIsImRlbGF5IiwieCIsImxlbmd0aCIsImUiLCJjb25zb2xlIiwibG9nIiwiY2hhaW5zIiwiaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4iLCJjaGFpblZhbHVlIiwibGFzdFZhbHVlIiwiZW1pdFZhbHVlIiwidmFsdWVzIiwibWFwIiwiZmlsdGVyIiwiaXNOb3ROdWxsT3JVbmRlZmluZWQiLCJoYW5kbGVDaGFuZ2VQYXJlbnQiLCJpbnB1dCIsIm5leHRWYWx1ZXNNYXAiLCJ0b01hcCIsIm5ld0tleXMiLCJfIiwiZGlmZmVyZW5jZSIsImtleXMiLCJyZW1vdmVkS2V5cyIsIm5ld0tleSIsIl9uZXh0VmFsdWVzTWFwJG5ld0tleSIsIm5ld0NoYWluIiwicmVqZWN0IiwibmV3Q2hhaW5WYWx1ZSIsInZhbHVlUHJvZHVjZXIiLCJyZW1vdmVkS2V5IiwicmVtb3ZlZENoYWluIiwicmVzdWx0IiwiZXJyb3JzIiwiY2hpbGRWYWx1ZVByb2R1Y2VyIiwiY2hpbGRWYWx1ZSIsIkFnZ3JlZ2F0ZWRFcnJvciIsIml0ZXJhdGVWYWx1ZXMiLCJfbmV4dFZhbHVlc01hcCRuZXdLZXkyIiwiY29uY3VycmVuY3lMaW1pdCIsInBMaW1pdCIsImNwdXMiLCJQcm9taXNlIiwiYWxsIiwiX3RoaXMkY2hhaW5zJGtleSIsImRldGFjaEZyb21QYXJlbnQiLCJuZXh0RW1pdFRvUHJvY2VzcyIsImN1cnJlbnRseVByb2Nlc3NpbmdFbWl0Iiwib25jZSIsInRpbWVvdXQiLCJyZXNvbHZlIiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9Db21tb25zL1Rhc2tzQ29yZS9DaGFpbmFibGVWYWx1ZVByb2R1Y2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuXG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgcExpbWl0IGZyb20gXCJwLWxpbWl0XCI7XG5cbmltcG9ydCB7IFJlYXNvbk9yRXJyb3IgfSBmcm9tIFwiLi4vRXJyb3JVbnR5cGVkXCI7XG5pbXBvcnQgeyBpdGVyYXRlVmFsdWVzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyByZWplY3QgfSBmcm9tIFwiLi4vLi4vLi4vLi4vQ29tbW9uL1R5cGluZ1V0aWxzXCI7XG5cbmltcG9ydCB7IEFnZ3JlZ2F0ZWRFcnJvciB9IGZyb20gXCIuL0FnZ3JlZ2F0ZWRFcnJvclwiO1xuaW1wb3J0IHsgRGV0YWNoTGlzdGVuZXIsIElWYWx1ZVByb2R1Y2VyLCBWYWx1ZUxpc3RlbmVyIH0gZnJvbSBcIi4vQnVpbGRUYXNrXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIG5vb3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gZW1wdHkgZnVuY3Rpb25cbn1cblxuZXhwb3J0IGNsYXNzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VD4gaW1wbGVtZW50cyBJVmFsdWVQcm9kdWNlcjxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvckxpc3RlbmVyczogQXJyYXk8VmFsdWVMaXN0ZW5lcjxFcnJvcj4+ID0gW107XG5cbiAgICBwdWJsaWMgb25OZXh0KF9saXN0ZW5lcjogKG5leHRWYWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3RFcnJvclwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25FcnJvcihsaXN0ZW5lcjogKGVycm9yOiBFcnJvcikgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhpcy5lcnJvckxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lcnJvckxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdEVycm9yXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2Zvcm08VE8+KHRyYW5zZm9ybUZ1bmN0aW9uOiAoaW5wdXQ6IFQpID0+IFByb21pc2U8VE8+KTogVHJhbnNmb3JtVmFsdWVQcm9kdWNlcjxULCBUTz4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybVZhbHVlUHJvZHVjZXIodGhpcywgdHJhbnNmb3JtRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkbyhhY3Rpb246IChpbnB1dDogVCkgPT4gUHJvbWlzZTx2b2lkPik6IEV4ZWN1dGVPblZhbHVlUHJvZHVjZXI8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGVPblZhbHVlUHJvZHVjZXIodGhpcywgYWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhaW5XaXRoPFRPLCBUVlAgZXh0ZW5kcyBJVmFsdWVQcm9kdWNlcjxUTz4+KG5leHRJdGVtRmFjdG9yeTogKHByZXZJdGVtOiBJVmFsdWVQcm9kdWNlcjxUPikgPT4gVFZQKTogVFZQIHtcbiAgICAgICAgcmV0dXJuIG5leHRJdGVtRmFjdG9yeSh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXR0YWNoPFRBLCBUTyA9IFQ+KFxuICAgICAgICBhdHRhY2hGYWN0b3J5OiAodmFsdWU6IFQpID0+IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VEE+PixcbiAgICAgICAgam9pblZhbHVlcz86IChvcmlnaW5hbDogVCwgYXR0YWNoZWQ6IFRBKSA9PiBQcm9taXNlPFRPPixcbiAgICAgICAgZXZhbHVhdGVBdHRhY2hLZXk/OiAodmFsdWU6IFQpID0+IFByb21pc2U8c3RyaW5nPlxuICAgICk6IEF0dGFjaFZhbHVlUHJvZHVjZXI8VCwgVEEsIFRPPiB7XG4gICAgICAgIHJldHVybiBuZXcgQXR0YWNoVmFsdWVQcm9kdWNlcih0aGlzLCBhdHRhY2hGYWN0b3J5LCBqb2luVmFsdWVzLCBldmFsdWF0ZUF0dGFjaEtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkKCk6IFNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkUHJvZHVjZXI8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkUHJvZHVjZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNwbGl0VG9DaGFpbnM8VEksIFRPPihcbiAgICAgICAgc3BsaXRGdW5jdGlvbjogKGlucHV0OiBUKSA9PiBUSVtdLFxuICAgICAgICBnZXRLZXk6IChpbnB1dDogVEkpID0+IHN0cmluZyxcbiAgICAgICAgZmFjdG9yeTogKGlucHV0OiBUSSkgPT4gSVZhbHVlUHJvZHVjZXI8VE8+XG4gICAgKTogU3BsaXRUb0NoYWluc1ZhbHVlUHJvZHVjZXI8VCwgVEksIFRPPiB7XG4gICAgICAgIHJldHVybiBuZXcgU3BsaXRUb0NoYWluc1ZhbHVlUHJvZHVjZXIodGhpcywgc3BsaXRGdW5jdGlvbiwgZ2V0S2V5LCBmYWN0b3J5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3BsaXRUb1BhcmFsbGVsQ2hhaW5zPFRJLCBUTz4oXG4gICAgICAgIHNwbGl0RnVuY3Rpb246IChpbnB1dDogVCkgPT4gVElbXSxcbiAgICAgICAgZ2V0S2V5OiAoaW5wdXQ6IFRJKSA9PiBzdHJpbmcsXG4gICAgICAgIGZhY3Rvcnk6IChpbnB1dDogVEkpID0+IElWYWx1ZVByb2R1Y2VyPFRPPiB8IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VE8+PlxuICAgICk6IFBhcmFsbGVsU3BsaXRUb0NoYWluc1ZhbHVlUHJvZHVjZXI8VCwgVEksIFRPPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYWxsZWxTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcih0aGlzLCBzcGxpdEZ1bmN0aW9uLCBnZXRLZXksIGZhY3RvcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvYnNlcnZlKGxpc3RlbmVyOiBWYWx1ZUxpc3RlbmVyPFQ+ID0gbm9vcCk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICBhd2FpdCBsaXN0ZW5lcihhd2FpdCB0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGRldGFjaExpc3RlbmVyID0gdGhpcy5vbk5leHQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBiZWdpbk9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuZE9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZW1pdEVycm9yKGVycm9yOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXJyb3JPYmplY3QgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoYCR7ZXJyb3J9YCk7XG4gICAgICAgIGZvciAoY29uc3QgZXJyb3JMaXN0ZW5lciBvZiB0aGlzLmVycm9yTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBlcnJvckxpc3RlbmVyKGVycm9yT2JqZWN0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9ic2VydmFibGVWYWx1ZVByb2R1Y2VyQmFzZTxUPiBleHRlbmRzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VD4ge1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8VmFsdWVMaXN0ZW5lcjxUPj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRDdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJlZ2luT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5iZWdpbkxpc3RlbmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbmRPYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVnaW5MaXN0ZW5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHN0b3BMaXN0ZW5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0RXJyb3JcIik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGVtaXRVcGRhdGUodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnlBbGxMaXN0ZW5lcnNBbmRXYWl0Rm9yQ29tcGxldGUodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk5leHQobGlzdGVuZXI6IChuZXh0VmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4pOiBEZXRhY2hMaXN0ZW5lciB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG5vdGlmeUFsbExpc3RlbmVyc0FuZFdhaXRGb3JDb21wbGV0ZShuZXh0VmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIobmV4dFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0dGFjaFZhbHVlUHJvZHVjZXI8VEksIFRBLCBUTz4gZXh0ZW5kcyBDaGFpbmFibGVWYWx1ZVByb2R1Y2VyPFRPPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFRJPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF0dGFjaEZhY3Rvcnk6ICh2YWx1ZTogVEkpID0+IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VEE+PjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvaW5WYWx1ZXM6IChvcmlnaW5hbDogVEksIGF0dGFjaGVkOiBUQSkgPT4gUHJvbWlzZTxUTz47XG4gICAgcHJpdmF0ZSBsYXN0QXR0YWNoS2V5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgYXR0YWNoZWRQcm9kdWNlcj86IElWYWx1ZVByb2R1Y2VyPFRBPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2YWx1YXRlQXR0YWNoS2V5OiAodmFsdWU6IFRJKSA9PiBQcm9taXNlPHN0cmluZz47XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PFZhbHVlTGlzdGVuZXI8VE8+PiA9IFtdO1xuICAgIHByaXZhdGUgZGV0YWNoUGFyZW50TGlzdGVuZXI/OiBEZXRhY2hMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGRldGFjaEF0dGFjaGVkTGlzdGVuZXI/OiBEZXRhY2hMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGxhc3RBdHRhY2hlZFZhbHVlPzogVEE7XG4gICAgcHJpdmF0ZSBsYXN0UGFyZW50VmFsdWU/OiBUSTtcbiAgICBwcml2YXRlIGF3YWl0aW5nTGFzdEF0dGFjaGVkVmFsdWUgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzSW5PYnNlcnZlU3RhdGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUST4sXG4gICAgICAgIGF0dGFjaEZhY3Rvcnk6ICh2YWx1ZTogVEkpID0+IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VEE+PixcbiAgICAgICAgam9pblZhbHVlcz86IChvcmlnaW5hbDogVEksIGF0dGFjaGVkOiBUQSkgPT4gUHJvbWlzZTxUTz4sXG4gICAgICAgIGV2YWx1YXRlQXR0YWNoS2V5PzogKHZhbHVlOiBUSSkgPT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmF0dGFjaEZhY3RvcnkgPSBhdHRhY2hGYWN0b3J5O1xuICAgICAgICAvLyDQryDQvdC1INC80L7Qs9GDINC/0L7QsdC10LTQuNGC0Ywg0YLQuNC/0LjQt9Cw0YbQuNGOINCyINGN0YLQvtC8INC80LXRgdGC0LUsINGB0LvQuNGI0LrQvtC8INC80L3QvtCz0L4g0YMg0LzQtdC90Y8g0LrQvtC00LAg0L/QvtC70YPRh9Cw0LXRgtGB0Y9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzIHx8IChhc3luYyB4ID0+IHgpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlQXR0YWNoS2V5ID0gZXZhbHVhdGVBdHRhY2hLZXkgfHwgKGFzeW5jICgpID0+IFwiU1RBVElDLUFUVEFDSC1LRVlcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJlZ2luT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuYmVnaW5PYnNlcnZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuZE9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmVuZE9ic2VydmUoKTtcbiAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXR0YWNoZWRQcm9kdWNlci5lbmRPYnNlcnZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUTz4ge1xuICAgICAgICBjb25zdCBnZXRDdXJyZW50VmFsdWUgPSBhc3luYyAoKTogUHJvbWlzZTxUTz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50VmFsdWUgPSBhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmxhc3RQYXJlbnRWYWx1ZSA9IHBhcmVudFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgYXR0YWNoS2V5ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUF0dGFjaEtleShwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyICE9IHVuZGVmaW5lZCAmJiB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyID0gdGhpcy5hdHRhY2hlZFByb2R1Y2VyLm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZUF0dGFjaGVkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGFzdEF0dGFjaEtleSA9PSB1bmRlZmluZWQgfHwgdGhpcy5sYXN0QXR0YWNoS2V5ICE9PSBhdHRhY2hLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdHRhY2hLZXkgPSBhdHRhY2hLZXk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaGVkUHJvZHVjZXIgIT0gdW5kZWZpbmVkICYmIHRoaXMuaXNJbk9ic2VydmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF0dGFjaGVkUHJvZHVjZXIuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaGVkUHJvZHVjZXIgPSBhd2FpdCB0aGlzLmF0dGFjaEZhY3RvcnkocGFyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgPSB0aGlzLmF0dGFjaGVkUHJvZHVjZXIub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlQXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5hdHRhY2hlZFByb2R1Y2VyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWRQcm9ncmFtU3RhdGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhdHRhY2hlZFZhbHVlID0gYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMubGFzdEF0dGFjaGVkVmFsdWUgPSBhdHRhY2hlZFZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuam9pblZhbHVlcyhwYXJlbnRWYWx1ZSwgYXR0YWNoZWRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE5leHRWYWx1ZSh2YWx1ZTogVE8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dChsaXN0ZW5lcjogKG5leHRWYWx1ZTogVE8pID0+IFByb21pc2U8dm9pZD4pOiBEZXRhY2hMaXN0ZW5lciB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhY2hQYXJlbnRMaXN0ZW5lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyID0gdGhpcy5wYXJlbnQub25OZXh0KHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciAhPSB1bmRlZmluZWQgJiYgdGhpcy5kZXRhY2hQYXJlbnRMaXN0ZW5lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyID0gdGhpcy5hdHRhY2hlZFByb2R1Y2VyLm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZUF0dGFjaGVkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaFBhcmVudExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGFjaEF0dGFjaGVkTGlzdGVuZXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNoYW5nZUF0dGFjaGVkVmFsdWUgPSBhc3luYyAoYXR0YWNoZWRWYWx1ZTogVEEpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdGhpcy5sYXN0QXR0YWNoZWRWYWx1ZSA9IGF0dGFjaGVkVmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5hd2FpdGluZ0xhc3RBdHRhY2hlZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0UGFyZW50VmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZFByb2dyYW1TdGF0ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE5leHRWYWx1ZShhd2FpdCB0aGlzLmpvaW5WYWx1ZXModGhpcy5sYXN0UGFyZW50VmFsdWUsIGF0dGFjaGVkVmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNoYW5nZVBhcmVudFZhbHVlID0gYXN5bmMgKHBhcmVudFZhbHVlOiBUSSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0aGlzLmxhc3RQYXJlbnRWYWx1ZSA9IHBhcmVudFZhbHVlO1xuICAgICAgICBjb25zdCBhdHRhY2hLZXkgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQXR0YWNoS2V5KHBhcmVudFZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciAhPSB1bmRlZmluZWQgJiYgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyID0gdGhpcy5hdHRhY2hlZFByb2R1Y2VyLm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZUF0dGFjaGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhc3RBdHRhY2hLZXkgPT0gdW5kZWZpbmVkIHx8IHRoaXMubGFzdEF0dGFjaEtleSAhPT0gYXR0YWNoS2V5KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RBdHRhY2hLZXkgPSBhdHRhY2hLZXk7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoQXR0YWNoZWRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNoZWRQcm9kdWNlciAhPSB1bmRlZmluZWQgJiYgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmVuZE9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0YWNoZWRQcm9kdWNlciA9IGF3YWl0IHRoaXMuYXR0YWNoRmFjdG9yeShwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmJlZ2luT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXRhY2hBdHRhY2hlZExpc3RlbmVyID0gdGhpcy5hdHRhY2hlZFByb2R1Y2VyLm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZUF0dGFjaGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaGVkUHJvZHVjZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkUHJvZ3JhbVN0YXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vINCf0YDQvtGB0YLQviDQvdC10LzQvdC+0LPQviDQvtCx0L7QttC00LXQvCwg0LLQtNGA0YPQsyDQv9GA0LjQtNGR0YIg0LTRgNGD0LPQvtC1IGF0dGFjaGVkVmFsdWVcbiAgICAgICAgdGhpcy5hd2FpdGluZ0xhc3RBdHRhY2hlZFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgZGVsYXkoNzAwKTtcbiAgICAgICAgdGhpcy5hd2FpdGluZ0xhc3RBdHRhY2hlZFZhbHVlID0gZmFsc2U7XG4gICAgICAgIGxldCBhdHRhY2hlZFZhbHVlID0gdGhpcy5sYXN0QXR0YWNoZWRWYWx1ZTtcbiAgICAgICAgaWYgKGF0dGFjaGVkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdHRhY2hlZFZhbHVlID0gYXdhaXQgdGhpcy5hdHRhY2hlZFByb2R1Y2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXROZXh0VmFsdWUoYXdhaXQgdGhpcy5qb2luVmFsdWVzKHBhcmVudFZhbHVlLCBhdHRhY2hlZFZhbHVlKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVPblZhbHVlUHJvZHVjZXI8VD4gZXh0ZW5kcyBDaGFpbmFibGVWYWx1ZVByb2R1Y2VyPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb246ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+LCBhY3Rpb246ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJlZ2luT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuYmVnaW5PYnNlcnZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuZE9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmVuZE9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudFZhbHVlID0gYXN5bmMgKCk6IFByb21pc2U8VD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25OZXh0KGxpc3RlbmVyOiAobmV4dFZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+KTogRGV0YWNoTGlzdGVuZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQub25OZXh0KGFzeW5jIHBhcmVudFZhbHVlID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgbGlzdGVuZXIodmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybVZhbHVlUHJvZHVjZXI8VEksIFRPPiBleHRlbmRzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VE8+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VEk+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNmb3JtRnVuY3Rpb246ICh2YWx1ZTogVEkpID0+IFByb21pc2U8VE8+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VEk+LCB0cmFuc2Zvcm1GdW5jdGlvbjogKHZhbHVlOiBUSSkgPT4gUHJvbWlzZTxUTz4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtRnVuY3Rpb24gPSB0cmFuc2Zvcm1GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFByb21pc2U8VE8+IHtcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudFZhbHVlID0gYXN5bmMgKCk6IFByb21pc2U8VE8+ID0+IHRoaXMudHJhbnNmb3JtRnVuY3Rpb24oYXdhaXQgdGhpcy5wYXJlbnQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk5leHQobGlzdGVuZXI6IChuZXh0VmFsdWU6IFRPKSA9PiBQcm9taXNlPHZvaWQ+KTogRGV0YWNoTGlzdGVuZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQub25OZXh0KGFzeW5jIHBhcmVudFZhbHVlID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKGF3YWl0IHRoaXMudHJhbnNmb3JtRnVuY3Rpb24ocGFyZW50VmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3BsaXRUb0NoYWluc1ZhbHVlUHJvZHVjZXI8VCwgVEksIFRPPiBleHRlbmRzIENoYWluYWJsZVZhbHVlUHJvZHVjZXI8VE9bXT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNwbGl0RnVuY3Rpb246IChpbnB1dDogVCkgPT4gVElbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdldEtleTogKGlucHV0OiBUSSkgPT4gc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeTogKGlucHV0OiBUSSkgPT4gSVZhbHVlUHJvZHVjZXI8VE8+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTxWYWx1ZUxpc3RlbmVyPFRPW10+PiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhaW5zOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IElWYWx1ZVByb2R1Y2VyPFRPPjtcbiAgICAgICAgICAgIGxhc3RWYWx1ZTogdW5kZWZpbmVkIHwgVE87XG4gICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogRGV0YWNoTGlzdGVuZXI7XG4gICAgICAgIH07XG4gICAgfSA9IHt9O1xuICAgIHByaXZhdGUgaXNJbk9ic2VydmVTdGF0ZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+LFxuICAgICAgICBzcGxpdEZ1bmN0aW9uOiAoaW5wdXQ6IFQpID0+IFRJW10sXG4gICAgICAgIGdldEtleTogKGlucHV0OiBUSSkgPT4gc3RyaW5nLFxuICAgICAgICBmYWN0b3J5OiAoaW5wdXQ6IFRJKSA9PiBJVmFsdWVQcm9kdWNlcjxUTz5cbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuc3BsaXRGdW5jdGlvbiA9IHNwbGl0RnVuY3Rpb247XG4gICAgICAgIHRoaXMuZ2V0S2V5ID0gZ2V0S2V5O1xuICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5O1xuICAgICAgICB0aGlzLnBhcmVudC5vbk5leHQodGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IFByb21pc2U8VE9bXT4ge1xuICAgICAgICBjb25zdCBnZXRDdXJyZW50VmFsdWUgPSBhc3luYyAoKTogUHJvbWlzZTxUT1tdPiA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnNwbGl0RnVuY3Rpb24oYXdhaXQgdGhpcy5wYXJlbnQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogVE9bXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzOiBSZWFzb25PckVycm9yW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRWYWx1ZVByb2R1Y2VyID0gdGhpcy5mYWN0b3J5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNoaWxkVmFsdWVQcm9kdWNlci5iZWdpbk9ic2VydmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IGF3YWl0IGNoaWxkVmFsdWVQcm9kdWNlci5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IGNoaWxkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBjaGlsZFZhbHVlUHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogY2hpbGRWYWx1ZVByb2R1Y2VyLm9uTmV4dCh4ID0+IHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4oeCwga2V5KSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IGNoaWxkVmFsdWVQcm9kdWNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBjaGlsZFZhbHVlUHJvZHVjZXIub25OZXh0KHggPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbih4LCBrZXkpKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVkRXJyb3IoXCJUaGVyZSBhcmUgZXJyb3JzXCIsIC4uLmVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJlZ2luT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuYmVnaW5PYnNlcnZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuZE9ic2VydmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmVuZE9ic2VydmUoKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYXRlVmFsdWVzKHRoaXMuY2hhaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdmFsdWUudmFsdWVQcm9kdWNlci5lbmRPYnNlcnZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0luT2JzZXJ2ZVN0YXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dChsaXN0ZW5lcjogKG5leHRWYWx1ZTogVE9bXSkgPT4gUHJvbWlzZTx2b2lkPik6IERldGFjaExpc3RlbmVyIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZW1pdFZhbHVlKHZhbHVlOiBUT1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGxpc3RlbmVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdG9NYXAodmFsdWVzOiBUSVtdKTogeyBba2V5OiBzdHJpbmddOiBUSSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IFRJIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdFt0aGlzLmdldEtleSh2YWx1ZSldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNoYW5nZVBhcmVudENoYWluID0gYXN5bmMgKG5leHRWYWx1ZTogVE8sIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWluVmFsdWUgPSB0aGlzLmNoYWluc1trZXldO1xuICAgICAgICBpZiAoY2hhaW5WYWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoYWluVmFsdWUubGFzdFZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdFZhbHVlKFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNoYWlucylcbiAgICAgICAgICAgICAgICAubWFwKHggPT4geC5sYXN0VmFsdWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZClcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDaGFuZ2VQYXJlbnQgPSBhc3luYyAoaW5wdXQ6IFQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5zcGxpdEZ1bmN0aW9uKGlucHV0KTtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlc01hcCA9IHRoaXMudG9NYXAodmFsdWVzKTtcblxuICAgICAgICBjb25zdCBuZXdLZXlzID0gXy5kaWZmZXJlbmNlKE9iamVjdC5rZXlzKG5leHRWYWx1ZXNNYXApLCBPYmplY3Qua2V5cyh0aGlzLmNoYWlucykpO1xuICAgICAgICBjb25zdCByZW1vdmVkS2V5cyA9IF8uZGlmZmVyZW5jZShPYmplY3Qua2V5cyh0aGlzLmNoYWlucyksIE9iamVjdC5rZXlzKG5leHRWYWx1ZXNNYXApKTtcbiAgICAgICAgZm9yIChjb25zdCBuZXdLZXkgb2YgbmV3S2V5cykge1xuICAgICAgICAgICAgY29uc3QgbmV3Q2hhaW4gPSB0aGlzLmZhY3RvcnkobmV4dFZhbHVlc01hcFtuZXdLZXldID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXdDaGFpbi5iZWdpbk9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2hhaW5WYWx1ZSA9IGF3YWl0IG5ld0NoYWluLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWluc1tuZXdLZXldID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IG5ld0NoYWluVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IG5ld0NoYWluLFxuICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogbmV3Q2hhaW4ub25OZXh0KG5leHRWYWx1ZSA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudENoYWluKG5leHRWYWx1ZSwgbmV3S2V5KSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW25ld0tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBuZXdDaGFpbixcbiAgICAgICAgICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IG5ld0NoYWluLm9uTmV4dChuZXh0VmFsdWUgPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbihuZXh0VmFsdWUsIG5ld0tleSkpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZW1vdmVkS2V5IG9mIHJlbW92ZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2hhaW4gPSB0aGlzLmNoYWluc1tyZW1vdmVkS2V5XTtcbiAgICAgICAgICAgIHJlbW92ZWRDaGFpbj8uZGV0YWNoTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5PYnNlcnZlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVkQ2hhaW4/LnZhbHVlUHJvZHVjZXIuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g0K8g0L3QtSDQt9C90LDRjiwg0LrQsNC6INGC0YPRgiDQv9GA0LDQstC40LvRjNC90L5cbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1keW5hbWljLWRlbGV0ZVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2hhaW5zW3JlbW92ZWRLZXldO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdFZhbHVlKFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNoYWlucylcbiAgICAgICAgICAgICAgICAubWFwKHggPT4geC5sYXN0VmFsdWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZClcbiAgICAgICAgKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgUGFyYWxsZWxTcGxpdFRvQ2hhaW5zVmFsdWVQcm9kdWNlcjxULCBUSSwgVE8+IGV4dGVuZHMgQ2hhaW5hYmxlVmFsdWVQcm9kdWNlcjxUT1tdPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3BsaXRGdW5jdGlvbjogKGlucHV0OiBUKSA9PiBUSVtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2V0S2V5OiAoaW5wdXQ6IFRJKSA9PiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3J5OiAoaW5wdXQ6IFRJKSA9PiBJVmFsdWVQcm9kdWNlcjxUTz4gfCBQcm9taXNlPElWYWx1ZVByb2R1Y2VyPFRPPj47XG4gICAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PFZhbHVlTGlzdGVuZXI8VE9bXT4+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFpbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXToge1xuICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogSVZhbHVlUHJvZHVjZXI8VE8+O1xuICAgICAgICAgICAgbGFzdFZhbHVlOiB1bmRlZmluZWQgfCBUTztcbiAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBEZXRhY2hMaXN0ZW5lcjtcbiAgICAgICAgfTtcbiAgICB9ID0ge307XG4gICAgcHJpdmF0ZSBpc0luT2JzZXJ2ZVN0YXRlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBhcmVudDogSVZhbHVlUHJvZHVjZXI8VD4sXG4gICAgICAgIHNwbGl0RnVuY3Rpb246IChpbnB1dDogVCkgPT4gVElbXSxcbiAgICAgICAgZ2V0S2V5OiAoaW5wdXQ6IFRJKSA9PiBzdHJpbmcsXG4gICAgICAgIGZhY3Rvcnk6IChpbnB1dDogVEkpID0+IElWYWx1ZVByb2R1Y2VyPFRPPiB8IFByb21pc2U8SVZhbHVlUHJvZHVjZXI8VE8+PlxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5zcGxpdEZ1bmN0aW9uID0gc3BsaXRGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5nZXRLZXkgPSBnZXRLZXk7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgICAgIHRoaXMucGFyZW50Lm9uTmV4dCh0aGlzLmhhbmRsZUNoYW5nZVBhcmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUT1tdPiB7XG4gICAgICAgIGNvbnN0IGdldEN1cnJlbnRWYWx1ZSA9IGFzeW5jICgpOiBQcm9taXNlPFRPW10+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuc3BsaXRGdW5jdGlvbihhd2FpdCB0aGlzLnBhcmVudC5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBUT1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IFJlYXNvbk9yRXJyb3JbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgY29uY3VycmVuY3lMaW1pdCA9IHBMaW1pdChvcy5jcHVzKCkubGVuZ3RoKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHZhbHVlcy5tYXAoKHZhbHVlLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lMaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFZhbHVlUHJvZHVjZXIgPSBhd2FpdCB0aGlzLmZhY3RvcnkodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbk9ic2VydmVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNoaWxkVmFsdWVQcm9kdWNlci5iZWdpbk9ic2VydmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IGF3YWl0IGNoaWxkVmFsdWVQcm9kdWNlci5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGNoaWxkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhaW5zW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZTogY2hpbGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogY2hpbGRWYWx1ZVByb2R1Y2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hMaXN0ZW5lcjogY2hpbGRWYWx1ZVByb2R1Y2VyLm9uTmV4dCh4ID0+IHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4oeCwga2V5KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUHJvZHVjZXI6IGNoaWxkVmFsdWVQcm9kdWNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IGNoaWxkVmFsdWVQcm9kdWNlci5vbk5leHQoeCA9PiB0aGlzLmhhbmRsZUNoYW5nZVBhcmVudENoYWluKHgsIGtleSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZWRFcnJvcihcIlRoZXJlIGFyZSBlcnJvcnNcIiwgLi4uZXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRDdXJyZW50VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYmVnaW5PYnNlcnZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmlzSW5PYnNlcnZlU3RhdGUgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW5kT2JzZXJ2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNoYWlucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhaW5zW2tleV0/LnZhbHVlUHJvZHVjZXIuZW5kT2JzZXJ2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNJbk9ic2VydmVTdGF0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk5leHQobGlzdGVuZXI6IChuZXh0VmFsdWU6IFRPW10pID0+IFByb21pc2U8dm9pZD4pOiBEZXRhY2hMaXN0ZW5lciB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVtaXRWYWx1ZSh2YWx1ZTogVE9bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBsaXN0ZW5lcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvTWFwKHZhbHVlczogVElbXSk6IHsgW2tleTogc3RyaW5nXTogVEkgfSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBUSSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICByZXN1bHRbdGhpcy5nZXRLZXkodmFsdWUpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbiA9IGFzeW5jIChuZXh0VmFsdWU6IFRPLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBjaGFpblZhbHVlID0gdGhpcy5jaGFpbnNba2V5XTtcbiAgICAgICAgaWYgKGNoYWluVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGFpblZhbHVlLmxhc3RWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRWYWx1ZShcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5jaGFpbnMpXG4gICAgICAgICAgICAgICAgLm1hcCh4ID0+IHgubGFzdFZhbHVlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNOb3ROdWxsT3JVbmRlZmluZWQpXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2hhbmdlUGFyZW50ID0gYXN5bmMgKGlucHV0OiBUKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuc3BsaXRGdW5jdGlvbihpbnB1dCk7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZXNNYXAgPSB0aGlzLnRvTWFwKHZhbHVlcyk7XG5cbiAgICAgICAgY29uc3QgbmV3S2V5cyA9IF8uZGlmZmVyZW5jZShPYmplY3Qua2V5cyhuZXh0VmFsdWVzTWFwKSwgT2JqZWN0LmtleXModGhpcy5jaGFpbnMpKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZEtleXMgPSBfLmRpZmZlcmVuY2UoT2JqZWN0LmtleXModGhpcy5jaGFpbnMpLCBPYmplY3Qua2V5cyhuZXh0VmFsdWVzTWFwKSk7XG4gICAgICAgIGZvciAoY29uc3QgbmV3S2V5IG9mIG5ld0tleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NoYWluID0gYXdhaXQgdGhpcy5mYWN0b3J5KG5leHRWYWx1ZXNNYXBbbmV3S2V5XSA/PyByZWplY3QoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3Q2hhaW4uYmVnaW5PYnNlcnZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NoYWluVmFsdWUgPSBhd2FpdCBuZXdDaGFpbi5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFpbnNbbmV3S2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlOiBuZXdDaGFpblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByb2R1Y2VyOiBuZXdDaGFpbixcbiAgICAgICAgICAgICAgICAgICAgZGV0YWNoTGlzdGVuZXI6IG5ld0NoYWluLm9uTmV4dChuZXh0VmFsdWUgPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRDaGFpbihuZXh0VmFsdWUsIG5ld0tleSkpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYWluc1tuZXdLZXldID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVQcm9kdWNlcjogbmV3Q2hhaW4sXG4gICAgICAgICAgICAgICAgICAgIGRldGFjaExpc3RlbmVyOiBuZXdDaGFpbi5vbk5leHQobmV4dFZhbHVlID0+IHRoaXMuaGFuZGxlQ2hhbmdlUGFyZW50Q2hhaW4obmV4dFZhbHVlLCBuZXdLZXkpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcmVtb3ZlZEtleSBvZiByZW1vdmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENoYWluID0gdGhpcy5jaGFpbnNbcmVtb3ZlZEtleV07XG4gICAgICAgICAgICByZW1vdmVkQ2hhaW4/LmRldGFjaExpc3RlbmVyKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luT2JzZXJ2ZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlZENoYWluPy52YWx1ZVByb2R1Y2VyLmVuZE9ic2VydmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vINCvINC90LUg0LfQvdCw0Y4sINC60LDQuiDRgtGD0YIg0L/RgNCw0LLQuNC70YzQvdC+XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZHluYW1pYy1kZWxldGVcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoYWluc1tyZW1vdmVkS2V5XTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRWYWx1ZShcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5jaGFpbnMpXG4gICAgICAgICAgICAgICAgLm1hcCh4ID0+IHgubGFzdFZhbHVlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoaXNOb3ROdWxsT3JVbmRlZmluZWQpXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFNraXBVcGRhdGVzVW50aWxOZXh0Q29tcGxldGVkUHJvZHVjZXI8VD4gZXh0ZW5kcyBPYnNlcnZhYmxlVmFsdWVQcm9kdWNlckJhc2U8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBJVmFsdWVQcm9kdWNlcjxUPjtcbiAgICBwcml2YXRlIGRldGFjaEZyb21QYXJlbnQ/OiBEZXRhY2hMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGxhc3RQYXJlbnRWYWx1ZT86IFQ7XG5cbiAgICBwcml2YXRlIG5leHRFbWl0VG9Qcm9jZXNzPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBwcml2YXRlIGN1cnJlbnRseVByb2Nlc3NpbmdFbWl0PzogUHJvbWlzZTx2b2lkPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJlbnQ6IElWYWx1ZVByb2R1Y2VyPFQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRDdXJyZW50VmFsdWUoKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQYXJlbnRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhcmVudFZhbHVlID0gYXdhaXQgdGhpcy5wYXJlbnQuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGFzdFBhcmVudFZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZFByb2dyYW1TdGF0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0UGFyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZ2luTGlzdGVuaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5iZWdpbk9ic2VydmUoKTtcbiAgICAgICAgaWYgKHRoaXMuZGV0YWNoRnJvbVBhcmVudCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoRnJvbVBhcmVudCA9IHRoaXMucGFyZW50Lm9uTmV4dChuZXh0VmFsdWUgPT4gdGhpcy5oYW5kbGVDaGFuZ2VQYXJlbnRWYWx1ZShuZXh0VmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBzdG9wTGlzdGVuaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kZXRhY2hGcm9tUGFyZW50ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hGcm9tUGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuZW5kT2JzZXJ2ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2hhbmdlUGFyZW50VmFsdWUobmV4dFZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubGFzdFBhcmVudFZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgICB0aGlzLm5leHRFbWl0VG9Qcm9jZXNzID0gXy5vbmNlKCgpID0+IHRoaXMuZW1pdFVwZGF0ZShuZXh0VmFsdWUpKTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRseVByb2Nlc3NpbmdFbWl0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQgPSB0aGlzLm5leHRFbWl0VG9Qcm9jZXNzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQ7XG4gICAgICAgIHRoaXMuY3VycmVudGx5UHJvY2Vzc2luZ0VtaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZWxheSh0aW1lb3V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaXNOb3ROdWxsT3JVbmRlZmluZWQ8VD4oaW5wdXQ6IFQgfCB1bmRlZmluZWQgfCBudWxsKTogaW5wdXQgaXMgVCB7XG4gICAgcmV0dXJuIGlucHV0ICE9IHVuZGVmaW5lZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUdBLElBQUFJLGNBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLGdCQUFBLEdBQUFOLE9BQUE7QUFBb0QsU0FBQU8seUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFG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