@kontur.candy/tools 2.154.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 +3 -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
@@ -18,65 +18,46 @@ exports.emptyAbsoluteModelPath = emptyAbsoluteModelPath;
18
18
  exports.emptyModelPath = emptyModelPath;
19
19
  exports.isModelPath = isModelPath;
20
20
  exports.joinModelPaths = joinModelPaths;
21
-
22
21
  var _IterableUtils = require("../IterableUtils");
23
-
24
22
  var _TypingUtils = require("../TypingUtils");
25
-
26
23
  var _hashUtils = require("../hashUtils");
27
-
28
24
  var _EachCurrentCollision = require("./EachCurrentCollision");
29
-
30
25
  var _ModelPathBuilder = require("./ModelPathBuilder");
31
-
32
26
  var _PathMatcher = require("./PathMatcher");
33
-
34
27
  const EachSymbol = Symbol.for("__EACH__");
35
28
  const CurrentSymbol = Symbol.for("__CURRENT__");
36
-
37
29
  class PathTokens {
38
30
  static isMultiToken(part) {
39
31
  return part === PathTokens.each || part === PathTokens.current;
40
32
  }
41
-
42
33
  static isSimpleToken(part) {
43
34
  return typeof part === "string";
44
35
  }
45
-
46
36
  static isInstanceToken(part) {
47
37
  return typeof part === "string" && /^\d+$/i.test(part);
48
38
  }
49
-
50
39
  }
51
-
52
40
  exports.PathTokens = PathTokens;
53
41
  PathTokens.each = EachSymbol;
54
42
  PathTokens.current = CurrentSymbol;
55
-
56
43
  function isModelPath(path) {
57
44
  return typeof path !== "string" && path instanceof ModelPathImpl;
58
45
  }
59
-
60
46
  function convertToLegacyPath(path) {
61
47
  return isModelPath(path) ? path.toLegacyPath() : path;
62
48
  }
63
-
64
49
  function convertToAbsoluteModelPath(path) {
65
50
  return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);
66
51
  }
67
-
68
52
  function emptyModelPath() {
69
53
  return new ModelPathImpl([], false);
70
54
  }
71
-
72
55
  function emptyAbsoluteModelPath() {
73
56
  return new ModelPathImpl([], true);
74
57
  }
75
-
76
58
  function createModelPath(path, absolute) {
77
59
  const partPartStrings = path.split("/");
78
60
  ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
79
-
80
61
  if (absolute === "auto") {
81
62
  if (path.startsWith("/")) {
82
63
  return new ModelPathImpl(partPartStrings.slice(1), true);
@@ -84,17 +65,13 @@ function createModelPath(path, absolute) {
84
65
  return new ModelPathImpl(partPartStrings, false);
85
66
  }
86
67
  }
87
-
88
68
  if (absolute && path.startsWith("/")) {
89
69
  return new ModelPathImpl(partPartStrings.slice(1), true);
90
70
  }
91
-
92
71
  return new ModelPathImpl(partPartStrings, absolute);
93
72
  }
94
-
95
73
  function createFromMask(path, absolute, multiplicitySymbol) {
96
74
  const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
97
-
98
75
  if (absolute === "auto") {
99
76
  if (path.startsWith("/")) {
100
77
  return new ModelPathImpl(partPartStrings.slice(1), true);
@@ -102,64 +79,49 @@ function createFromMask(path, absolute, multiplicitySymbol) {
102
79
  return new ModelPathImpl(partPartStrings, false);
103
80
  }
104
81
  }
105
-
106
82
  if (absolute && path.startsWith("/")) {
107
83
  return new ModelPathImpl(partPartStrings.slice(1), true);
108
84
  }
109
-
110
85
  return new ModelPathImpl(partPartStrings, absolute);
111
86
  }
112
-
113
87
  function createAbsoluteFromMask(path, multiplicitySymbol) {
114
88
  const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
115
-
116
89
  if (path.startsWith("/")) {
117
90
  return new ModelPathImpl(partPartStrings.slice(1), true);
118
91
  }
119
-
120
92
  return new ModelPathImpl(partPartStrings, true);
121
93
  }
122
-
123
94
  function ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
124
95
  if (parts.some(x => x === "*")) {
125
96
  throw new Error("Path must not contain * symbol");
126
97
  }
127
98
  }
128
-
129
99
  function createAbsolute(path) {
130
100
  const partPartStrings = path.split("/");
131
101
  ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
132
-
133
102
  if (path.startsWith("/")) {
134
103
  return new ModelPathImpl(partPartStrings.slice(1), true);
135
104
  }
136
-
137
105
  return new ModelPathImpl(partPartStrings, true);
138
106
  }
139
-
140
107
  function createRelativeResolvedModelPath(path) {
141
108
  const partPartStrings = path.split("/");
142
109
  ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
143
110
  return new ModelPathImpl(partPartStrings, false);
144
111
  }
145
-
146
112
  function createAbsoluteFromTokens(tokens) {
147
113
  return new ModelPathImpl(tokens, true);
148
114
  }
149
-
150
115
  function createAbsoluteResolvedFromTokens(tokens) {
151
116
  ensurePlainPathPartsDoesNotContainMultiplicity(tokens);
152
117
  return new ModelPathImpl(tokens, true);
153
118
  }
154
-
155
119
  function createRelativeFromTokens(tokens) {
156
120
  return new ModelPathImpl(tokens, false);
157
121
  }
158
-
159
122
  function joinModelPaths(...parts) {
160
123
  let absolute = false;
161
124
  let resultParts = [];
162
-
163
125
  for (const joinItem of parts) {
164
126
  if (typeof joinItem === "string") {
165
127
  resultParts.push(joinItem);
@@ -176,10 +138,8 @@ function joinModelPaths(...parts) {
176
138
  resultParts.push(joinItem);
177
139
  }
178
140
  }
179
-
180
141
  return new ModelPathImpl(resultParts, absolute);
181
142
  }
182
-
183
143
  class AbsoluteModelFieldPath {
184
144
  constructor(path, fieldName) {
185
145
  this.path = void 0;
@@ -187,57 +147,46 @@ class AbsoluteModelFieldPath {
187
147
  this.path = path;
188
148
  this.field = fieldName;
189
149
  }
190
-
191
150
  getHash() {
192
151
  return this.path.getHash() + (0, _hashUtils.getSimpleHashByString)(this.field);
193
152
  }
194
-
195
153
  isEquals(modelPath, eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreSame) {
196
154
  return this.path.isEquals(modelPath.path, eachCurrentCollision) && this.field === modelPath.field;
197
155
  }
198
-
199
156
  static createFromString(pathWithFieldName) {
200
157
  if (pathWithFieldName.endsWith(".$errorCount")) {
201
158
  return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
202
159
  }
203
-
204
160
  if (pathWithFieldName.endsWith(".$warningCount")) {
205
161
  return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
206
162
  }
207
-
208
163
  return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName), "value");
209
164
  }
210
-
211
165
  static createFromMask(pathWithFieldName, multiplicitySymbol) {
212
166
  if (pathWithFieldName.endsWith(".$errorCount")) {
213
167
  return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
214
168
  }
215
-
216
169
  if (pathWithFieldName.endsWith(".$warningCount")) {
217
170
  return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
218
171
  }
219
-
220
172
  if (pathWithFieldName.endsWith(".errorsCount")) {
221
173
  return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".errorsCount", ""), multiplicitySymbol), "errorsCount");
222
174
  }
223
-
224
175
  if (pathWithFieldName.endsWith(".warningsCount")) {
225
176
  return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".warningsCount", ""), multiplicitySymbol), "warningsCount");
226
177
  }
227
-
228
178
  return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
229
179
  }
230
-
180
+ toString() {
181
+ return `${this.path.toLegacyPath()}.${this.field}`;
182
+ }
231
183
  }
232
-
233
184
  exports.AbsoluteModelFieldPath = AbsoluteModelFieldPath;
234
-
235
185
  function isAllTokensResolved(tokens) {
236
186
  // Я что-то немогу сообразить как тут всё строго написать...
237
187
  // @ts-expect-error
238
188
  return tokens.every(PathTokens.isSimpleToken);
239
189
  }
240
-
241
190
  class ModelPathImpl {
242
191
  constructor(pathParts, absolute) {
243
192
  this.tokens = void 0;
@@ -246,50 +195,40 @@ class ModelPathImpl {
246
195
  this.tokens = pathParts.filter(x => x !== "");
247
196
  this.absolute = absolute;
248
197
  }
249
-
250
198
  get resolved() {
251
199
  return isAllTokensResolved(this.tokens);
252
200
  }
253
-
254
201
  getPathParts() {
255
202
  return this.tokens;
256
203
  }
257
-
258
204
  getPathPartsAsArray() {
259
205
  return this.tokens;
260
206
  }
261
-
262
207
  *getSimpleTokensStrict() {
263
208
  for (const token of this.tokens) {
264
209
  if (!PathTokens.isSimpleToken(token)) {
265
210
  throw new Error("Path must not contain spec tokens");
266
211
  }
267
-
268
212
  yield token;
269
213
  }
270
214
  }
271
-
272
215
  getSimpleTokensAsArrayStrict() {
273
216
  for (const token of this.tokens) {
274
217
  if (!PathTokens.isSimpleToken(token)) {
275
218
  throw new Error("Path must not contain spec tokens");
276
219
  }
277
- } // Проверка выше гараентирует что будут только SimplePathToken.
220
+ }
221
+ // Проверка выше гараентирует что будут только SimplePathToken.
278
222
  // Все map и filter убраны для производительности
279
223
  // @ts-ignore
280
-
281
-
282
224
  return this.tokens;
283
225
  }
284
-
285
226
  joinWith(...path) {
286
227
  return joinModelPaths(this, ...path);
287
228
  }
288
-
289
229
  isResolved() {
290
230
  return isAllTokensResolved(this.tokens);
291
231
  }
292
-
293
232
  resolveAll(instance) {
294
233
  const tokens = this.tokens.map(token => {
295
234
  if (PathTokens.isSimpleToken(token)) {
@@ -300,50 +239,39 @@ class ModelPathImpl {
300
239
  });
301
240
  return new ModelPathImpl(tokens, this.absolute);
302
241
  }
303
-
304
242
  isContainIteration() {
305
243
  return this.tokens.some(x => x === PathTokens.each);
306
244
  }
307
-
308
245
  isContainCurrentIteration() {
309
246
  return this.tokens.some(x => x === PathTokens.current);
310
247
  }
311
-
312
248
  getLastListPath() {
313
249
  if (!this.isContainIteration()) {
314
250
  throw new Error("Path must contain iteration");
315
- } // Проверка выше гарантирует, что будет PathTokens.each
316
- // @ts-ignore
317
-
251
+ }
318
252
 
253
+ // Проверка выше гарантирует, что будет PathTokens.each
254
+ // @ts-ignore
319
255
  const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);
320
256
  return this.tokens.slice(0, lastIterationIndex);
321
257
  }
322
-
323
258
  isEndsWithIteration() {
324
259
  const lastItem = _IterableUtils.IterUtils.last(this.tokens);
325
-
326
260
  return lastItem == PathTokens.each;
327
261
  }
328
-
329
262
  isAbsolute() {
330
263
  return this.absolute;
331
264
  }
332
-
333
265
  toString() {
334
266
  if (this.tokens.length === 0) {
335
267
  return "";
336
268
  }
337
-
338
269
  return (this.absolute ? "/" : "") + this.tokens.map(x => this.pathPartToString(x)).join("/");
339
270
  }
340
-
341
271
  toLegacyPath() {
342
272
  var _this$legacyPath;
343
-
344
273
  return (_this$legacyPath = this.legacyPath) !== null && _this$legacyPath !== void 0 ? _this$legacyPath : this.legacyPath = this.tokens.map(x => this.pathPartToString(x)).join("/");
345
274
  }
346
-
347
275
  isEquals(modelPath, eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreSame) {
348
276
  if (eachCurrentCollision === _EachCurrentCollision.EachCurrentCollision.AreSame) {
349
277
  return this.toLegacyPath() === modelPath.toLegacyPath();
@@ -351,17 +279,14 @@ class ModelPathImpl {
351
279
  return this.isAbsolute() === modelPath.isAbsolute() && Iterator.from(_IterableUtils.IterUtils.zip(this.getPathParts(), modelPath.getPathParts())).every(([t1, t2]) => t1 === t2);
352
280
  }
353
281
  }
282
+
354
283
  /**
355
284
  * Всегда целое положительное беззнаковое 32-битное число
356
285
  */
357
-
358
-
359
286
  getHash(eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreSame) {
360
287
  let hash = 5381;
361
-
362
288
  for (const token of (0, _IterableUtils.reverseArray)(this.tokens)) {
363
289
  let currentStr;
364
-
365
290
  if (PathTokens.isSimpleToken(token)) {
366
291
  currentStr = token;
367
292
  } else {
@@ -371,42 +296,34 @@ class ModelPathImpl {
371
296
  currentStr = "*";
372
297
  }
373
298
  }
374
-
375
299
  let stringIndex = currentStr.length;
376
-
377
300
  while (stringIndex) {
378
301
  // tslint:disable-next-line:no-bitwise
379
302
  hash = hash * 33 ^ currentStr.charCodeAt(--stringIndex);
380
303
  }
381
304
  }
305
+
382
306
  /*
383
307
  tslint:disable-next-line:no-bitwise
384
308
  JavaScript does bitwise operations (like XOR, above) on 32-bit signed
385
309
  integers. Since we want the results to be always positive, convert the
386
310
  signed int to an unsigned by doing an unsigned bitshift.
387
311
  */
388
-
389
-
390
312
  return hash >>> 0;
391
313
  }
392
-
393
314
  isIncludes(modelPath) {
394
315
  const targetTokens = modelPath.getPathPartsAsArray();
395
-
396
316
  if (this.tokens.length !== targetTokens.length) {
397
317
  return false;
398
318
  }
399
-
400
319
  for (let i = 0; i < this.tokens.length; i++) {
401
320
  const leftPart = this.tokens[i];
402
321
  const rightPart = targetTokens[i];
403
-
404
322
  if (typeof leftPart === "string") {
405
323
  if (typeof rightPart === "string") {
406
324
  if (leftPart !== rightPart) {
407
325
  return false;
408
326
  }
409
-
410
327
  continue;
411
328
  } else {
412
329
  return false;
@@ -416,44 +333,34 @@ class ModelPathImpl {
416
333
  if (!isFinite(Number(rightPart))) {
417
334
  return false;
418
335
  }
419
-
420
336
  continue;
421
337
  } else {
422
338
  if (rightPart !== PathTokens.current && rightPart !== PathTokens.each) {
423
339
  return false;
424
340
  }
425
-
426
341
  continue;
427
342
  }
428
343
  }
429
344
  }
430
-
431
345
  return true;
432
346
  }
433
-
434
347
  getIterationRank(eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreDifferent) {
435
348
  return (0, _IterableUtils.count)(Iterator.from(this.tokens).filter(x => eachCurrentCollision == _EachCurrentCollision.EachCurrentCollision.AreDifferent ? x === PathTokens.each : PathTokens.isMultiToken(x)));
436
349
  }
437
-
438
350
  isEmpty() {
439
351
  return this.tokens.length === 0;
440
352
  }
441
-
442
353
  matchFor(modelPath) {
443
354
  if (!this.isAbsolute()) {
444
355
  throw new Error(`Cannot match non absolute path '${this.toString()}'`);
445
356
  }
446
-
447
357
  if (!modelPath.isAbsolute()) {
448
358
  throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);
449
359
  }
450
-
451
360
  return _PathMatcher.PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());
452
361
  }
453
-
454
362
  *splitByMultiplicity() {
455
363
  let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
456
-
457
364
  for (const token of this.tokens) {
458
365
  if (PathTokens.isSimpleToken(token)) {
459
366
  lastSimpleParts.append(token);
@@ -462,19 +369,15 @@ class ModelPathImpl {
462
369
  yield lastSimpleParts.toResolvedPath();
463
370
  lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(false);
464
371
  }
465
-
466
372
  yield token;
467
373
  }
468
374
  }
469
-
470
375
  if (!lastSimpleParts.empty) {
471
376
  yield lastSimpleParts.toResolvedPath();
472
377
  }
473
378
  }
474
-
475
379
  normalize() {
476
380
  const resultTokens = [];
477
-
478
381
  for (const pathPart of this.tokens) {
479
382
  if (pathPart === "..") {
480
383
  if (!resultTokens.pop()) {
@@ -484,24 +387,19 @@ class ModelPathImpl {
484
387
  resultTokens.push("..");
485
388
  }
486
389
  }
487
-
488
390
  continue;
489
391
  }
490
-
491
392
  if (pathPart === ".") {
492
393
  continue;
493
394
  }
494
-
495
395
  resultTokens.push(pathPart);
496
396
  }
497
-
498
397
  return new ModelPathImpl(resultTokens, this.absolute);
499
398
  }
399
+
500
400
  /**
501
401
  * @summary Спецификаторы множественности Each заменяет на Current
502
402
  */
503
-
504
-
505
403
  toCurrentIteration() {
506
404
  if (this.isResolved()) {
507
405
  return this;
@@ -512,7 +410,6 @@ class ModelPathImpl {
512
410
  return new ModelPathImpl(pathParts, this.absolute);
513
411
  }
514
412
  }
515
-
516
413
  toEachIteration() {
517
414
  if (this.isResolved()) {
518
415
  return this;
@@ -523,87 +420,66 @@ class ModelPathImpl {
523
420
  return new ModelPathImpl(pathParts, this.absolute);
524
421
  }
525
422
  }
526
-
527
423
  toAbsolute() {
528
424
  if (!this.absolute) {
529
425
  throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);
530
426
  }
531
-
532
427
  return new ModelPathImpl(this.tokens, true);
533
428
  }
534
-
535
429
  *getAllParentPaths() {
536
430
  const result = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
537
-
538
431
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
539
432
  result.append(token);
540
433
  yield result.toPath();
541
434
  }
542
435
  }
543
-
544
436
  trimLastStarIfLastToken() {
545
437
  const lastItem = _IterableUtils.IterUtils.last(this.tokens);
546
-
547
438
  if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {
548
439
  return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);
549
440
  }
550
-
551
441
  return this;
552
442
  }
553
-
554
443
  getParentPath() {
555
444
  const result = new _ModelPathBuilder.ModelPathBuilder(this.absolute);
556
-
557
445
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
558
446
  result.append(token);
559
- } // Тут получается так, что по другому никак
447
+ }
448
+ // Тут получается так, что по другому никак
560
449
  // @ts-expect-error
561
-
562
-
563
450
  return result.toPath();
564
451
  }
565
-
566
452
  applyInstancesDirty(instances) {
567
453
  if (this.isResolved() || instances.length === 0) {
568
454
  return this;
569
455
  }
570
-
571
456
  let instanceCounter = 0;
572
457
  const result = new _ModelPathBuilder.ModelPathBuilder(true);
573
-
574
458
  for (const token of this.getPathParts()) {
575
459
  if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {
576
460
  var _instances$instanceCo;
577
-
578
461
  result.append((_instances$instanceCo = instances[instanceCounter]) !== null && _instances$instanceCo !== void 0 ? _instances$instanceCo : (0, _TypingUtils.reject)());
579
462
  instanceCounter++;
580
463
  } else {
581
464
  result.append(token);
582
465
  }
583
- } // Тут получается так, что по другому никак
466
+ }
467
+ // Тут получается так, что по другому никак
584
468
  // @ts-expect-error
585
-
586
-
587
469
  return result.toPath();
588
470
  }
589
-
590
471
  pathPartToString(pathPart) {
591
472
  if (typeof pathPart === "string") {
592
473
  return pathPart;
593
474
  }
594
-
595
475
  if (pathPart === PathTokens.each) {
596
476
  return "*";
597
477
  }
598
-
599
478
  if (pathPart === PathTokens.current) {
600
479
  return "*";
601
480
  }
602
-
603
481
  throw new Error(`Unknown path part specified: ${(0, _TypingUtils.ensureAndGetString)(pathPart)}`);
604
482
  }
605
-
606
483
  }
607
-
608
484
  exports.ModelPathImpl = ModelPathImpl;
609
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiTW9kZWxQYXRoSW1wbCIsImNvbnZlcnRUb0xlZ2FjeVBhdGgiLCJ0b0xlZ2FjeVBhdGgiLCJjb252ZXJ0VG9BYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbU1hc2siLCJlbXB0eU1vZGVsUGF0aCIsImVtcHR5QWJzb2x1dGVNb2RlbFBhdGgiLCJjcmVhdGVNb2RlbFBhdGgiLCJhYnNvbHV0ZSIsInBhcnRQYXJ0U3RyaW5ncyIsInNwbGl0IiwiZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eSIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImNyZWF0ZUZyb21NYXNrIiwibXVsdGlwbGljaXR5U3ltYm9sIiwibWFwIiwieCIsInBhcnRzIiwic29tZSIsIkVycm9yIiwiY3JlYXRlQWJzb2x1dGUiLCJjcmVhdGVSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIiwiY3JlYXRlQWJzb2x1dGVGcm9tVG9rZW5zIiwidG9rZW5zIiwiY3JlYXRlQWJzb2x1dGVSZXNvbHZlZEZyb21Ub2tlbnMiLCJjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnMiLCJqb2luTW9kZWxQYXRocyIsInJlc3VsdFBhcnRzIiwiam9pbkl0ZW0iLCJwdXNoIiwiaXNBYnNvbHV0ZSIsImdldFBhdGhQYXJ0c0FzQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIiwiY29uc3RydWN0b3IiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImdldEhhc2giLCJpc0VxdWFscyIsIm1vZGVsUGF0aCIsImVhY2hDdXJyZW50Q29sbGlzaW9uIiwiRWFjaEN1cnJlbnRDb2xsaXNpb24iLCJBcmVTYW1lIiwiY3JlYXRlRnJvbVN0cmluZyIsInBhdGhXaXRoRmllbGROYW1lIiwiZW5kc1dpdGgiLCJyZXBsYWNlIiwiaXNBbGxUb2tlbnNSZXNvbHZlZCIsImV2ZXJ5IiwicGF0aFBhcnRzIiwibGVnYWN5UGF0aCIsImZpbHRlciIsInJlc29sdmVkIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0U2ltcGxlVG9rZW5zU3RyaWN0IiwidG9rZW4iLCJnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0Iiwiam9pbldpdGgiLCJpc1Jlc29sdmVkIiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsImdldExhc3RMaXN0UGF0aCIsImxhc3RJdGVyYXRpb25JbmRleCIsImxhc3RJbmRleE9mIiwiaXNFbmRzV2l0aEl0ZXJhdGlvbiIsImxhc3RJdGVtIiwiSXRlclV0aWxzIiwibGFzdCIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJJdGVyYXRvciIsImZyb20iLCJ6aXAiLCJ0MSIsInQyIiwiaGFzaCIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwidGFyZ2V0VG9rZW5zIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiaXNFbXB0eSIsIm1hdGNoRm9yIiwiUGF0aE1hdGNoZXIiLCJtYXRjaCIsInNwbGl0QnlNdWx0aXBsaWNpdHkiLCJsYXN0U2ltcGxlUGFydHMiLCJNb2RlbFBhdGhCdWlsZGVyIiwiYXBwZW5kIiwiZW1wdHkiLCJ0b1Jlc29sdmVkUGF0aCIsIm5vcm1hbGl6ZSIsInJlc3VsdFRva2VucyIsInBhdGhQYXJ0IiwicG9wIiwidG9DdXJyZW50SXRlcmF0aW9uIiwidG9FYWNoSXRlcmF0aW9uIiwidG9BYnNvbHV0ZSIsImdldEFsbFBhcmVudFBhdGhzIiwicmVzdWx0Iiwic2tpcExhc3QiLCJ0b1BhdGgiLCJ0cmltTGFzdFN0YXJJZkxhc3RUb2tlbiIsInVuZGVmaW5lZCIsImdldFBhcmVudFBhdGgiLCJhcHBseUluc3RhbmNlc0RpcnR5IiwiaW5zdGFuY2VzIiwiaW5zdGFuY2VDb3VudGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsR0FBUCxDQUFXLFVBQVgsQ0FBbkI7QUFDQSxNQUFNQyxhQUFhLEdBQUdGLE1BQU0sQ0FBQ0MsR0FBUCxDQUFXLGFBQVgsQ0FBdEI7O0FBRU8sTUFBTUUsVUFBTixDQUFpQjtBQUlNLFNBQVpDLFlBQVksQ0FBQ0MsSUFBRCxFQUFnRjtBQUN0RyxXQUFPQSxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0csSUFBcEIsSUFBNEJELElBQUksS0FBS0YsVUFBVSxDQUFDSSxPQUF2RDtBQUNIOztBQUUwQixTQUFiQyxhQUFhLENBQUNILElBQUQsRUFBOEM7QUFDckUsV0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQXZCO0FBQ0g7O0FBRTRCLFNBQWZJLGVBQWUsQ0FBQ0osSUFBRCxFQUE4QztBQUN2RSxXQUFPLE9BQU9BLElBQVAsS0FBZ0IsUUFBaEIsSUFBNEIsU0FBU0ssSUFBVCxDQUFjTCxJQUFkLENBQW5DO0FBQ0g7O0FBZG1COzs7QUFBWEYsVSxDQUNLRyxJLEdBQTBCUCxVO0FBRC9CSSxVLENBRUtJLE8sR0FBZ0NMLGE7O0FBbUIzQyxTQUFTUyxXQUFULENBQXFCQyxJQUFyQixFQUFpRjtBQUNwRixTQUFPLE9BQU9BLElBQVAsS0FBZ0IsUUFBaEIsSUFBNEJBLElBQUksWUFBWUMsYUFBbkQ7QUFDSDs7QUFFTSxTQUFTQyxtQkFBVCxDQUE2QkYs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QXZFLENBQU47QUFDSDs7QUF6VkwiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCwgVmlld01vZGVsRmllbGROYW1lIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS9zcmMvRW5naW5lL0NvcmUvQ29yZVR5cGVzXCI7XG5pbXBvcnQgeyBjb3VudCwgSXRlclV0aWxzLCByZXZlcnNlQXJyYXkgfSBmcm9tIFwiLi4vSXRlcmFibGVVdGlsc1wiO1xuaW1wb3J0IHsgZW5zdXJlQW5kR2V0U3RyaW5nLCByZWplY3QgfSBmcm9tIFwiLi4vVHlwaW5nVXRpbHNcIjtcbmltcG9ydCB7IGdldFNpbXBsZUhhc2hCeVN0cmluZyB9IGZyb20gXCIuLi9oYXNoVXRpbHNcIjtcblxuaW1wb3J0IHsgRWFjaEN1cnJlbnRDb2xsaXNpb24gfSBmcm9tIFwiLi9FYWNoQ3VycmVudENvbGxpc2lvblwiO1xuaW1wb3J0IHsgTW9kZWxQYXRoQnVpbGRlciB9IGZyb20gXCIuL01vZGVsUGF0aEJ1aWxkZXJcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hpbmcgfSBmcm9tIFwiLi9QYXRoTWF0Y2hlclwiO1xuaW1wb3J0IHsgSUVxdWF0YWJsZSB9IGZyb20gXCIuL0lFcXVhdGFibGVcIjtcblxuY29uc3QgRWFjaFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0VBQ0hfX1wiKTtcbmNvbnN0IEN1cnJlbnRTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19DVVJSRU5UX19cIik7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVG9rZW5zIHtcbiAgICBwdWJsaWMgc3RhdGljIGVhY2g6IHR5cGVvZiBFYWNoU3ltYm9sID0gRWFjaFN5bWJvbDtcbiAgICBwdWJsaWMgc3RhdGljIGN1cnJlbnQ6IHR5cGVvZiBDdXJyZW50U3ltYm9sID0gQ3VycmVudFN5bWJvbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbCB7XG4gICAgICAgIHJldHVybiBwYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2ggfHwgcGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaW1wbGVUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzSW5zdGFuY2VUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskL2kudGVzdChwYXJ0KTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFNpbXBsZVBhdGhUb2tlbiA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgUGF0aFRva2VuID0gU2ltcGxlUGF0aFRva2VuIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgTW9kZWxQYXRoIHwgdW5rbm93bik6IHBhdGggaXMgTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIgJiYgcGF0aCBpbnN0YW5jZW9mIE1vZGVsUGF0aEltcGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9MZWdhY3lQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgTW9kZWxQYXRoKTogQmluZGluZ1BhdGgge1xuICAgIHJldHVybiBpc01vZGVsUGF0aChwYXRoKSA/IHBhdGgudG9MZWdhY3lQYXRoKCkgOiBwYXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGg8UiBleHRlbmRzIGJvb2xlYW4sIEEgZXh0ZW5kcyBib29sZWFuPihcbiAgICBwYXRoOiBCaW5kaW5nUGF0aCB8IElNb2RlbFBhdGg8UiwgQT5cbik6IElNb2RlbFBhdGg8UiwgdHJ1ZT47XG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlNb2RlbFBhdGgoKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihbXSwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCgpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4oW10sIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgYm9vbGVhbj4ocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiAqIHN5bWJvbFwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aChwYXRoOiBzdHJpbmcpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbVRva2Vucyh0b2tlbnM6IFBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxmYWxzZSwgdHJ1ZT4odG9rZW5zLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zKHRva2Vuczogc3RyaW5nW10pOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHRva2Vucyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBzdHJpbmdbXSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXSk6IFJlbGF0aXZlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIGZhbHNlPih0b2tlbnMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Nb2RlbFBhdGhzKC4uLnBhcnRzOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4gfCBQYXRoVG9rZW5bXT4pOiBNb2RlbFBhdGgge1xuICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvaW5JdGVtIG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW9kZWxQYXRoKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgaWYgKGpvaW5JdGVtLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChqb2luSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGggaW1wbGVtZW50cyBJRXF1YXRhYmxlPEFic29sdXRlTW9kZWxGaWVsZFBhdGg+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogQWJzb2x1dGVNb2RlbFBhdGg7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpZWxkOiBWaWV3TW9kZWxGaWVsZE5hbWUgfCBcIiRlcnJvckNvdW50XCIgfCBcIiR3YXJuaW5nQ291bnRcIjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aCwgZmllbGROYW1lOiBWaWV3TW9kZWxGaWVsZE5hbWUgfCBcIiRlcnJvckNvdW50XCIgfCBcIiR3YXJuaW5nQ291bnRcIikge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGROYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRIYXNoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGguZ2V0SGFzaCgpICsgZ2V0U2ltcGxlSGFzaEJ5U3RyaW5nKHRoaXMuZmllbGQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoLFxuICAgICAgICBlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGguaXNFcXVhbHMobW9kZWxQYXRoLnBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uKSAmJiB0aGlzLmZpZWxkID09PSBtb2RlbFBhdGguZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tU3RyaW5nKHBhdGhXaXRoRmllbGROYW1lOiBzdHJpbmcpOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIHtcbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiRlcnJvckNvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kZXJyb3JDb3VudFwiLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiR3YXJuaW5nQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUpLCBcInZhbHVlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIHtcbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiRlcnJvckNvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiJGVycm9yQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJHdhcm5pbmdDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi5lcnJvcnNDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi5lcnJvcnNDb3VudFwiLCBcIlwiKSwgbXVsdGlwbGljaXR5U3ltYm9sKSxcbiAgICAgICAgICAgICAgICBcImVycm9yc0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLndhcm5pbmdzQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIud2FybmluZ3NDb3VudFwiLCBcIlwiKSwgbXVsdGlwbGljaXR5U3ltYm9sKSxcbiAgICAgICAgICAgICAgICBcIndhcm5pbmdzQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZSwgbXVsdGlwbGljaXR5U3ltYm9sKSwgXCJ2YWx1ZVwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1vZGVsUGF0aDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuLCBUQWJzb2x1dGUgZXh0ZW5kcyBib29sZWFuPlxuICAgIGV4dGVuZHMgSUVxdWF0YWJsZTxJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+PiB7XG4gICAgcmVhZG9ubHkgcmVzb2x2ZWQ6IFRSZXNvbHZlZDtcbiAgICByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuXG4gICAgaXNFcXVhbHMobW9kZWxQYXRoOiBNb2RlbFBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uPzogRWFjaEN1cnJlbnRDb2xsaXNpb24pOiBib29sZWFuO1xuICAgIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IG51bWJlcjtcblxuICAgIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT47XG4gICAgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICB0b0Fic29sdXRlKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcblxuICAgIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8UmVzb2x2ZWRNb2RlbFBhdGggfCBzdHJpbmc+KTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcblxuICAgIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogUmVhZG9ubHlBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+O1xuICAgIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW107XG5cbiAgICByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGg7XG4gICAgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXTtcbiAgICBpc0VuZHNXaXRoSXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD47XG4gICAgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPjtcbiAgICB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBnZXRQYXJlbnRQYXRoKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICAgIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZU1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgdHJ1ZT47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCB0cnVlPjtcblxuZXhwb3J0IHR5cGUgUmVsYXRpdmVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGZhbHNlPjtcbmV4cG9ydCB0eXBlIFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGZhbHNlPjtcblxudHlwZSBQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4+ID0gVFJlc29sdmVkIGV4dGVuZHMgdHJ1ZSA/IHN0cmluZyA6IFBhdGhUb2tlbjtcblxudHlwZSBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IEFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbnR5cGUgUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcblxuZnVuY3Rpb24gaXNBbGxUb2tlbnNSZXNvbHZlZDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPih0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPik6IFRSZXNvbHZlZCB7XG4gICAgLy8g0K8g0YfRgtC+LdGC0L4g0L3QtdC80L7Qs9GDINGB0L7QvtCx0YDQsNC30LjRgtGMINC60LDQuiDRgtGD0YIg0LLRgdGRINGB0YLRgNC+0LPQviDQvdCw0L/QuNGB0LDRgtGMLi4uXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiB0b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUGF0aEltcGw8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBpbXBsZW1lbnRzIElFcXVhdGFibGU8TW9kZWxQYXRoPiwgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+LCBhYnNvbHV0ZTogVEFic29sdXRlKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvbHZlZCgpOiBUUmVzb2x2ZWQge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+IHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0LXQvdGC0LjRgNGD0LXRgiDRh9GC0L4g0LHRg9C00YPRgiDRgtC+0LvRjNC60L4gU2ltcGxlUGF0aFRva2VuLlxuICAgICAgICAvLyDQktGB0LUgbWFwINC4IGZpbHRlciDRg9Cx0YDQsNC90Ysg0LTQu9GPINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gam9pbk1vZGVsUGF0aHModGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT4ge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVBbGwoaW5zdGFuY2U6IHN0cmluZyk6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5zLm1hcCh0b2tlbiA9PiB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFzdExpc3RQYXRoKCk6IFBhdGhUb2tlbltdIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29udGFpbkl0ZXJhdGlvbigpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3QgY29udGFpbiBpdGVyYXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0L3RgtC40YDRg9C10YIsINGH0YLQviDQsdGD0LTQtdGCIFBhdGhUb2tlbnMuZWFjaFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb25JbmRleCA9IHRoaXMudG9rZW5zLmxhc3RJbmRleE9mKFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zbGljZSgwLCBsYXN0SXRlcmF0aW9uSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VuZHNXaXRoSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtID09IFBhdGhUb2tlbnMuZWFjaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmV2ZXJzZUFycmF5KHRoaXMudG9rZW5zKSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW4gPT09IFBhdGhUb2tlbnMuZWFjaCA/IFwiKlwiIDogXCIhXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgc2lnbmVkIGludCB0byBhbiB1bnNpZ25lZCBieSBkb2luZyBhbiB1bnNpZ25lZCBiaXRzaGlmdC5cbiAgICAgICovXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVzKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFRva2VucyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IHRhcmdldFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gdGFyZ2V0VG9rZW5zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0UGFydCAhPT0gcmlnaHRQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCB8fCBsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShOdW1iZXIocmlnaHRQYXJ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmN1cnJlbnQgJiYgcmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZXJhdGlvblJhbmsoZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlRGlmZmVyZW50KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvdW50KFxuICAgICAgICAgICAgSXRlcmF0b3IuZnJvbSh0aGlzLnRva2VucykuZmlsdGVyKHggPT5cbiAgICAgICAgICAgICAgICBlYWNoQ3VycmVudENvbGxpc2lvbiA9PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgICAgPyB4ID09PSBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgICAgICAgICAgICAgOiBQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbih4KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZyB7XG4gICAgICAgIGlmICghdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb2RlbFBhdGguaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHttb2RlbFBhdGgudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhdGhNYXRjaGVyLm1hdGNoKHRoaXMudG9rZW5zLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuIl19
485
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSXRlcmFibGVVdGlscyIsInJlcXVpcmUiLCJfVHlwaW5nVXRpbHMiLCJfaGFzaFV0aWxzIiwiX0VhY2hDdXJyZW50Q29sbGlzaW9uIiwiX01vZGVsUGF0aEJ1aWxkZXIiLCJfUGF0aE1hdGNoZXIiLCJFYWNoU3ltYm9sIiwiU3ltYm9sIiwiZm9yIiwiQ3VycmVudFN5bWJvbCIsIlBhdGhUb2tlbnMiLCJpc011bHRpVG9rZW4iLCJwYXJ0IiwiZWFjaCIsImN1cnJlbnQiLCJpc1NpbXBsZVRva2VuIiwiaXNJbnN0YW5jZVRva2VuIiwidGVzdCIsImV4cG9ydHMiLCJpc01vZGVsUGF0aCIsInBhdGgiLCJNb2RlbFBhdGhJbXBsIiwiY29udmVydFRvTGVnYWN5UGF0aCIsInRvTGVnYWN5UGF0aCIsImNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoIiwiY3JlYXRlQWJzb2x1dGVGcm9tTWFzayIsImVtcHR5TW9kZWxQYXRoIiwiZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZU1vZGVsUGF0aCIsImFic29sdXRlIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwiY3JlYXRlRnJvbU1hc2siLCJtdWx0aXBsaWNpdHlTeW1ib2wiLCJtYXAiLCJ4IiwicGFydHMiLCJzb21lIiwiRXJyb3IiLCJjcmVhdGVBYnNvbHV0ZSIsImNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnMiLCJ0b2tlbnMiLCJjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2VucyIsImNyZWF0ZVJlbGF0aXZlRnJvbVRva2VucyIsImpvaW5Nb2RlbFBhdGhzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIkFic29sdXRlTW9kZWxGaWVsZFBhdGgiLCJjb25zdHJ1Y3RvciIsImZpZWxkTmFtZSIsImZpZWxkIiwiZ2V0SGFzaCIsImdldFNpbXBsZUhhc2hCeVN0cmluZyIsImlzRXF1YWxzIiwibW9kZWxQYXRoIiwiZWFjaEN1cnJlbnRDb2xsaXNpb24iLCJFYWNoQ3VycmVudENvbGxpc2lvbiIsIkFyZVNhbWUiLCJjcmVhdGVGcm9tU3RyaW5nIiwicGF0aFdpdGhGaWVsZE5hbWUiLCJlbmRzV2l0aCIsInJlcGxhY2UiLCJ0b1N0cmluZyIsImlzQWxsVG9rZW5zUmVzb2x2ZWQiLCJldmVyeSIsInBhdGhQYXJ0cyIsImxlZ2FjeVBhdGgiLCJmaWx0ZXIiLCJyZXNvbHZlZCIsImdldFBhdGhQYXJ0cyIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsInJlc29sdmVBbGwiLCJpbnN0YW5jZSIsImlzQ29udGFpbkl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsImlzRW5kc1dpdGhJdGVyYXRpb24iLCJsYXN0SXRlbSIsIkl0ZXJVdGlscyIsImxhc3QiLCJsZW5ndGgiLCJwYXRoUGFydFRvU3RyaW5nIiwiam9pbiIsIl90aGlzJGxlZ2FjeVBhdGgiLCJJdGVyYXRvciIsImZyb20iLCJ6aXAiLCJ0MSIsInQyIiwiaGFzaCIsInJldmVyc2VBcnJheSIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwidGFyZ2V0VG9rZW5zIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiY291bnQiLCJpc0VtcHR5IiwibWF0Y2hGb3IiLCJQYXRoTWF0Y2hlciIsIm1hdGNoIiwic3BsaXRCeU11bHRpcGxpY2l0eSIsImxhc3RTaW1wbGVQYXJ0cyIsIk1vZGVsUGF0aEJ1aWxkZXIiLCJhcHBlbmQiLCJlbXB0eSIsInRvUmVzb2x2ZWRQYXRoIiwibm9ybWFsaXplIiwicmVzdWx0VG9rZW5zIiwicGF0aFBhcnQiLCJwb3AiLCJ0b0N1cnJlbnRJdGVyYXRpb24iLCJ0b0VhY2hJdGVyYXRpb24iLCJ0b0Fic29sdXRlIiwiZ2V0QWxsUGFyZW50UGF0aHMiLCJyZXN1bHQiLCJza2lwTGFzdCIsInRvUGF0aCIsInRyaW1MYXN0U3RhcklmTGFzdFRva2VuIiwidW5kZWZpbmVkIiwiZ2V0UGFyZW50UGF0aCIsImFwcGx5SW5zdGFuY2VzRGlydHkiLCJpbnN0YW5jZXMiLCJpbnN0YW5jZUNvdW50ZXIiLCJfaW5zdGFuY2VzJGluc3RhbmNlQ28iLCJyZWplY3QiLCJlbnN1cmVBbmRHZXRTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9Db21tb24vTW9kZWxQYXRoL01vZGVsUGF0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCwgVmlld01vZGVsRmllbGROYW1lIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS9zcmMvRW5naW5lL0NvcmUvQ29yZVR5cGVzXCI7XG5pbXBvcnQgeyBjb3VudCwgSXRlclV0aWxzLCByZXZlcnNlQXJyYXkgfSBmcm9tIFwiLi4vSXRlcmFibGVVdGlsc1wiO1xuaW1wb3J0IHsgZW5zdXJlQW5kR2V0U3RyaW5nLCByZWplY3QgfSBmcm9tIFwiLi4vVHlwaW5nVXRpbHNcIjtcbmltcG9ydCB7IGdldFNpbXBsZUhhc2hCeVN0cmluZyB9IGZyb20gXCIuLi9oYXNoVXRpbHNcIjtcblxuaW1wb3J0IHsgRWFjaEN1cnJlbnRDb2xsaXNpb24gfSBmcm9tIFwiLi9FYWNoQ3VycmVudENvbGxpc2lvblwiO1xuaW1wb3J0IHsgTW9kZWxQYXRoQnVpbGRlciB9IGZyb20gXCIuL01vZGVsUGF0aEJ1aWxkZXJcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hpbmcgfSBmcm9tIFwiLi9QYXRoTWF0Y2hlclwiO1xuaW1wb3J0IHsgSUVxdWF0YWJsZSB9IGZyb20gXCIuL0lFcXVhdGFibGVcIjtcblxuY29uc3QgRWFjaFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0VBQ0hfX1wiKTtcbmNvbnN0IEN1cnJlbnRTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19DVVJSRU5UX19cIik7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVG9rZW5zIHtcbiAgICBwdWJsaWMgc3RhdGljIGVhY2g6IHR5cGVvZiBFYWNoU3ltYm9sID0gRWFjaFN5bWJvbDtcbiAgICBwdWJsaWMgc3RhdGljIGN1cnJlbnQ6IHR5cGVvZiBDdXJyZW50U3ltYm9sID0gQ3VycmVudFN5bWJvbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbCB7XG4gICAgICAgIHJldHVybiBwYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2ggfHwgcGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaW1wbGVUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzSW5zdGFuY2VUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskL2kudGVzdChwYXJ0KTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFNpbXBsZVBhdGhUb2tlbiA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgUGF0aFRva2VuID0gU2ltcGxlUGF0aFRva2VuIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgTW9kZWxQYXRoIHwgdW5rbm93bik6IHBhdGggaXMgTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gdHlwZW9mIHBhdGggIT09IFwic3RyaW5nXCIgJiYgcGF0aCBpbnN0YW5jZW9mIE1vZGVsUGF0aEltcGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9MZWdhY3lQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgTW9kZWxQYXRoKTogQmluZGluZ1BhdGgge1xuICAgIHJldHVybiBpc01vZGVsUGF0aChwYXRoKSA/IHBhdGgudG9MZWdhY3lQYXRoKCkgOiBwYXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGg8UiBleHRlbmRzIGJvb2xlYW4sIEEgZXh0ZW5kcyBib29sZWFuPihcbiAgICBwYXRoOiBCaW5kaW5nUGF0aCB8IElNb2RlbFBhdGg8UiwgQT5cbik6IElNb2RlbFBhdGg8UiwgdHJ1ZT47XG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlNb2RlbFBhdGgoKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihbXSwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCgpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4oW10sIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgYm9vbGVhbj4ocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiAqIHN5bWJvbFwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aChwYXRoOiBzdHJpbmcpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbVRva2Vucyh0b2tlbnM6IFBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxmYWxzZSwgdHJ1ZT4odG9rZW5zLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zKHRva2Vuczogc3RyaW5nW10pOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHRva2Vucyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBzdHJpbmdbXSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXSk6IFJlbGF0aXZlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIGZhbHNlPih0b2tlbnMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Nb2RlbFBhdGhzKC4uLnBhcnRzOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4gfCBQYXRoVG9rZW5bXT4pOiBNb2RlbFBhdGgge1xuICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvaW5JdGVtIG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW9kZWxQYXRoKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgaWYgKGpvaW5JdGVtLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChqb2luSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGggaW1wbGVtZW50cyBJRXF1YXRhYmxlPEFic29sdXRlTW9kZWxGaWVsZFBhdGg+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogQWJzb2x1dGVNb2RlbFBhdGg7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpZWxkOiBWaWV3TW9kZWxGaWVsZE5hbWUgfCBcIiRlcnJvckNvdW50XCIgfCBcIiR3YXJuaW5nQ291bnRcIjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aCwgZmllbGROYW1lOiBWaWV3TW9kZWxGaWVsZE5hbWUgfCBcIiRlcnJvckNvdW50XCIgfCBcIiR3YXJuaW5nQ291bnRcIikge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGROYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRIYXNoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGguZ2V0SGFzaCgpICsgZ2V0U2ltcGxlSGFzaEJ5U3RyaW5nKHRoaXMuZmllbGQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoLFxuICAgICAgICBlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGguaXNFcXVhbHMobW9kZWxQYXRoLnBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uKSAmJiB0aGlzLmZpZWxkID09PSBtb2RlbFBhdGguZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tU3RyaW5nKHBhdGhXaXRoRmllbGROYW1lOiBzdHJpbmcpOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIHtcbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiRlcnJvckNvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kZXJyb3JDb3VudFwiLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiR3YXJuaW5nQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoY3JlYXRlQWJzb2x1dGUocGF0aFdpdGhGaWVsZE5hbWUpLCBcInZhbHVlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIHtcbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiRlcnJvckNvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiJGVycm9yQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJHdhcm5pbmdDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi5lcnJvcnNDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi5lcnJvcnNDb3VudFwiLCBcIlwiKSwgbXVsdGlwbGljaXR5U3ltYm9sKSxcbiAgICAgICAgICAgICAgICBcImVycm9yc0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLndhcm5pbmdzQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIud2FybmluZ3NDb3VudFwiLCBcIlwiKSwgbXVsdGlwbGljaXR5U3ltYm9sKSxcbiAgICAgICAgICAgICAgICBcIndhcm5pbmdzQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZSwgbXVsdGlwbGljaXR5U3ltYm9sKSwgXCJ2YWx1ZVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMucGF0aC50b0xlZ2FjeVBhdGgoKX0uJHt0aGlzLmZpZWxkfWA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNb2RlbFBhdGg8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBleHRlbmRzIElFcXVhdGFibGU8SU1vZGVsUGF0aDxib29sZWFuLCBib29sZWFuPj4ge1xuICAgIHJlYWRvbmx5IHJlc29sdmVkOiBUUmVzb2x2ZWQ7XG4gICAgcmVhZG9ubHkgYWJzb2x1dGU6IFRBYnNvbHV0ZTtcblxuICAgIGlzRXF1YWxzKG1vZGVsUGF0aDogTW9kZWxQYXRoLCBlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogYm9vbGVhbjtcbiAgICBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uPzogRWFjaEN1cnJlbnRDb2xsaXNpb24pOiBudW1iZXI7XG5cbiAgICBpc1Jlc29sdmVkKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDx0cnVlLCBUQWJzb2x1dGU+O1xuICAgIGlzQWJzb2x1dGUoKTogdGhpcyBpcyBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG5cbiAgICBqb2luV2l0aCguLi5wYXRoOiBzdHJpbmdbXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGpvaW5XaXRoKC4uLnBhdGg6IFBhdGhUb2tlbltdKTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuICAgIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PEFic29sdXRlUmVzb2x2ZWRNb2RlbFBhdGggfCBzdHJpbmc+KTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuICAgIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG5cbiAgICBnZXRQYXRoUGFydHMoKTogSXRlcmFibGU8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcbiAgICBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcbiAgICBnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPjtcbiAgICBnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0KCk6IHJlYWRvbmx5IFNpbXBsZVBhdGhUb2tlbltdO1xuXG4gICAgcmVzb2x2ZUFsbChpbnN0YW5jZTogc3RyaW5nKTogTW9kZWxQYXRoO1xuICAgIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBnZXRMYXN0TGlzdFBhdGgoKTogUGF0aFRva2VuW107XG4gICAgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuO1xuICAgIGdldEl0ZXJhdGlvblJhbmsoZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IG51bWJlcjtcbiAgICBpc0VtcHR5KCk6IGJvb2xlYW47XG4gICAgbWF0Y2hGb3IobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBQYXRoTWF0Y2hpbmc7XG4gICAgc3BsaXRCeU11bHRpcGxpY2l0eSgpOiBJdGVyYWJsZTxSZXNvbHZlZE1vZGVsUGF0aCB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w+O1xuICAgIG5vcm1hbGl6ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0N1cnJlbnRJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgdG9FYWNoSXRlcmF0aW9uKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD47XG4gICAgdHJpbUxhc3RTdGFySWZMYXN0VG9rZW4oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgICB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIHRydWU+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgdHJ1ZT47XG5cbmV4cG9ydCB0eXBlIFJlbGF0aXZlTW9kZWxQYXRoID0gSU1vZGVsUGF0aDxib29sZWFuLCBmYWxzZT47XG5leHBvcnQgdHlwZSBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCBmYWxzZT47XG5cbnR5cGUgUGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFRSZXNvbHZlZCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBQYXRoVG9rZW47XG5cbnR5cGUgUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuXG50eXBlIFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbmZ1bmN0aW9uIGlzQWxsVG9rZW5zUmVzb2x2ZWQ8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4odG9rZW5zOiBSZWFkb25seVBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4pOiBUUmVzb2x2ZWQge1xuICAgIC8vINCvINGH0YLQvi3RgtC+INC90LXQvNC+0LPRgyDRgdC+0L7QsdGA0LDQt9C40YLRjCDQutCw0Log0YLRg9GCINCy0YHRkSDRgdGC0YDQvtCz0L4g0L3QsNC/0LjRgdCw0YLRjC4uLlxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXR1cm4gdG9rZW5zLmV2ZXJ5KFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbik7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgaW1wbGVtZW50cyBJRXF1YXRhYmxlPE1vZGVsUGF0aD4sIElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWJzb2x1dGU6IFRBYnNvbHV0ZTtcbiAgICBwcml2YXRlIGxlZ2FjeVBhdGg6IHVuZGVmaW5lZCB8IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoUGFydHM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiwgYWJzb2x1dGU6IFRBYnNvbHV0ZSkge1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhdGhQYXJ0cy5maWx0ZXIoeCA9PiB4ICE9PSBcIlwiKTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IGFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZWQoKTogVFJlc29sdmVkIHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHMoKTogSXRlcmFibGU8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW10ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC10L3RgtC40YDRg9C10YIg0YfRgtC+INCx0YPQtNGD0YIg0YLQvtC70YzQutC+IFNpbXBsZVBhdGhUb2tlbi5cbiAgICAgICAgLy8g0JLRgdC1IG1hcCDQuCBmaWx0ZXIg0YPQsdGA0LDQvdGLINC00LvRjyDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IFBhdGhUb2tlbltdKTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGpvaW5Nb2RlbFBhdGhzKHRoaXMsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc29sdmVkKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDx0cnVlLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiBsYXN0SXRlbSA9PSBQYXRoVG9rZW5zLmVhY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWJzb2x1dGUoKTogdGhpcyBpcyBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hYnNvbHV0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLmFic29sdXRlID8gXCIvXCIgOiBcIlwiKSArIHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIik7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5sZWdhY3lQYXRoID8/ICh0aGlzLmxlZ2FjeVBhdGggPSB0aGlzLnRva2Vucy5tYXAoeCA9PiB0aGlzLnBhdGhQYXJ0VG9TdHJpbmcoeCkpLmpvaW4oXCIvXCIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFcXVhbHMoXG4gICAgICAgIG1vZGVsUGF0aDogTW9kZWxQYXRoLFxuICAgICAgICBlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChlYWNoQ3VycmVudENvbGxpc2lvbiA9PT0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9MZWdhY3lQYXRoKCkgPT09IG1vZGVsUGF0aC50b0xlZ2FjeVBhdGgoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Fic29sdXRlKCkgPT09IG1vZGVsUGF0aC5pc0Fic29sdXRlKCkgJiZcbiAgICAgICAgICAgICAgICBJdGVyYXRvci5mcm9tKEl0ZXJVdGlscy56aXAodGhpcy5nZXRQYXRoUGFydHMoKSwgbW9kZWxQYXRoLmdldFBhdGhQYXJ0cygpKSkuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChbdDEsIHQyXSkgPT4gdDEgPT09IHQyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0YHQtdCz0LTQsCDRhtC10LvQvtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INCx0LXQt9C30L3QsNC60L7QstC+0LUgMzIt0LHQuNGC0L3QvtC1INGH0LjRgdC70L5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGFzaChlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGhhc2ggPSA1MzgxO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHJldmVyc2VBcnJheSh0aGlzLnRva2VucykpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50U3RyOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuID09PSBQYXRoVG9rZW5zLmVhY2ggPyBcIipcIiA6IFwiIVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSBcIipcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RyaW5nSW5kZXggPSBjdXJyZW50U3RyLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChzdHJpbmdJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgICAgICAgICAgaGFzaCA9IChoYXNoICogMzMpIF4gY3VycmVudFN0ci5jaGFyQ29kZUF0KC0tc3RyaW5nSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgICAgICBKYXZhU2NyaXB0IGRvZXMgYml0d2lzZSBvcGVyYXRpb25zIChsaWtlIFhPUiwgYWJvdmUpIG9uIDMyLWJpdCBzaWduZWRcbiAgICAgICAgICAgIGludGVnZXJzLiBTaW5jZSB3ZSB3YW50IHRoZSByZXN1bHRzIHRvIGJlIGFsd2F5cyBwb3NpdGl2ZSwgY29udmVydCB0aGVcbiAgICAgICAgICAgIHNpZ25lZCBpbnQgdG8gYW4gdW5zaWduZWQgYnkgZG9pbmcgYW4gdW5zaWduZWQgYml0c2hpZnQuXG4gICAgICAqL1xuICAgICAgICByZXR1cm4gaGFzaCA+Pj4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUb2tlbnMgPSBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpO1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoICE9PSB0YXJnZXRUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGVmdFBhcnQgPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0UGFydCA9IHRhcmdldFRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGVmdFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFBhcnQgIT09IHJpZ2h0UGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgfHwgbGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoTnVtYmVyKHJpZ2h0UGFydCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5jdXJyZW50ICYmIHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVyYXRpb25SYW5rKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb3VudChcbiAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20odGhpcy50b2tlbnMpLmZpbHRlcih4ID0+XG4gICAgICAgICAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb24gPT0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlRGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgID8geCA9PT0gUGF0aFRva2Vucy5lYWNoXG4gICAgICAgICAgICAgICAgICAgIDogUGF0aFRva2Vucy5pc011bHRpVG9rZW4oeClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hGb3IobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBQYXRoTWF0Y2hpbmcge1xuICAgICAgICBpZiAoIXRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7bW9kZWxQYXRoLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXRoTWF0Y2hlci5tYXRjaCh0aGlzLnRva2VucywgbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljICpzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD4ge1xuICAgICAgICBsZXQgbGFzdFNpbXBsZVBhcnRzID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIodGhpcy5pc0Fic29sdXRlKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIGxhc3RTaW1wbGVQYXJ0cy5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUmVzb2x2ZWRQYXRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0VG9rZW5zOiBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0aFBhcnQgb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRUb2tlbnMucG9wKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggaXMgaW52YWxpZCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2goXCIuLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocmVzdWx0VG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSDQodC/0LXRhtC40YTQuNC60LDRgtC+0YDRiyDQvNC90L7QttC10YHRgtCy0LXQvdC90L7RgdGC0LggRWFjaCDQt9Cw0LzQtdC90Y/QtdGCINC90LAgQ3VycmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b0N1cnJlbnRJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuZWFjaCA/IFBhdGhUb2tlbnMuY3VycmVudCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9FYWNoSXRlcmF0aW9uKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEUg0KLRg9GCINC90LUg0L/QvtC70YPRh9Cw0LXRgtGB0Y8g0L3QsNC70L7QttC40YLRjCDQtNC40YHQutGA0LjQvNC40L3QsNGC0L7RgFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzOiBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+ID0gdGhpcy50b2tlbnMubWFwKHggPT5cbiAgICAgICAgICAgICAgICB4ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgPyBQYXRoVG9rZW5zLmVhY2ggOiB4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihwYXRoUGFydHMsIHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvQWJzb2x1dGUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFic29sdXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7dGhpcy50b0xlZ2FjeVBhdGgoKX0gaXMgbm90IGFic29sdXRlJ2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIHRydWU+KHRoaXMudG9rZW5zLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgSXRlclV0aWxzLnNraXBMYXN0KHRoaXMuZ2V0UGF0aFBhcnRzKCksIDEpKSB7XG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdC50b1BhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gSXRlclV0aWxzLmxhc3QodGhpcy50b2tlbnMpO1xuICAgICAgICBpZiAobGFzdEl0ZW0gIT0gdW5kZWZpbmVkICYmIFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGxhc3RJdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRoaXMudG9rZW5zLnNsaWNlKDAsIC0xKSwgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudFBhdGgoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmFic29sdXRlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIC8vINCi0YPRgiDQv9C+0LvRg9GH0LDQtdGC0YHRjyDRgtCw0LosINGH0YLQviDQv9C+INC00YDRg9Cz0L7QvNGDINC90LjQutCw0LpcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICByZXR1cm4gcmVzdWx0LnRvUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSB8fCBpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5zdGFuY2VDb3VudGVyID0gMDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIodHJ1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy5nZXRQYXRoUGFydHMoKSkge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHRva2VuKSAmJiBpbnN0YW5jZUNvdW50ZXIgPCBpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpbnN0YW5jZXNbaW5zdGFuY2VDb3VudGVyXSA/PyByZWplY3QoKSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudGVyKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vINCi0YPRgiDQv9C+0LvRg9GH0LDQtdGC0YHRjyDRgtCw0LosINGH0YLQviDQv9C+INC00YDRg9Cz0L7QvNGDINC90LjQutCw0LpcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICByZXR1cm4gcmVzdWx0LnRvUGF0aCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGF0aFBhcnRUb1N0cmluZyhwYXRoUGFydDogUGF0aFRva2VuKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoUGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIqXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGF0aCBwYXJ0IHNwZWNpZmllZDogJHtlbnN1cmVBbmRHZXRTdHJpbmcocGF0aFBhcnQpfWApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7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