@kontur.candy/tools 2.129.0 → 2.131.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 (249) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +6 -6
  3. package/distr/Common/AsyncUtils.js +1 -30
  4. package/distr/Common/CandyApiClient/CandyApiClient.js +56 -39
  5. package/distr/Common/CandyApiClient/CandyApiClientContext.js +1 -33
  6. package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +0 -4
  7. package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +0 -4
  8. package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +1 -29
  9. package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +0 -4
  10. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +1 -35
  11. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +1 -35
  12. package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +1 -37
  13. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +1 -29
  14. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +1 -34
  15. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +1 -28
  16. package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +0 -4
  17. package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +1 -33
  18. package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +1 -29
  19. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +1 -6
  20. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +0 -4
  21. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestResponse.js +0 -4
  22. package/distr/Common/CandyApiClient/FakeCandyApiClient.js +22 -38
  23. package/distr/Common/CandyApiClient/ICandyApiClient.js +1 -5
  24. package/distr/Common/CandyApiClient/IsBuffer.js +1 -29
  25. package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +0 -4
  26. package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +0 -4
  27. package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +0 -4
  28. package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +0 -4
  29. package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +0 -4
  30. package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +1 -6
  31. package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +0 -4
  32. package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +0 -4
  33. package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +11 -0
  34. package/distr/Common/CandyApiClient/Types/DraftFullId.js +0 -4
  35. package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +0 -4
  36. package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +1 -6
  37. package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +0 -4
  38. package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +0 -4
  39. package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +1 -6
  40. package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +0 -4
  41. package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +0 -4
  42. package/distr/Common/CandyApiClient/Types/Guid.js +0 -4
  43. package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +1 -6
  44. package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +0 -4
  45. package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +0 -4
  46. package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +1 -6
  47. package/distr/Common/CommonConstants/SectionNames.js +1 -28
  48. package/distr/Common/Comparers.js +8 -30
  49. package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +1 -29
  50. package/distr/Common/EndPoints.js +1 -34
  51. package/distr/Common/Errors.js +3 -71
  52. package/distr/Common/FormActionHandlers/ContextualActionNames.js +1 -30
  53. package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +0 -4
  54. package/distr/Common/Funcs.js +1 -29
  55. package/distr/Common/GFV.js +0 -4
  56. package/distr/Common/Hooks/UseLocalStorage.js +42 -0
  57. package/distr/Common/HttpClient/AuthenticationMode.js +1 -32
  58. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +12 -0
  59. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -29
  60. package/distr/Common/HttpClient/FetchImplementation/Fetch.js +0 -4
  61. package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -30
  62. package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +3 -31
  63. package/distr/Common/HttpClient/HttpClient.js +12 -56
  64. package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +0 -4
  65. package/distr/Common/HttpClient/IHttpClient.js +0 -4
  66. package/distr/Common/IndentString.js +18 -0
  67. package/distr/Common/IntRangeUtils.js +1 -31
  68. package/distr/Common/IterableUtils.js +23 -38
  69. package/distr/Common/KCLangRuntimeUtils.js +3 -38
  70. package/distr/Common/ModelPath/BuildIterationSequence.js +3 -31
  71. package/distr/Common/ModelPath/EachCurrentCollision.js +1 -6
  72. package/distr/Common/ModelPath/IEquatable.js +0 -4
  73. package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +30 -0
  74. package/distr/Common/ModelPath/Map/Map2.js +103 -0
  75. package/distr/Common/ModelPath/Map/ModelPathMap.js +30 -0
  76. package/distr/Common/ModelPath/ModelPath.js +206 -206
  77. package/distr/Common/ModelPath/ModelPathBuilder.js +11 -40
  78. package/distr/Common/ModelPath/ModelPathHelper.js +13 -0
  79. package/distr/Common/ModelPath/PathMatcher.js +8 -37
  80. package/distr/Common/ModelPath/PathSplitHelper.js +26 -0
  81. package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +40 -0
  82. package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +40 -0
  83. package/distr/Common/ModelPath/Set/ModelPathSet.js +40 -0
  84. package/distr/Common/ModelPath/Set/Set2.js +60 -0
  85. package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +1 -34
  86. package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +0 -4
  87. package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +1 -29
  88. package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +1 -34
  89. package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +1 -38
  90. package/distr/Common/NidusClient/INidusClient.js +1 -30
  91. package/distr/Common/NidusClient/NidusClientContext.js +1 -38
  92. package/distr/Common/NidusClient/NidusClientImpl.js +1 -34
  93. package/distr/Common/PathConstants.js +3 -31
  94. package/distr/Common/TypingUtils.js +6 -50
  95. package/distr/Common/UUID.js +1 -30
  96. package/distr/Common/UseAsyncEffect.js +1 -31
  97. package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +3 -36
  98. package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +1 -29
  99. package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +1 -30
  100. package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +3 -36
  101. package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +3 -36
  102. package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +1 -29
  103. package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +3 -34
  104. package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +1 -28
  105. package/distr/Tools/src/BuildTasks/FSTask.js +3 -30
  106. package/distr/Tools/src/BuildTasks/Form/CompileForm.js +3 -32
  107. package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +1 -37
  108. package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +1 -34
  109. package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +3 -31
  110. package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +1 -29
  111. package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +1 -31
  112. package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +3 -36
  113. package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +3 -37
  114. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +2 -37
  115. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +2 -34
  116. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +1 -5
  117. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +1 -5
  118. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +3 -33
  119. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +1 -28
  120. package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +3 -30
  121. package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +1 -34
  122. package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +1 -45
  123. package/distr/Tools/src/BuildTasks/ReadFormSource.js +4 -39
  124. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +3 -33
  125. package/distr/Tools/src/BuildTasks/Version.js +1 -32
  126. package/distr/Tools/src/BuildTasks/WriteFormMeta.js +3 -31
  127. package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +1 -30
  128. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +7 -34
  129. package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +3 -33
  130. package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +1 -34
  131. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +1 -29
  132. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +6 -37
  133. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +6 -47
  134. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +26 -43
  135. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +6 -40
  136. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +6 -38
  137. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +6 -37
  138. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +6 -39
  139. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +6 -37
  140. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +6 -39
  141. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +3 -36
  142. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +3 -36
  143. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +12 -37
  144. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +3 -31
  145. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +5 -35
  146. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +4 -36
  147. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +3 -31
  148. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +0 -4
  149. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +0 -4
  150. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +2 -42
  151. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +3 -36
  152. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +1 -29
  153. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +0 -4
  154. package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +1 -30
  155. package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +1 -29
  156. package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +1 -29
  157. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +1 -30
  158. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +0 -4
  159. package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +1 -28
  160. package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +3 -31
  161. package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +1 -28
  162. package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +3 -31
  163. package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +6 -40
  164. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}.calc.js +1 -30
  165. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/setKppValue.js +1 -29
  166. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +1 -34
  167. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +6 -37
  168. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/kppValue.js +1 -29
  169. package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +1 -28
  170. package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +1 -30
  171. package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +1 -28
  172. package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +3 -32
  173. package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +1 -32
  174. package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +1 -29
  175. package/distr/Tools/src/CandyCLI.js +3 -31
  176. package/distr/Tools/src/CheckNodeJsVersion.js +3 -33
  177. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +4 -35
  178. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +1 -34
  179. package/distr/Tools/src/Commons/ErrorUntyped.js +0 -4
  180. package/distr/Tools/src/Commons/EventObject.js +2 -44
  181. package/distr/Tools/src/Commons/ExecUtils.js +1 -29
  182. package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +1 -29
  183. package/distr/Tools/src/Commons/FormGlobsUtils.js +3 -36
  184. package/distr/Tools/src/Commons/FsUtils.js +3 -34
  185. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +1 -32
  186. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +2 -33
  187. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +1 -34
  188. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +1 -34
  189. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +0 -4
  190. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +1 -34
  191. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +1 -34
  192. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +2 -34
  193. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +1 -34
  194. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +1 -36
  195. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +1 -34
  196. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +1 -34
  197. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +1 -34
  198. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +1 -34
  199. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +0 -4
  200. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +1 -34
  201. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +1 -34
  202. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +3 -57
  203. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +1 -28
  204. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +3 -36
  205. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +1 -34
  206. package/distr/Tools/src/Commons/Locks/Lock.js +3 -36
  207. package/distr/Tools/src/Commons/Locks/LockHandle.js +1 -34
  208. package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +3 -36
  209. package/distr/Tools/src/Commons/Logging/ELKLogger.js +3 -33
  210. package/distr/Tools/src/Commons/Logging/ILogger.js +1 -36
  211. package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +1 -41
  212. package/distr/Tools/src/Commons/Logging/Logger.js +3 -36
  213. package/distr/Tools/src/Commons/Logging/StaticLogger.js +1 -38
  214. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +1 -30
  215. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +6 -53
  216. package/distr/Tools/src/Commons/PathPattern.js +1 -34
  217. package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +1 -34
  218. package/distr/Tools/src/Commons/TasksCore/BuildTask.js +0 -4
  219. package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +3 -89
  220. package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +3 -36
  221. package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +1 -34
  222. package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +3 -36
  223. package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +3 -36
  224. package/distr/Tools/src/Commons/TasksCore/Observe.js +1 -28
  225. package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +1 -34
  226. package/distr/Tools/src/Commons/TimingUtils.js +1 -29
  227. package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +55 -48
  228. package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +8 -36
  229. package/distr/Tools/src/GenerateReadMe.js +1 -31
  230. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
  231. package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
  232. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  233. package/distr/Tools/src/Options/CandyToolOptions.js +1 -28
  234. package/distr/Tools/src/ReadFarmConfig.js +3 -31
  235. package/distr/Tools/src/SelfUpdate.js +4 -36
  236. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1000 -2036
  237. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
  238. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +366 -361
  239. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
  240. package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +1 -5
  241. package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +1 -5
  242. package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +1 -5
  243. package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +1 -5
  244. package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +1 -5
  245. package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +1 -5
  246. package/package.json +9 -8
  247. package/distr/Common/ModelPath/AbsoluteModelPathSet.js +0 -95
  248. package/distr/Common/ModelPath/ModelPathMap.js +0 -160
  249. package/distr/Common/ModelPath/ModelPathSet.js +0 -99
@@ -3,10 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PathTokens = exports.ModelPath = exports.AbsoluteModelPath = exports.AbsoluteModelFieldPath = void 0;
6
+ exports.PathTokens = exports.ModelPathImpl = exports.AbsoluteModelFieldPath = void 0;
7
7
  exports.convertToAbsolutModelPath = convertToAbsolutModelPath;
8
8
  exports.convertToLegacyPath = convertToLegacyPath;
9
+ exports.createAbsolute = createAbsolute;
10
+ exports.createAbsoluteFromMask = createAbsoluteFromMask;
11
+ exports.createAbsoluteFromTokens = createAbsoluteFromTokens;
12
+ exports.createAbsoluteResolvedFromTokens = createAbsoluteResolvedFromTokens;
13
+ exports.createFromMask = createFromMask;
14
+ exports.createModelPath = createModelPath;
15
+ exports.createRelativeFromTokens = createRelativeFromTokens;
16
+ exports.createRelativeResolvedModelPath = createRelativeResolvedModelPath;
17
+ exports.emptyAbsoluteModelPath = emptyAbsoluteModelPath;
18
+ exports.emptyModelPath = emptyModelPath;
9
19
  exports.isModelPath = isModelPath;
20
+ exports.joinModelPaths = joinModelPaths;
10
21
 
11
22
  var _IterableUtils = require("../IterableUtils");
12
23
 
@@ -18,15 +29,6 @@ var _ModelPathBuilder = require("./ModelPathBuilder");
18
29
 
19
30
  var _PathMatcher = require("./PathMatcher");
20
31
 
21
- (function () {
22
- var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
23
- enterModule && enterModule(module);
24
- })();
25
-
26
- var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
27
- return a;
28
- };
29
-
30
32
  const EachSymbol = Symbol.for("__EACH__");
31
33
  const CurrentSymbol = Symbol.for("__CURRENT__");
32
34
 
@@ -50,7 +52,7 @@ PathTokens.each = EachSymbol;
50
52
  PathTokens.current = CurrentSymbol;
51
53
 
52
54
  function isModelPath(path) {
53
- return typeof path !== "string";
55
+ return typeof path !== "string" && path instanceof ModelPathImpl;
54
56
  }
55
57
 
56
58
  function convertToLegacyPath(path) {
@@ -58,7 +60,122 @@ function convertToLegacyPath(path) {
58
60
  }
59
61
 
60
62
  function convertToAbsolutModelPath(path) {
61
- return isModelPath(path) ? path : AbsoluteModelPath.createAbsoluteFromMask(path, PathTokens.each);
63
+ return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);
64
+ }
65
+
66
+ function emptyModelPath() {
67
+ return new ModelPathImpl([], false);
68
+ }
69
+
70
+ function emptyAbsoluteModelPath() {
71
+ return new ModelPathImpl([], true);
72
+ }
73
+
74
+ function createModelPath(path, absolute) {
75
+ const partPartStrings = path.split("/");
76
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
77
+
78
+ if (absolute === "auto") {
79
+ if (path.startsWith("/")) {
80
+ return new ModelPathImpl(partPartStrings.slice(1), true);
81
+ } else {
82
+ return new ModelPathImpl(partPartStrings, false);
83
+ }
84
+ }
85
+
86
+ if (absolute && path.startsWith("/")) {
87
+ return new ModelPathImpl(partPartStrings.slice(1), true);
88
+ }
89
+
90
+ return new ModelPathImpl(partPartStrings, absolute);
91
+ }
92
+
93
+ function createFromMask(path, absolute, multiplicitySymbol) {
94
+ const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
95
+
96
+ if (absolute === "auto") {
97
+ if (path.startsWith("/")) {
98
+ return new ModelPathImpl(partPartStrings.slice(1), true);
99
+ } else {
100
+ return new ModelPathImpl(partPartStrings, false);
101
+ }
102
+ }
103
+
104
+ if (absolute && path.startsWith("/")) {
105
+ return new ModelPathImpl(partPartStrings.slice(1), true);
106
+ }
107
+
108
+ return new ModelPathImpl(partPartStrings, absolute);
109
+ }
110
+
111
+ function createAbsoluteFromMask(path, multiplicitySymbol) {
112
+ const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
113
+
114
+ if (path.startsWith("/")) {
115
+ return new ModelPathImpl(partPartStrings.slice(1), true);
116
+ }
117
+
118
+ return new ModelPathImpl(partPartStrings, true);
119
+ }
120
+
121
+ function ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
122
+ if (parts.some(x => x === "*")) {
123
+ throw new Error("Path must not contain * symbol");
124
+ }
125
+ }
126
+
127
+ function createAbsolute(path) {
128
+ const partPartStrings = path.split("/");
129
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
130
+
131
+ if (path.startsWith("/")) {
132
+ return new ModelPathImpl(partPartStrings.slice(1), true);
133
+ }
134
+
135
+ return new ModelPathImpl(partPartStrings, true);
136
+ }
137
+
138
+ function createRelativeResolvedModelPath(path) {
139
+ const partPartStrings = path.split("/");
140
+ ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
141
+ return new ModelPathImpl(partPartStrings, false);
142
+ }
143
+
144
+ function createAbsoluteFromTokens(tokens) {
145
+ return new ModelPathImpl(tokens, true);
146
+ }
147
+
148
+ function createAbsoluteResolvedFromTokens(tokens) {
149
+ ensurePlainPathPartsDoesNotContainMultiplicity(tokens);
150
+ return new ModelPathImpl(tokens, true);
151
+ }
152
+
153
+ function createRelativeFromTokens(tokens) {
154
+ return new ModelPathImpl(tokens, false);
155
+ }
156
+
157
+ function joinModelPaths(...parts) {
158
+ let absolute = false;
159
+ let resultParts = [];
160
+
161
+ for (const joinItem of parts) {
162
+ if (typeof joinItem === "string") {
163
+ resultParts.push(joinItem);
164
+ } else if (isModelPath(joinItem)) {
165
+ if (joinItem.isAbsolute()) {
166
+ absolute = true;
167
+ resultParts = [...joinItem.getPathPartsAsArray()];
168
+ } else {
169
+ resultParts.push(...joinItem.getPathPartsAsArray());
170
+ }
171
+ } else if (Array.isArray(joinItem)) {
172
+ resultParts.push(...joinItem);
173
+ } else if (PathTokens.isMultiToken(joinItem)) {
174
+ resultParts.push(joinItem);
175
+ }
176
+ }
177
+
178
+ return new ModelPathImpl(resultParts, absolute);
62
179
  }
63
180
 
64
181
  class AbsoluteModelFieldPath {
@@ -75,39 +192,47 @@ class AbsoluteModelFieldPath {
75
192
 
76
193
  static createFromString(pathWithFieldName) {
77
194
  if (pathWithFieldName.endsWith(".$errorCount")) {
78
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
195
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
79
196
  }
80
197
 
81
198
  if (pathWithFieldName.endsWith(".$warningCount")) {
82
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
199
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
83
200
  }
84
201
 
85
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsolute(pathWithFieldName), "value");
202
+ return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName), "value");
86
203
  }
87
204
 
88
205
  static createFromMask(pathWithFieldName, multiplicitySymbol) {
89
206
  if (pathWithFieldName.endsWith(".$errorCount")) {
90
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
207
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
91
208
  }
92
209
 
93
210
  if (pathWithFieldName.endsWith(".$warningCount")) {
94
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
211
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
95
212
  }
96
213
 
97
- return new AbsoluteModelFieldPath(AbsoluteModelPath.createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
98
- }
214
+ if (pathWithFieldName.endsWith(".errorsCount")) {
215
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".errorsCount", ""), multiplicitySymbol), "errorsCount");
216
+ }
99
217
 
100
- // @ts-ignore
101
- __reactstandin__regenerateByEval(key, code) {
102
- // @ts-ignore
103
- this[key] = eval(code);
218
+ if (pathWithFieldName.endsWith(".warningsCount")) {
219
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".warningsCount", ""), multiplicitySymbol), "warningsCount");
220
+ }
221
+
222
+ return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
104
223
  }
105
224
 
106
225
  }
107
226
 
108
227
  exports.AbsoluteModelFieldPath = AbsoluteModelFieldPath;
109
228
 
110
- class ModelPath {
229
+ function isAllTokensResolved(tokens) {
230
+ // Я что-то немогу сообразить как тут всё строго написать...
231
+ // @ts-expect-error
232
+ return tokens.every(PathTokens.isSimpleToken);
233
+ }
234
+
235
+ class ModelPathImpl {
111
236
  constructor(pathParts, absolute) {
112
237
  this.tokens = void 0;
113
238
  this.absolute = void 0;
@@ -116,79 +241,8 @@ class ModelPath {
116
241
  this.absolute = absolute;
117
242
  }
118
243
 
119
- static empty() {
120
- return new ModelPath([], false);
121
- }
122
-
123
- static builder(forceAbsolute = false) {
124
- return new _ModelPathBuilder.ModelPathBuilder(forceAbsolute);
125
- }
126
-
127
- static createFromString(path, absolute) {
128
- const partPartStrings = path.split("/");
129
- this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
130
-
131
- if (absolute === "auto") {
132
- if (path.startsWith("/")) {
133
- return new ModelPath(partPartStrings.slice(1), true);
134
- } else {
135
- return new ModelPath(partPartStrings, false);
136
- }
137
- }
138
-
139
- if (absolute && path.startsWith("/")) {
140
- return new ModelPath(partPartStrings.slice(1), true);
141
- }
142
-
143
- return new ModelPath(partPartStrings, absolute);
144
- }
145
-
146
- static createFromMask(path, absolute, multiplicitySymbol) {
147
- const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
148
-
149
- if (absolute === "auto") {
150
- if (path.startsWith("/")) {
151
- return new ModelPath(partPartStrings.slice(1), true);
152
- } else {
153
- return new ModelPath(partPartStrings, false);
154
- }
155
- }
156
-
157
- if (absolute && path.startsWith("/")) {
158
- return new ModelPath(partPartStrings.slice(1), true);
159
- }
160
-
161
- return new ModelPath(partPartStrings, absolute);
162
- }
163
-
164
- static join(...parts) {
165
- let absolute = false;
166
- let resultParts = [];
167
-
168
- for (const joinItem of parts) {
169
- if (typeof joinItem === "string") {
170
- resultParts.push(joinItem);
171
- } else if (joinItem instanceof ModelPath) {
172
- if (joinItem.isAbsolute()) {
173
- absolute = true;
174
- resultParts = [...joinItem.tokens];
175
- } else {
176
- resultParts.push(...joinItem.tokens);
177
- }
178
- } else if (Array.isArray(joinItem)) {
179
- resultParts.push(...joinItem);
180
- } else if (PathTokens.isMultiToken(joinItem)) {
181
- resultParts.push(joinItem);
182
- }
183
- }
184
-
185
- return new ModelPath(resultParts, absolute);
186
- }
187
-
188
- static ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
189
- if (parts.some(x => x === "*")) {
190
- throw new Error("Path must not contain * symbol");
191
- }
244
+ get resolved() {
245
+ return isAllTokensResolved(this.tokens);
192
246
  }
193
247
 
194
248
  getPathParts() {
@@ -223,10 +277,11 @@ class ModelPath {
223
277
  }
224
278
 
225
279
  joinWith(...path) {
226
- return ModelPath.join(this, ...path);
280
+ return joinModelPaths(this, ...path);
227
281
  }
228
282
 
229
283
  isResolved() {
284
+ return isAllTokensResolved(this.tokens);
230
285
  return this.tokens.every(PathTokens.isSimpleToken);
231
286
  }
232
287
 
@@ -238,7 +293,7 @@ class ModelPath {
238
293
  return instance;
239
294
  }
240
295
  });
241
- return new ModelPath(tokens, this.absolute);
296
+ return new ModelPathImpl(tokens, this.absolute);
242
297
  }
243
298
 
244
299
  isContainIteration() {
@@ -249,6 +304,17 @@ class ModelPath {
249
304
  return this.tokens.some(x => x === PathTokens.current);
250
305
  }
251
306
 
307
+ getLastListPath() {
308
+ if (!this.isContainIteration()) {
309
+ throw new Error("Path must contain iteration");
310
+ } // Проверка выше гарантирует, что будет PathTokens.each
311
+ // @ts-ignore
312
+
313
+
314
+ const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);
315
+ return this.tokens.slice(0, lastIterationIndex);
316
+ }
317
+
252
318
  isAbsolute() {
253
319
  return this.absolute;
254
320
  }
@@ -314,13 +380,15 @@ class ModelPath {
314
380
  }
315
381
 
316
382
  isIncludes(modelPath) {
317
- if (this.tokens.length !== modelPath.tokens.length) {
383
+ const targetTokens = modelPath.getPathPartsAsArray();
384
+
385
+ if (this.tokens.length !== targetTokens.length) {
318
386
  return false;
319
387
  }
320
388
 
321
389
  for (let i = 0; i < this.tokens.length; i++) {
322
390
  const leftPart = this.tokens[i];
323
- const rightPart = modelPath.tokens[i];
391
+ const rightPart = targetTokens[i];
324
392
 
325
393
  if (typeof leftPart === "string") {
326
394
  if (typeof rightPart === "string") {
@@ -369,19 +437,19 @@ class ModelPath {
369
437
  throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);
370
438
  }
371
439
 
372
- return _PathMatcher.PathMatcher.match(this.tokens, modelPath.tokens);
440
+ return _PathMatcher.PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());
373
441
  }
374
442
 
375
443
  *splitByMultiplicity() {
376
- let lastSimpleParts = ModelPath.builder(this.isAbsolute());
444
+ let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
377
445
 
378
446
  for (const token of this.tokens) {
379
447
  if (PathTokens.isSimpleToken(token)) {
380
448
  lastSimpleParts.append(token);
381
449
  } else {
382
450
  if (!lastSimpleParts.empty) {
383
- yield lastSimpleParts.toPath();
384
- lastSimpleParts = ModelPath.builder();
451
+ yield lastSimpleParts.toResolvedPath();
452
+ lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(false);
385
453
  }
386
454
 
387
455
  yield token;
@@ -389,7 +457,7 @@ class ModelPath {
389
457
  }
390
458
 
391
459
  if (!lastSimpleParts.empty) {
392
- yield lastSimpleParts.toPath();
460
+ yield lastSimpleParts.toResolvedPath();
393
461
  }
394
462
  }
395
463
 
@@ -416,7 +484,7 @@ class ModelPath {
416
484
  resultTokens.push(pathPart);
417
485
  }
418
486
 
419
- return new ModelPath(resultTokens, this.isAbsolute());
487
+ return new ModelPathImpl(resultTokens, this.absolute);
420
488
  }
421
489
  /**
422
490
  * @summary Спецификаторы множественности Each заменяет на Current
@@ -424,11 +492,25 @@ class ModelPath {
424
492
 
425
493
 
426
494
  toCurrentIteration() {
427
- return new ModelPath(this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x), this.isAbsolute());
495
+ if (this.isResolved()) {
496
+ return this;
497
+ } else {
498
+ // NOTE Тут не получается наложить дискриминатор
499
+ // @ts-expect-error
500
+ const pathParts = this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x);
501
+ return new ModelPathImpl(pathParts, this.absolute);
502
+ }
428
503
  }
429
504
 
430
505
  toEachIteration() {
431
- return new ModelPath(this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x), this.isAbsolute());
506
+ if (this.isResolved()) {
507
+ return this;
508
+ } else {
509
+ // NOTE Тут не получается наложить дискриминатор
510
+ // @ts-expect-error
511
+ const pathParts = this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x);
512
+ return new ModelPathImpl(pathParts, this.absolute);
513
+ }
432
514
  }
433
515
 
434
516
  toAbsolute() {
@@ -436,11 +518,11 @@ class ModelPath {
436
518
  throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);
437
519
  }
438
520
 
439
- return new AbsoluteModelPath(this.tokens);
521
+ return new ModelPathImpl(this.tokens, true);
440
522
  }
441
523
 
442
524
  *getAllParentPaths() {
443
- const result = ModelPath.builder(this.isAbsolute());
525
+ const result = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
444
526
 
445
527
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
446
528
  result.append(token);
@@ -452,20 +534,22 @@ class ModelPath {
452
534
  const lastItem = _IterableUtils.IterUtils.last(this.tokens);
453
535
 
454
536
  if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {
455
- return new ModelPath(this.tokens.slice(0, -1), this.absolute);
537
+ return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);
456
538
  }
457
539
 
458
540
  return this;
459
541
  }
460
542
 
461
543
  getParentPath() {
462
- const result = ModelPath.builder(this.isAbsolute());
544
+ const result = new _ModelPathBuilder.ModelPathBuilder(this.absolute);
463
545
 
464
546
  for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
465
547
  result.append(token);
466
- }
548
+ } // Тут получается так, что по другому никак
549
+ // @ts-expect-error
550
+
467
551
 
468
- return result.toAbsolutePath();
552
+ return result.toPath();
469
553
  }
470
554
 
471
555
  applyInstancesDirty(instances) {
@@ -474,7 +558,7 @@ class ModelPath {
474
558
  }
475
559
 
476
560
  let instanceCounter = 0;
477
- const result = ModelPath.builder();
561
+ const result = new _ModelPathBuilder.ModelPathBuilder(true);
478
562
 
479
563
  for (const token of this.getPathParts()) {
480
564
  if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {
@@ -485,9 +569,11 @@ class ModelPath {
485
569
  } else {
486
570
  result.append(token);
487
571
  }
488
- }
572
+ } // Тут получается так, что по другому никак
573
+ // @ts-expect-error
489
574
 
490
- return result.toAbsolutePath();
575
+
576
+ return result.toPath();
491
577
  }
492
578
 
493
579
  pathPartToString(pathPart) {
@@ -506,93 +592,7 @@ class ModelPath {
506
592
  throw new Error(`Unknown path part specified: ${(0, _TypingUtils.ensureAndGetString)(pathPart)}`);
507
593
  }
508
594
 
509
- // @ts-ignore
510
- __reactstandin__regenerateByEval(key, code) {
511
- // @ts-ignore
512
- this[key] = eval(code);
513
- }
514
-
515
595
  }
516
596
 
517
- exports.ModelPath = ModelPath;
518
-
519
- class AbsoluteModelPath extends ModelPath {
520
- constructor(pathParts) {
521
- super(pathParts, true);
522
- }
523
-
524
- static createAbsoluteFromMask(path, multiplicitySymbol) {
525
- const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
526
-
527
- if (path.startsWith("/")) {
528
- return new AbsoluteModelPath(partPartStrings.slice(1));
529
- }
530
-
531
- return new AbsoluteModelPath(partPartStrings);
532
- }
533
-
534
- static createAbsolute(path) {
535
- const partPartStrings = path.split("/");
536
- this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
537
-
538
- if (path.startsWith("/")) {
539
- return new AbsoluteModelPath(partPartStrings.slice(1));
540
- }
541
-
542
- return new AbsoluteModelPath(partPartStrings);
543
- }
544
-
545
- joinWith(path) {
546
- return super.joinWith(path).toAbsolute();
547
- }
548
-
549
- getParentPath() {
550
- const result = ModelPath.builder(true);
551
-
552
- for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
553
- result.append(token);
554
- }
555
-
556
- return result.toAbsolutePath();
557
- }
558
-
559
- applyInstancesDirty(instances) {
560
- return super.applyInstancesDirty(instances).toAbsolute();
561
- }
562
-
563
- // @ts-ignore
564
- __reactstandin__regenerateByEval(key, code) {
565
- // @ts-ignore
566
- this[key] = eval(code);
567
- }
568
-
569
- }
570
-
571
- exports.AbsoluteModelPath = AbsoluteModelPath;
572
- ;
573
-
574
- (function () {
575
- var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
576
-
577
- if (!reactHotLoader) {
578
- return;
579
- }
580
-
581
- reactHotLoader.register(EachSymbol, "EachSymbol", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
582
- reactHotLoader.register(CurrentSymbol, "CurrentSymbol", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
583
- reactHotLoader.register(PathTokens, "PathTokens", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
584
- reactHotLoader.register(isModelPath, "isModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
585
- reactHotLoader.register(convertToLegacyPath, "convertToLegacyPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
586
- reactHotLoader.register(convertToAbsolutModelPath, "convertToAbsolutModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
587
- reactHotLoader.register(AbsoluteModelFieldPath, "AbsoluteModelFieldPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
588
- reactHotLoader.register(ModelPath, "ModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
589
- reactHotLoader.register(AbsoluteModelPath, "AbsoluteModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
590
- })();
591
-
592
- ;
593
-
594
- (function () {
595
- var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
596
- leaveModule && leaveModule(module);
597
- })();
598
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiY29udmVydFRvTGVnYWN5UGF0aCIsInRvTGVnYWN5UGF0aCIsImNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgiLCJBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbU1hc2siLCJBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIiwiY29uc3RydWN0b3IiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImlzRXF1YWxzIiwibW9kZWxQYXRoIiwiZWFjaEN1cnJlbnRDb2xsaXNpb24iLCJFYWNoQ3VycmVudENvbGxpc2lvbiIsIkFyZVNhbWUiLCJjcmVhdGVGcm9tU3RyaW5nIiwicGF0aFdpdGhGaWVsZE5hbWUiLCJlbmRzV2l0aCIsImNyZWF0ZUFic29sdXRlIiwicmVwbGFjZSIsImNyZWF0ZUZyb21NYXNrIiwibXVsdGlwbGljaXR5U3ltYm9sIiwiTW9kZWxQYXRoIiwicGF0aFBhcnRzIiwiYWJzb2x1dGUiLCJ0b2tlbnMiLCJsZWdhY3lQYXRoIiwiZmlsdGVyIiwieCIsImVtcHR5IiwiYnVpbGRlciIsImZvcmNlQWJzb2x1dGUiLCJNb2RlbFBhdGhCdWlsZGVyIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwibWFwIiwiam9pbiIsInBhcnRzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiQXJyYXkiLCJpc0FycmF5Iiwic29tZSIsIkVycm9yIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsImV2ZXJ5IiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsIkl0ZXJhdG9yIiwiZnJvbSIsIkl0ZXJVdGlscyIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwiaGFzaCIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiaXNFbXB0eSIsIm1hdGNoRm9yIiwiUGF0aE1hdGNoZXIiLCJtYXRjaCIsInNwbGl0QnlNdWx0aXBsaWNpdHkiLCJsYXN0U2ltcGxlUGFydHMiLCJhcHBlbmQiLCJ0b1BhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwidG9BYnNvbHV0ZVBhdGgiLCJhcHBseUluc3RhbmNlc0RpcnR5IiwiaW5zdGFuY2VzIiwiaW5zdGFuY2VDb3VudGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7O0FB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eEMsQ0FBcEIsRUFBZ0U7QUFDNURrRCxNQUFBQSxNQUFNLENBQUNWLE1BQVAsQ0FBY3JDLEtBQWQ7QUFDSDs7QUFDRCxXQUFPK0MsTUFBTSxDQUFDTyxjQUFQLEVBQVA7QUFDSDs7QUFFTUMsRUFBQUEsbUJBQW1CLENBQUNDLFNBQUQsRUFBa0Q7QUFDeEUsV0FBTyxNQUFNRCxtQkFBTixDQUEwQkMsU0FBMUIsRUFBcUNYLFVBQXJDLEVBQVA7QUFDSDs7QUFwQzRDO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7Ozs7Ozs7Ozs7OzswQkE5YzNDOUcsVTswQkFDQUcsYTswQkFFT0MsVTswQkFxQkdRLFc7MEJBSUFFLG1COzBCQUlBRSx5QjswQkFJSEcsc0I7MEJBMERBZ0IsUzswQkFnWEFsQixpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpbmRpbmdQYXRoLCBWaWV3TW9kZWxGaWVsZE5hbWUgfSBmcm9tIFwiLi4vLi4vRW5naW5lL3NyYy9FbmdpbmUvQ29yZS9Db3JlVHlwZXNcIjtcbmltcG9ydCB7IGNvdW50LCBJdGVyVXRpbHMsIHJldmVyc2VBcnJheSB9IGZyb20gXCIuLi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBlbnN1cmVBbmRHZXRTdHJpbmcsIHJlamVjdCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBFYWNoQ3VycmVudENvbGxpc2lvbiB9IGZyb20gXCIuL0VhY2hDdXJyZW50Q29sbGlzaW9uXCI7XG5pbXBvcnQgeyBNb2RlbFBhdGhCdWlsZGVyIH0gZnJvbSBcIi4vTW9kZWxQYXRoQnVpbGRlclwiO1xuaW1wb3J0IHsgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaGluZyB9IGZyb20gXCIuL1BhdGhNYXRjaGVyXCI7XG5pbXBvcnQgeyBJRXF1YXRhYmxlIH0gZnJvbSBcIi4vSUVxdWF0YWJsZVwiO1xuXG5jb25zdCBFYWNoU3ltYm9sID0gU3ltYm9sLmZvcihcIl9fRUFDSF9fXCIpO1xuY29uc3QgQ3VycmVudFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0NVUlJFTlRfX1wiKTtcblxuZXhwb3J0IGNsYXNzIFBhdGhUb2tlbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgZWFjaDogdHlwZW9mIEVhY2hTeW1ib2wgPSBFYWNoU3ltYm9sO1xuICAgIHB1YmxpYyBzdGF0aWMgY3VycmVudDogdHlwZW9mIEN1cnJlbnRTeW1ib2wgPSBDdXJyZW50U3ltYm9sO1xuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCB8fCBwYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1NpbXBsZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbnN0YW5jZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvaS50ZXN0KHBhcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU2ltcGxlUGF0aFRva2VuID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBQYXRoVG9rZW4gPSBTaW1wbGVQYXRoVG9rZW4gfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBwYXRoIGlzIE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTGVnYWN5UGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCk6IEJpbmRpbmdQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoLnRvTGVnYWN5UGF0aCgpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogQWJzb2x1dGVNb2RlbFBhdGguY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgY2xhc3MgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IEFic29sdXRlTW9kZWxQYXRoO1xuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZDogVmlld01vZGVsRmllbGROYW1lIHwgXCIkZXJyb3JDb3VudFwiIHwgXCIkd2FybmluZ0NvdW50XCI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogQWJzb2x1dGVNb2RlbFBhdGgsIGZpZWxkTmFtZTogVmlld01vZGVsRmllbGROYW1lIHwgXCIkZXJyb3JDb3VudFwiIHwgXCIkd2FybmluZ0NvdW50XCIpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFcXVhbHMoXG4gICAgICAgIG1vZGVsUGF0aDogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCxcbiAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmlzRXF1YWxzKG1vZGVsUGF0aC5wYXRoLCBlYWNoQ3VycmVudENvbGxpc2lvbikgJiYgdGhpcy5maWVsZCA9PT0gbW9kZWxQYXRoLmZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbVN0cmluZyhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nKTogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kZXJyb3JDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJGVycm9yQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJHdhcm5pbmdDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJHdhcm5pbmdDb3VudFwiLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgXCIkd2FybmluZ0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lKSwgXCJ2YWx1ZVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lOiBzdHJpbmcsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kZXJyb3JDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2soXG4gICAgICAgICAgICAgICAgICAgIHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2l0eVN5bWJvbFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgQWJzb2x1dGVNb2RlbFBhdGguY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhcbiAgICAgICAgICAgICAgICAgICAgcGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNpdHlTeW1ib2xcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUsIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICBcInZhbHVlXCJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFBhdGggaW1wbGVtZW50cyBJRXF1YXRhYmxlPE1vZGVsUGF0aD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFic29sdXRlOiBib29sZWFuO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogcmVhZG9ubHkgUGF0aFRva2VuW10sIGFic29sdXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbXB0eSgpOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChbXSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYnVpbGRlcihmb3JjZUFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbFBhdGhCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhCdWlsZGVyKGZvcmNlQWJzb2x1dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbVN0cmluZyhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgdGhpcy5lbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgICAgICBpZiAoYWJzb2x1dGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgam9pbiguLi5wYXJ0czogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuIHwgUGF0aFRva2VuW10+KTogTW9kZWxQYXRoIHtcbiAgICAgICAgbGV0IGFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBqb2luSXRlbSBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqb2luSXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqb2luSXRlbSBpbnN0YW5jZW9mIE1vZGVsUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChqb2luSXRlbS5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS50b2tlbnNdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0udG9rZW5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoam9pbkl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaCguLi5qb2luSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gKiBzeW1ib2xcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGF0aFBhcnRzKCk6IEl0ZXJhYmxlPFBhdGhUb2tlbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogcmVhZG9ubHkgUGF0aFRva2VuW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW10ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC10L3RgtC40YDRg9C10YIg0YfRgtC+INCx0YPQtNGD0YIg0YLQvtC70YzQutC+IFNpbXBsZVBhdGhUb2tlbi5cbiAgICAgICAgLy8g0JLRgdC1IG1hcCDQuCBmaWx0ZXIg0YPQsdGA0LDQvdGLINC00LvRjyDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gTW9kZWxQYXRoLmpvaW4odGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5ldmVyeShQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgodG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5hYnNvbHV0ZSA/IFwiL1wiIDogXCJcIikgKyB0aGlzLnRva2Vucy5tYXAoeCA9PiB0aGlzLnBhdGhQYXJ0VG9TdHJpbmcoeCkpLmpvaW4oXCIvXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVnYWN5UGF0aCA/PyAodGhpcy5sZWdhY3lQYXRoID0gdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IE1vZGVsUGF0aCxcbiAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTGVnYWN5UGF0aCgpID09PSBtb2RlbFBhdGgudG9MZWdhY3lQYXRoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSgpID09PSBtb2RlbFBhdGguaXNBYnNvbHV0ZSgpICYmXG4gICAgICAgICAgICAgICAgSXRlcmF0b3IuZnJvbShJdGVyVXRpbHMuemlwKHRoaXMuZ2V0UGF0aFBhcnRzKCksIG1vZGVsUGF0aC5nZXRQYXRoUGFydHMoKSkpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoW3QxLCB0Ml0pID0+IHQxID09PSB0MlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGB0LXQs9C00LAg0YbQtdC70L7QtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDQsdC10LfQt9C90LDQutC+0LLQvtC1IDMyLdCx0LjRgtC90L7QtSDRh9C40YHQu9C+XG4gICAgICovXG4gICAgcHVibGljIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZSk6IG51bWJlciB7XG4gICAgICAgIGxldCBoYXNoID0gNTM4MTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiByZXZlcnNlQXJyYXkodGhpcy50b2tlbnMpKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFN0cjogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlYWNoQ3VycmVudENvbGxpc2lvbiA9PT0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlRGlmZmVyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbiA9PT0gUGF0aFRva2Vucy5lYWNoID8gXCIqXCIgOiBcIiFcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gXCIqXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0cmluZ0luZGV4ID0gY3VycmVudFN0ci5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgICAgIGhhc2ggPSAoaGFzaCAqIDMzKSBeIGN1cnJlbnRTdHIuY2hhckNvZGVBdCgtLXN0cmluZ0luZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAgICB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgSmF2YVNjcmlwdCBkb2VzIGJpdHdpc2Ugb3BlcmF0aW9ucyAobGlrZSBYT1IsIGFib3ZlKSBvbiAzMi1iaXQgc2lnbmVkXG4gICAgICAgICAgICBpbnRlZ2Vycy4gU2luY2Ugd2Ugd2FudCB0aGUgcmVzdWx0cyB0byBiZSBhbHdheXMgcG9zaXRpdmUsIGNvbnZlcnQgdGhlXG4gICAgICAgICAgICBzaWduZWQgaW50IHRvIGFuIHVuc2lnbmVkIGJ5IGRvaW5nIGFuIHVuc2lnbmVkIGJpdHNoaWZ0LlxuICAgICAgKi9cbiAgICAgICAgcmV0dXJuIGhhc2ggPj4+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gbW9kZWxQYXRoLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gbW9kZWxQYXRoLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGVmdFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFBhcnQgIT09IHJpZ2h0UGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgfHwgbGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoTnVtYmVyKHJpZ2h0UGFydCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5jdXJyZW50ICYmIHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVyYXRpb25SYW5rKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb3VudChJdGVyYXRvci5mcm9tKHRoaXMudG9rZW5zKS5maWx0ZXIoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hGb3IobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBQYXRoTWF0Y2hpbmcge1xuICAgICAgICBpZiAoIXRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7bW9kZWxQYXRoLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXRoTWF0Y2hlci5tYXRjaCh0aGlzLnRva2VucywgbW9kZWxQYXRoLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljICpzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPE1vZGVsUGF0aCB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w+IHtcbiAgICAgICAgbGV0IGxhc3RTaW1wbGVQYXJ0cyA9IE1vZGVsUGF0aC5idWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0U2ltcGxlUGFydHMuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBNb2RlbFBhdGguYnVpbGRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5vcm1hbGl6ZSgpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0aFBhcnQgb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRUb2tlbnMucG9wKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggaXMgaW52YWxpZCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2goXCIuLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHJlc3VsdFRva2VucywgdGhpcy5pc0Fic29sdXRlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLm1hcCh4ID0+ICh4ID09PSBQYXRoVG9rZW5zLmVhY2ggPyBQYXRoVG9rZW5zLmN1cnJlbnQgOiB4KSksXG4gICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgoXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5tYXAoeCA9PiAoeCA9PT0gUGF0aFRva2Vucy5jdXJyZW50ID8gUGF0aFRva2Vucy5lYWNoIDogeCkpLFxuICAgICAgICAgICAgdGhpcy5pc0Fic29sdXRlKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGlmICghdGhpcy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICcke3RoaXMudG9MZWdhY3lQYXRoKCl9IGlzIG5vdCBhYnNvbHV0ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHRoaXMudG9rZW5zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNb2RlbFBhdGguYnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgSXRlclV0aWxzLnNraXBMYXN0KHRoaXMuZ2V0UGF0aFBhcnRzKCksIDEpKSB7XG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdC50b1BhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgaWYgKGxhc3RJdGVtICE9IHVuZGVmaW5lZCAmJiBQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihsYXN0SXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHRoaXMudG9rZW5zLnNsaWNlKDAsIC0xKSwgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudFBhdGgoKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTW9kZWxQYXRoLmJ1aWxkZXIodGhpcy5pc0Fic29sdXRlKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b0Fic29sdXRlUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBNb2RlbFBhdGgge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkgfHwgaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluc3RhbmNlQ291bnRlciA9IDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE1vZGVsUGF0aC5idWlsZGVyKCk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy5nZXRQYXRoUGFydHMoKSkge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHRva2VuKSAmJiBpbnN0YW5jZUNvdW50ZXIgPCBpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpbnN0YW5jZXNbaW5zdGFuY2VDb3VudGVyXSA/PyByZWplY3QoKSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudGVyKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudG9BYnNvbHV0ZVBhdGgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhdGhQYXJ0VG9TdHJpbmcocGF0aFBhcnQ6IFBhdGhUb2tlbik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoUGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIqXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBhdGggcGFydCBzcGVjaWZpZWQ6ICR7ZW5zdXJlQW5kR2V0U3RyaW5nKHBhdGhQYXJ0KX1gKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBYnNvbHV0ZU1vZGVsUGF0aCBleHRlbmRzIE1vZGVsUGF0aCB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogcmVhZG9ubHkgUGF0aFRva2VuW10pIHtcbiAgICAgICAgc3VwZXIocGF0aFBhcnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpLm1hcCh4ID0+ICh4ID09PSBcIipcIiA/IG11bHRpcGxpY2l0eVN5bWJvbCA6IHgpKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICB0aGlzLmVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkocGFydFBhcnRTdHJpbmdzKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKHBhdGg6IE1vZGVsUGF0aCB8IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmpvaW5XaXRoKHBhdGgpLnRvQWJzb2x1dGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE1vZGVsUGF0aC5idWlsZGVyKHRydWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b0Fic29sdXRlUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIHJldHVybiBzdXBlci5hcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlcykudG9BYnNvbHV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
597
+ exports.ModelPathImpl = ModelPathImpl;
598
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiTW9kZWxQYXRoSW1wbCIsImNvbnZlcnRUb0xlZ2FjeVBhdGgiLCJ0b0xlZ2FjeVBhdGgiLCJjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoIiwiY3JlYXRlQWJzb2x1dGVGcm9tTWFzayIsImVtcHR5TW9kZWxQYXRoIiwiZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZU1vZGVsUGF0aCIsImFic29sdXRlIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwiY3JlYXRlRnJvbU1hc2siLCJtdWx0aXBsaWNpdHlTeW1ib2wiLCJtYXAiLCJ4IiwicGFydHMiLCJzb21lIiwiRXJyb3IiLCJjcmVhdGVBYnNvbHV0ZSIsImNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnMiLCJ0b2tlbnMiLCJjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2VucyIsImNyZWF0ZVJlbGF0aXZlRnJvbVRva2VucyIsImpvaW5Nb2RlbFBhdGhzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIkFic29sdXRlTW9kZWxGaWVsZFBhdGgiLCJjb25zdHJ1Y3RvciIsImZpZWxkTmFtZSIsImZpZWxkIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsImNyZWF0ZUZyb21TdHJpbmciLCJwYXRoV2l0aEZpZWxkTmFtZSIsImVuZHNXaXRoIiwicmVwbGFjZSIsImlzQWxsVG9rZW5zUmVzb2x2ZWQiLCJldmVyeSIsInBhdGhQYXJ0cyIsImxlZ2FjeVBhdGgiLCJmaWx0ZXIiLCJyZXNvbHZlZCIsImdldFBhdGhQYXJ0cyIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsInJlc29sdmVBbGwiLCJpbnN0YW5jZSIsImlzQ29udGFpbkl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJJdGVyYXRvciIsImZyb20iLCJJdGVyVXRpbHMiLCJ6aXAiLCJ0MSIsInQyIiwiZ2V0SGFzaCIsImhhc2giLCJjdXJyZW50U3RyIiwiQXJlRGlmZmVyZW50Iiwic3RyaW5nSW5kZXgiLCJjaGFyQ29kZUF0IiwiaXNJbmNsdWRlcyIsInRhcmdldFRva2VucyIsImkiLCJsZWZ0UGFydCIsInJpZ2h0UGFydCIsImlzRmluaXRlIiwiTnVtYmVyIiwiZ2V0SXRlcmF0aW9uUmFuayIsImlzRW1wdHkiLCJtYXRjaEZvciIsIlBhdGhNYXRjaGVyIiwibWF0Y2giLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImluc3RhbmNlQ291bnRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEdBQVAsQ0FBVyxVQUFYLENBQW5CO0FBQ0EsTUFBTUMsYUFBYSxHQUFHRixNQUFNLENBQUNDLEdBQVAsQ0FBVyxhQUFYLENBQXRCOztBQUVPLE1BQU1FLFVBQU4sQ0FBaUI7QUFJTSxTQUFaQyxZQUFZLENBQUNDLElBQUQsRUFBZ0Y7QUFDdEcsV0FBT0EsSUFBSSxLQUFLRixVQUFVLENBQUNHLElBQXBCLElBQTRCRCxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0ksT0FBdkQ7QUFDSDs7QUFFMEIsU0FBYkMsYUFBYSxDQUFDSCxJQUFELEVBQThDO0FBQ3JFLFdBQU8sT0FBT0EsSUFBUCxLQUFnQixRQUF2QjtBQUNIOztBQUU0QixTQUFmSSxlQUFlLENBQUNKLElBQUQsRUFBOEM7QUFDdkUsV0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCLFNBQVNLLElBQVQsQ0FBY0wsSUFBZCxDQUFuQztBQUNIOztBQWRtQjs7O0FBQVhGLFUsQ0FDS0csSSxHQUEwQlAsVTtBQUQvQkksVSxDQUVLSSxPLEdBQWdDTCxhOztBQW1CM0MsU0FBU1MsV0FBVCxDQUFxQkMsSUFBckIsRUFBaUY7QUFDcEYsU0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCQSxJQUFJLFlBQVlDLGFBQW5EO0FBQ0g7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJGLElBQTdCLEVBQXlFO0FBQzVFLFNBQU9ELFdBQVcs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QUFDckMsVUFBSWhFLFVBQVUsQ0FBQ0MsWUFBWCxDQUF3QmlFLEtBQXhCLEtBQWtDK0QsZUFBZSxHQUFHRCxTQUFTLENBQUNsRCxNQUFsRSxFQUEwRTtBQUFBOztBQUN0RXlDLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCwwQkFBY29CLFNBQVMsQ0FBQ0MsZUFBRCxDQUF2Qix5RUFBNEMsMEJBQTVDO0FBQ0FBLFFBQUFBLGVBQWU7QUFDbEIsT0FIRCxNQUdPO0FBQ0hWLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCxDQUFjMUMsS0FBZDtBQUNIO0FBQ0osS0Fic0YsQ0FjdkY7QUFDQTs7O0FBQ0EsV0FBT3FELE1BQU0sQ0FBQ0UsTUFBUCxFQUFQO0FBQ0g7O0FBRU8xQyxFQUFBQSxnQkFBZ0IsQ0FBQ2tDLFFBQUQsRUFBOEI7QUFDbEQsUUFBSSxPQUFPQSxRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQzlCLGFBQU9BLFFBQVA7QUFDSDs7QUFDRCxRQUFJQSxRQUFRLEtBQUtqSCxVQUFVLENBQUNHLElBQTVCLEVBQWtDO0FBQzlCLGFBQU8sR0FBUDtBQUNIOztBQUNELFFBQUk4RyxRQUFRLEtBQUtqSCxVQUFVLENBQUNJLE9BQTVCLEVBQXFDO0FBQ2pDLGFBQU8sR0FBUDtBQUNIOztBQUNELFVBQU0sSUFBSTBCLEtBQUosQ0FBVyxnQ0FBK0IscUNBQW1CbUYsUUFBbkIsQ0FBNkIsRUFBdkUsQ0FBTjtBQUNIOztBQS9VTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpbmRpbmdQYXRoLCBWaWV3TW9kZWxGaWVsZE5hbWUgfSBmcm9tIFwiLi4vLi4vRW5naW5lL3NyYy9FbmdpbmUvQ29yZS9Db3JlVHlwZXNcIjtcbmltcG9ydCB7IGNvdW50LCBJdGVyVXRpbHMsIHJldmVyc2VBcnJheSB9IGZyb20gXCIuLi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBlbnN1cmVBbmRHZXRTdHJpbmcsIHJlamVjdCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBFYWNoQ3VycmVudENvbGxpc2lvbiB9IGZyb20gXCIuL0VhY2hDdXJyZW50Q29sbGlzaW9uXCI7XG5pbXBvcnQgeyBNb2RlbFBhdGhCdWlsZGVyIH0gZnJvbSBcIi4vTW9kZWxQYXRoQnVpbGRlclwiO1xuaW1wb3J0IHsgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaGluZyB9IGZyb20gXCIuL1BhdGhNYXRjaGVyXCI7XG5pbXBvcnQgeyBJRXF1YXRhYmxlIH0gZnJvbSBcIi4vSUVxdWF0YWJsZVwiO1xuXG5jb25zdCBFYWNoU3ltYm9sID0gU3ltYm9sLmZvcihcIl9fRUFDSF9fXCIpO1xuY29uc3QgQ3VycmVudFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0NVUlJFTlRfX1wiKTtcblxuZXhwb3J0IGNsYXNzIFBhdGhUb2tlbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgZWFjaDogdHlwZW9mIEVhY2hTeW1ib2wgPSBFYWNoU3ltYm9sO1xuICAgIHB1YmxpYyBzdGF0aWMgY3VycmVudDogdHlwZW9mIEN1cnJlbnRTeW1ib2wgPSBDdXJyZW50U3ltYm9sO1xuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCB8fCBwYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1NpbXBsZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbnN0YW5jZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvaS50ZXN0KHBhcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU2ltcGxlUGF0aFRva2VuID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBQYXRoVG9rZW4gPSBTaW1wbGVQYXRoVG9rZW4gfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGggfCB1bmtub3duKTogcGF0aCBpcyBNb2RlbFBhdGgge1xuICAgIHJldHVybiB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIiAmJiBwYXRoIGluc3RhbmNlb2YgTW9kZWxQYXRoSW1wbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xlZ2FjeVBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBCaW5kaW5nUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aC50b0xlZ2FjeVBhdGgoKSA6IHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlNb2RlbFBhdGgoKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihbXSwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCgpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4oW10sIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgYm9vbGVhbj4ocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiAqIHN5bWJvbFwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aChwYXRoOiBzdHJpbmcpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbVRva2Vucyh0b2tlbnM6IFBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxmYWxzZSwgdHJ1ZT4odG9rZW5zLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zKHRva2Vuczogc3RyaW5nW10pOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHRva2Vucyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBzdHJpbmdbXSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXSk6IFJlbGF0aXZlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIGZhbHNlPih0b2tlbnMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Nb2RlbFBhdGhzKC4uLnBhcnRzOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4gfCBQYXRoVG9rZW5bXT4pOiBNb2RlbFBhdGgge1xuICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvaW5JdGVtIG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW9kZWxQYXRoKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgaWYgKGpvaW5JdGVtLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChqb2luSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGQ6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IEFic29sdXRlTW9kZWxQYXRoLCBmaWVsZE5hbWU6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5pc0VxdWFscyhtb2RlbFBhdGgucGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24pICYmIHRoaXMuZmllbGQgPT09IG1vZGVsUGF0aC5maWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcocGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZyk6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiRlcnJvckNvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiR3YXJuaW5nQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZSksIFwidmFsdWVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkd2FybmluZ0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLmVycm9yc0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLmVycm9yc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JzQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIud2FybmluZ3NDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi53YXJuaW5nc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwid2FybmluZ3NDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLCBtdWx0aXBsaWNpdHlTeW1ib2wpLCBcInZhbHVlXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kZWxQYXRoPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgZXh0ZW5kcyBJRXF1YXRhYmxlPElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4+IHtcbiAgICByZWFkb25seSByZXNvbHZlZDogVFJlc29sdmVkO1xuICAgIHJlYWRvbmx5IGFic29sdXRlOiBUQWJzb2x1dGU7XG5cbiAgICBpc0VxdWFscyhtb2RlbFBhdGg6IE1vZGVsUGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IGJvb2xlYW47XG4gICAgZ2V0SGFzaChlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuXG4gICAgaXNSZXNvbHZlZCgpOiB0aGlzIGlzIElNb2RlbFBhdGg8dHJ1ZSwgVEFic29sdXRlPjtcbiAgICBpc0Fic29sdXRlKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuICAgIHRvQWJzb2x1dGUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuXG4gICAgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4+KTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuXG4gICAgZ2V0UGF0aFBhcnRzKCk6IEl0ZXJhYmxlPFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zU3RyaWN0KCk6IEl0ZXJhYmxlPFNpbXBsZVBhdGhUb2tlbj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXTtcblxuICAgIHJlc29sdmVBbGwoaW5zdGFuY2U6IHN0cmluZyk6IE1vZGVsUGF0aDtcbiAgICBpc0NvbnRhaW5JdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgZ2V0TGFzdExpc3RQYXRoKCk6IFBhdGhUb2tlbltdO1xuICAgIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuO1xuICAgIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD47XG4gICAgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPjtcbiAgICB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBnZXRQYXJlbnRQYXRoKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICAgIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZU1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgdHJ1ZT47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCB0cnVlPjtcblxuZXhwb3J0IHR5cGUgUmVsYXRpdmVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGZhbHNlPjtcbmV4cG9ydCB0eXBlIFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGZhbHNlPjtcblxudHlwZSBQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4+ID0gVFJlc29sdmVkIGV4dGVuZHMgdHJ1ZSA/IHN0cmluZyA6IFBhdGhUb2tlbjtcblxudHlwZSBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IEFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbnR5cGUgUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcblxuZnVuY3Rpb24gaXNBbGxUb2tlbnNSZXNvbHZlZDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPih0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPik6IFRSZXNvbHZlZCB7XG4gICAgLy8g0K8g0YfRgtC+LdGC0L4g0L3QtdC80L7Qs9GDINGB0L7QvtCx0YDQsNC30LjRgtGMINC60LDQuiDRgtGD0YIg0LLRgdGRINGB0YLRgNC+0LPQviDQvdCw0L/QuNGB0LDRgtGMLi4uXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiB0b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUGF0aEltcGw8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBpbXBsZW1lbnRzIElFcXVhdGFibGU8TW9kZWxQYXRoPiwgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+LCBhYnNvbHV0ZTogVEFic29sdXRlKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvbHZlZCgpOiBUUmVzb2x2ZWQge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+IHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0LXQvdGC0LjRgNGD0LXRgiDRh9GC0L4g0LHRg9C00YPRgiDRgtC+0LvRjNC60L4gU2ltcGxlUGF0aFRva2VuLlxuICAgICAgICAvLyDQktGB0LUgbWFwINC4IGZpbHRlciDRg9Cx0YDQsNC90Ysg0LTQu9GPINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gam9pbk1vZGVsUGF0aHModGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT4ge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5ldmVyeShQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmV2ZXJzZUFycmF5KHRoaXMudG9rZW5zKSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW4gPT09IFBhdGhUb2tlbnMuZWFjaCA/IFwiKlwiIDogXCIhXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgc2lnbmVkIGludCB0byBhbiB1bnNpZ25lZCBieSBkb2luZyBhbiB1bnNpZ25lZCBiaXRzaGlmdC5cbiAgICAgICovXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVzKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFRva2VucyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IHRhcmdldFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gdGFyZ2V0VG9rZW5zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0UGFydCAhPT0gcmlnaHRQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCB8fCBsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShOdW1iZXIocmlnaHRQYXJ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmN1cnJlbnQgJiYgcmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvdW50KEl0ZXJhdG9yLmZyb20odGhpcy50b2tlbnMpLmZpbHRlcih4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZyB7XG4gICAgICAgIGlmICghdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb2RlbFBhdGguaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHttb2RlbFBhdGgudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhdGhNYXRjaGVyLm1hdGNoKHRoaXMudG9rZW5zLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuIl19