@angular/compiler-cli 9.0.0-rc.6 → 9.0.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 (255) hide show
  1. package/ngcc/src/analysis/decoration_analyzer.d.ts +13 -26
  2. package/ngcc/src/analysis/decoration_analyzer.js +100 -134
  3. package/ngcc/src/analysis/migration_host.d.ts +5 -16
  4. package/ngcc/src/analysis/migration_host.js +20 -91
  5. package/ngcc/src/analysis/module_with_providers_analyzer.js +2 -2
  6. package/ngcc/src/analysis/ngcc_trait_compiler.d.ts +42 -0
  7. package/ngcc/src/analysis/ngcc_trait_compiler.js +107 -0
  8. package/ngcc/src/analysis/private_declarations_analyzer.d.ts +0 -1
  9. package/ngcc/src/analysis/private_declarations_analyzer.js +4 -35
  10. package/ngcc/src/analysis/types.d.ts +6 -21
  11. package/ngcc/src/analysis/types.js +1 -1
  12. package/ngcc/src/analysis/util.d.ts +2 -5
  13. package/ngcc/src/analysis/util.js +11 -94
  14. package/ngcc/src/dependencies/commonjs_dependency_host.d.ts +1 -1
  15. package/ngcc/src/dependencies/commonjs_dependency_host.js +90 -39
  16. package/ngcc/src/dependencies/dependency_host.d.ts +7 -5
  17. package/ngcc/src/dependencies/dependency_host.js +12 -10
  18. package/ngcc/src/dependencies/dependency_resolver.d.ts +2 -1
  19. package/ngcc/src/dependencies/dependency_resolver.js +9 -4
  20. package/ngcc/src/dependencies/dts_dependency_host.d.ts +21 -0
  21. package/ngcc/src/dependencies/dts_dependency_host.js +34 -0
  22. package/ngcc/src/dependencies/esm_dependency_host.d.ts +8 -1
  23. package/ngcc/src/dependencies/esm_dependency_host.js +30 -22
  24. package/ngcc/src/dependencies/module_resolver.d.ts +1 -1
  25. package/ngcc/src/dependencies/module_resolver.js +1 -1
  26. package/ngcc/src/dependencies/umd_dependency_host.d.ts +1 -1
  27. package/ngcc/src/dependencies/umd_dependency_host.js +3 -3
  28. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.d.ts +2 -0
  29. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +49 -9
  30. package/ngcc/src/execution/cluster/executor.d.ts +3 -1
  31. package/ngcc/src/execution/cluster/executor.js +12 -7
  32. package/ngcc/src/execution/cluster/package_json_updater.js +3 -2
  33. package/ngcc/src/execution/cluster/worker.d.ts +3 -1
  34. package/ngcc/src/execution/cluster/worker.js +10 -7
  35. package/ngcc/src/execution/lock_file.d.ts +43 -0
  36. package/ngcc/src/execution/lock_file.js +129 -0
  37. package/ngcc/src/execution/single_process_executor.d.ts +3 -1
  38. package/ngcc/src/execution/single_process_executor.js +18 -15
  39. package/ngcc/src/execution/task_selection/base_task_queue.d.ts +1 -1
  40. package/ngcc/src/host/commonjs_host.d.ts +6 -18
  41. package/ngcc/src/host/commonjs_host.js +45 -81
  42. package/ngcc/src/host/commonjs_umd_utils.d.ts +73 -0
  43. package/ngcc/src/host/commonjs_umd_utils.js +109 -0
  44. package/ngcc/src/host/esm2015_host.d.ts +46 -14
  45. package/ngcc/src/host/esm2015_host.js +182 -55
  46. package/ngcc/src/host/esm5_host.js +3 -1
  47. package/ngcc/src/host/umd_host.d.ts +12 -5
  48. package/ngcc/src/host/umd_host.js +144 -92
  49. package/ngcc/src/main.js +65 -122
  50. package/ngcc/src/migrations/migration.d.ts +1 -0
  51. package/ngcc/src/migrations/migration.js +1 -1
  52. package/ngcc/src/packages/build_marker.d.ts +17 -8
  53. package/ngcc/src/packages/build_marker.js +61 -32
  54. package/ngcc/src/packages/entry_point_bundle.js +2 -2
  55. package/ngcc/src/packages/transformer.js +5 -6
  56. package/ngcc/src/rendering/commonjs_rendering_formatter.js +9 -5
  57. package/ngcc/src/rendering/dts_renderer.js +8 -5
  58. package/ngcc/src/rendering/esm_rendering_formatter.js +17 -5
  59. package/ngcc/src/rendering/renderer.js +4 -4
  60. package/ngcc/src/rendering/umd_rendering_formatter.d.ts +18 -1
  61. package/ngcc/src/rendering/umd_rendering_formatter.js +69 -16
  62. package/ngcc/src/utils.d.ts +14 -0
  63. package/ngcc/src/utils.js +29 -1
  64. package/ngcc/src/writing/cleaning/cleaning_strategies.d.ts +45 -0
  65. package/ngcc/src/writing/cleaning/cleaning_strategies.js +77 -0
  66. package/ngcc/src/writing/cleaning/package_cleaner.d.ts +39 -0
  67. package/ngcc/src/writing/cleaning/package_cleaner.js +125 -0
  68. package/ngcc/src/writing/cleaning/utils.d.ts +16 -0
  69. package/ngcc/src/writing/cleaning/utils.js +29 -0
  70. package/ngcc/src/writing/in_place_file_writer.d.ts +1 -0
  71. package/ngcc/src/writing/in_place_file_writer.js +3 -2
  72. package/ngcc/src/writing/new_entry_point_file_writer.d.ts +2 -0
  73. package/ngcc/src/writing/new_entry_point_file_writer.js +5 -4
  74. package/ngcc/src/writing/package_json_updater.d.ts +24 -10
  75. package/ngcc/src/writing/package_json_updater.js +53 -10
  76. package/package.json +6 -5
  77. package/src/main.d.ts +2 -2
  78. package/src/metadata/symbols.d.ts +1 -1
  79. package/src/ngtsc/annotations/src/component.d.ts +58 -20
  80. package/src/ngtsc/annotations/src/component.js +149 -97
  81. package/src/ngtsc/annotations/src/diagnostics.d.ts +23 -0
  82. package/src/ngtsc/annotations/src/diagnostics.js +123 -0
  83. package/src/ngtsc/annotations/src/directive.d.ts +19 -8
  84. package/src/ngtsc/annotations/src/directive.js +41 -18
  85. package/src/ngtsc/annotations/src/injectable.d.ts +8 -4
  86. package/src/ngtsc/annotations/src/injectable.js +7 -3
  87. package/src/ngtsc/annotations/src/ng_module.d.ts +22 -7
  88. package/src/ngtsc/annotations/src/ng_module.js +115 -52
  89. package/src/ngtsc/annotations/src/pipe.d.ts +12 -6
  90. package/src/ngtsc/annotations/src/pipe.js +22 -5
  91. package/src/ngtsc/annotations/src/util.d.ts +22 -0
  92. package/src/ngtsc/annotations/src/util.js +92 -3
  93. package/src/ngtsc/core/api.d.ts +368 -0
  94. package/src/ngtsc/core/api.js +20 -0
  95. package/src/ngtsc/core/index.d.ts +10 -0
  96. package/src/ngtsc/core/index.js +24 -0
  97. package/src/ngtsc/core/src/compiler.d.ts +120 -0
  98. package/src/ngtsc/core/src/compiler.js +769 -0
  99. package/src/ngtsc/core/src/host.d.ts +85 -0
  100. package/src/ngtsc/core/src/host.js +208 -0
  101. package/src/ngtsc/cycles/src/imports.js +2 -2
  102. package/src/ngtsc/diagnostics/index.d.ts +1 -1
  103. package/src/ngtsc/diagnostics/index.js +5 -5
  104. package/src/ngtsc/diagnostics/src/error.d.ts +1 -1
  105. package/src/ngtsc/diagnostics/src/error.js +1 -1
  106. package/src/ngtsc/diagnostics/src/{code.d.ts → error_code.d.ts} +27 -4
  107. package/src/ngtsc/diagnostics/src/error_code.js +128 -0
  108. package/src/ngtsc/file_system/src/cached_file_system.d.ts +3 -1
  109. package/src/ngtsc/file_system/src/cached_file_system.js +48 -4
  110. package/src/ngtsc/file_system/src/invalid_file_system.d.ts +3 -1
  111. package/src/ngtsc/file_system/src/invalid_file_system.js +4 -2
  112. package/src/ngtsc/file_system/src/node_js_file_system.d.ts +3 -1
  113. package/src/ngtsc/file_system/src/node_js_file_system.js +8 -4
  114. package/src/ngtsc/file_system/src/types.d.ts +3 -1
  115. package/src/ngtsc/file_system/src/types.js +1 -1
  116. package/src/ngtsc/imports/index.d.ts +3 -3
  117. package/src/ngtsc/imports/index.js +4 -4
  118. package/src/ngtsc/imports/src/alias.d.ts +12 -11
  119. package/src/ngtsc/imports/src/alias.js +21 -16
  120. package/src/ngtsc/imports/src/emitter.d.ts +40 -19
  121. package/src/ngtsc/imports/src/emitter.js +54 -26
  122. package/src/ngtsc/imports/src/references.d.ts +30 -8
  123. package/src/ngtsc/imports/src/references.js +41 -6
  124. package/src/ngtsc/imports/src/resolver.d.ts +3 -6
  125. package/src/ngtsc/imports/src/resolver.js +5 -4
  126. package/src/ngtsc/incremental/api.d.ts +51 -0
  127. package/src/ngtsc/incremental/api.js +20 -0
  128. package/src/ngtsc/incremental/index.d.ts +1 -0
  129. package/src/ngtsc/incremental/index.js +4 -2
  130. package/src/ngtsc/incremental/src/dependency_tracking.d.ts +56 -0
  131. package/src/ngtsc/incremental/src/dependency_tracking.js +186 -0
  132. package/src/ngtsc/incremental/src/noop.d.ts +10 -0
  133. package/src/ngtsc/incremental/src/noop.js +23 -0
  134. package/src/ngtsc/incremental/src/state.d.ts +8 -14
  135. package/src/ngtsc/incremental/src/state.js +83 -80
  136. package/src/ngtsc/indexer/index.d.ts +1 -0
  137. package/src/ngtsc/indexer/index.js +4 -2
  138. package/src/ngtsc/metadata/index.d.ts +1 -1
  139. package/src/ngtsc/metadata/index.js +2 -1
  140. package/src/ngtsc/metadata/src/api.d.ts +8 -0
  141. package/src/ngtsc/metadata/src/api.js +1 -1
  142. package/src/ngtsc/metadata/src/dts.js +2 -1
  143. package/src/ngtsc/metadata/src/registry.d.ts +12 -1
  144. package/src/ngtsc/metadata/src/registry.js +22 -2
  145. package/src/ngtsc/metadata/src/util.d.ts +2 -0
  146. package/src/ngtsc/metadata/src/util.js +10 -1
  147. package/src/ngtsc/modulewithproviders/src/scanner.js +2 -2
  148. package/src/ngtsc/partial_evaluator/index.d.ts +1 -1
  149. package/src/ngtsc/partial_evaluator/index.js +1 -1
  150. package/src/ngtsc/partial_evaluator/src/builtin.d.ts +7 -6
  151. package/src/ngtsc/partial_evaluator/src/builtin.js +54 -9
  152. package/src/ngtsc/partial_evaluator/src/interface.d.ts +3 -9
  153. package/src/ngtsc/partial_evaluator/src/interface.js +4 -3
  154. package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +4 -3
  155. package/src/ngtsc/partial_evaluator/src/interpreter.js +11 -7
  156. package/src/ngtsc/partial_evaluator/src/known_declaration.d.ts +19 -0
  157. package/src/ngtsc/partial_evaluator/src/known_declaration.js +38 -0
  158. package/src/ngtsc/partial_evaluator/src/result.d.ts +1 -1
  159. package/src/ngtsc/partial_evaluator/src/result.js +1 -1
  160. package/src/ngtsc/partial_evaluator/src/ts_helpers.d.ts +1 -1
  161. package/src/ngtsc/partial_evaluator/src/ts_helpers.js +13 -3
  162. package/src/ngtsc/program.d.ts +46 -57
  163. package/src/ngtsc/program.js +68 -574
  164. package/src/ngtsc/reflection/src/host.d.ts +19 -2
  165. package/src/ngtsc/reflection/src/host.js +17 -3
  166. package/src/ngtsc/reflection/src/typescript.js +11 -7
  167. package/src/ngtsc/resource/index.d.ts +9 -0
  168. package/src/ngtsc/resource/index.js +22 -0
  169. package/src/ngtsc/{resource_loader.d.ts → resource/src/loader.d.ts} +4 -4
  170. package/src/ngtsc/resource/src/loader.js +193 -0
  171. package/src/ngtsc/routing/src/route.js +2 -2
  172. package/src/ngtsc/scope/index.d.ts +1 -1
  173. package/src/ngtsc/scope/index.js +1 -1
  174. package/src/ngtsc/scope/src/component_scope.d.ts +2 -2
  175. package/src/ngtsc/scope/src/component_scope.js +1 -1
  176. package/src/ngtsc/scope/src/dependency.js +10 -8
  177. package/src/ngtsc/scope/src/local.d.ts +31 -4
  178. package/src/ngtsc/scope/src/local.js +83 -15
  179. package/src/ngtsc/shims/index.d.ts +2 -1
  180. package/src/ngtsc/shims/index.js +4 -5
  181. package/src/ngtsc/shims/src/api.d.ts +25 -0
  182. package/src/ngtsc/shims/src/api.js +13 -0
  183. package/src/ngtsc/shims/src/factory_generator.d.ts +2 -2
  184. package/src/ngtsc/shims/src/factory_generator.js +1 -1
  185. package/src/ngtsc/shims/src/factory_tracker.d.ts +24 -0
  186. package/src/ngtsc/shims/src/factory_tracker.js +47 -0
  187. package/src/ngtsc/shims/src/summary_generator.d.ts +1 -1
  188. package/src/ngtsc/shims/src/summary_generator.js +1 -1
  189. package/src/ngtsc/shims/src/typecheck_shim.d.ts +1 -1
  190. package/src/ngtsc/shims/src/typecheck_shim.js +1 -1
  191. package/src/ngtsc/synthetic_files_compiler_host.d.ts +1 -1
  192. package/src/ngtsc/transform/index.d.ts +3 -1
  193. package/src/ngtsc/transform/index.js +8 -3
  194. package/src/ngtsc/transform/src/alias.d.ts +1 -1
  195. package/src/ngtsc/transform/src/alias.js +1 -1
  196. package/src/ngtsc/transform/src/api.d.ts +52 -17
  197. package/src/ngtsc/transform/src/api.js +1 -1
  198. package/src/ngtsc/transform/src/compilation.d.ts +68 -47
  199. package/src/ngtsc/transform/src/compilation.js +498 -313
  200. package/src/ngtsc/transform/src/declaration.d.ts +1 -1
  201. package/src/ngtsc/transform/src/declaration.js +6 -1
  202. package/src/ngtsc/transform/src/trait.d.ts +169 -0
  203. package/src/ngtsc/transform/src/trait.js +114 -0
  204. package/src/ngtsc/transform/src/transform.d.ts +2 -2
  205. package/src/ngtsc/transform/src/transform.js +4 -4
  206. package/src/ngtsc/translator/src/translator.d.ts +11 -9
  207. package/src/ngtsc/translator/src/translator.js +51 -18
  208. package/src/ngtsc/typecheck/index.d.ts +1 -0
  209. package/src/ngtsc/typecheck/index.js +4 -2
  210. package/src/ngtsc/typecheck/src/api.d.ts +12 -1
  211. package/src/ngtsc/typecheck/src/api.js +1 -1
  212. package/src/ngtsc/typecheck/src/context.d.ts +3 -2
  213. package/src/ngtsc/typecheck/src/context.js +10 -8
  214. package/src/ngtsc/typecheck/src/diagnostics.d.ts +30 -31
  215. package/src/ngtsc/typecheck/src/diagnostics.js +108 -70
  216. package/src/ngtsc/typecheck/src/dom.d.ts +6 -5
  217. package/src/ngtsc/typecheck/src/dom.js +3 -3
  218. package/src/ngtsc/typecheck/src/environment.d.ts +5 -3
  219. package/src/ngtsc/typecheck/src/environment.js +20 -8
  220. package/src/ngtsc/typecheck/src/expression.d.ts +2 -3
  221. package/src/ngtsc/typecheck/src/expression.js +26 -23
  222. package/src/ngtsc/typecheck/src/host.d.ts +1 -0
  223. package/src/ngtsc/typecheck/src/host.js +4 -1
  224. package/src/ngtsc/typecheck/src/oob.d.ts +11 -11
  225. package/src/ngtsc/typecheck/src/oob.js +15 -4
  226. package/src/ngtsc/typecheck/src/source.d.ts +9 -9
  227. package/src/ngtsc/typecheck/src/source.js +15 -15
  228. package/src/ngtsc/typecheck/src/template_semantics.d.ts +22 -0
  229. package/src/ngtsc/typecheck/src/template_semantics.js +51 -0
  230. package/src/ngtsc/typecheck/src/ts_util.js +36 -1
  231. package/src/ngtsc/typecheck/src/type_check_block.d.ts +3 -3
  232. package/src/ngtsc/typecheck/src/type_check_block.js +70 -43
  233. package/src/ngtsc/typecheck/src/type_check_file.d.ts +2 -2
  234. package/src/ngtsc/typecheck/src/type_check_file.js +3 -3
  235. package/src/ngtsc/typecheck/src/type_constructor.d.ts +4 -4
  236. package/src/ngtsc/typecheck/src/type_constructor.js +15 -10
  237. package/src/ngtsc/typecheck/src/type_emitter.d.ts +72 -0
  238. package/src/ngtsc/typecheck/src/type_emitter.js +150 -0
  239. package/src/ngtsc/typecheck/src/type_parameter_emitter.d.ts +31 -0
  240. package/src/ngtsc/typecheck/src/type_parameter_emitter.js +96 -0
  241. package/src/ngtsc/util/src/typescript.d.ts +7 -1
  242. package/src/ngtsc/util/src/typescript.js +15 -5
  243. package/src/perform_watch.js +6 -5
  244. package/src/transformers/api.d.ts +3 -204
  245. package/src/transformers/api.js +1 -1
  246. package/src/transformers/compiler_host.js +2 -2
  247. package/src/transformers/program.js +1 -1
  248. package/src/typescript_support.js +2 -2
  249. package/src/version.js +1 -1
  250. package/src/ngtsc/diagnostics/src/code.js +0 -101
  251. package/src/ngtsc/resource_loader.js +0 -193
  252. package/src/ngtsc/shims/src/host.d.ts +0 -46
  253. package/src/ngtsc/shims/src/host.js +0 -82
  254. package/src/ngtsc/util/src/resource_recorder.d.ts +0 -18
  255. package/src/ngtsc/util/src/resource_recorder.js +0 -20
@@ -8,9 +8,10 @@
8
8
  /// <amd-module name="@angular/compiler-cli/src/ngtsc/imports/src/alias" />
9
9
  import { Expression } from '@angular/compiler';
10
10
  import * as ts from 'typescript';
11
+ import { UnifiedModulesHost } from '../../core/api';
11
12
  import { ClassDeclaration, ReflectionHost } from '../../reflection';
12
- import { FileToModuleHost, ReferenceEmitStrategy } from './emitter';
13
- import { ImportMode, Reference } from './references';
13
+ import { ImportFlags, ReferenceEmitStrategy } from './emitter';
14
+ import { Reference } from './references';
14
15
  /**
15
16
  * A host for the aliasing system, which allows for alternative exports/imports of directives/pipes.
16
17
  *
@@ -26,8 +27,8 @@ import { ImportMode, Reference } from './references';
26
27
  *
27
28
  * 1) It can be used to create "alias" re-exports from different files, which can be used when the
28
29
  * user hasn't exported the directive(s) from the ES module containing the NgModule. These re-
29
- * exports can also be helpful when using a `FileToModuleHost`, which overrides the import logic
30
- * described above.
30
+ * exports can also be helpful when using a `UnifiedModulesHost`, which overrides the import
31
+ * logic described above.
31
32
  *
32
33
  * 2) It can be used to get an alternative import expression for a directive or pipe, instead of
33
34
  * the import that the normal logic would apply. The alias used depends on the provenance of the
@@ -73,16 +74,16 @@ export interface AliasingHost {
73
74
  }
74
75
  /**
75
76
  * An `AliasingHost` which generates and consumes alias re-exports when module names for each file
76
- * are determined by a `FileToModuleHost`.
77
+ * are determined by a `UnifiedModulesHost`.
77
78
  *
78
- * When using a `FileToModuleHost`, aliasing prevents issues with transitive dependencies. See the
79
+ * When using a `UnifiedModulesHost`, aliasing prevents issues with transitive dependencies. See the
79
80
  * README.md for more details.
80
81
  */
81
- export declare class FileToModuleAliasingHost implements AliasingHost {
82
- private fileToModuleHost;
83
- constructor(fileToModuleHost: FileToModuleHost);
82
+ export declare class UnifiedModulesAliasingHost implements AliasingHost {
83
+ private unifiedModulesHost;
84
+ constructor(unifiedModulesHost: UnifiedModulesHost);
84
85
  /**
85
- * With a `FileToModuleHost`, aliases are chosen automatically without the need to look through
86
+ * With a `UnifiedModulesHost`, aliases are chosen automatically without the need to look through
86
87
  * the exports present in a .d.ts file, so we can avoid cluttering the .d.ts files.
87
88
  */
88
89
  readonly aliasExportsInDts = false;
@@ -135,5 +136,5 @@ export declare class PrivateExportAliasingHost implements AliasingHost {
135
136
  * directive or pipe, if it exists.
136
137
  */
137
138
  export declare class AliasStrategy implements ReferenceEmitStrategy {
138
- emit(ref: Reference<ts.Node>, context: ts.SourceFile, importMode: ImportMode): Expression | null;
139
+ emit(ref: Reference<ts.Node>, context: ts.SourceFile, importMode: ImportFlags): Expression | null;
139
140
  }
@@ -11,33 +11,35 @@
11
11
  if (v !== undefined) module.exports = v;
12
12
  }
13
13
  else if (typeof define === "function" && define.amd) {
14
- define("@angular/compiler-cli/src/ngtsc/imports/src/alias", ["require", "exports", "@angular/compiler"], factory);
14
+ define("@angular/compiler-cli/src/ngtsc/imports/src/alias", ["require", "exports", "@angular/compiler", "@angular/compiler-cli/src/ngtsc/imports/src/emitter"], factory);
15
15
  }
16
16
  })(function (require, exports) {
17
17
  "use strict";
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  var compiler_1 = require("@angular/compiler");
20
+ var emitter_1 = require("@angular/compiler-cli/src/ngtsc/imports/src/emitter");
20
21
  // Escape anything that isn't alphanumeric, '/' or '_'.
21
22
  var CHARS_TO_ESCAPE = /[^a-zA-Z0-9/_]/g;
22
23
  /**
23
24
  * An `AliasingHost` which generates and consumes alias re-exports when module names for each file
24
- * are determined by a `FileToModuleHost`.
25
+ * are determined by a `UnifiedModulesHost`.
25
26
  *
26
- * When using a `FileToModuleHost`, aliasing prevents issues with transitive dependencies. See the
27
+ * When using a `UnifiedModulesHost`, aliasing prevents issues with transitive dependencies. See the
27
28
  * README.md for more details.
28
29
  */
29
- var FileToModuleAliasingHost = /** @class */ (function () {
30
- function FileToModuleAliasingHost(fileToModuleHost) {
31
- this.fileToModuleHost = fileToModuleHost;
30
+ var UnifiedModulesAliasingHost = /** @class */ (function () {
31
+ function UnifiedModulesAliasingHost(unifiedModulesHost) {
32
+ this.unifiedModulesHost = unifiedModulesHost;
32
33
  /**
33
- * With a `FileToModuleHost`, aliases are chosen automatically without the need to look through
34
+ * With a `UnifiedModulesHost`, aliases are chosen automatically without the need to look through
34
35
  * the exports present in a .d.ts file, so we can avoid cluttering the .d.ts files.
35
36
  */
36
37
  this.aliasExportsInDts = false;
37
38
  }
38
- FileToModuleAliasingHost.prototype.maybeAliasSymbolAs = function (ref, context, ngModuleName, isReExport) {
39
+ UnifiedModulesAliasingHost.prototype.maybeAliasSymbolAs = function (ref, context, ngModuleName, isReExport) {
39
40
  if (!isReExport) {
40
- // Aliasing is used with a FileToModuleHost to prevent transitive dependencies. Thus, aliases
41
+ // Aliasing is used with a UnifiedModulesHost to prevent transitive dependencies. Thus,
42
+ // aliases
41
43
  // only need to be created for directives/pipes which are not direct declarations of an
42
44
  // NgModule which exports them.
43
45
  return null;
@@ -48,29 +50,29 @@
48
50
  * Generates an `Expression` to import `decl` from `via`, assuming an export was added when `via`
49
51
  * was compiled per `maybeAliasSymbolAs` above.
50
52
  */
51
- FileToModuleAliasingHost.prototype.getAliasIn = function (decl, via, isReExport) {
53
+ UnifiedModulesAliasingHost.prototype.getAliasIn = function (decl, via, isReExport) {
52
54
  if (!isReExport) {
53
55
  // Directly exported directives/pipes don't require an alias, per the logic in
54
56
  // `maybeAliasSymbolAs`.
55
57
  return null;
56
58
  }
57
59
  // viaModule is the module it'll actually be imported from.
58
- var moduleName = this.fileToModuleHost.fileNameToModuleName(via.fileName, via.fileName);
60
+ var moduleName = this.unifiedModulesHost.fileNameToModuleName(via.fileName, via.fileName);
59
61
  return new compiler_1.ExternalExpr({ moduleName: moduleName, name: this.aliasName(decl, via) });
60
62
  };
61
63
  /**
62
64
  * Generates an alias name based on the full module name of the file which declares the aliased
63
65
  * directive/pipe.
64
66
  */
65
- FileToModuleAliasingHost.prototype.aliasName = function (decl, context) {
67
+ UnifiedModulesAliasingHost.prototype.aliasName = function (decl, context) {
66
68
  // The declared module is used to get the name of the alias.
67
- var declModule = this.fileToModuleHost.fileNameToModuleName(decl.getSourceFile().fileName, context.fileName);
69
+ var declModule = this.unifiedModulesHost.fileNameToModuleName(decl.getSourceFile().fileName, context.fileName);
68
70
  var replaced = declModule.replace(CHARS_TO_ESCAPE, '_').replace(/\//g, '$');
69
71
  return 'ɵng$' + replaced + '$$' + decl.name.text;
70
72
  };
71
- return FileToModuleAliasingHost;
73
+ return UnifiedModulesAliasingHost;
72
74
  }());
73
- exports.FileToModuleAliasingHost = FileToModuleAliasingHost;
75
+ exports.UnifiedModulesAliasingHost = UnifiedModulesAliasingHost;
74
76
  /**
75
77
  * An `AliasingHost` which exports directives from any file containing an NgModule in which they're
76
78
  * declared/exported, under a private symbol name.
@@ -141,10 +143,13 @@
141
143
  function AliasStrategy() {
142
144
  }
143
145
  AliasStrategy.prototype.emit = function (ref, context, importMode) {
146
+ if (importMode & emitter_1.ImportFlags.NoAliasing) {
147
+ return null;
148
+ }
144
149
  return ref.alias;
145
150
  };
146
151
  return AliasStrategy;
147
152
  }());
148
153
  exports.AliasStrategy = AliasStrategy;
149
154
  });
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL2ltcG9ydHMvc3JjL2FsaWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7O0lBRUgsOENBQTJEO0lBTzNELHVEQUF1RDtJQUN2RCxJQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztJQW1FMUM7Ozs7OztPQU1HO0lBQ0g7UUFDRSxrQ0FBb0IsZ0JBQWtDO1lBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7WUFFdEQ7OztlQUdHO1lBQ00sc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBTnNCLENBQUM7UUFRMUQscURBQWtCLEdBQWxCLFVBQ0ksR0FBZ0MsRUFBRSxPQUFzQixFQUFFLFlBQW9CLEVBQzlFLFVBQW1CO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsNkZBQTZGO2dCQUM3Rix1RkFBdUY7Z0JBQ3ZGLCtCQUErQjtnQkFDL0IsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRDs7O1dBR0c7UUFDSCw2Q0FBVSxHQUFWLFVBQVcsSUFBc0IsRUFBRSxHQUFrQixFQUFFLFVBQW1CO1lBQ3hFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsOEVBQThFO2dCQUM5RSx3QkFBd0I7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCwyREFBMkQ7WUFDM0QsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFGLE9BQU8sSUFBSSx1QkFBWSxDQUFDLEVBQUMsVUFBVSxZQUFBLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ssNENBQVMsR0FBakIsVUFBa0IsSUFBc0IsRUFBRSxPQUFzQjtZQUM5RCw0REFBNEQ7WUFDNUQsSUFBTSxVQUFVLEdBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWhHLElBQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUUsT0FBTyxNQUFNLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuRCxDQUFDO1FBQ0gsK0JBQUM7SUFBRCxDQUFDLEFBaERELElBZ0RDO0lBaERZLDREQUF3QjtJQWtEckM7Ozs7Ozs7O09BUUc7SUFDSDtRQUNFLG1DQUFvQixJQUFvQjtZQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtZQUV4Qzs7Ozs7ZUFLRztZQUNNLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQVJTLENBQUM7UUFVNUMsc0RBQWtCLEdBQWxCLFVBQ0ksR0FBZ0MsRUFBRSxPQUFzQixFQUFFLFlBQW9CO1lBQ2hGLElBQUksR0FBRyxDQUFDLG9CQUFvQixFQUFFO2dCQUM1QiwwRkFBMEY7Z0JBQzFGLHVDQUF1QztnQkFDdkMsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELDhGQUE4RjtZQUM5RixpQkFBaUI7WUFDakIsOEZBQThGO1lBQzlGLHNDQUFzQztZQUN0QyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDcEIsNkZBQTZGO2dCQUM3RixzQ0FBc0M7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXVDLE9BQU8sQ0FBQyxRQUFVLENBQUMsQ0FBQzthQUM1RTtZQUNELElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztZQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSztnQkFDbkIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2Q7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksS0FBSyxFQUFFO2dCQUNULHlFQUF5RTtnQkFDekUsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8seUJBQWEsWUFBWSxjQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQU0sQ0FBQztRQUMzRCxDQUFDO1FBRUQ7Ozs7Ozs7OztXQVNHO1FBQ0gsOENBQVUsR0FBVixjQUFxQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckMsZ0NBQUM7SUFBRCxDQUFDLEFBcERELElBb0RDO0lBcERZLDhEQUF5QjtJQXNEdEM7OztPQUdHO0lBQ0g7UUFBQTtRQUlBLENBQUM7UUFIQyw0QkFBSSxHQUFKLFVBQUssR0FBdUIsRUFBRSxPQUFzQixFQUFFLFVBQXNCO1lBQzFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNuQixDQUFDO1FBQ0gsb0JBQUM7SUFBRCxDQUFDLEFBSkQsSUFJQztJQUpZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0V4cHJlc3Npb24sIEV4dGVybmFsRXhwcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7Q2xhc3NEZWNsYXJhdGlvbiwgUmVmbGVjdGlvbkhvc3QsIGlzTmFtZWRDbGFzc0RlY2xhcmF0aW9ufSBmcm9tICcuLi8uLi9yZWZsZWN0aW9uJztcbmltcG9ydCB7RmlsZVRvTW9kdWxlSG9zdCwgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5fSBmcm9tICcuL2VtaXR0ZXInO1xuaW1wb3J0IHtJbXBvcnRNb2RlLCBSZWZlcmVuY2V9IGZyb20gJy4vcmVmZXJlbmNlcyc7XG5cbi8vIEVzY2FwZSBhbnl0aGluZyB0aGF0IGlzbid0IGFscGhhbnVtZXJpYywgJy8nIG9yICdfJy5cbmNvbnN0IENIQVJTX1RPX0VTQ0FQRSA9IC9bXmEtekEtWjAtOS9fXS9nO1xuXG4vKipcbiAqIEEgaG9zdCBmb3IgdGhlIGFsaWFzaW5nIHN5c3RlbSwgd2hpY2ggYWxsb3dzIGZvciBhbHRlcm5hdGl2ZSBleHBvcnRzL2ltcG9ydHMgb2YgZGlyZWN0aXZlcy9waXBlcy5cbiAqXG4gKiBHaXZlbiBhbiBpbXBvcnQgb2YgYW4gTmdNb2R1bGUgKGUuZy4gYENvbW1vbk1vZHVsZWApLCB0aGUgY29tcGlsZXIgbXVzdCBnZW5lcmF0ZSBpbXBvcnRzIHRvIHRoZVxuICogZGlyZWN0aXZlcyBhbmQgcGlwZXMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUgKGUuZy4gYE5nSWZgKSB3aGVuIHRoZXkncmUgdXNlZCBpbiBhIHBhcnRpY3VsYXJcbiAqIHRlbXBsYXRlLiBJbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBpZiB0aGUgY29tcGlsZXIgaXMgbm90IGRpcmVjdGx5IGFibGUgdG8gaW1wb3J0IHRoZVxuICogY29tcG9uZW50IGZyb20gYW5vdGhlciBmaWxlIHdpdGhpbiB0aGUgc2FtZSBwcm9qZWN0LCBpdCB3aWxsIGF0dGVtcHQgdG8gaW1wb3J0IHRoZSBjb21wb25lbnRcbiAqIGZyb20gdGhlIHNhbWUgKGFic29sdXRlKSBwYXRoIGJ5IHdoaWNoIHRoZSBtb2R1bGUgd2FzIGltcG9ydGVkLiBTbyBpbiB0aGUgYWJvdmUgZXhhbXBsZSBpZlxuICogYENvbW1vbk1vZHVsZWAgd2FzIGltcG9ydGVkIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbicsIHRoZSBjb21waWxlciB3aWxsIGF0dGVtcHQgdG8gaW1wb3J0IGBOZ0lmYFxuICogZnJvbSAnQGFuZ3VsYXIvY29tbW9uJyBhcyB3ZWxsLlxuICpcbiAqIFRoZSBhbGlhc2luZyBzeXN0ZW0gaW50ZXJhY3RzIHdpdGggdGhlIGFib3ZlIGxvZ2ljIGluIHR3byBkaXN0aW5jdCB3YXlzLlxuICpcbiAqIDEpIEl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBcImFsaWFzXCIgcmUtZXhwb3J0cyBmcm9tIGRpZmZlcmVudCBmaWxlcywgd2hpY2ggY2FuIGJlIHVzZWQgd2hlbiB0aGVcbiAqICAgIHVzZXIgaGFzbid0IGV4cG9ydGVkIHRoZSBkaXJlY3RpdmUocykgZnJvbSB0aGUgRVMgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIE5nTW9kdWxlLiBUaGVzZSByZS1cbiAqICAgIGV4cG9ydHMgY2FuIGFsc28gYmUgaGVscGZ1bCB3aGVuIHVzaW5nIGEgYEZpbGVUb01vZHVsZUhvc3RgLCB3aGljaCBvdmVycmlkZXMgdGhlIGltcG9ydCBsb2dpY1xuICogICAgZGVzY3JpYmVkIGFib3ZlLlxuICpcbiAqIDIpIEl0IGNhbiBiZSB1c2VkIHRvIGdldCBhbiBhbHRlcm5hdGl2ZSBpbXBvcnQgZXhwcmVzc2lvbiBmb3IgYSBkaXJlY3RpdmUgb3IgcGlwZSwgaW5zdGVhZCBvZlxuICogICAgdGhlIGltcG9ydCB0aGF0IHRoZSBub3JtYWwgbG9naWMgd291bGQgYXBwbHkuIFRoZSBhbGlhcyB1c2VkIGRlcGVuZHMgb24gdGhlIHByb3ZlbmFuY2Ugb2YgdGhlXG4gKiAgICBgUmVmZXJlbmNlYCB3aGljaCB3YXMgb2J0YWluZWQgZm9yIHRoZSBkaXJlY3RpdmUvcGlwZSwgd2hpY2ggaXMgdXN1YWxseSBhIHByb3BlcnR5IG9mIGhvdyBpdFxuICogICAgY2FtZSB0byBiZSBpbiBhIHRlbXBsYXRlJ3Mgc2NvcGUgKGUuZy4gYnkgd2hpY2ggTmdNb2R1bGUpLlxuICpcbiAqIFNlZSB0aGUgUkVBRE1FLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyBhbGlhc2luZyB3b3JrcyB3aXRoaW4gdGhlIGNvbXBpbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsaWFzaW5nSG9zdCB7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGFueSBhbGlhcyByZS1leHBvcnRzIGFyZSByZW5kZXJlZCBpbnRvIC5kLnRzIGZpbGVzLlxuICAgKlxuICAgKiBUaGlzIGlzIG5vdCBhbHdheXMgbmVjZXNzYXJ5IGZvciBhbGlhc2luZyB0byBmdW5jdGlvbiBjb3JyZWN0bHksIHNvIHRoaXMgZmxhZyBhbGxvd3MgYW5cbiAgICogYEFsaWFzaW5nSG9zdGAgdG8gYXZvaWQgY2x1dHRlcmluZyB0aGUgLmQudHMgZmlsZXMgaWYgZXhwb3J0cyBhcmUgbm90IHN0cmljdGx5IG5lZWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzRXhwb3J0c0luRHRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgYSBuYW1lIGJ5IHdoaWNoIGBkZWNsYCBzaG91bGQgYmUgcmUtZXhwb3J0ZWQgZnJvbSBgY29udGV4dGAsIGRlcGVuZGluZyBvbiB0aGVcbiAgICogcGFydGljdWxhciBzZXQgb2YgYWxpYXNpbmcgcnVsZXMgaW4gcGxhY2UuXG4gICAqXG4gICAqIGBtYXliZUFsaWFzU3ltYm9sQXNgIGNhbiByZXR1cm4gYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGFsaWFzIGV4cG9ydCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcmVmIGEgYFJlZmVyZW5jZWAgdG8gdGhlIGRpcmVjdGl2ZS9waXBlIHRvIGNvbnNpZGVyIGZvciBhbGlhc2luZy5cbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGB0cy5Tb3VyY2VGaWxlYCBpbiB3aGljaCB0aGUgYWxpYXMgcmUtZXhwb3J0IG1pZ2h0IG5lZWQgdG8gYmUgZ2VuZXJhdGVkLlxuICAgKiBAcGFyYW0gbmdNb2R1bGVOYW1lIHRoZSBkZWNsYXJlZCBuYW1lIG9mIHRoZSBgTmdNb2R1bGVgIHdpdGhpbiBgY29udGV4dGAgZm9yIHdoaWNoIHRoZSBhbGlhc1xuICAgKiB3b3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAqIEBwYXJhbSBpc1JlRXhwb3J0IHdoZXRoZXIgdGhlIGRpcmVjdGl2ZS9waXBlIHVuZGVyIGNvbnNpZGVyYXRpb24gaXMgcmUtZXhwb3J0ZWQgZnJvbSBhbm90aGVyXG4gICAqIE5nTW9kdWxlIChhcyBvcHBvc2VkIHRvIGJlaW5nIGRlY2xhcmVkIGJ5IGl0IGRpcmVjdGx5KS5cbiAgICovXG4gIG1heWJlQWxpYXNTeW1ib2xBcyhcbiAgICAgIHJlZjogUmVmZXJlbmNlPENsYXNzRGVjbGFyYXRpb24+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBuZ01vZHVsZU5hbWU6IHN0cmluZyxcbiAgICAgIGlzUmVFeHBvcnQ6IGJvb2xlYW4pOiBzdHJpbmd8bnVsbDtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGBFeHByZXNzaW9uYCBieSB3aGljaCBgZGVjbGAgc2hvdWxkIGJlIGltcG9ydGVkIGZyb20gYHZpYWAgdXNpbmcgYW4gYWxpYXMgZXhwb3J0XG4gICAqICh3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBgdmlhYCkuXG4gICAqXG4gICAqIGBnZXRBbGlhc0luYCBjYW4gcmV0dXJuIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBhbGlhcyBpcyBuZWVkZWQgdG8gaW1wb3J0IGBkZWNsYCBmcm9tIGB2aWFgXG4gICAqIChhbmQgdGhlIG5vcm1hbCBpbXBvcnQgcnVsZXMgc2hvdWxkIGJlIHVzZWQpLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjbCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS9waXBlIHdoaWNoIGlzIGJlaW5nIGltcG9ydGVkLCBhbmQgd2hpY2ggbWlnaHQgYmVcbiAgICogYWxpYXNlZC5cbiAgICogQHBhcmFtIHZpYSB0aGUgYHRzLlNvdXJjZUZpbGVgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gYW4gYWxpYXMgdG8gdGhlXG4gICAqL1xuICBnZXRBbGlhc0luKGRlY2w6IENsYXNzRGVjbGFyYXRpb24sIHZpYTogdHMuU291cmNlRmlsZSwgaXNSZUV4cG9ydDogYm9vbGVhbik6IEV4cHJlc3Npb258bnVsbDtcbn1cblxuLyoqXG4gKiBBbiBgQWxpYXNpbmdIb3N0YCB3aGljaCBnZW5lcmF0ZXMgYW5kIGNvbnN1bWVzIGFsaWFzIHJlLWV4cG9ydHMgd2hlbiBtb2R1bGUgbmFtZXMgZm9yIGVhY2ggZmlsZVxuICogYXJlIGRldGVybWluZWQgYnkgYSBgRmlsZVRvTW9kdWxlSG9zdGAuXG4gKlxuICogV2hlbiB1c2luZyBhIGBGaWxlVG9Nb2R1bGVIb3N0YCwgYWxpYXNpbmcgcHJldmVudHMgaXNzdWVzIHdpdGggdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMuIFNlZSB0aGVcbiAqIFJFQURNRS5tZCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZVRvTW9kdWxlQWxpYXNpbmdIb3N0IGltcGxlbWVudHMgQWxpYXNpbmdIb3N0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlVG9Nb2R1bGVIb3N0OiBGaWxlVG9Nb2R1bGVIb3N0KSB7fVxuXG4gIC8qKlxuICAgKiBXaXRoIGEgYEZpbGVUb01vZHVsZUhvc3RgLCBhbGlhc2VzIGFyZSBjaG9zZW4gYXV0b21hdGljYWxseSB3aXRob3V0IHRoZSBuZWVkIHRvIGxvb2sgdGhyb3VnaFxuICAgKiB0aGUgZXhwb3J0cyBwcmVzZW50IGluIGEgLmQudHMgZmlsZSwgc28gd2UgY2FuIGF2b2lkIGNsdXR0ZXJpbmcgdGhlIC5kLnRzIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFeHBvcnRzSW5EdHMgPSBmYWxzZTtcblxuICBtYXliZUFsaWFzU3ltYm9sQXMoXG4gICAgICByZWY6IFJlZmVyZW5jZTxDbGFzc0RlY2xhcmF0aW9uPiwgY29udGV4dDogdHMuU291cmNlRmlsZSwgbmdNb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgICBpc1JlRXhwb3J0OiBib29sZWFuKTogc3RyaW5nfG51bGwge1xuICAgIGlmICghaXNSZUV4cG9ydCkge1xuICAgICAgLy8gQWxpYXNpbmcgaXMgdXNlZCB3aXRoIGEgRmlsZVRvTW9kdWxlSG9zdCB0byBwcmV2ZW50IHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLiBUaHVzLCBhbGlhc2VzXG4gICAgICAvLyBvbmx5IG5lZWQgdG8gYmUgY3JlYXRlZCBmb3IgZGlyZWN0aXZlcy9waXBlcyB3aGljaCBhcmUgbm90IGRpcmVjdCBkZWNsYXJhdGlvbnMgb2YgYW5cbiAgICAgIC8vIE5nTW9kdWxlIHdoaWNoIGV4cG9ydHMgdGhlbS5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGlhc05hbWUocmVmLm5vZGUsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBgRXhwcmVzc2lvbmAgdG8gaW1wb3J0IGBkZWNsYCBmcm9tIGB2aWFgLCBhc3N1bWluZyBhbiBleHBvcnQgd2FzIGFkZGVkIHdoZW4gYHZpYWBcbiAgICogd2FzIGNvbXBpbGVkIHBlciBgbWF5YmVBbGlhc1N5bWJvbEFzYCBhYm92ZS5cbiAgICovXG4gIGdldEFsaWFzSW4oZGVjbDogQ2xhc3NEZWNsYXJhdGlvbiwgdmlhOiB0cy5Tb3VyY2VGaWxlLCBpc1JlRXhwb3J0OiBib29sZWFuKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICBpZiAoIWlzUmVFeHBvcnQpIHtcbiAgICAgIC8vIERpcmVjdGx5IGV4cG9ydGVkIGRpcmVjdGl2ZXMvcGlwZXMgZG9uJ3QgcmVxdWlyZSBhbiBhbGlhcywgcGVyIHRoZSBsb2dpYyBpblxuICAgICAgLy8gYG1heWJlQWxpYXNTeW1ib2xBc2AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gdmlhTW9kdWxlIGlzIHRoZSBtb2R1bGUgaXQnbGwgYWN0dWFsbHkgYmUgaW1wb3J0ZWQgZnJvbS5cbiAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5maWxlVG9Nb2R1bGVIb3N0LmZpbGVOYW1lVG9Nb2R1bGVOYW1lKHZpYS5maWxlTmFtZSwgdmlhLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcih7bW9kdWxlTmFtZSwgbmFtZTogdGhpcy5hbGlhc05hbWUoZGVjbCwgdmlhKX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBhbGlhcyBuYW1lIGJhc2VkIG9uIHRoZSBmdWxsIG1vZHVsZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGRlY2xhcmVzIHRoZSBhbGlhc2VkXG4gICAqIGRpcmVjdGl2ZS9waXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGlhc05hbWUoZGVjbDogQ2xhc3NEZWNsYXJhdGlvbiwgY29udGV4dDogdHMuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gICAgLy8gVGhlIGRlY2xhcmVkIG1vZHVsZSBpcyB1c2VkIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgYWxpYXMuXG4gICAgY29uc3QgZGVjbE1vZHVsZSA9XG4gICAgICAgIHRoaXMuZmlsZVRvTW9kdWxlSG9zdC5maWxlTmFtZVRvTW9kdWxlTmFtZShkZWNsLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSwgY29udGV4dC5maWxlTmFtZSk7XG5cbiAgICBjb25zdCByZXBsYWNlZCA9IGRlY2xNb2R1bGUucmVwbGFjZShDSEFSU19UT19FU0NBUEUsICdfJykucmVwbGFjZSgvXFwvL2csICckJyk7XG4gICAgcmV0dXJuICfJtW5nJCcgKyByZXBsYWNlZCArICckJCcgKyBkZWNsLm5hbWUudGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGBBbGlhc2luZ0hvc3RgIHdoaWNoIGV4cG9ydHMgZGlyZWN0aXZlcyBmcm9tIGFueSBmaWxlIGNvbnRhaW5pbmcgYW4gTmdNb2R1bGUgaW4gd2hpY2ggdGhleSdyZVxuICogZGVjbGFyZWQvZXhwb3J0ZWQsIHVuZGVyIGEgcHJpdmF0ZSBzeW1ib2wgbmFtZS5cbiAqXG4gKiBUaGVzZSBleHBvcnRzIHN1cHBvcnQgY2FzZXMgd2hlcmUgYW4gTmdNb2R1bGUgaXMgaW1wb3J0ZWQgZGVlcGx5IGZyb20gYW4gYWJzb2x1dGUgbW9kdWxlIHBhdGhcbiAqICh0aGF0IGlzLCBpdCdzIG5vdCBwYXJ0IG9mIGFuIEFuZ3VsYXIgUGFja2FnZSBGb3JtYXQgZW50cnlwb2ludCksIGFuZCB0aGUgY29tcGlsZXIgbmVlZHMgdG9cbiAqIGltcG9ydCBhbnkgbWF0Y2hlZCBkaXJlY3RpdmVzL3BpcGVzIGZyb20gdGhlIHNhbWUgcGF0aCAodG8gdGhlIE5nTW9kdWxlIGZpbGUpLiBTZWUgUkVBRE1FLm1kIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdCBpbXBsZW1lbnRzIEFsaWFzaW5nSG9zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogUmVmbGVjdGlvbkhvc3QpIHt9XG5cbiAgLyoqXG4gICAqIFVuZGVyIHByaXZhdGUgZXhwb3J0IGFsaWFzaW5nLCB0aGUgYEFic29sdXRlTW9kdWxlU3RyYXRlZ3lgIHVzZWQgZm9yIGVtaXR0aW5nIHJlZmVyZW5jZXMgd2lsbFxuICAgKiB3aWxsIHNlbGVjdCBhbGlhc2VkIGV4cG9ydHMgdGhhdCBpdCBmaW5kcyBpbiB0aGUgLmQudHMgZmlsZSBmb3IgYW4gTmdNb2R1bGUncyBmaWxlLiBUaHVzLFxuICAgKiBlbWl0dGluZyB0aGVzZSBleHBvcnRzIGluIC5kLnRzIGlzIGEgcmVxdWlyZW1lbnQgZm9yIHRoZSBgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdGAgdG9cbiAgICogZnVuY3Rpb24gY29ycmVjdGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFeHBvcnRzSW5EdHMgPSB0cnVlO1xuXG4gIG1heWJlQWxpYXNTeW1ib2xBcyhcbiAgICAgIHJlZjogUmVmZXJlbmNlPENsYXNzRGVjbGFyYXRpb24+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBuZ01vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZ3xudWxsIHtcbiAgICBpZiAocmVmLmhhc093bmluZ01vZHVsZUd1ZXNzKSB7XG4gICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgYWxyZWFkeSBoYXZlIGFuIGFzc29jaWF0ZWQgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciwgc2luY2UgdGhleSBjYW4gYmVcbiAgICAgIC8vIHNhZmVseSBpbXBvcnRlZCBmcm9tIHRoYXQgc3BlY2lmaWVyLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIExvb2sgZm9yIGEgdXNlci1wcm92aWRlZCBleHBvcnQgb2YgYGRlY2xgIGluIGBjb250ZXh0YC4gSWYgb25lIGV4aXN0cywgdGhlbiBhbiBhbGlhcyBleHBvcnRcbiAgICAvLyBpcyBub3QgbmVlZGVkLlxuICAgIC8vIFRPRE8oYWx4aHViKTogbWF5YmUgYWRkIGEgaG9zdCBtZXRob2QgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZXhwb3J0IHdpdGhvdXQgZ29pbmdcbiAgICAvLyB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCBvZiBleHBvcnRzLlxuICAgIGNvbnN0IGV4cG9ydHMgPSB0aGlzLmhvc3QuZ2V0RXhwb3J0c09mTW9kdWxlKGNvbnRleHQpO1xuICAgIGlmIChleHBvcnRzID09PSBudWxsKSB7XG4gICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgYW5kIG5vIGV4cG9ydHMgd2VyZSBhdmFpbGFibGUgYXQgYWxsLiBCYWlsIHJhdGhlciB0aGFuIHJpc2sgY3JlYXRpbmdcbiAgICAgIC8vIHJlLWV4cG9ydHMgd2hlbiB0aGV5J3JlIG5vdCBuZWVkZWQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGV4cG9ydHMgb2Y6ICR7Y29udGV4dC5maWxlTmFtZX1gKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XG4gICAgZXhwb3J0cy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZS5ub2RlID09PSByZWYubm9kZSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICAvLyBUaGUgbW9kdWxlIGV4cG9ydHMgdGhlIGRlY2xhcmVkIGNsYXNzIGRpcmVjdGx5LCBubyBhbGlhcyBpcyBuZWNlc3NhcnkuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGDJtW5nRXhwb3J0ybUke25nTW9kdWxlTmFtZX3JtSR7cmVmLm5vZGUubmFtZS50ZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICogQSBgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdGAgb25seSBnZW5lcmF0ZXMgcmUtZXhwb3J0cyBhbmQgZG9lcyBub3QgZGlyZWN0IHRoZSBjb21waWxlciB0b1xuICAgKiBkaXJlY3RseSBjb25zdW1lIHRoZSBhbGlhc2VzIGl0IGNyZWF0ZXMuXG4gICAqXG4gICAqIEluc3RlYWQsIHRoZXkncmUgY29uc3VtZWQgaW5kaXJlY3RseTogYEFic29sdXRlTW9kdWxlU3RyYXRlZ3lgIGBSZWZlcmVuY2VFbWl0dGVyU3RyYXRlZ3lgIHdpbGxcbiAgICogc2VsZWN0IHRoZXNlIGFsaWFzIGV4cG9ydHMgYXV0b21hdGljYWxseSB3aGVuIGxvb2tpbmcgZm9yIGFuIGV4cG9ydCBvZiB0aGUgZGlyZWN0aXZlL3BpcGUgZnJvbVxuICAgKiB0aGUgc2FtZSBwYXRoIGFzIHRoZSBOZ01vZHVsZSB3YXMgaW1wb3J0ZWQuXG4gICAqXG4gICAqIFRodXMsIGBnZXRBbGlhc0luYCBhbHdheXMgcmV0dXJucyBgbnVsbGAuXG4gICAqL1xuICBnZXRBbGlhc0luKCk6IG51bGwgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vKipcbiAqIEEgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgd2hpY2ggd2lsbCBjb25zdW1lIHRoZSBhbGlhcyBhdHRhY2hlZCB0byBhIHBhcnRpY3VsYXIgYFJlZmVyZW5jZWAgdG8gYVxuICogZGlyZWN0aXZlIG9yIHBpcGUsIGlmIGl0IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2VFbWl0U3RyYXRlZ3kge1xuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnRNb2RlOiBJbXBvcnRNb2RlKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICByZXR1cm4gcmVmLmFsaWFzO1xuICB9XG59XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL2ltcG9ydHMvc3JjL2FsaWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7O0lBRUgsOENBQTJEO0lBTTNELCtFQUE2RDtJQUs3RCx1REFBdUQ7SUFDdkQsSUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7SUFtRTFDOzs7Ozs7T0FNRztJQUNIO1FBQ0Usb0NBQW9CLGtCQUFzQztZQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1lBRTFEOzs7ZUFHRztZQUNNLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQU4wQixDQUFDO1FBUTlELHVEQUFrQixHQUFsQixVQUNJLEdBQWdDLEVBQUUsT0FBc0IsRUFBRSxZQUFvQixFQUM5RSxVQUFtQjtZQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLHVGQUF1RjtnQkFDdkYsVUFBVTtnQkFDVix1RkFBdUY7Z0JBQ3ZGLCtCQUErQjtnQkFDL0IsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRDs7O1dBR0c7UUFDSCwrQ0FBVSxHQUFWLFVBQVcsSUFBc0IsRUFBRSxHQUFrQixFQUFFLFVBQW1CO1lBQ3hFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2YsOEVBQThFO2dCQUM5RSx3QkFBd0I7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCwyREFBMkQ7WUFDM0QsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVGLE9BQU8sSUFBSSx1QkFBWSxDQUFDLEVBQUMsVUFBVSxZQUFBLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQ7OztXQUdHO1FBQ0ssOENBQVMsR0FBakIsVUFBa0IsSUFBc0IsRUFBRSxPQUFzQjtZQUM5RCw0REFBNEQ7WUFDNUQsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUMzRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVyRCxJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sTUFBTSxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkQsQ0FBQztRQUNILGlDQUFDO0lBQUQsQ0FBQyxBQWpERCxJQWlEQztJQWpEWSxnRUFBMEI7SUFtRHZDOzs7Ozs7OztPQVFHO0lBQ0g7UUFDRSxtQ0FBb0IsSUFBb0I7WUFBcEIsU0FBSSxHQUFKLElBQUksQ0FBZ0I7WUFFeEM7Ozs7O2VBS0c7WUFDTSxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFSUyxDQUFDO1FBVTVDLHNEQUFrQixHQUFsQixVQUNJLEdBQWdDLEVBQUUsT0FBc0IsRUFBRSxZQUFvQjtZQUNoRixJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDNUIsMEZBQTBGO2dCQUMxRix1Q0FBdUM7Z0JBQ3ZDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCw4RkFBOEY7WUFDOUYsaUJBQWlCO1lBQ2pCLDhGQUE4RjtZQUM5RixzQ0FBc0M7WUFDdEMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLDZGQUE2RjtnQkFDN0Ysc0NBQXNDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF1QyxPQUFPLENBQUMsUUFBVSxDQUFDLENBQUM7YUFDNUU7WUFDRCxJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7WUFDM0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7Z0JBQ25CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUMzQixLQUFLLEdBQUcsSUFBSSxDQUFDO2lCQUNkO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLEtBQUssRUFBRTtnQkFDVCx5RUFBeUU7Z0JBQ3pFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLHlCQUFhLFlBQVksY0FBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFNLENBQUM7UUFDM0QsQ0FBQztRQUVEOzs7Ozs7Ozs7V0FTRztRQUNILDhDQUFVLEdBQVYsY0FBcUIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLGdDQUFDO0lBQUQsQ0FBQyxBQXBERCxJQW9EQztJQXBEWSw4REFBeUI7SUFzRHRDOzs7T0FHRztJQUNIO1FBQUE7UUFRQSxDQUFDO1FBUEMsNEJBQUksR0FBSixVQUFLLEdBQXVCLEVBQUUsT0FBc0IsRUFBRSxVQUF1QjtZQUMzRSxJQUFJLFVBQVUsR0FBRyxxQkFBVyxDQUFDLFVBQVUsRUFBRTtnQkFDdkMsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNuQixDQUFDO1FBQ0gsb0JBQUM7SUFBRCxDQUFDLEFBUkQsSUFRQztJQVJZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0V4cHJlc3Npb24sIEV4dGVybmFsRXhwcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7VW5pZmllZE1vZHVsZXNIb3N0fSBmcm9tICcuLi8uLi9jb3JlL2FwaSc7XG5pbXBvcnQge0NsYXNzRGVjbGFyYXRpb24sIFJlZmxlY3Rpb25Ib3N0LCBpc05hbWVkQ2xhc3NEZWNsYXJhdGlvbn0gZnJvbSAnLi4vLi4vcmVmbGVjdGlvbic7XG5cbmltcG9ydCB7SW1wb3J0RmxhZ3MsIFJlZmVyZW5jZUVtaXRTdHJhdGVneX0gZnJvbSAnLi9lbWl0dGVyJztcbmltcG9ydCB7UmVmZXJlbmNlfSBmcm9tICcuL3JlZmVyZW5jZXMnO1xuXG5cblxuLy8gRXNjYXBlIGFueXRoaW5nIHRoYXQgaXNuJ3QgYWxwaGFudW1lcmljLCAnLycgb3IgJ18nLlxuY29uc3QgQ0hBUlNfVE9fRVNDQVBFID0gL1teYS16QS1aMC05L19dL2c7XG5cbi8qKlxuICogQSBob3N0IGZvciB0aGUgYWxpYXNpbmcgc3lzdGVtLCB3aGljaCBhbGxvd3MgZm9yIGFsdGVybmF0aXZlIGV4cG9ydHMvaW1wb3J0cyBvZiBkaXJlY3RpdmVzL3BpcGVzLlxuICpcbiAqIEdpdmVuIGFuIGltcG9ydCBvZiBhbiBOZ01vZHVsZSAoZS5nLiBgQ29tbW9uTW9kdWxlYCksIHRoZSBjb21waWxlciBtdXN0IGdlbmVyYXRlIGltcG9ydHMgdG8gdGhlXG4gKiBkaXJlY3RpdmVzIGFuZCBwaXBlcyBleHBvcnRlZCBieSB0aGlzIG1vZHVsZSAoZS5nLiBgTmdJZmApIHdoZW4gdGhleSdyZSB1c2VkIGluIGEgcGFydGljdWxhclxuICogdGVtcGxhdGUuIEluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGlmIHRoZSBjb21waWxlciBpcyBub3QgZGlyZWN0bHkgYWJsZSB0byBpbXBvcnQgdGhlXG4gKiBjb21wb25lbnQgZnJvbSBhbm90aGVyIGZpbGUgd2l0aGluIHRoZSBzYW1lIHByb2plY3QsIGl0IHdpbGwgYXR0ZW1wdCB0byBpbXBvcnQgdGhlIGNvbXBvbmVudFxuICogZnJvbSB0aGUgc2FtZSAoYWJzb2x1dGUpIHBhdGggYnkgd2hpY2ggdGhlIG1vZHVsZSB3YXMgaW1wb3J0ZWQuIFNvIGluIHRoZSBhYm92ZSBleGFtcGxlIGlmXG4gKiBgQ29tbW9uTW9kdWxlYCB3YXMgaW1wb3J0ZWQgZnJvbSAnQGFuZ3VsYXIvY29tbW9uJywgdGhlIGNvbXBpbGVyIHdpbGwgYXR0ZW1wdCB0byBpbXBvcnQgYE5nSWZgXG4gKiBmcm9tICdAYW5ndWxhci9jb21tb24nIGFzIHdlbGwuXG4gKlxuICogVGhlIGFsaWFzaW5nIHN5c3RlbSBpbnRlcmFjdHMgd2l0aCB0aGUgYWJvdmUgbG9naWMgaW4gdHdvIGRpc3RpbmN0IHdheXMuXG4gKlxuICogMSkgSXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIFwiYWxpYXNcIiByZS1leHBvcnRzIGZyb20gZGlmZmVyZW50IGZpbGVzLCB3aGljaCBjYW4gYmUgdXNlZCB3aGVuIHRoZVxuICogICAgdXNlciBoYXNuJ3QgZXhwb3J0ZWQgdGhlIGRpcmVjdGl2ZShzKSBmcm9tIHRoZSBFUyBtb2R1bGUgY29udGFpbmluZyB0aGUgTmdNb2R1bGUuIFRoZXNlIHJlLVxuICogICAgZXhwb3J0cyBjYW4gYWxzbyBiZSBoZWxwZnVsIHdoZW4gdXNpbmcgYSBgVW5pZmllZE1vZHVsZXNIb3N0YCwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBpbXBvcnRcbiAqICAgIGxvZ2ljIGRlc2NyaWJlZCBhYm92ZS5cbiAqXG4gKiAyKSBJdCBjYW4gYmUgdXNlZCB0byBnZXQgYW4gYWx0ZXJuYXRpdmUgaW1wb3J0IGV4cHJlc3Npb24gZm9yIGEgZGlyZWN0aXZlIG9yIHBpcGUsIGluc3RlYWQgb2ZcbiAqICAgIHRoZSBpbXBvcnQgdGhhdCB0aGUgbm9ybWFsIGxvZ2ljIHdvdWxkIGFwcGx5LiBUaGUgYWxpYXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBwcm92ZW5hbmNlIG9mIHRoZVxuICogICAgYFJlZmVyZW5jZWAgd2hpY2ggd2FzIG9idGFpbmVkIGZvciB0aGUgZGlyZWN0aXZlL3BpcGUsIHdoaWNoIGlzIHVzdWFsbHkgYSBwcm9wZXJ0eSBvZiBob3cgaXRcbiAqICAgIGNhbWUgdG8gYmUgaW4gYSB0ZW1wbGF0ZSdzIHNjb3BlIChlLmcuIGJ5IHdoaWNoIE5nTW9kdWxlKS5cbiAqXG4gKiBTZWUgdGhlIFJFQURNRS5tZCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgYWxpYXNpbmcgd29ya3Mgd2l0aGluIHRoZSBjb21waWxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGlhc2luZ0hvc3Qge1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBhbnkgYWxpYXMgcmUtZXhwb3J0cyBhcmUgcmVuZGVyZWQgaW50byAuZC50cyBmaWxlcy5cbiAgICpcbiAgICogVGhpcyBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSBmb3IgYWxpYXNpbmcgdG8gZnVuY3Rpb24gY29ycmVjdGx5LCBzbyB0aGlzIGZsYWcgYWxsb3dzIGFuXG4gICAqIGBBbGlhc2luZ0hvc3RgIHRvIGF2b2lkIGNsdXR0ZXJpbmcgdGhlIC5kLnRzIGZpbGVzIGlmIGV4cG9ydHMgYXJlIG5vdCBzdHJpY3RseSBuZWVkZWQuXG4gICAqL1xuICByZWFkb25seSBhbGlhc0V4cG9ydHNJbkR0czogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGEgbmFtZSBieSB3aGljaCBgZGVjbGAgc2hvdWxkIGJlIHJlLWV4cG9ydGVkIGZyb20gYGNvbnRleHRgLCBkZXBlbmRpbmcgb24gdGhlXG4gICAqIHBhcnRpY3VsYXIgc2V0IG9mIGFsaWFzaW5nIHJ1bGVzIGluIHBsYWNlLlxuICAgKlxuICAgKiBgbWF5YmVBbGlhc1N5bWJvbEFzYCBjYW4gcmV0dXJuIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBhbGlhcyBleHBvcnQgc2hvdWxkIGJlIGdlbmVyYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHJlZiBhIGBSZWZlcmVuY2VgIHRvIHRoZSBkaXJlY3RpdmUvcGlwZSB0byBjb25zaWRlciBmb3IgYWxpYXNpbmcuXG4gICAqIEBwYXJhbSBjb250ZXh0IHRoZSBgdHMuU291cmNlRmlsZWAgaW4gd2hpY2ggdGhlIGFsaWFzIHJlLWV4cG9ydCBtaWdodCBuZWVkIHRvIGJlIGdlbmVyYXRlZC5cbiAgICogQHBhcmFtIG5nTW9kdWxlTmFtZSB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGUgYE5nTW9kdWxlYCB3aXRoaW4gYGNvbnRleHRgIGZvciB3aGljaCB0aGUgYWxpYXNcbiAgICogd291bGQgYmUgZ2VuZXJhdGVkLlxuICAgKiBAcGFyYW0gaXNSZUV4cG9ydCB3aGV0aGVyIHRoZSBkaXJlY3RpdmUvcGlwZSB1bmRlciBjb25zaWRlcmF0aW9uIGlzIHJlLWV4cG9ydGVkIGZyb20gYW5vdGhlclxuICAgKiBOZ01vZHVsZSAoYXMgb3Bwb3NlZCB0byBiZWluZyBkZWNsYXJlZCBieSBpdCBkaXJlY3RseSkuXG4gICAqL1xuICBtYXliZUFsaWFzU3ltYm9sQXMoXG4gICAgICByZWY6IFJlZmVyZW5jZTxDbGFzc0RlY2xhcmF0aW9uPiwgY29udGV4dDogdHMuU291cmNlRmlsZSwgbmdNb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgICBpc1JlRXhwb3J0OiBib29sZWFuKTogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBhbiBgRXhwcmVzc2lvbmAgYnkgd2hpY2ggYGRlY2xgIHNob3VsZCBiZSBpbXBvcnRlZCBmcm9tIGB2aWFgIHVzaW5nIGFuIGFsaWFzIGV4cG9ydFxuICAgKiAod2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBwcmV2aW91c2x5IGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgYHZpYWApLlxuICAgKlxuICAgKiBgZ2V0QWxpYXNJbmAgY2FuIHJldHVybiBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gYWxpYXMgaXMgbmVlZGVkIHRvIGltcG9ydCBgZGVjbGAgZnJvbSBgdmlhYFxuICAgKiAoYW5kIHRoZSBub3JtYWwgaW1wb3J0IHJ1bGVzIHNob3VsZCBiZSB1c2VkKS5cbiAgICpcbiAgICogQHBhcmFtIGRlY2wgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBkaXJlY3RpdmUvcGlwZSB3aGljaCBpcyBiZWluZyBpbXBvcnRlZCwgYW5kIHdoaWNoIG1pZ2h0IGJlXG4gICAqIGFsaWFzZWQuXG4gICAqIEBwYXJhbSB2aWEgdGhlIGB0cy5Tb3VyY2VGaWxlYCB3aGljaCBtaWdodCBjb250YWluIGFuIGFsaWFzIHRvIHRoZVxuICAgKi9cbiAgZ2V0QWxpYXNJbihkZWNsOiBDbGFzc0RlY2xhcmF0aW9uLCB2aWE6IHRzLlNvdXJjZUZpbGUsIGlzUmVFeHBvcnQ6IGJvb2xlYW4pOiBFeHByZXNzaW9ufG51bGw7XG59XG5cbi8qKlxuICogQW4gYEFsaWFzaW5nSG9zdGAgd2hpY2ggZ2VuZXJhdGVzIGFuZCBjb25zdW1lcyBhbGlhcyByZS1leHBvcnRzIHdoZW4gbW9kdWxlIG5hbWVzIGZvciBlYWNoIGZpbGVcbiAqIGFyZSBkZXRlcm1pbmVkIGJ5IGEgYFVuaWZpZWRNb2R1bGVzSG9zdGAuXG4gKlxuICogV2hlbiB1c2luZyBhIGBVbmlmaWVkTW9kdWxlc0hvc3RgLCBhbGlhc2luZyBwcmV2ZW50cyBpc3N1ZXMgd2l0aCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcy4gU2VlIHRoZVxuICogUkVBRE1FLm1kIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmlmaWVkTW9kdWxlc0FsaWFzaW5nSG9zdCBpbXBsZW1lbnRzIEFsaWFzaW5nSG9zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdW5pZmllZE1vZHVsZXNIb3N0OiBVbmlmaWVkTW9kdWxlc0hvc3QpIHt9XG5cbiAgLyoqXG4gICAqIFdpdGggYSBgVW5pZmllZE1vZHVsZXNIb3N0YCwgYWxpYXNlcyBhcmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB0aGUgbmVlZCB0byBsb29rIHRocm91Z2hcbiAgICogdGhlIGV4cG9ydHMgcHJlc2VudCBpbiBhIC5kLnRzIGZpbGUsIHNvIHdlIGNhbiBhdm9pZCBjbHV0dGVyaW5nIHRoZSAuZC50cyBmaWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzRXhwb3J0c0luRHRzID0gZmFsc2U7XG5cbiAgbWF5YmVBbGlhc1N5bWJvbEFzKFxuICAgICAgcmVmOiBSZWZlcmVuY2U8Q2xhc3NEZWNsYXJhdGlvbj4sIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUsIG5nTW9kdWxlTmFtZTogc3RyaW5nLFxuICAgICAgaXNSZUV4cG9ydDogYm9vbGVhbik6IHN0cmluZ3xudWxsIHtcbiAgICBpZiAoIWlzUmVFeHBvcnQpIHtcbiAgICAgIC8vIEFsaWFzaW5nIGlzIHVzZWQgd2l0aCBhIFVuaWZpZWRNb2R1bGVzSG9zdCB0byBwcmV2ZW50IHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLiBUaHVzLFxuICAgICAgLy8gYWxpYXNlc1xuICAgICAgLy8gb25seSBuZWVkIHRvIGJlIGNyZWF0ZWQgZm9yIGRpcmVjdGl2ZXMvcGlwZXMgd2hpY2ggYXJlIG5vdCBkaXJlY3QgZGVjbGFyYXRpb25zIG9mIGFuXG4gICAgICAvLyBOZ01vZHVsZSB3aGljaCBleHBvcnRzIHRoZW0uXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWxpYXNOYW1lKHJlZi5ub2RlLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gYEV4cHJlc3Npb25gIHRvIGltcG9ydCBgZGVjbGAgZnJvbSBgdmlhYCwgYXNzdW1pbmcgYW4gZXhwb3J0IHdhcyBhZGRlZCB3aGVuIGB2aWFgXG4gICAqIHdhcyBjb21waWxlZCBwZXIgYG1heWJlQWxpYXNTeW1ib2xBc2AgYWJvdmUuXG4gICAqL1xuICBnZXRBbGlhc0luKGRlY2w6IENsYXNzRGVjbGFyYXRpb24sIHZpYTogdHMuU291cmNlRmlsZSwgaXNSZUV4cG9ydDogYm9vbGVhbik6IEV4cHJlc3Npb258bnVsbCB7XG4gICAgaWYgKCFpc1JlRXhwb3J0KSB7XG4gICAgICAvLyBEaXJlY3RseSBleHBvcnRlZCBkaXJlY3RpdmVzL3BpcGVzIGRvbid0IHJlcXVpcmUgYW4gYWxpYXMsIHBlciB0aGUgbG9naWMgaW5cbiAgICAgIC8vIGBtYXliZUFsaWFzU3ltYm9sQXNgLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIHZpYU1vZHVsZSBpcyB0aGUgbW9kdWxlIGl0J2xsIGFjdHVhbGx5IGJlIGltcG9ydGVkIGZyb20uXG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHRoaXMudW5pZmllZE1vZHVsZXNIb3N0LmZpbGVOYW1lVG9Nb2R1bGVOYW1lKHZpYS5maWxlTmFtZSwgdmlhLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcih7bW9kdWxlTmFtZSwgbmFtZTogdGhpcy5hbGlhc05hbWUoZGVjbCwgdmlhKX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBhbGlhcyBuYW1lIGJhc2VkIG9uIHRoZSBmdWxsIG1vZHVsZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGRlY2xhcmVzIHRoZSBhbGlhc2VkXG4gICAqIGRpcmVjdGl2ZS9waXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGlhc05hbWUoZGVjbDogQ2xhc3NEZWNsYXJhdGlvbiwgY29udGV4dDogdHMuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gICAgLy8gVGhlIGRlY2xhcmVkIG1vZHVsZSBpcyB1c2VkIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgYWxpYXMuXG4gICAgY29uc3QgZGVjbE1vZHVsZSA9IHRoaXMudW5pZmllZE1vZHVsZXNIb3N0LmZpbGVOYW1lVG9Nb2R1bGVOYW1lKFxuICAgICAgICBkZWNsLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSwgY29udGV4dC5maWxlTmFtZSk7XG5cbiAgICBjb25zdCByZXBsYWNlZCA9IGRlY2xNb2R1bGUucmVwbGFjZShDSEFSU19UT19FU0NBUEUsICdfJykucmVwbGFjZSgvXFwvL2csICckJyk7XG4gICAgcmV0dXJuICfJtW5nJCcgKyByZXBsYWNlZCArICckJCcgKyBkZWNsLm5hbWUudGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGBBbGlhc2luZ0hvc3RgIHdoaWNoIGV4cG9ydHMgZGlyZWN0aXZlcyBmcm9tIGFueSBmaWxlIGNvbnRhaW5pbmcgYW4gTmdNb2R1bGUgaW4gd2hpY2ggdGhleSdyZVxuICogZGVjbGFyZWQvZXhwb3J0ZWQsIHVuZGVyIGEgcHJpdmF0ZSBzeW1ib2wgbmFtZS5cbiAqXG4gKiBUaGVzZSBleHBvcnRzIHN1cHBvcnQgY2FzZXMgd2hlcmUgYW4gTmdNb2R1bGUgaXMgaW1wb3J0ZWQgZGVlcGx5IGZyb20gYW4gYWJzb2x1dGUgbW9kdWxlIHBhdGhcbiAqICh0aGF0IGlzLCBpdCdzIG5vdCBwYXJ0IG9mIGFuIEFuZ3VsYXIgUGFja2FnZSBGb3JtYXQgZW50cnlwb2ludCksIGFuZCB0aGUgY29tcGlsZXIgbmVlZHMgdG9cbiAqIGltcG9ydCBhbnkgbWF0Y2hlZCBkaXJlY3RpdmVzL3BpcGVzIGZyb20gdGhlIHNhbWUgcGF0aCAodG8gdGhlIE5nTW9kdWxlIGZpbGUpLiBTZWUgUkVBRE1FLm1kIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdCBpbXBsZW1lbnRzIEFsaWFzaW5nSG9zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogUmVmbGVjdGlvbkhvc3QpIHt9XG5cbiAgLyoqXG4gICAqIFVuZGVyIHByaXZhdGUgZXhwb3J0IGFsaWFzaW5nLCB0aGUgYEFic29sdXRlTW9kdWxlU3RyYXRlZ3lgIHVzZWQgZm9yIGVtaXR0aW5nIHJlZmVyZW5jZXMgd2lsbFxuICAgKiB3aWxsIHNlbGVjdCBhbGlhc2VkIGV4cG9ydHMgdGhhdCBpdCBmaW5kcyBpbiB0aGUgLmQudHMgZmlsZSBmb3IgYW4gTmdNb2R1bGUncyBmaWxlLiBUaHVzLFxuICAgKiBlbWl0dGluZyB0aGVzZSBleHBvcnRzIGluIC5kLnRzIGlzIGEgcmVxdWlyZW1lbnQgZm9yIHRoZSBgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdGAgdG9cbiAgICogZnVuY3Rpb24gY29ycmVjdGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFeHBvcnRzSW5EdHMgPSB0cnVlO1xuXG4gIG1heWJlQWxpYXNTeW1ib2xBcyhcbiAgICAgIHJlZjogUmVmZXJlbmNlPENsYXNzRGVjbGFyYXRpb24+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBuZ01vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZ3xudWxsIHtcbiAgICBpZiAocmVmLmhhc093bmluZ01vZHVsZUd1ZXNzKSB7XG4gICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgYWxyZWFkeSBoYXZlIGFuIGFzc29jaWF0ZWQgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciwgc2luY2UgdGhleSBjYW4gYmVcbiAgICAgIC8vIHNhZmVseSBpbXBvcnRlZCBmcm9tIHRoYXQgc3BlY2lmaWVyLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIExvb2sgZm9yIGEgdXNlci1wcm92aWRlZCBleHBvcnQgb2YgYGRlY2xgIGluIGBjb250ZXh0YC4gSWYgb25lIGV4aXN0cywgdGhlbiBhbiBhbGlhcyBleHBvcnRcbiAgICAvLyBpcyBub3QgbmVlZGVkLlxuICAgIC8vIFRPRE8oYWx4aHViKTogbWF5YmUgYWRkIGEgaG9zdCBtZXRob2QgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZXhwb3J0IHdpdGhvdXQgZ29pbmdcbiAgICAvLyB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCBvZiBleHBvcnRzLlxuICAgIGNvbnN0IGV4cG9ydHMgPSB0aGlzLmhvc3QuZ2V0RXhwb3J0c09mTW9kdWxlKGNvbnRleHQpO1xuICAgIGlmIChleHBvcnRzID09PSBudWxsKSB7XG4gICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgYW5kIG5vIGV4cG9ydHMgd2VyZSBhdmFpbGFibGUgYXQgYWxsLiBCYWlsIHJhdGhlciB0aGFuIHJpc2sgY3JlYXRpbmdcbiAgICAgIC8vIHJlLWV4cG9ydHMgd2hlbiB0aGV5J3JlIG5vdCBuZWVkZWQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGV4cG9ydHMgb2Y6ICR7Y29udGV4dC5maWxlTmFtZX1gKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XG4gICAgZXhwb3J0cy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZS5ub2RlID09PSByZWYubm9kZSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICAvLyBUaGUgbW9kdWxlIGV4cG9ydHMgdGhlIGRlY2xhcmVkIGNsYXNzIGRpcmVjdGx5LCBubyBhbGlhcyBpcyBuZWNlc3NhcnkuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGDJtW5nRXhwb3J0ybUke25nTW9kdWxlTmFtZX3JtSR7cmVmLm5vZGUubmFtZS50ZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICogQSBgUHJpdmF0ZUV4cG9ydEFsaWFzaW5nSG9zdGAgb25seSBnZW5lcmF0ZXMgcmUtZXhwb3J0cyBhbmQgZG9lcyBub3QgZGlyZWN0IHRoZSBjb21waWxlciB0b1xuICAgKiBkaXJlY3RseSBjb25zdW1lIHRoZSBhbGlhc2VzIGl0IGNyZWF0ZXMuXG4gICAqXG4gICAqIEluc3RlYWQsIHRoZXkncmUgY29uc3VtZWQgaW5kaXJlY3RseTogYEFic29sdXRlTW9kdWxlU3RyYXRlZ3lgIGBSZWZlcmVuY2VFbWl0dGVyU3RyYXRlZ3lgIHdpbGxcbiAgICogc2VsZWN0IHRoZXNlIGFsaWFzIGV4cG9ydHMgYXV0b21hdGljYWxseSB3aGVuIGxvb2tpbmcgZm9yIGFuIGV4cG9ydCBvZiB0aGUgZGlyZWN0aXZlL3BpcGUgZnJvbVxuICAgKiB0aGUgc2FtZSBwYXRoIGFzIHRoZSBOZ01vZHVsZSB3YXMgaW1wb3J0ZWQuXG4gICAqXG4gICAqIFRodXMsIGBnZXRBbGlhc0luYCBhbHdheXMgcmV0dXJucyBgbnVsbGAuXG4gICAqL1xuICBnZXRBbGlhc0luKCk6IG51bGwgeyByZXR1cm4gbnVsbDsgfVxufVxuXG4vKipcbiAqIEEgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgd2hpY2ggd2lsbCBjb25zdW1lIHRoZSBhbGlhcyBhdHRhY2hlZCB0byBhIHBhcnRpY3VsYXIgYFJlZmVyZW5jZWAgdG8gYVxuICogZGlyZWN0aXZlIG9yIHBpcGUsIGlmIGl0IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2VFbWl0U3RyYXRlZ3kge1xuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnRNb2RlOiBJbXBvcnRGbGFncyk6IEV4cHJlc3Npb258bnVsbCB7XG4gICAgaWYgKGltcG9ydE1vZGUgJiBJbXBvcnRGbGFncy5Ob0FsaWFzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmLmFsaWFzO1xuICB9XG59XG4iXX0=
@@ -8,17 +8,38 @@
8
8
  */
9
9
  import { Expression } from '@angular/compiler';
10
10
  import * as ts from 'typescript';
11
+ import { UnifiedModulesHost } from '../../core/api';
11
12
  import { LogicalFileSystem } from '../../file_system';
12
13
  import { ReflectionHost } from '../../reflection';
13
- import { ImportMode, Reference } from './references';
14
+ import { Reference } from './references';
15
+ import { ModuleResolver } from './resolver';
14
16
  /**
15
- * A host which supports an operation to convert a file name into a module name.
16
- *
17
- * This operation is typically implemented as part of the compiler host passed to ngtsc when running
18
- * under a build tool like Bazel or Blaze.
17
+ * Flags which alter the imports generated by the `ReferenceEmitter`.
19
18
  */
20
- export interface FileToModuleHost {
21
- fileNameToModuleName(importedFilePath: string, containingFilePath: string): string;
19
+ export declare enum ImportFlags {
20
+ None = 0,
21
+ /**
22
+ * Force the generation of a new import when generating a reference, even if an identifier already
23
+ * exists in the target file which could be used instead.
24
+ *
25
+ * This is sometimes required if there's a risk TypeScript might remove imports during emit.
26
+ */
27
+ ForceNewImport = 1,
28
+ /**
29
+ * Don't make use of any aliasing information when emitting a reference.
30
+ *
31
+ * This is sometimes required if emitting into a context where generated references will be fed
32
+ * into TypeScript and type-checked (such as in template type-checking).
33
+ */
34
+ NoAliasing = 2,
35
+ /**
36
+ * Indicates that an import to a type-only declaration is allowed.
37
+ *
38
+ * For references that occur in type-positions, the referred declaration may be a type-only
39
+ * declaration that is not retained during emit. Including this flag allows to emit references to
40
+ * type-only declarations as used in e.g. template type-checking.
41
+ */
42
+ AllowTypeImports = 4
22
43
  }
23
44
  /**
24
45
  * A particular strategy for generating an expression which refers to a `Reference`.
@@ -39,10 +60,10 @@ export interface ReferenceEmitStrategy {
39
60
  *
40
61
  * @param ref the `Reference` for which to generate an expression
41
62
  * @param context the source file in which the `Expression` must be valid
42
- * @param importMode a flag which controls whether imports should be generated or not
63
+ * @param importFlags a flag which controls whether imports should be generated or not
43
64
  * @returns an `Expression` which refers to the `Reference`, or `null` if none can be generated
44
65
  */
45
- emit(ref: Reference, context: ts.SourceFile, importMode: ImportMode): Expression | null;
66
+ emit(ref: Reference, context: ts.SourceFile, importFlags: ImportFlags): Expression | null;
46
67
  }
47
68
  /**
48
69
  * Generates `Expression`s which refer to `Reference`s in a given context.
@@ -53,14 +74,14 @@ export interface ReferenceEmitStrategy {
53
74
  export declare class ReferenceEmitter {
54
75
  private strategies;
55
76
  constructor(strategies: ReferenceEmitStrategy[]);
56
- emit(ref: Reference, context: ts.SourceFile, importMode?: ImportMode): Expression;
77
+ emit(ref: Reference, context: ts.SourceFile, importFlags?: ImportFlags): Expression;
57
78
  }
58
79
  /**
59
80
  * A `ReferenceEmitStrategy` which will refer to declarations by any local `ts.Identifier`s, if
60
81
  * such identifiers are available.
61
82
  */
62
83
  export declare class LocalIdentifierStrategy implements ReferenceEmitStrategy {
63
- emit(ref: Reference<ts.Node>, context: ts.SourceFile, importMode: ImportMode): Expression | null;
84
+ emit(ref: Reference<ts.Node>, context: ts.SourceFile, importFlags: ImportFlags): Expression | null;
64
85
  }
65
86
  /**
66
87
  * A `ReferenceEmitStrategy` which will refer to declarations that come from `node_modules` using
@@ -74,16 +95,15 @@ export declare class LocalIdentifierStrategy implements ReferenceEmitStrategy {
74
95
  export declare class AbsoluteModuleStrategy implements ReferenceEmitStrategy {
75
96
  protected program: ts.Program;
76
97
  protected checker: ts.TypeChecker;
77
- protected options: ts.CompilerOptions;
78
- protected host: ts.CompilerHost;
98
+ protected moduleResolver: ModuleResolver;
79
99
  private reflectionHost;
80
100
  /**
81
101
  * A cache of the exports of specific modules, because resolving a module to its exports is a
82
102
  * costly operation.
83
103
  */
84
104
  private moduleExportsCache;
85
- constructor(program: ts.Program, checker: ts.TypeChecker, options: ts.CompilerOptions, host: ts.CompilerHost, reflectionHost: ReflectionHost);
86
- emit(ref: Reference<ts.Node>, context: ts.SourceFile, importMode: ImportMode): Expression | null;
105
+ constructor(program: ts.Program, checker: ts.TypeChecker, moduleResolver: ModuleResolver, reflectionHost: ReflectionHost);
106
+ emit(ref: Reference<ts.Node>, context: ts.SourceFile, importFlags: ImportFlags): Expression | null;
87
107
  private resolveImportName;
88
108
  private getExportsOfModule;
89
109
  protected enumerateExportsOfModule(specifier: string, fromFile: string): Map<ts.Declaration, string> | null;
@@ -114,11 +134,12 @@ export declare class RelativePathStrategy implements ReferenceEmitStrategy {
114
134
  emit(ref: Reference<ts.Node>, context: ts.SourceFile): Expression | null;
115
135
  }
116
136
  /**
117
- * A `ReferenceEmitStrategy` which uses a `FileToModuleHost` to generate absolute import references.
137
+ * A `ReferenceEmitStrategy` which uses a `UnifiedModulesHost` to generate absolute import
138
+ * references.
118
139
  */
119
- export declare class FileToModuleStrategy implements ReferenceEmitStrategy {
140
+ export declare class UnifiedModulesStrategy implements ReferenceEmitStrategy {
120
141
  private reflector;
121
- private fileToModuleHost;
122
- constructor(reflector: ReflectionHost, fileToModuleHost: FileToModuleHost);
142
+ private unifiedModulesHost;
143
+ constructor(reflector: ReflectionHost, unifiedModulesHost: UnifiedModulesHost);
123
144
  emit(ref: Reference<ts.Node>, context: ts.SourceFile): Expression | null;
124
145
  }
@@ -4,7 +4,7 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define("@angular/compiler-cli/src/ngtsc/imports/src/emitter", ["require", "exports", "tslib", "@angular/compiler", "@angular/compiler-cli/src/ngtsc/file_system", "@angular/compiler-cli/src/ngtsc/file_system/src/util", "@angular/compiler-cli/src/ngtsc/util/src/typescript", "@angular/compiler-cli/src/ngtsc/imports/src/find_export", "@angular/compiler-cli/src/ngtsc/imports/src/references"], factory);
7
+ define("@angular/compiler-cli/src/ngtsc/imports/src/emitter", ["require", "exports", "tslib", "@angular/compiler", "typescript", "@angular/compiler-cli/src/ngtsc/file_system", "@angular/compiler-cli/src/ngtsc/file_system/src/util", "@angular/compiler-cli/src/ngtsc/util/src/typescript", "@angular/compiler-cli/src/ngtsc/imports/src/find_export"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
@@ -18,11 +18,40 @@
18
18
  * found in the LICENSE file at https://angular.io/license
19
19
  */
20
20
  var compiler_1 = require("@angular/compiler");
21
+ var ts = require("typescript");
21
22
  var file_system_1 = require("@angular/compiler-cli/src/ngtsc/file_system");
22
23
  var util_1 = require("@angular/compiler-cli/src/ngtsc/file_system/src/util");
23
24
  var typescript_1 = require("@angular/compiler-cli/src/ngtsc/util/src/typescript");
24
25
  var find_export_1 = require("@angular/compiler-cli/src/ngtsc/imports/src/find_export");
25
- var references_1 = require("@angular/compiler-cli/src/ngtsc/imports/src/references");
26
+ /**
27
+ * Flags which alter the imports generated by the `ReferenceEmitter`.
28
+ */
29
+ var ImportFlags;
30
+ (function (ImportFlags) {
31
+ ImportFlags[ImportFlags["None"] = 0] = "None";
32
+ /**
33
+ * Force the generation of a new import when generating a reference, even if an identifier already
34
+ * exists in the target file which could be used instead.
35
+ *
36
+ * This is sometimes required if there's a risk TypeScript might remove imports during emit.
37
+ */
38
+ ImportFlags[ImportFlags["ForceNewImport"] = 1] = "ForceNewImport";
39
+ /**
40
+ * Don't make use of any aliasing information when emitting a reference.
41
+ *
42
+ * This is sometimes required if emitting into a context where generated references will be fed
43
+ * into TypeScript and type-checked (such as in template type-checking).
44
+ */
45
+ ImportFlags[ImportFlags["NoAliasing"] = 2] = "NoAliasing";
46
+ /**
47
+ * Indicates that an import to a type-only declaration is allowed.
48
+ *
49
+ * For references that occur in type-positions, the referred declaration may be a type-only
50
+ * declaration that is not retained during emit. Including this flag allows to emit references to
51
+ * type-only declarations as used in e.g. template type-checking.
52
+ */
53
+ ImportFlags[ImportFlags["AllowTypeImports"] = 4] = "AllowTypeImports";
54
+ })(ImportFlags = exports.ImportFlags || (exports.ImportFlags = {}));
26
55
  /**
27
56
  * Generates `Expression`s which refer to `Reference`s in a given context.
28
57
  *
@@ -33,13 +62,13 @@
33
62
  function ReferenceEmitter(strategies) {
34
63
  this.strategies = strategies;
35
64
  }
36
- ReferenceEmitter.prototype.emit = function (ref, context, importMode) {
65
+ ReferenceEmitter.prototype.emit = function (ref, context, importFlags) {
37
66
  var e_1, _a;
38
- if (importMode === void 0) { importMode = references_1.ImportMode.UseExistingImport; }
67
+ if (importFlags === void 0) { importFlags = ImportFlags.None; }
39
68
  try {
40
69
  for (var _b = tslib_1.__values(this.strategies), _c = _b.next(); !_c.done; _c = _b.next()) {
41
70
  var strategy = _c.value;
42
- var emitted = strategy.emit(ref, context, importMode);
71
+ var emitted = strategy.emit(ref, context, importFlags);
43
72
  if (emitted !== null) {
44
73
  return emitted;
45
74
  }
@@ -64,10 +93,10 @@
64
93
  var LocalIdentifierStrategy = /** @class */ (function () {
65
94
  function LocalIdentifierStrategy() {
66
95
  }
67
- LocalIdentifierStrategy.prototype.emit = function (ref, context, importMode) {
96
+ LocalIdentifierStrategy.prototype.emit = function (ref, context, importFlags) {
68
97
  // If the emitter has specified ForceNewImport, then LocalIdentifierStrategy should not use a
69
98
  // local identifier at all, *except* in the source file where the node is actually declared.
70
- if (importMode === references_1.ImportMode.ForceNewImport &&
99
+ if (importFlags & ImportFlags.ForceNewImport &&
71
100
  typescript_1.getSourceFile(ref.node) !== typescript_1.getSourceFile(context)) {
72
101
  return null;
73
102
  }
@@ -94,11 +123,10 @@
94
123
  * which maps back to the original directive, an error is thrown.
95
124
  */
96
125
  var AbsoluteModuleStrategy = /** @class */ (function () {
97
- function AbsoluteModuleStrategy(program, checker, options, host, reflectionHost) {
126
+ function AbsoluteModuleStrategy(program, checker, moduleResolver, reflectionHost) {
98
127
  this.program = program;
99
128
  this.checker = checker;
100
- this.options = options;
101
- this.host = host;
129
+ this.moduleResolver = moduleResolver;
102
130
  this.reflectionHost = reflectionHost;
103
131
  /**
104
132
  * A cache of the exports of specific modules, because resolving a module to its exports is a
@@ -106,7 +134,7 @@
106
134
  */
107
135
  this.moduleExportsCache = new Map();
108
136
  }
109
- AbsoluteModuleStrategy.prototype.emit = function (ref, context, importMode) {
137
+ AbsoluteModuleStrategy.prototype.emit = function (ref, context, importFlags) {
110
138
  if (ref.bestGuessOwningModule === null) {
111
139
  // There is no module name available for this Reference, meaning it was arrived at via a
112
140
  // relative path.
@@ -114,7 +142,10 @@
114
142
  }
115
143
  else if (!typescript_1.isDeclaration(ref.node)) {
116
144
  // It's not possible to import something which isn't a declaration.
117
- throw new Error('Debug assert: importing a Reference to non-declaration?');
145
+ throw new Error("Debug assert: unable to import a Reference to non-declaration of type " + ts.SyntaxKind[ref.node.kind] + ".");
146
+ }
147
+ else if ((importFlags & ImportFlags.AllowTypeImports) === 0 && typescript_1.isTypeDeclaration(ref.node)) {
148
+ throw new Error("Importing a type-only declaration of type " + ts.SyntaxKind[ref.node.kind] + " in a value position is not allowed.");
118
149
  }
119
150
  // Try to find the exported name of the declaration, if one is available.
120
151
  var _a = ref.bestGuessOwningModule, specifier = _a.specifier, resolutionContext = _a.resolutionContext;
@@ -143,11 +174,7 @@
143
174
  };
144
175
  AbsoluteModuleStrategy.prototype.enumerateExportsOfModule = function (specifier, fromFile) {
145
176
  // First, resolve the module specifier to its entry point, and get the ts.Symbol for it.
146
- var resolvedModule = typescript_1.resolveModuleName(specifier, fromFile, this.options, this.host);
147
- if (resolvedModule === undefined) {
148
- return null;
149
- }
150
- var entryPointFile = typescript_1.getSourceFileOrNull(this.program, file_system_1.absoluteFrom(resolvedModule.resolvedFileName));
177
+ var entryPointFile = this.moduleResolver.resolveModule(specifier, fromFile);
151
178
  if (entryPointFile === null) {
152
179
  return null;
153
180
  }
@@ -234,24 +261,25 @@
234
261
  }());
235
262
  exports.RelativePathStrategy = RelativePathStrategy;
236
263
  /**
237
- * A `ReferenceEmitStrategy` which uses a `FileToModuleHost` to generate absolute import references.
264
+ * A `ReferenceEmitStrategy` which uses a `UnifiedModulesHost` to generate absolute import
265
+ * references.
238
266
  */
239
- var FileToModuleStrategy = /** @class */ (function () {
240
- function FileToModuleStrategy(reflector, fileToModuleHost) {
267
+ var UnifiedModulesStrategy = /** @class */ (function () {
268
+ function UnifiedModulesStrategy(reflector, unifiedModulesHost) {
241
269
  this.reflector = reflector;
242
- this.fileToModuleHost = fileToModuleHost;
270
+ this.unifiedModulesHost = unifiedModulesHost;
243
271
  }
244
- FileToModuleStrategy.prototype.emit = function (ref, context) {
272
+ UnifiedModulesStrategy.prototype.emit = function (ref, context) {
245
273
  var destSf = typescript_1.getSourceFile(ref.node);
246
274
  var name = find_export_1.findExportedNameOfNode(ref.node, destSf, this.reflector);
247
275
  if (name === null) {
248
276
  return null;
249
277
  }
250
- var moduleName = this.fileToModuleHost.fileNameToModuleName(destSf.fileName, context.fileName);
278
+ var moduleName = this.unifiedModulesHost.fileNameToModuleName(destSf.fileName, context.fileName);
251
279
  return new compiler_1.ExternalExpr({ moduleName: moduleName, name: name });
252
280
  };
253
- return FileToModuleStrategy;
281
+ return UnifiedModulesStrategy;
254
282
  }());
255
- exports.FileToModuleStrategy = FileToModuleStrategy;
283
+ exports.UnifiedModulesStrategy = UnifiedModulesStrategy;
256
284
  });
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvaW1wb3J0cy9zcmMvZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUFBQTs7Ozs7O09BTUc7SUFDSCw4Q0FBK0Y7SUFHL0YsMkVBQWlLO0lBQ2pLLDZFQUEwRDtJQUUxRCxrRkFBaUk7SUFFakksdUZBQXFEO0lBQ3JELHFGQUFtRDtJQXVDbkQ7Ozs7O09BS0c7SUFDSDtRQUNFLDBCQUFvQixVQUFtQztZQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUFHLENBQUM7UUFFM0QsK0JBQUksR0FBSixVQUNJLEdBQWMsRUFBRSxPQUFzQixFQUN0QyxVQUFxRDs7WUFBckQsMkJBQUEsRUFBQSxhQUF5Qix1QkFBVSxDQUFDLGlCQUFpQjs7Z0JBQ3ZELEtBQXVCLElBQUEsS0FBQSxpQkFBQSxJQUFJLENBQUMsVUFBVSxDQUFBLGdCQUFBLDRCQUFFO29CQUFuQyxJQUFNLFFBQVEsV0FBQTtvQkFDakIsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUN4RCxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7d0JBQ3BCLE9BQU8sT0FBTyxDQUFDO3FCQUNoQjtpQkFDRjs7Ozs7Ozs7O1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDWCxvQ0FBa0MsNkJBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxjQUFTLE9BQU8sQ0FBQyxRQUFVLENBQUMsQ0FBQztRQUN2SSxDQUFDO1FBQ0gsdUJBQUM7SUFBRCxDQUFDLEFBZkQsSUFlQztJQWZZLDRDQUFnQjtJQWlCN0I7OztPQUdHO0lBQ0g7UUFBQTtRQWtCQSxD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QWdCO1lBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFHLENBQUM7UUFFN0YsbUNBQUksR0FBSixVQUFLLEdBQXVCLEVBQUUsT0FBc0I7WUFDbEQsSUFBTSxNQUFNLEdBQUcsMEJBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBTSxJQUFJLEdBQUcsb0NBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDakIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELElBQU0sVUFBVSxHQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVsRixPQUFPLElBQUksdUJBQVksQ0FBQyxFQUFDLFVBQVUsWUFBQSxFQUFFLElBQUksTUFBQSxFQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0gsMkJBQUM7SUFBRCxDQUFDLEFBZkQsSUFlQztJQWZZLG9EQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCB7RXhwcmVzc2lvbiwgRXh0ZXJuYWxFeHByLCBFeHRlcm5hbFJlZmVyZW5jZSwgV3JhcHBlZE5vZGVFeHByfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtMb2dpY2FsRmlsZVN5c3RlbSwgTG9naWNhbFByb2plY3RQYXRoLCBQYXRoU2VnbWVudCwgYWJzb2x1dGVGcm9tLCBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlLCBiYXNlbmFtZSwgZGlybmFtZSwgcmVsYXRpdmUsIHJlc29sdmV9IGZyb20gJy4uLy4uL2ZpbGVfc3lzdGVtJztcbmltcG9ydCB7c3RyaXBFeHRlbnNpb259IGZyb20gJy4uLy4uL2ZpbGVfc3lzdGVtL3NyYy91dGlsJztcbmltcG9ydCB7UmVmbGVjdGlvbkhvc3R9IGZyb20gJy4uLy4uL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtnZXRTb3VyY2VGaWxlLCBnZXRTb3VyY2VGaWxlT3JOdWxsLCBpc0RlY2xhcmF0aW9uLCBub2RlTmFtZUZvckVycm9yLCByZXNvbHZlTW9kdWxlTmFtZX0gZnJvbSAnLi4vLi4vdXRpbC9zcmMvdHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7ZmluZEV4cG9ydGVkTmFtZU9mTm9kZX0gZnJvbSAnLi9maW5kX2V4cG9ydCc7XG5pbXBvcnQge0ltcG9ydE1vZGUsIFJlZmVyZW5jZX0gZnJvbSAnLi9yZWZlcmVuY2VzJztcblxuXG5cbi8qKlxuICogQSBob3N0IHdoaWNoIHN1cHBvcnRzIGFuIG9wZXJhdGlvbiB0byBjb252ZXJ0IGEgZmlsZSBuYW1lIGludG8gYSBtb2R1bGUgbmFtZS5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYXMgcGFydCBvZiB0aGUgY29tcGlsZXIgaG9zdCBwYXNzZWQgdG8gbmd0c2Mgd2hlbiBydW5uaW5nXG4gKiB1bmRlciBhIGJ1aWxkIHRvb2wgbGlrZSBCYXplbCBvciBCbGF6ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlVG9Nb2R1bGVIb3N0IHtcbiAgZmlsZU5hbWVUb01vZHVsZU5hbWUoaW1wb3J0ZWRGaWxlUGF0aDogc3RyaW5nLCBjb250YWluaW5nRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHBhcnRpY3VsYXIgc3RyYXRlZ3kgZm9yIGdlbmVyYXRpbmcgYW4gZXhwcmVzc2lvbiB3aGljaCByZWZlcnMgdG8gYSBgUmVmZXJlbmNlYC5cbiAqXG4gKiBUaGVyZSBhcmUgbWFueSBwb3RlbnRpYWwgd2F5cyBhIGdpdmVuIGBSZWZlcmVuY2VgIGNvdWxkIGJlIHJlZmVycmVkIHRvIGluIHRoZSBjb250ZXh0IG9mIGEgZ2l2ZW5cbiAqIGZpbGUuIEEgbG9jYWwgZGVjbGFyYXRpb24gY291bGQgYmUgYXZhaWxhYmxlLCB0aGUgYFJlZmVyZW5jZWAgY291bGQgYmUgaW1wb3J0YWJsZSB2aWEgYSByZWxhdGl2ZVxuICogaW1wb3J0IHdpdGhpbiB0aGUgcHJvamVjdCwgb3IgYW4gYWJzb2x1dGUgaW1wb3J0IGludG8gYG5vZGVfbW9kdWxlc2AgbWlnaHQgYmUgbmVjZXNzYXJ5LlxuICpcbiAqIERpZmZlcmVudCBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCBpbXBsZW1lbnRhdGlvbnMgaW1wbGVtZW50IHNwZWNpZmljIGxvZ2ljIGZvciBnZW5lcmF0aW5nIHN1Y2hcbiAqIHJlZmVyZW5jZXMuIEEgc2luZ2xlIHN0cmF0ZWd5IChzdWNoIGFzIHVzaW5nIGEgbG9jYWwgZGVjbGFyYXRpb24pIG1heSBub3QgYWx3YXlzIGJlIGFibGUgdG9cbiAqIGdlbmVyYXRlIGFuIGV4cHJlc3Npb24gZm9yIGV2ZXJ5IGBSZWZlcmVuY2VgIChmb3IgZXhhbXBsZSwgaWYgbm8gbG9jYWwgaWRlbnRpZmllciBpcyBhdmFpbGFibGUpLFxuICogYW5kIG1heSByZXR1cm4gYG51bGxgIGluIHN1Y2ggYSBjYXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBFbWl0IGFuIGBFeHByZXNzaW9uYCB3aGljaCByZWZlcnMgdG8gdGhlIGdpdmVuIGBSZWZlcmVuY2VgIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhclxuICAgKiBzb3VyY2UgZmlsZSwgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgdGhlIGBSZWZlcmVuY2VgIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhbiBleHByZXNzaW9uXG4gICAqIEBwYXJhbSBjb250ZXh0IHRoZSBzb3VyY2UgZmlsZSBpbiB3aGljaCB0aGUgYEV4cHJlc3Npb25gIG11c3QgYmUgdmFsaWRcbiAgICogQHBhcmFtIGltcG9ydE1vZGUgYSBmbGFnIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIgaW1wb3J0cyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdFxuICAgKiBAcmV0dXJucyBhbiBgRXhwcmVzc2lvbmAgd2hpY2ggcmVmZXJzIHRvIHRoZSBgUmVmZXJlbmNlYCwgb3IgYG51bGxgIGlmIG5vbmUgY2FuIGJlIGdlbmVyYXRlZFxuICAgKi9cbiAgZW1pdChyZWY6IFJlZmVyZW5jZSwgY29udGV4dDogdHMuU291cmNlRmlsZSwgaW1wb3J0TW9kZTogSW1wb3J0TW9kZSk6IEV4cHJlc3Npb258bnVsbDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYEV4cHJlc3Npb25gcyB3aGljaCByZWZlciB0byBgUmVmZXJlbmNlYHMgaW4gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEEgYFJlZmVyZW5jZUVtaXR0ZXJgIHVzZXMgb25lIG9yIG1vcmUgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgaW1wbGVtZW50YXRpb25zIHRvIHByb2R1Y2UgYW5cbiAqIGBFeHByZXNzaW9uYCB3aGljaCByZWZlcnMgdG8gYSBgUmVmZXJlbmNlYCBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgZmlsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUVtaXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0cmF0ZWdpZXM6IFJlZmVyZW5jZUVtaXRTdHJhdGVneVtdKSB7fVxuXG4gIGVtaXQoXG4gICAgICByZWY6IFJlZmVyZW5jZSwgY29udGV4dDogdHMuU291cmNlRmlsZSxcbiAgICAgIGltcG9ydE1vZGU6IEltcG9ydE1vZGXCoD0gSW1wb3J0TW9kZS5Vc2VFeGlzdGluZ0ltcG9ydCk6IEV4cHJlc3Npb24ge1xuICAgIGZvciAoY29uc3Qgc3RyYXRlZ3kgb2YgdGhpcy5zdHJhdGVnaWVzKSB7XG4gICAgICBjb25zdCBlbWl0dGVkID0gc3RyYXRlZ3kuZW1pdChyZWYsIGNvbnRleHQsIGltcG9ydE1vZGUpO1xuICAgICAgaWYgKGVtaXR0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGVtaXR0ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byB3cml0ZSBhIHJlZmVyZW5jZSB0byAke25vZGVOYW1lRm9yRXJyb3IocmVmLm5vZGUpfSBpbiAke3JlZi5ub2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZX0gZnJvbSAke2NvbnRleHQuZmlsZU5hbWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGBSZWZlcmVuY2VFbWl0U3RyYXRlZ3lgIHdoaWNoIHdpbGwgcmVmZXIgdG8gZGVjbGFyYXRpb25zIGJ5IGFueSBsb2NhbCBgdHMuSWRlbnRpZmllcmBzLCBpZlxuICogc3VjaCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxJZGVudGlmaWVyU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2VFbWl0U3RyYXRlZ3kge1xuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnRNb2RlOiBJbXBvcnRNb2RlKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICAvLyBJZiB0aGUgZW1pdHRlciBoYXMgc3BlY2lmaWVkIEZvcmNlTmV3SW1wb3J0LCB0aGVuIExvY2FsSWRlbnRpZmllclN0cmF0ZWd5IHNob3VsZCBub3QgdXNlIGFcbiAgICAvLyBsb2NhbCBpZGVudGlmaWVyIGF0IGFsbCwgKmV4Y2VwdCogaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBub2RlIGlzIGFjdHVhbGx5IGRlY2xhcmVkLlxuICAgIGlmIChpbXBvcnRNb2RlID09PSBJbXBvcnRNb2RlLkZvcmNlTmV3SW1wb3J0ICYmXG4gICAgICAgIGdldFNvdXJjZUZpbGUocmVmLm5vZGUpICE9PSBnZXRTb3VyY2VGaWxlKGNvbnRleHQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBIFJlZmVyZW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSBpZGVudGl0aWVzIGluIGRpZmZlcmVudCBmaWxlcywgc28gaXQgbWF5IGFscmVhZHkgaGF2ZSBhblxuICAgIC8vIElkZW50aWZpZXIgaW4gdGhlIHJlcXVlc3RlZCBjb250ZXh0IGZpbGUuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IHJlZi5nZXRJZGVudGl0eUluKGNvbnRleHQpO1xuICAgIGlmIChpZGVudGlmaWVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IFdyYXBwZWROb2RlRXhwcihpZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCB3aGljaCB3aWxsIHJlZmVyIHRvIGRlY2xhcmF0aW9ucyB0aGF0IGNvbWUgZnJvbSBgbm9kZV9tb2R1bGVzYCB1c2luZ1xuICogYW4gYWJzb2x1dGUgaW1wb3J0LlxuICpcbiAqIFBhcnQgb2YgdGhpcyBzdHJhdGVneSBpbnZvbHZlcyBsb29raW5nIGF0IHRoZSB0YXJnZXQgZW50cnkgcG9pbnQgYW5kIGlkZW50aWZ5aW5nIHRoZSBleHBvcnRlZFxuICogbmFtZSBvZiB0aGUgdGFyZ2V0ZWQgZGVjbGFyYXRpb24sIGFzIGl0IG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWNsYXJlZCBuYW1lIChlLmcuIGFcbiAqIGRpcmVjdGl2ZSBtaWdodCBiZSBkZWNsYXJlZCBhcyBGb29EaXJJbXBsLCBidXQgZXhwb3J0ZWQgYXMgRm9vRGlyKS4gSWYgbm8gZXhwb3J0IGNhbiBiZSBmb3VuZFxuICogd2hpY2ggbWFwcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkaXJlY3RpdmUsIGFuIGVycm9yIGlzIHRocm93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kdWxlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2VFbWl0U3RyYXRlZ3kge1xuICAvKipcbiAgICogQSBjYWNoZSBvZiB0aGUgZXhwb3J0cyBvZiBzcGVjaWZpYyBtb2R1bGVzLCBiZWNhdXNlIHJlc29sdmluZyBhIG1vZHVsZSB0byBpdHMgZXhwb3J0cyBpcyBhXG4gICAqIGNvc3RseSBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIG1vZHVsZUV4cG9ydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8dHMuRGVjbGFyYXRpb24sIHN0cmluZz58bnVsbD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBwcm9ncmFtOiB0cy5Qcm9ncmFtLCBwcm90ZWN0ZWQgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgICBwcm90ZWN0ZWQgb3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zLCBwcm90ZWN0ZWQgaG9zdDogdHMuQ29tcGlsZXJIb3N0LFxuICAgICAgcHJpdmF0ZSByZWZsZWN0aW9uSG9zdDogUmVmbGVjdGlvbkhvc3QpIHt9XG5cbiAgZW1pdChyZWY6IFJlZmVyZW5jZTx0cy5Ob2RlPiwgY29udGV4dDogdHMuU291cmNlRmlsZSwgaW1wb3J0TW9kZTogSW1wb3J0TW9kZSk6IEV4cHJlc3Npb258bnVsbCB7XG4gICAgaWYgKHJlZi5iZXN0R3Vlc3NPd25pbmdNb2R1bGUgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIG1vZHVsZSBuYW1lIGF2YWlsYWJsZSBmb3IgdGhpcyBSZWZlcmVuY2UsIG1lYW5pbmcgaXQgd2FzIGFycml2ZWQgYXQgdmlhIGFcbiAgICAgIC8vIHJlbGF0aXZlIHBhdGguXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCFpc0RlY2xhcmF0aW9uKHJlZi5ub2RlKSkge1xuICAgICAgLy8gSXQncyBub3QgcG9zc2libGUgdG8gaW1wb3J0IHNvbWV0aGluZyB3aGljaCBpc24ndCBhIGRlY2xhcmF0aW9uLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWJ1ZyBhc3NlcnQ6IGltcG9ydGluZyBhIFJlZmVyZW5jZSB0byBub24tZGVjbGFyYXRpb24/Jyk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGV4cG9ydGVkIG5hbWUgb2YgdGhlIGRlY2xhcmF0aW9uLCBpZiBvbmUgaXMgYXZhaWxhYmxlLlxuICAgIGNvbnN0IHtzcGVjaWZpZXIsIHJlc29sdXRpb25Db250ZXh0fSA9IHJlZi5iZXN0R3Vlc3NPd25pbmdNb2R1bGU7XG4gICAgY29uc3Qgc3ltYm9sTmFtZSA9IHRoaXMucmVzb2x2ZUltcG9ydE5hbWUoc3BlY2lmaWVyLCByZWYubm9kZSwgcmVzb2x1dGlvbkNvbnRleHQpO1xuICAgIGlmIChzeW1ib2xOYW1lID09PSBudWxsKSB7XG4gICAgICAvLyBUT0RPKGFseGh1Yik6IG1ha2UgdGhpcyBlcnJvciBhIHRzLkRpYWdub3N0aWMgcG9pbnRpbmcgYXQgd2hhdGV2ZXIgY2F1c2VkIHRoaXMgaW1wb3J0IHRvIGJlXG4gICAgICAvLyB0cmlnZ2VyZWQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bWJvbCAke3JlZi5kZWJ1Z05hbWV9IGRlY2xhcmVkIGluICR7Z2V0U291cmNlRmlsZShyZWYubm9kZSkuZmlsZU5hbWV9IGlzIG5vdCBleHBvcnRlZCBmcm9tICR7c3BlY2lmaWVyfSAoaW1wb3J0IGludG8gJHtjb250ZXh0LmZpbGVOYW1lfSlgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcihuZXcgRXh0ZXJuYWxSZWZlcmVuY2Uoc3BlY2lmaWVyLCBzeW1ib2xOYW1lKSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbXBvcnROYW1lKG1vZHVsZU5hbWU6IHN0cmluZywgdGFyZ2V0OiB0cy5EZWNsYXJhdGlvbiwgZnJvbUZpbGU6IHN0cmluZyk6IHN0cmluZ1xuICAgICAgfG51bGwge1xuICAgIGNvbnN0IGV4cG9ydHMgPSB0aGlzLmdldEV4cG9ydHNPZk1vZHVsZShtb2R1bGVOYW1lLCBmcm9tRmlsZSk7XG4gICAgaWYgKGV4cG9ydHMgIT09IG51bGwgJiYgZXhwb3J0cy5oYXModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZ2V0KHRhcmdldCkgITtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlTmFtZTogc3RyaW5nLCBmcm9tRmlsZTogc3RyaW5nKTpcbiAgICAgIE1hcDx0cy5EZWNsYXJhdGlvbiwgc3RyaW5nPnxudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kdWxlRXhwb3J0c0NhY2hlLmhhcyhtb2R1bGVOYW1lKSkge1xuICAgICAgdGhpcy5tb2R1bGVFeHBvcnRzQ2FjaGUuc2V0KG1vZHVsZU5hbWUsIHRoaXMuZW51bWVyYXRlRXhwb3J0c09mTW9kdWxlKG1vZHVsZU5hbWUsIGZyb21GaWxlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZHVsZUV4cG9ydHNDYWNoZS5nZXQobW9kdWxlTmFtZSkgITtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbnVtZXJhdGVFeHBvcnRzT2ZNb2R1bGUoc3BlY2lmaWVyOiBzdHJpbmcsIGZyb21GaWxlOiBzdHJpbmcpOlxuICAgICAgTWFwPHRzLkRlY2xhcmF0aW9uLCBzdHJpbmc+fG51bGwge1xuICAgIC8vIEZpcnN0LCByZXNvbHZlIHRoZSBtb2R1bGUgc3BlY2lmaWVyIHRvIGl0cyBlbnRyeSBwb2ludCwgYW5kIGdldCB0aGUgdHMuU3ltYm9sIGZvciBpdC5cbiAgICBjb25zdCByZXNvbHZlZE1vZHVsZSA9IHJlc29sdmVNb2R1bGVOYW1lKHNwZWNpZmllciwgZnJvbUZpbGUsIHRoaXMub3B0aW9ucywgdGhpcy5ob3N0KTtcbiAgICBpZiAocmVzb2x2ZWRNb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlQb2ludEZpbGUgPVxuICAgICAgICBnZXRTb3VyY2VGaWxlT3JOdWxsKHRoaXMucHJvZ3JhbSwgYWJzb2x1dGVGcm9tKHJlc29sdmVkTW9kdWxlLnJlc29sdmVkRmlsZU5hbWUpKTtcbiAgICBpZiAoZW50cnlQb2ludEZpbGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cG9ydHMgPSB0aGlzLnJlZmxlY3Rpb25Ib3N0LmdldEV4cG9ydHNPZk1vZHVsZShlbnRyeVBvaW50RmlsZSk7XG4gICAgaWYgKGV4cG9ydHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBleHBvcnRNYXAgPSBuZXcgTWFwPHRzLkRlY2xhcmF0aW9uLCBzdHJpbmc+KCk7XG4gICAgZXhwb3J0cy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgbmFtZSkgPT4ge1xuICAgICAgLy8gSXQncyBva2F5IHRvIHNraXAgaW5saW5lIGRlY2xhcmF0aW9ucywgc2luY2UgYnkgZGVmaW5pdGlvbiB0aGV5J3JlIG5vdCB0YXJnZXQtYWJsZSB3aXRoIGFcbiAgICAgIC8vIHRzLkRlY2xhcmF0aW9uIGFueXdheS5cbiAgICAgIGlmIChkZWNsYXJhdGlvbi5ub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGV4cG9ydE1hcC5zZXQoZGVjbGFyYXRpb24ubm9kZSwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cG9ydE1hcDtcbiAgfVxufVxuXG4vKipcbiAqIEEgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgd2hpY2ggd2lsbCByZWZlciB0byBkZWNsYXJhdGlvbnMgdmlhIHJlbGF0aXZlIHBhdGhzLCBwcm92aWRlZCB0aGV5J3JlXG4gKiBib3RoIGluIHRoZSBsb2dpY2FsIHByb2plY3QgXCJzcGFjZVwiIG9mIHBhdGhzLlxuICpcbiAqIFRoaXMgaXMgdHJpY2tpZXIgdGhhbiBpdCBzb3VuZHMsIGFzIHRoZSB0d28gZmlsZXMgbWF5IGJlIGluIGRpZmZlcmVudCByb290IGRpcmVjdG9yaWVzIGluIHRoZVxuICogcHJvamVjdC4gU2ltcGx5IGNhbGN1bGF0aW5nIGEgZmlsZSBzeXN0ZW0gcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRoZSB0d28gaXMgbm90IHN1ZmZpY2llbnQuXG4gKiBJbnN0ZWFkLCBgTG9naWNhbFByb2plY3RQYXRoYHMgYXJlIHVzZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsUHJvamVjdFN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWZsZWN0b3I6IFJlZmxlY3Rpb25Ib3N0LCBwcml2YXRlIGxvZ2ljYWxGczogTG9naWNhbEZpbGVTeXN0ZW0pIHt9XG5cbiAgZW1pdChyZWY6IFJlZmVyZW5jZTx0cy5Ob2RlPiwgY29udGV4dDogdHMuU291cmNlRmlsZSk6IEV4cHJlc3Npb258bnVsbCB7XG4gICAgY29uc3QgZGVzdFNmID0gZ2V0U291cmNlRmlsZShyZWYubm9kZSk7XG5cbiAgICAvLyBDb21wdXRlIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGltcG9ydGluZyBmaWxlIHRvIHRoZSBmaWxlIGJlaW5nIGltcG9ydGVkLiBUaGlzIGlzIGRvbmVcbiAgICAvLyBhcyBhIGxvZ2ljYWwgcGF0aCBjb21wdXRhdGlvbiwgYmVjYXVzZSB0aGUgdHdvIGZpbGVzIG1pZ2h0IGJlIGluIGRpZmZlcmVudCByb290RGlycy5cbiAgICBjb25zdCBkZXN0UGF0aCA9IHRoaXMubG9naWNhbEZzLmxvZ2ljYWxQYXRoT2ZTZihkZXN0U2YpO1xuICAgIGlmIChkZXN0UGF0aCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGltcG9ydGVkIGZpbGUgaXMgbm90IHdpdGhpbiB0aGUgbG9naWNhbCBwcm9qZWN0IGZpbGVzeXN0ZW0uXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5QYXRoID0gdGhpcy5sb2dpY2FsRnMubG9naWNhbFBhdGhPZlNmKGNvbnRleHQpO1xuICAgIGlmIChvcmlnaW5QYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYERlYnVnIGFzc2VydDogYXR0ZW1wdCB0byBpbXBvcnQgZnJvbSAke2NvbnRleHQuZmlsZU5hbWV9IGJ1dCBpdCdzIG91dHNpZGUgdGhlIHByb2dyYW0/YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlcmUncyBubyB3YXkgdG8gZW1pdCBhIHJlbGF0aXZlIHJlZmVyZW5jZSBmcm9tIGEgZmlsZSB0byBpdHNlbGYuXG4gICAgaWYgKGRlc3RQYXRoID09PSBvcmlnaW5QYXRoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gZmluZEV4cG9ydGVkTmFtZU9mTm9kZShyZWYubm9kZSwgZGVzdFNmLCB0aGlzLnJlZmxlY3Rvcik7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSB0YXJnZXQgZGVjbGFyYXRpb24gaXNuJ3QgZXhwb3J0ZWQgZnJvbSB0aGUgZmlsZSBpdCdzIGRlY2xhcmVkIGluLiBUaGlzIGlzIGFuIGlzc3VlIVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gV2l0aCBib3RoIGZpbGVzIGV4cHJlc3NlZCBhcyBMb2dpY2FsUHJvamVjdFBhdGhzLCBnZXR0aW5nIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFzIGEgcmVsYXRpdmVcbiAgICAvLyBwYXRoIGlzIG5vdyBzdHJhaWdodGZvcndhcmQuXG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IExvZ2ljYWxQcm9qZWN0UGF0aC5yZWxhdGl2ZVBhdGhCZXR3ZWVuKG9yaWdpblBhdGgsIGRlc3RQYXRoKTtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcih7bW9kdWxlTmFtZSwgbmFtZX0pO1xuICB9XG59XG5cbi8qKlxuICogQSBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCB3aGljaCBjb25zdHJ1Y3RzIHJlbGF0aXZlcyBwYXRocyBiZXR3ZWVuIGB0cy5Tb3VyY2VGaWxlYHMuXG4gKlxuICogVGhpcyBzdHJhdGVneSBjYW4gYmUgdXNlZCBpZiB0aGVyZSBpcyBubyBgcm9vdERpcmAvYHJvb3REaXJzYCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm9qZWN0IHdoaWNoXG4gKiBuZWNlc3NpdGF0ZXMgdGhlIHN0cm9uZ2VyIGxvZ2ljIG9mIGBMb2dpY2FsUHJvamVjdFN0cmF0ZWd5YC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGF0aXZlUGF0aFN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWZsZWN0b3I6IFJlZmxlY3Rpb25Ib3N0KSB7fVxuXG4gIGVtaXQocmVmOiBSZWZlcmVuY2U8dHMuTm9kZT4sIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUpOiBFeHByZXNzaW9ufG51bGwge1xuICAgIGNvbnN0IGRlc3RTZiA9IGdldFNvdXJjZUZpbGUocmVmLm5vZGUpO1xuICAgIGxldCBtb2R1bGVOYW1lID0gc3RyaXBFeHRlbnNpb24oXG4gICAgICAgIHJlbGF0aXZlKGRpcm5hbWUoYWJzb2x1dGVGcm9tU291cmNlRmlsZShjb250ZXh0KSksIGFic29sdXRlRnJvbVNvdXJjZUZpbGUoZGVzdFNmKSkpO1xuICAgIGlmICghbW9kdWxlTmFtZS5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgbW9kdWxlTmFtZSA9ICgnLi8nICsgbW9kdWxlTmFtZSkgYXMgUGF0aFNlZ21lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IGZpbmRFeHBvcnRlZE5hbWVPZk5vZGUocmVmLm5vZGUsIGRlc3RTZiwgdGhpcy5yZWZsZWN0b3IpO1xuICAgIHJldHVybiBuZXcgRXh0ZXJuYWxFeHByKHttb2R1bGVOYW1lLCBuYW1lfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGBSZWZlcmVuY2VFbWl0U3RyYXRlZ3lgIHdoaWNoIHVzZXMgYSBgRmlsZVRvTW9kdWxlSG9zdGAgdG8gZ2VuZXJhdGUgYWJzb2x1dGUgaW1wb3J0IHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlVG9Nb2R1bGVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmbGVjdG9yOiBSZWZsZWN0aW9uSG9zdCwgcHJpdmF0ZSBmaWxlVG9Nb2R1bGVIb3N0OiBGaWxlVG9Nb2R1bGVIb3N0KSB7fVxuXG4gIGVtaXQocmVmOiBSZWZlcmVuY2U8dHMuTm9kZT4sIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUpOiBFeHByZXNzaW9ufG51bGwge1xuICAgIGNvbnN0IGRlc3RTZiA9IGdldFNvdXJjZUZpbGUocmVmLm5vZGUpO1xuICAgIGNvbnN0IG5hbWUgPSBmaW5kRXhwb3J0ZWROYW1lT2ZOb2RlKHJlZi5ub2RlLCBkZXN0U2YsIHRoaXMucmVmbGVjdG9yKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlTmFtZSA9XG4gICAgICAgIHRoaXMuZmlsZVRvTW9kdWxlSG9zdC5maWxlTmFtZVRvTW9kdWxlTmFtZShkZXN0U2YuZmlsZU5hbWUsIGNvbnRleHQuZmlsZU5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbEV4cHIoe21vZHVsZU5hbWUsIG5hbWV9KTtcbiAgfVxufVxuIl19
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvaW1wb3J0cy9zcmMvZW1pdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUFBQTs7Ozs7O09BTUc7SUFDSCw4Q0FBK0Y7SUFDL0YsK0JBQWlDO0lBR2pDLDJFQUFnSTtJQUNoSSw2RUFBMEQ7SUFFMUQsa0ZBQTRHO0lBRTVHLHVGQUFxRDtJQUtyRDs7T0FFRztJQUNILElBQVksV0EyQlg7SUEzQkQsV0FBWSxXQUFXO1FBQ3JCLDZDQUFXLENBQUE7UUFFWDs7Ozs7V0FLRztRQUNILGlFQUFxQixDQUFBO1FBRXJCOzs7OztXQUtHO1FBQ0gseURBQWlCLENBQUE7UUFFakI7Ozs7OztXQU1HO1FBQ0gscUVBQXVCLENBQUE7SUFDekIsQ0FBQyxFQTNCVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQTJCdEI7SUEyQkQ7Ozs7O09BS0c7SUFDSDtRQUNFLDBCQUFvQixVQUFtQztZQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUFHLENBQUM7UUFFM0QsK0JBQUksR0FBSixVQUFLLEdBQWMsRUFBRSxPQUFzQixFQUFFLFdBQTJDOztZQUEzQyw0QkFBQSxFQUFBLGNBQTJCLFdBQVcsQ0FBQyxJQUFJOztnQkFFdEYsS0FBdUIsSUFBQSxLQUFBLGlCQUFBLElBQUksQ0FBQyxVQUFVLENBQUEsZ0JBQUEsNEJBQUU7b0JBQW5DLElBQU0sUUFBUSxXQUFBO29CQUNqQixJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3pELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTt3QkFDcEIsT0FBTyxPQUFPLENBQUM7cUJBQ2hCO2lCQUNGOzs7Ozs7Ozs7WUFDRCxNQUFNLElBQUksS0FBSyxD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RyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBSSx1QkFBWSxDQUFDLEVBQUMsVUFBVSxZQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDSCwyQkFBQztJQUFELENBQUMsQUFkRCxJQWNDO0lBZFksb0RBQW9CO0lBZ0JqQzs7O09BR0c7SUFDSDtRQUNFLGdDQUFvQixTQUF5QixFQUFVLGtCQUFzQztZQUF6RSxjQUFTLEdBQVQsU0FBUyxDQUFnQjtZQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBRyxDQUFDO1FBRWpHLHFDQUFJLEdBQUosVUFBSyxHQUF1QixFQUFFLE9BQXNCO1lBQ2xELElBQU0sTUFBTSxHQUFHLDBCQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQU0sSUFBSSxHQUFHLG9DQUFzQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFNLFVBQVUsR0FDWixJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFcEYsT0FBTyxJQUFJLHVCQUFZLENBQUMsRUFBQyxVQUFVLFlBQUEsRUFBRSxJQUFJLE1BQUEsRUFBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNILDZCQUFDO0lBQUQsQ0FBQyxBQWZELElBZUM7SUFmWSx3REFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0V4cHJlc3Npb24sIEV4dGVybmFsRXhwciwgRXh0ZXJuYWxSZWZlcmVuY2UsIFdyYXBwZWROb2RlRXhwcn0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7VW5pZmllZE1vZHVsZXNIb3N0fSBmcm9tICcuLi8uLi9jb3JlL2FwaSc7XG5pbXBvcnQge0xvZ2ljYWxGaWxlU3lzdGVtLCBMb2dpY2FsUHJvamVjdFBhdGgsIFBhdGhTZWdtZW50LCBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlLCBkaXJuYW1lLCByZWxhdGl2ZX0gZnJvbSAnLi4vLi4vZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtzdHJpcEV4dGVuc2lvbn0gZnJvbSAnLi4vLi4vZmlsZV9zeXN0ZW0vc3JjL3V0aWwnO1xuaW1wb3J0IHtSZWZsZWN0aW9uSG9zdH0gZnJvbSAnLi4vLi4vcmVmbGVjdGlvbic7XG5pbXBvcnQge2dldFNvdXJjZUZpbGUsIGlzRGVjbGFyYXRpb24sIGlzVHlwZURlY2xhcmF0aW9uLCBub2RlTmFtZUZvckVycm9yfSBmcm9tICcuLi8uLi91dGlsL3NyYy90eXBlc2NyaXB0JztcblxuaW1wb3J0IHtmaW5kRXhwb3J0ZWROYW1lT2ZOb2RlfSBmcm9tICcuL2ZpbmRfZXhwb3J0JztcbmltcG9ydCB7UmVmZXJlbmNlfSBmcm9tICcuL3JlZmVyZW5jZXMnO1xuaW1wb3J0IHtNb2R1bGVSZXNvbHZlcn0gZnJvbSAnLi9yZXNvbHZlcic7XG5cblxuLyoqXG4gKiBGbGFncyB3aGljaCBhbHRlciB0aGUgaW1wb3J0cyBnZW5lcmF0ZWQgYnkgdGhlIGBSZWZlcmVuY2VFbWl0dGVyYC5cbiAqL1xuZXhwb3J0IGVudW0gSW1wb3J0RmxhZ3Mge1xuICBOb25lID0gMHgwMCxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGdlbmVyYXRpb24gb2YgYSBuZXcgaW1wb3J0IHdoZW4gZ2VuZXJhdGluZyBhIHJlZmVyZW5jZSwgZXZlbiBpZiBhbiBpZGVudGlmaWVyIGFscmVhZHlcbiAgICogZXhpc3RzIGluIHRoZSB0YXJnZXQgZmlsZSB3aGljaCBjb3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAqXG4gICAqIFRoaXMgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGlmIHRoZXJlJ3MgYSByaXNrIFR5cGVTY3JpcHQgbWlnaHQgcmVtb3ZlIGltcG9ydHMgZHVyaW5nIGVtaXQuXG4gICAqL1xuICBGb3JjZU5ld0ltcG9ydCA9IDB4MDEsXG5cbiAgLyoqXG4gICAqIERvbid0IG1ha2UgdXNlIG9mIGFueSBhbGlhc2luZyBpbmZvcm1hdGlvbiB3aGVuIGVtaXR0aW5nIGEgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBUaGlzIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBpZiBlbWl0dGluZyBpbnRvIGEgY29udGV4dCB3aGVyZSBnZW5lcmF0ZWQgcmVmZXJlbmNlcyB3aWxsIGJlIGZlZFxuICAgKiBpbnRvIFR5cGVTY3JpcHQgYW5kIHR5cGUtY2hlY2tlZCAoc3VjaCBhcyBpbiB0ZW1wbGF0ZSB0eXBlLWNoZWNraW5nKS5cbiAgICovXG4gIE5vQWxpYXNpbmcgPSAweDAyLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBhbiBpbXBvcnQgdG8gYSB0eXBlLW9ubHkgZGVjbGFyYXRpb24gaXMgYWxsb3dlZC5cbiAgICpcbiAgICogRm9yIHJlZmVyZW5jZXMgdGhhdCBvY2N1ciBpbiB0eXBlLXBvc2l0aW9ucywgdGhlIHJlZmVycmVkIGRlY2xhcmF0aW9uIG1heSBiZSBhIHR5cGUtb25seVxuICAgKiBkZWNsYXJhdGlvbiB0aGF0IGlzIG5vdCByZXRhaW5lZCBkdXJpbmcgZW1pdC4gSW5jbHVkaW5nIHRoaXMgZmxhZyBhbGxvd3MgdG8gZW1pdCByZWZlcmVuY2VzIHRvXG4gICAqIHR5cGUtb25seSBkZWNsYXJhdGlvbnMgYXMgdXNlZCBpbiBlLmcuIHRlbXBsYXRlIHR5cGUtY2hlY2tpbmcuXG4gICAqL1xuICBBbGxvd1R5cGVJbXBvcnRzID0gMHgwNCxcbn1cblxuLyoqXG4gKiBBIHBhcnRpY3VsYXIgc3RyYXRlZ3kgZm9yIGdlbmVyYXRpbmcgYW4gZXhwcmVzc2lvbiB3aGljaCByZWZlcnMgdG8gYSBgUmVmZXJlbmNlYC5cbiAqXG4gKiBUaGVyZSBhcmUgbWFueSBwb3RlbnRpYWwgd2F5cyBhIGdpdmVuIGBSZWZlcmVuY2VgIGNvdWxkIGJlIHJlZmVycmVkIHRvIGluIHRoZSBjb250ZXh0IG9mIGEgZ2l2ZW5cbiAqIGZpbGUuIEEgbG9jYWwgZGVjbGFyYXRpb24gY291bGQgYmUgYXZhaWxhYmxlLCB0aGUgYFJlZmVyZW5jZWAgY291bGQgYmUgaW1wb3J0YWJsZSB2aWEgYSByZWxhdGl2ZVxuICogaW1wb3J0IHdpdGhpbiB0aGUgcHJvamVjdCwgb3IgYW4gYWJzb2x1dGUgaW1wb3J0IGludG8gYG5vZGVfbW9kdWxlc2AgbWlnaHQgYmUgbmVjZXNzYXJ5LlxuICpcbiAqIERpZmZlcmVudCBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCBpbXBsZW1lbnRhdGlvbnMgaW1wbGVtZW50IHNwZWNpZmljIGxvZ2ljIGZvciBnZW5lcmF0aW5nIHN1Y2hcbiAqIHJlZmVyZW5jZXMuIEEgc2luZ2xlIHN0cmF0ZWd5IChzdWNoIGFzIHVzaW5nIGEgbG9jYWwgZGVjbGFyYXRpb24pIG1heSBub3QgYWx3YXlzIGJlIGFibGUgdG9cbiAqIGdlbmVyYXRlIGFuIGV4cHJlc3Npb24gZm9yIGV2ZXJ5IGBSZWZlcmVuY2VgIChmb3IgZXhhbXBsZSwgaWYgbm8gbG9jYWwgaWRlbnRpZmllciBpcyBhdmFpbGFibGUpLFxuICogYW5kIG1heSByZXR1cm4gYG51bGxgIGluIHN1Y2ggYSBjYXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBFbWl0IGFuIGBFeHByZXNzaW9uYCB3aGljaCByZWZlcnMgdG8gdGhlIGdpdmVuIGBSZWZlcmVuY2VgIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhclxuICAgKiBzb3VyY2UgZmlsZSwgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSByZWYgdGhlIGBSZWZlcmVuY2VgIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhbiBleHByZXNzaW9uXG4gICAqIEBwYXJhbSBjb250ZXh0IHRoZSBzb3VyY2UgZmlsZSBpbiB3aGljaCB0aGUgYEV4cHJlc3Npb25gIG11c3QgYmUgdmFsaWRcbiAgICogQHBhcmFtIGltcG9ydEZsYWdzIGEgZmxhZyB3aGljaCBjb250cm9scyB3aGV0aGVyIGltcG9ydHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3RcbiAgICogQHJldHVybnMgYW4gYEV4cHJlc3Npb25gIHdoaWNoIHJlZmVycyB0byB0aGUgYFJlZmVyZW5jZWAsIG9yIGBudWxsYCBpZiBub25lIGNhbiBiZSBnZW5lcmF0ZWRcbiAgICovXG4gIGVtaXQocmVmOiBSZWZlcmVuY2UsIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUsIGltcG9ydEZsYWdzOiBJbXBvcnRGbGFncyk6IEV4cHJlc3Npb258bnVsbDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYEV4cHJlc3Npb25gcyB3aGljaCByZWZlciB0byBgUmVmZXJlbmNlYHMgaW4gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEEgYFJlZmVyZW5jZUVtaXR0ZXJgIHVzZXMgb25lIG9yIG1vcmUgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgaW1wbGVtZW50YXRpb25zIHRvIHByb2R1Y2UgYW5cbiAqIGBFeHByZXNzaW9uYCB3aGljaCByZWZlcnMgdG8gYSBgUmVmZXJlbmNlYCBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgZmlsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUVtaXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0cmF0ZWdpZXM6IFJlZmVyZW5jZUVtaXRTdHJhdGVneVtdKSB7fVxuXG4gIGVtaXQocmVmOiBSZWZlcmVuY2UsIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUsIGltcG9ydEZsYWdzOiBJbXBvcnRGbGFnc8KgPSBJbXBvcnRGbGFncy5Ob25lKTpcbiAgICAgIEV4cHJlc3Npb24ge1xuICAgIGZvciAoY29uc3Qgc3RyYXRlZ3kgb2YgdGhpcy5zdHJhdGVnaWVzKSB7XG4gICAgICBjb25zdCBlbWl0dGVkID0gc3RyYXRlZ3kuZW1pdChyZWYsIGNvbnRleHQsIGltcG9ydEZsYWdzKTtcbiAgICAgIGlmIChlbWl0dGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBlbWl0dGVkO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gd3JpdGUgYSByZWZlcmVuY2UgdG8gJHtub2RlTmFtZUZvckVycm9yKHJlZi5ub2RlKX0gaW4gJHtyZWYubm9kZS5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWV9IGZyb20gJHtjb250ZXh0LmZpbGVOYW1lfWApO1xuICB9XG59XG5cbi8qKlxuICogQSBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCB3aGljaCB3aWxsIHJlZmVyIHRvIGRlY2xhcmF0aW9ucyBieSBhbnkgbG9jYWwgYHRzLklkZW50aWZpZXJgcywgaWZcbiAqIHN1Y2ggaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsSWRlbnRpZmllclN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5IHtcbiAgZW1pdChyZWY6IFJlZmVyZW5jZTx0cy5Ob2RlPiwgY29udGV4dDogdHMuU291cmNlRmlsZSwgaW1wb3J0RmxhZ3M6IEltcG9ydEZsYWdzKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICAvLyBJZiB0aGUgZW1pdHRlciBoYXMgc3BlY2lmaWVkIEZvcmNlTmV3SW1wb3J0LCB0aGVuIExvY2FsSWRlbnRpZmllclN0cmF0ZWd5IHNob3VsZCBub3QgdXNlIGFcbiAgICAvLyBsb2NhbCBpZGVudGlmaWVyIGF0IGFsbCwgKmV4Y2VwdCogaW4gdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBub2RlIGlzIGFjdHVhbGx5IGRlY2xhcmVkLlxuICAgIGlmIChpbXBvcnRGbGFncyAmIEltcG9ydEZsYWdzLkZvcmNlTmV3SW1wb3J0ICYmXG4gICAgICAgIGdldFNvdXJjZUZpbGUocmVmLm5vZGUpICE9PSBnZXRTb3VyY2VGaWxlKGNvbnRleHQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBIFJlZmVyZW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSBpZGVudGl0aWVzIGluIGRpZmZlcmVudCBmaWxlcywgc28gaXQgbWF5IGFscmVhZHkgaGF2ZSBhblxuICAgIC8vIElkZW50aWZpZXIgaW4gdGhlIHJlcXVlc3RlZCBjb250ZXh0IGZpbGUuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IHJlZi5nZXRJZGVudGl0eUluKGNvbnRleHQpO1xuICAgIGlmIChpZGVudGlmaWVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IFdyYXBwZWROb2RlRXhwcihpZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCB3aGljaCB3aWxsIHJlZmVyIHRvIGRlY2xhcmF0aW9ucyB0aGF0IGNvbWUgZnJvbSBgbm9kZV9tb2R1bGVzYCB1c2luZ1xuICogYW4gYWJzb2x1dGUgaW1wb3J0LlxuICpcbiAqIFBhcnQgb2YgdGhpcyBzdHJhdGVneSBpbnZvbHZlcyBsb29raW5nIGF0IHRoZSB0YXJnZXQgZW50cnkgcG9pbnQgYW5kIGlkZW50aWZ5aW5nIHRoZSBleHBvcnRlZFxuICogbmFtZSBvZiB0aGUgdGFyZ2V0ZWQgZGVjbGFyYXRpb24sIGFzIGl0IG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWNsYXJlZCBuYW1lIChlLmcuIGFcbiAqIGRpcmVjdGl2ZSBtaWdodCBiZSBkZWNsYXJlZCBhcyBGb29EaXJJbXBsLCBidXQgZXhwb3J0ZWQgYXMgRm9vRGlyKS4gSWYgbm8gZXhwb3J0IGNhbiBiZSBmb3VuZFxuICogd2hpY2ggbWFwcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkaXJlY3RpdmUsIGFuIGVycm9yIGlzIHRocm93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kdWxlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2VFbWl0U3RyYXRlZ3kge1xuICAvKipcbiAgICogQSBjYWNoZSBvZiB0aGUgZXhwb3J0cyBvZiBzcGVjaWZpYyBtb2R1bGVzLCBiZWNhdXNlIHJlc29sdmluZyBhIG1vZHVsZSB0byBpdHMgZXhwb3J0cyBpcyBhXG4gICAqIGNvc3RseSBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIG1vZHVsZUV4cG9ydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8dHMuRGVjbGFyYXRpb24sIHN0cmluZz58bnVsbD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBwcm9ncmFtOiB0cy5Qcm9ncmFtLCBwcm90ZWN0ZWQgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgICBwcm90ZWN0ZWQgbW9kdWxlUmVzb2x2ZXI6IE1vZHVsZVJlc29sdmVyLCBwcml2YXRlIHJlZmxlY3Rpb25Ib3N0OiBSZWZsZWN0aW9uSG9zdCkge31cblxuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnRGbGFnczogSW1wb3J0RmxhZ3MpOiBFeHByZXNzaW9ufG51bGwge1xuICAgIGlmIChyZWYuYmVzdEd1ZXNzT3duaW5nTW9kdWxlID09PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBtb2R1bGUgbmFtZSBhdmFpbGFibGUgZm9yIHRoaXMgUmVmZXJlbmNlLCBtZWFuaW5nIGl0IHdhcyBhcnJpdmVkIGF0IHZpYSBhXG4gICAgICAvLyByZWxhdGl2ZSBwYXRoLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICghaXNEZWNsYXJhdGlvbihyZWYubm9kZSkpIHtcbiAgICAgIC8vIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGltcG9ydCBzb21ldGhpbmcgd2hpY2ggaXNuJ3QgYSBkZWNsYXJhdGlvbi5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRGVidWcgYXNzZXJ0OiB1bmFibGUgdG8gaW1wb3J0IGEgUmVmZXJlbmNlIHRvIG5vbi1kZWNsYXJhdGlvbiBvZiB0eXBlICR7dHMuU3ludGF4S2luZFtyZWYubm9kZS5raW5kXX0uYCk7XG4gICAgfSBlbHNlIGlmICgoaW1wb3J0RmxhZ3MgJiBJbXBvcnRGbGFncy5BbGxvd1R5cGVJbXBvcnRzKSA9PT0gMCAmJiBpc1R5cGVEZWNsYXJhdGlvbihyZWYubm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW1wb3J0aW5nIGEgdHlwZS1vbmx5IGRlY2xhcmF0aW9uIG9mIHR5cGUgJHt0cy5TeW50YXhLaW5kW3JlZi5ub2RlLmtpbmRdfSBpbiBhIHZhbHVlIHBvc2l0aW9uIGlzIG5vdCBhbGxvd2VkLmApO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBmaW5kIHRoZSBleHBvcnRlZCBuYW1lIG9mIHRoZSBkZWNsYXJhdGlvbiwgaWYgb25lIGlzIGF2YWlsYWJsZS5cbiAgICBjb25zdCB7c3BlY2lmaWVyLCByZXNvbHV0aW9uQ29udGV4dH0gPSByZWYuYmVzdEd1ZXNzT3duaW5nTW9kdWxlO1xuICAgIGNvbnN0IHN5bWJvbE5hbWUgPSB0aGlzLnJlc29sdmVJbXBvcnROYW1lKHNwZWNpZmllciwgcmVmLm5vZGUsIHJlc29sdXRpb25Db250ZXh0KTtcbiAgICBpZiAoc3ltYm9sTmFtZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVE9ETyhhbHhodWIpOiBtYWtlIHRoaXMgZXJyb3IgYSB0cy5EaWFnbm9zdGljIHBvaW50aW5nIGF0IHdoYXRldmVyIGNhdXNlZCB0aGlzIGltcG9ydCB0byBiZVxuICAgICAgLy8gdHJpZ2dlcmVkLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTeW1ib2wgJHtyZWYuZGVidWdOYW1lfSBkZWNsYXJlZCBpbiAke2dldFNvdXJjZUZpbGUocmVmLm5vZGUpLmZpbGVOYW1lfSBpcyBub3QgZXhwb3J0ZWQgZnJvbSAke3NwZWNpZmllcn0gKGltcG9ydCBpbnRvICR7Y29udGV4dC5maWxlTmFtZX0pYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbEV4cHIobmV3IEV4dGVybmFsUmVmZXJlbmNlKHNwZWNpZmllciwgc3ltYm9sTmFtZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlSW1wb3J0TmFtZShtb2R1bGVOYW1lOiBzdHJpbmcsIHRhcmdldDogdHMuRGVjbGFyYXRpb24sIGZyb21GaWxlOiBzdHJpbmcpOiBzdHJpbmdcbiAgICAgIHxudWxsIHtcbiAgICBjb25zdCBleHBvcnRzID0gdGhpcy5nZXRFeHBvcnRzT2ZNb2R1bGUobW9kdWxlTmFtZSwgZnJvbUZpbGUpO1xuICAgIGlmIChleHBvcnRzICE9PSBudWxsICYmIGV4cG9ydHMuaGFzKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmdldCh0YXJnZXQpICE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhwb3J0c09mTW9kdWxlKG1vZHVsZU5hbWU6IHN0cmluZywgZnJvbUZpbGU6IHN0cmluZyk6XG4gICAgICBNYXA8dHMuRGVjbGFyYXRpb24sIHN0cmluZz58bnVsbCB7XG4gICAgaWYgKCF0aGlzLm1vZHVsZUV4cG9ydHNDYWNoZS5oYXMobW9kdWxlTmFtZSkpIHtcbiAgICAgIHRoaXMubW9kdWxlRXhwb3J0c0NhY2hlLnNldChtb2R1bGVOYW1lLCB0aGlzLmVudW1lcmF0ZUV4cG9ydHNPZk1vZHVsZShtb2R1bGVOYW1lLCBmcm9tRmlsZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2R1bGVFeHBvcnRzQ2FjaGUuZ2V0KG1vZHVsZU5hbWUpICE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW51bWVyYXRlRXhwb3J0c09mTW9kdWxlKHNwZWNpZmllcjogc3RyaW5nLCBmcm9tRmlsZTogc3RyaW5nKTpcbiAgICAgIE1hcDx0cy5EZWNsYXJhdGlvbiwgc3RyaW5nPnxudWxsIHtcbiAgICAvLyBGaXJzdCwgcmVzb2x2ZSB0aGUgbW9kdWxlIHNwZWNpZmllciB0byBpdHMgZW50cnkgcG9pbnQsIGFuZCBnZXQgdGhlIHRzLlN5bWJvbCBmb3IgaXQuXG4gICAgY29uc3QgZW50cnlQb2ludEZpbGUgPSB0aGlzLm1vZHVsZVJlc29sdmVyLnJlc29sdmVNb2R1bGUoc3BlY2lmaWVyLCBmcm9tRmlsZSk7XG4gICAgaWYgKGVudHJ5UG9pbnRGaWxlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleHBvcnRzID0gdGhpcy5yZWZsZWN0aW9uSG9zdC5nZXRFeHBvcnRzT2ZNb2R1bGUoZW50cnlQb2ludEZpbGUpO1xuICAgIGlmIChleHBvcnRzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZXhwb3J0TWFwID0gbmV3IE1hcDx0cy5EZWNsYXJhdGlvbiwgc3RyaW5nPigpO1xuICAgIGV4cG9ydHMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIG5hbWUpID0+IHtcbiAgICAgIC8vIEl0J3Mgb2theSB0byBza2lwIGlubGluZSBkZWNsYXJhdGlvbnMsIHNpbmNlIGJ5IGRlZmluaXRpb24gdGhleSdyZSBub3QgdGFyZ2V0LWFibGUgd2l0aCBhXG4gICAgICAvLyB0cy5EZWNsYXJhdGlvbiBhbnl3YXkuXG4gICAgICBpZiAoZGVjbGFyYXRpb24ubm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBleHBvcnRNYXAuc2V0KGRlY2xhcmF0aW9uLm5vZGUsIG5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBleHBvcnRNYXA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGBSZWZlcmVuY2VFbWl0U3RyYXRlZ3lgIHdoaWNoIHdpbGwgcmVmZXIgdG8gZGVjbGFyYXRpb25zIHZpYSByZWxhdGl2ZSBwYXRocywgcHJvdmlkZWQgdGhleSdyZVxuICogYm90aCBpbiB0aGUgbG9naWNhbCBwcm9qZWN0IFwic3BhY2VcIiBvZiBwYXRocy5cbiAqXG4gKiBUaGlzIGlzIHRyaWNraWVyIHRoYW4gaXQgc291bmRzLCBhcyB0aGUgdHdvIGZpbGVzIG1heSBiZSBpbiBkaWZmZXJlbnQgcm9vdCBkaXJlY3RvcmllcyBpbiB0aGVcbiAqIHByb2plY3QuIFNpbXBseSBjYWxjdWxhdGluZyBhIGZpbGUgc3lzdGVtIHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aGUgdHdvIGlzIG5vdCBzdWZmaWNpZW50LlxuICogSW5zdGVhZCwgYExvZ2ljYWxQcm9qZWN0UGF0aGBzIGFyZSB1c2VkLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFByb2plY3RTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmbGVjdG9yOiBSZWZsZWN0aW9uSG9zdCwgcHJpdmF0ZSBsb2dpY2FsRnM6IExvZ2ljYWxGaWxlU3lzdGVtKSB7fVxuXG4gIGVtaXQocmVmOiBSZWZlcmVuY2U8dHMuTm9kZT4sIGNvbnRleHQ6IHRzLlNvdXJjZUZpbGUpOiBFeHByZXNzaW9ufG51bGwge1xuICAgIGNvbnN0IGRlc3RTZiA9IGdldFNvdXJjZUZpbGUocmVmLm5vZGUpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBpbXBvcnRpbmcgZmlsZSB0byB0aGUgZmlsZSBiZWluZyBpbXBvcnRlZC4gVGhpcyBpcyBkb25lXG4gICAgLy8gYXMgYSBsb2dpY2FsIHBhdGggY29tcHV0YXRpb24sIGJlY2F1c2UgdGhlIHR3byBmaWxlcyBtaWdodCBiZSBpbiBkaWZmZXJlbnQgcm9vdERpcnMuXG4gICAgY29uc3QgZGVzdFBhdGggPSB0aGlzLmxvZ2ljYWxGcy5sb2dpY2FsUGF0aE9mU2YoZGVzdFNmKTtcbiAgICBpZiAoZGVzdFBhdGggPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBpbXBvcnRlZCBmaWxlIGlzIG5vdCB3aXRoaW4gdGhlIGxvZ2ljYWwgcHJvamVjdCBmaWxlc3lzdGVtLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luUGF0aCA9IHRoaXMubG9naWNhbEZzLmxvZ2ljYWxQYXRoT2ZTZihjb250ZXh0KTtcbiAgICBpZiAob3JpZ2luUGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBEZWJ1ZyBhc3NlcnQ6IGF0dGVtcHQgdG8gaW1wb3J0IGZyb20gJHtjb250ZXh0LmZpbGVOYW1lfSBidXQgaXQncyBvdXRzaWRlIHRoZSBwcm9ncmFtP2ApO1xuICAgIH1cblxuICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGVtaXQgYSByZWxhdGl2ZSByZWZlcmVuY2UgZnJvbSBhIGZpbGUgdG8gaXRzZWxmLlxuICAgIGlmIChkZXN0UGF0aCA9PT0gb3JpZ2luUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IGZpbmRFeHBvcnRlZE5hbWVPZk5vZGUocmVmLm5vZGUsIGRlc3RTZiwgdGhpcy5yZWZsZWN0b3IpO1xuICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICAvLyBUaGUgdGFyZ2V0IGRlY2xhcmF0aW9uIGlzbid0IGV4cG9ydGVkIGZyb20gdGhlIGZpbGUgaXQncyBkZWNsYXJlZCBpbi4gVGhpcyBpcyBhbiBpc3N1ZSFcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdpdGggYm90aCBmaWxlcyBleHByZXNzZWQgYXMgTG9naWNhbFByb2plY3RQYXRocywgZ2V0dGluZyB0aGUgbW9kdWxlIHNwZWNpZmllciBhcyBhIHJlbGF0aXZlXG4gICAgLy8gcGF0aCBpcyBub3cgc3RyYWlnaHRmb3J3YXJkLlxuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBMb2dpY2FsUHJvamVjdFBhdGgucmVsYXRpdmVQYXRoQmV0d2VlbihvcmlnaW5QYXRoLCBkZXN0UGF0aCk7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbEV4cHIoe21vZHVsZU5hbWUsIG5hbWV9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgYFJlZmVyZW5jZUVtaXRTdHJhdGVneWAgd2hpY2ggY29uc3RydWN0cyByZWxhdGl2ZXMgcGF0aHMgYmV0d2VlbiBgdHMuU291cmNlRmlsZWBzLlxuICpcbiAqIFRoaXMgc3RyYXRlZ3kgY2FuIGJlIHVzZWQgaWYgdGhlcmUgaXMgbm8gYHJvb3REaXJgL2Byb290RGlyc2Agc3RydWN0dXJlIGZvciB0aGUgcHJvamVjdCB3aGljaFxuICogbmVjZXNzaXRhdGVzIHRoZSBzdHJvbmdlciBsb2dpYyBvZiBgTG9naWNhbFByb2plY3RTdHJhdGVneWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZVBhdGhTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmbGVjdG9yOiBSZWZsZWN0aW9uSG9zdCkge31cblxuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICBjb25zdCBkZXN0U2YgPSBnZXRTb3VyY2VGaWxlKHJlZi5ub2RlKTtcbiAgICBsZXQgbW9kdWxlTmFtZSA9IHN0cmlwRXh0ZW5zaW9uKFxuICAgICAgICByZWxhdGl2ZShkaXJuYW1lKGFic29sdXRlRnJvbVNvdXJjZUZpbGUoY29udGV4dCkpLCBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKGRlc3RTZikpKTtcbiAgICBpZiAoIW1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgIG1vZHVsZU5hbWUgPSAoJy4vJyArIG1vZHVsZU5hbWUpIGFzIFBhdGhTZWdtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBmaW5kRXhwb3J0ZWROYW1lT2ZOb2RlKHJlZi5ub2RlLCBkZXN0U2YsIHRoaXMucmVmbGVjdG9yKTtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcih7bW9kdWxlTmFtZSwgbmFtZX0pO1xuICB9XG59XG5cbi8qKlxuICogQSBgUmVmZXJlbmNlRW1pdFN0cmF0ZWd5YCB3aGljaCB1c2VzIGEgYFVuaWZpZWRNb2R1bGVzSG9zdGAgdG8gZ2VuZXJhdGUgYWJzb2x1dGUgaW1wb3J0XG4gKiByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgVW5pZmllZE1vZHVsZXNTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jZUVtaXRTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmbGVjdG9yOiBSZWZsZWN0aW9uSG9zdCwgcHJpdmF0ZSB1bmlmaWVkTW9kdWxlc0hvc3Q6IFVuaWZpZWRNb2R1bGVzSG9zdCkge31cblxuICBlbWl0KHJlZjogUmVmZXJlbmNlPHRzLk5vZGU+LCBjb250ZXh0OiB0cy5Tb3VyY2VGaWxlKTogRXhwcmVzc2lvbnxudWxsIHtcbiAgICBjb25zdCBkZXN0U2YgPSBnZXRTb3VyY2VGaWxlKHJlZi5ub2RlKTtcbiAgICBjb25zdCBuYW1lID0gZmluZEV4cG9ydGVkTmFtZU9mTm9kZShyZWYubm9kZSwgZGVzdFNmLCB0aGlzLnJlZmxlY3Rvcik7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZU5hbWUgPVxuICAgICAgICB0aGlzLnVuaWZpZWRNb2R1bGVzSG9zdC5maWxlTmFtZVRvTW9kdWxlTmFtZShkZXN0U2YuZmlsZU5hbWUsIGNvbnRleHQuZmlsZU5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbEV4cHIoe21vZHVsZU5hbWUsIG5hbWV9KTtcbiAgfVxufVxuIl19