@angular/compiler-cli 13.0.0-next.8 → 13.0.0-rc.2

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 (604) hide show
  1. package/bundles/index.js +20422 -0
  2. package/bundles/index.js.map +6 -0
  3. package/bundles/linker/babel/index.js +2384 -0
  4. package/bundles/linker/babel/index.js.map +6 -0
  5. package/bundles/linker/index.js +1849 -0
  6. package/bundles/linker/index.js.map +6 -0
  7. package/bundles/ngcc/index.js +16047 -0
  8. package/bundles/ngcc/index.js.map +6 -0
  9. package/bundles/ngcc/main-ngcc.js +16135 -0
  10. package/bundles/ngcc/main-ngcc.js.map +6 -0
  11. package/bundles/ngcc/src/execution/cluster/ngcc_cluster_worker.js +13859 -0
  12. package/bundles/ngcc/src/execution/cluster/ngcc_cluster_worker.js.map +6 -0
  13. package/bundles/ngcc/src/locking/lock_file_with_child_process/ngcc_lock_unlocker.js +334 -0
  14. package/bundles/ngcc/src/locking/lock_file_with_child_process/ngcc_lock_unlocker.js.map +6 -0
  15. package/bundles/private/bazel.js +97 -0
  16. package/bundles/private/bazel.js.map +6 -0
  17. package/bundles/private/localize.js +911 -0
  18. package/bundles/private/localize.js.map +6 -0
  19. package/bundles/private/migrations.js +2183 -0
  20. package/bundles/private/migrations.js.map +6 -0
  21. package/bundles/private/tooling.js +942 -0
  22. package/bundles/private/tooling.js.map +6 -0
  23. package/bundles/src/bin/ng_xi18n.js +20472 -0
  24. package/bundles/src/bin/ng_xi18n.js.map +6 -0
  25. package/bundles/src/bin/ngc.js +20474 -0
  26. package/bundles/src/bin/ngc.js.map +6 -0
  27. package/bundles_metadata.json +1 -0
  28. package/import_meta_url.d.ts +14 -0
  29. package/index.d.ts +4 -1
  30. package/linker/babel/src/ast/babel_ast_factory.d.ts +1 -8
  31. package/linker/babel/src/ast/babel_ast_host.d.ts +1 -1
  32. package/linker/babel/src/babel_core.d.ts +36 -0
  33. package/linker/babel/src/babel_declaration_scope.d.ts +1 -1
  34. package/linker/babel/src/babel_plugin.d.ts +1 -8
  35. package/linker/babel/src/es2015_linker_plugin.d.ts +2 -2
  36. package/linker/src/ast/typescript/typescript_ast_host.d.ts +1 -1
  37. package/linker/src/file_linker/emit_scopes/emit_scope.d.ts +1 -2
  38. package/linker/src/file_linker/emit_scopes/iife_emit_scope.d.ts +1 -1
  39. package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.d.ts +1 -2
  40. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.d.ts +1 -2
  41. package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.d.ts +1 -2
  42. package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.d.ts +1 -2
  43. package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.d.ts +1 -2
  44. package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.d.ts +1 -2
  45. package/linker/src/file_linker/partial_linkers/partial_linker.d.ts +1 -2
  46. package/linker/src/file_linker/partial_linkers/partial_linker_selector.d.ts +2 -2
  47. package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.d.ts +1 -2
  48. package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.d.ts +1 -2
  49. package/linker/src/file_linker/partial_linkers/util.d.ts +1 -2
  50. package/ngcc/index.d.ts +15 -0
  51. package/ngcc/src/analysis/decoration_analyzer.d.ts +1 -1
  52. package/ngcc/src/analysis/module_with_providers_analyzer.d.ts +1 -1
  53. package/ngcc/src/analysis/ngcc_references_registry.d.ts +1 -1
  54. package/ngcc/src/analysis/ngcc_trait_compiler.d.ts +1 -1
  55. package/ngcc/src/analysis/private_declarations_analyzer.d.ts +1 -1
  56. package/ngcc/src/analysis/switch_marker_analyzer.d.ts +1 -1
  57. package/ngcc/src/analysis/types.d.ts +1 -1
  58. package/ngcc/src/dependencies/esm_dependency_host.d.ts +1 -1
  59. package/ngcc/src/execution/cluster/api.d.ts +5 -1
  60. package/ngcc/src/execution/cluster/master.d.ts +5 -3
  61. package/{src/ngtsc/logging/testing/index.d.ts → ngcc/src/execution/cluster/ngcc_cluster_worker.d.ts} +2 -2
  62. package/ngcc/src/host/commonjs_host.d.ts +1 -1
  63. package/ngcc/src/host/commonjs_umd_utils.d.ts +1 -1
  64. package/ngcc/src/host/delegating_host.d.ts +1 -1
  65. package/ngcc/src/host/esm2015_host.d.ts +1 -1
  66. package/ngcc/src/host/esm5_host.d.ts +1 -1
  67. package/ngcc/src/host/ngcc_host.d.ts +1 -1
  68. package/ngcc/src/host/umd_host.d.ts +1 -1
  69. package/ngcc/src/host/utils.d.ts +1 -1
  70. package/ngcc/src/locking/lock_file.d.ts +1 -1
  71. package/ngcc/src/locking/lock_file_with_child_process/index.d.ts +2 -0
  72. package/ngcc/src/locking/lock_file_with_child_process/{unlocker.d.ts → ngcc_lock_unlocker.d.ts} +1 -1
  73. package/ngcc/src/migrations/migration.d.ts +1 -1
  74. package/ngcc/src/migrations/missing_injectable_migration.d.ts +1 -1
  75. package/ngcc/src/migrations/undecorated_child_migration.d.ts +1 -1
  76. package/ngcc/src/migrations/undecorated_parent_migration.d.ts +1 -1
  77. package/ngcc/src/migrations/utils.d.ts +1 -1
  78. package/ngcc/src/packages/build_marker.d.ts +1 -1
  79. package/ngcc/src/packages/bundle_program.d.ts +1 -1
  80. package/ngcc/src/packages/configuration.d.ts +41 -4
  81. package/ngcc/src/packages/entry_point_bundle.d.ts +1 -1
  82. package/ngcc/src/packages/ngcc_compiler_host.d.ts +1 -1
  83. package/ngcc/src/packages/source_file_cache.d.ts +1 -1
  84. package/ngcc/src/packages/transformer.d.ts +1 -1
  85. package/ngcc/src/rendering/commonjs_rendering_formatter.d.ts +1 -1
  86. package/ngcc/src/rendering/dts_renderer.d.ts +1 -1
  87. package/ngcc/src/rendering/esm5_rendering_formatter.d.ts +1 -1
  88. package/ngcc/src/rendering/esm_rendering_formatter.d.ts +1 -1
  89. package/ngcc/src/rendering/renderer.d.ts +1 -1
  90. package/ngcc/src/rendering/rendering_formatter.d.ts +1 -1
  91. package/ngcc/src/rendering/source_maps.d.ts +3 -3
  92. package/ngcc/src/rendering/umd_rendering_formatter.d.ts +1 -1
  93. package/ngcc/src/rendering/utils.d.ts +1 -1
  94. package/ngcc/src/utils.d.ts +1 -1
  95. package/package.json +52 -13
  96. package/private/bazel.d.ts +13 -0
  97. package/private/localize.d.ts +15 -0
  98. package/private/migrations.d.ts +16 -0
  99. package/{src → private}/tooling.d.ts +2 -2
  100. package/src/bin/ng_xi18n.d.ts +10 -0
  101. package/{ngcc/main-ivy-ngcc.d.ts → src/bin/ngc.d.ts} +2 -1
  102. package/src/diagnostics/translate_diagnostics.d.ts +1 -1
  103. package/src/extract_i18n.d.ts +0 -5
  104. package/src/main.d.ts +9 -6
  105. package/src/metadata/bundle_index_host.d.ts +1 -1
  106. package/src/metadata/bundler.d.ts +1 -1
  107. package/src/metadata/collector.d.ts +1 -1
  108. package/src/metadata/evaluator.d.ts +1 -1
  109. package/src/metadata/symbols.d.ts +1 -1
  110. package/src/ngtsc/annotations/src/component.d.ts +1 -1
  111. package/src/ngtsc/annotations/src/diagnostics.d.ts +1 -1
  112. package/src/ngtsc/annotations/src/directive.d.ts +1 -1
  113. package/src/ngtsc/annotations/src/ng_module.d.ts +2 -4
  114. package/src/ngtsc/annotations/src/pipe.d.ts +1 -1
  115. package/src/ngtsc/annotations/src/util.d.ts +2 -4
  116. package/src/ngtsc/core/api/src/adapter.d.ts +1 -1
  117. package/src/ngtsc/core/api/src/interfaces.d.ts +1 -12
  118. package/src/ngtsc/core/api/src/options.d.ts +1 -1
  119. package/src/ngtsc/core/api/src/public_options.d.ts +5 -1
  120. package/src/ngtsc/core/src/compiler.d.ts +2 -8
  121. package/src/ngtsc/core/src/host.d.ts +1 -1
  122. package/src/ngtsc/cycles/src/analyzer.d.ts +1 -1
  123. package/src/ngtsc/cycles/src/imports.d.ts +1 -1
  124. package/src/ngtsc/diagnostics/index.d.ts +4 -2
  125. package/src/ngtsc/diagnostics/src/docs.d.ts +14 -0
  126. package/src/ngtsc/diagnostics/src/error.d.ts +1 -1
  127. package/src/ngtsc/diagnostics/src/error_details_base_url.d.ts +16 -0
  128. package/src/ngtsc/diagnostics/src/util.d.ts +2 -0
  129. package/src/ngtsc/entry_point/src/generator.d.ts +1 -1
  130. package/src/ngtsc/entry_point/src/private_export_checker.d.ts +1 -1
  131. package/src/ngtsc/file_system/src/compiler_host.d.ts +1 -1
  132. package/src/ngtsc/file_system/src/logical.d.ts +1 -1
  133. package/src/ngtsc/file_system/src/util.d.ts +1 -1
  134. package/src/ngtsc/imports/src/alias.d.ts +1 -1
  135. package/src/ngtsc/imports/src/default.d.ts +1 -1
  136. package/src/ngtsc/imports/src/emitter.d.ts +1 -1
  137. package/src/ngtsc/imports/src/find_export.d.ts +1 -1
  138. package/src/ngtsc/imports/src/references.d.ts +1 -1
  139. package/src/ngtsc/imports/src/resolver.d.ts +1 -1
  140. package/src/ngtsc/incremental/api.d.ts +1 -1
  141. package/src/ngtsc/incremental/src/dependency_tracking.d.ts +1 -1
  142. package/src/ngtsc/incremental/src/incremental.d.ts +1 -1
  143. package/src/ngtsc/incremental/src/state.d.ts +1 -1
  144. package/src/ngtsc/incremental/src/strategy.d.ts +1 -1
  145. package/src/ngtsc/metadata/src/api.d.ts +1 -1
  146. package/src/ngtsc/metadata/src/dts.d.ts +1 -1
  147. package/src/ngtsc/metadata/src/resource_registry.d.ts +1 -1
  148. package/src/ngtsc/metadata/src/util.d.ts +1 -1
  149. package/src/ngtsc/partial_evaluator/index.d.ts +1 -0
  150. package/src/ngtsc/partial_evaluator/src/builtin.d.ts +1 -1
  151. package/src/ngtsc/partial_evaluator/src/diagnostics.d.ts +1 -1
  152. package/src/ngtsc/partial_evaluator/src/dynamic.d.ts +1 -1
  153. package/src/ngtsc/partial_evaluator/src/interface.d.ts +1 -1
  154. package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +1 -1
  155. package/src/ngtsc/partial_evaluator/src/result.d.ts +1 -1
  156. package/src/ngtsc/partial_evaluator/src/ts_helpers.d.ts +1 -1
  157. package/src/ngtsc/program.d.ts +1 -1
  158. package/src/ngtsc/program_driver/src/api.d.ts +1 -1
  159. package/src/ngtsc/program_driver/src/ts_create_program_driver.d.ts +1 -1
  160. package/src/ngtsc/reflection/src/host.d.ts +1 -1
  161. package/src/ngtsc/reflection/src/type_to_value.d.ts +1 -1
  162. package/src/ngtsc/reflection/src/typescript.d.ts +1 -1
  163. package/src/ngtsc/reflection/src/util.d.ts +1 -1
  164. package/src/ngtsc/resource/src/loader.d.ts +1 -1
  165. package/src/ngtsc/scope/src/local.d.ts +1 -1
  166. package/src/ngtsc/scope/src/typecheck.d.ts +1 -1
  167. package/src/ngtsc/shims/api.d.ts +1 -1
  168. package/src/ngtsc/shims/src/adapter.d.ts +1 -1
  169. package/src/ngtsc/shims/src/expando.d.ts +1 -1
  170. package/src/ngtsc/shims/src/factory_generator.d.ts +1 -1
  171. package/src/ngtsc/shims/src/reference_tagger.d.ts +1 -1
  172. package/src/ngtsc/shims/src/summary_generator.d.ts +1 -1
  173. package/src/ngtsc/switch/src/switch.d.ts +1 -1
  174. package/src/ngtsc/transform/src/alias.d.ts +1 -1
  175. package/src/ngtsc/transform/src/api.d.ts +1 -1
  176. package/src/ngtsc/transform/src/compilation.d.ts +1 -1
  177. package/src/ngtsc/transform/src/declaration.d.ts +1 -1
  178. package/src/ngtsc/transform/src/trait.d.ts +1 -1
  179. package/src/ngtsc/transform/src/transform.d.ts +1 -1
  180. package/src/ngtsc/transform/src/utils.d.ts +1 -1
  181. package/src/ngtsc/translator/src/import_manager.d.ts +1 -1
  182. package/src/ngtsc/translator/src/type_translator.d.ts +1 -1
  183. package/src/ngtsc/translator/src/typescript_ast_factory.d.ts +1 -1
  184. package/src/ngtsc/translator/src/typescript_translator.d.ts +1 -1
  185. package/src/ngtsc/tsc_plugin.d.ts +1 -1
  186. package/src/ngtsc/typecheck/api/api.d.ts +1 -1
  187. package/src/ngtsc/typecheck/api/checker.d.ts +7 -4
  188. package/src/ngtsc/typecheck/api/context.d.ts +1 -1
  189. package/src/ngtsc/typecheck/api/scope.d.ts +1 -1
  190. package/src/ngtsc/typecheck/api/symbols.d.ts +1 -1
  191. package/src/ngtsc/typecheck/diagnostics/src/diagnostic.d.ts +1 -1
  192. package/src/ngtsc/typecheck/extended/api/api.d.ts +1 -1
  193. package/src/ngtsc/typecheck/extended/api/extended_template_checker.d.ts +1 -1
  194. package/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box/index.d.ts +1 -1
  195. package/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.d.ts +1 -1
  196. package/src/ngtsc/typecheck/extended/src/extended_template_checker.d.ts +1 -1
  197. package/src/ngtsc/typecheck/src/checker.d.ts +4 -4
  198. package/src/ngtsc/typecheck/src/comments.d.ts +1 -1
  199. package/src/ngtsc/typecheck/src/completion.d.ts +3 -5
  200. package/src/ngtsc/typecheck/src/context.d.ts +1 -1
  201. package/src/ngtsc/typecheck/src/diagnostics.d.ts +1 -1
  202. package/src/ngtsc/typecheck/src/environment.d.ts +1 -1
  203. package/src/ngtsc/typecheck/src/expression.d.ts +1 -1
  204. package/src/ngtsc/typecheck/src/oob.d.ts +3 -4
  205. package/src/ngtsc/typecheck/src/shim.d.ts +1 -1
  206. package/src/ngtsc/typecheck/src/source.d.ts +1 -1
  207. package/src/ngtsc/typecheck/src/tcb_util.d.ts +1 -1
  208. package/src/ngtsc/typecheck/src/template_symbol_builder.d.ts +1 -1
  209. package/src/ngtsc/typecheck/src/ts_util.d.ts +1 -1
  210. package/src/ngtsc/typecheck/src/type_check_block.d.ts +1 -1
  211. package/src/ngtsc/typecheck/src/type_check_file.d.ts +1 -1
  212. package/src/ngtsc/typecheck/src/type_constructor.d.ts +1 -1
  213. package/src/ngtsc/typecheck/src/type_emitter.d.ts +1 -1
  214. package/src/ngtsc/typecheck/src/type_parameter_emitter.d.ts +1 -1
  215. package/src/ngtsc/util/src/typescript.d.ts +1 -1
  216. package/src/ngtsc/util/src/visitor.d.ts +1 -1
  217. package/src/perform_compile.d.ts +1 -2
  218. package/src/perform_watch.d.ts +1 -1
  219. package/src/transformers/api.d.ts +2 -5
  220. package/src/transformers/compiler_host.d.ts +1 -1
  221. package/src/transformers/{downlevel_decorators_transform.d.ts → downlevel_decorators_transform/downlevel_decorators_transform.d.ts} +3 -3
  222. package/src/{ngtsc/routing → transformers/downlevel_decorators_transform}/index.d.ts +2 -3
  223. package/src/transformers/{patch_alias_reference_resolution.d.ts → downlevel_decorators_transform/patch_alias_reference_resolution.d.ts} +2 -2
  224. package/src/transformers/i18n.d.ts +1 -1
  225. package/src/transformers/inline_resources.d.ts +1 -1
  226. package/src/transformers/lower_expressions.d.ts +1 -1
  227. package/src/transformers/metadata_cache.d.ts +1 -1
  228. package/src/transformers/node_emitter.d.ts +1 -1
  229. package/src/transformers/node_emitter_transform.d.ts +1 -1
  230. package/src/transformers/program.d.ts +1 -1
  231. package/src/transformers/r3_metadata_transform.d.ts +1 -1
  232. package/src/transformers/r3_transform.d.ts +1 -1
  233. package/src/transformers/util.d.ts +1 -1
  234. package/index.js +0 -40
  235. package/linker/babel/index.js +0 -25
  236. package/linker/babel/src/ast/babel_ast_factory.js +0 -153
  237. package/linker/babel/src/ast/babel_ast_host.js +0 -181
  238. package/linker/babel/src/babel_declaration_scope.js +0 -67
  239. package/linker/babel/src/babel_plugin.js +0 -38
  240. package/linker/babel/src/es2015_linker_plugin.js +0 -183
  241. package/linker/babel/src/linker_plugin_options.js +0 -13
  242. package/linker/index.js +0 -27
  243. package/linker/src/ast/ast_host.js +0 -20
  244. package/linker/src/ast/ast_value.js +0 -299
  245. package/linker/src/ast/typescript/typescript_ast_host.js +0 -183
  246. package/linker/src/ast/utils.js +0 -31
  247. package/linker/src/fatal_linker_error.js +0 -49
  248. package/linker/src/file_linker/declaration_scope.js +0 -20
  249. package/linker/src/file_linker/emit_scopes/emit_scope.js +0 -57
  250. package/linker/src/file_linker/emit_scopes/iife_emit_scope.js +0 -51
  251. package/linker/src/file_linker/file_linker.js +0 -97
  252. package/linker/src/file_linker/get_source_file.js +0 -42
  253. package/linker/src/file_linker/linker_environment.js +0 -38
  254. package/linker/src/file_linker/linker_options.js +0 -29
  255. package/linker/src/file_linker/needs_linking.js +0 -41
  256. package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.js +0 -47
  257. package/linker/src/file_linker/partial_linkers/partial_component_linker_1.js +0 -210
  258. package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.js +0 -154
  259. package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.js +0 -70
  260. package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.js +0 -74
  261. package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.js +0 -56
  262. package/linker/src/file_linker/partial_linkers/partial_linker.js +0 -13
  263. package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +0 -194
  264. package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.js +0 -126
  265. package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.js +0 -59
  266. package/linker/src/file_linker/partial_linkers/util.js +0 -95
  267. package/linker/src/file_linker/translator.js +0 -40
  268. package/linker/src/linker_import_generator.js +0 -43
  269. package/ngcc/index.js +0 -33
  270. package/ngcc/main-ivy-ngcc.js +0 -12
  271. package/ngcc/main-ngcc.js +0 -54
  272. package/ngcc/src/analysis/decoration_analyzer.js +0 -268
  273. package/ngcc/src/analysis/migration_host.js +0 -108
  274. package/ngcc/src/analysis/module_with_providers_analyzer.js +0 -197
  275. package/ngcc/src/analysis/ngcc_references_registry.js +0 -65
  276. package/ngcc/src/analysis/ngcc_trait_compiler.js +0 -117
  277. package/ngcc/src/analysis/private_declarations_analyzer.js +0 -63
  278. package/ngcc/src/analysis/switch_marker_analyzer.js +0 -50
  279. package/ngcc/src/analysis/types.js +0 -15
  280. package/ngcc/src/analysis/util.js +0 -36
  281. package/ngcc/src/command_line_options.js +0 -156
  282. package/ngcc/src/constants.js +0 -23
  283. package/ngcc/src/dependencies/commonjs_dependency_host.js +0 -129
  284. package/ngcc/src/dependencies/dependency_host.js +0 -143
  285. package/ngcc/src/dependencies/dependency_resolver.js +0 -180
  286. package/ngcc/src/dependencies/dts_dependency_host.js +0 -35
  287. package/ngcc/src/dependencies/esm_dependency_host.js +0 -307
  288. package/ngcc/src/dependencies/module_resolver.js +0 -269
  289. package/ngcc/src/dependencies/umd_dependency_host.js +0 -53
  290. package/ngcc/src/entry_point_finder/directory_walker_entry_point_finder.js +0 -70
  291. package/ngcc/src/entry_point_finder/entry_point_collector.js +0 -157
  292. package/ngcc/src/entry_point_finder/interface.js +0 -13
  293. package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +0 -132
  294. package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +0 -268
  295. package/ngcc/src/entry_point_finder/tracing_entry_point_finder.js +0 -78
  296. package/ngcc/src/entry_point_finder/utils.js +0 -234
  297. package/ngcc/src/execution/analyze_entry_points.js +0 -197
  298. package/ngcc/src/execution/api.js +0 -13
  299. package/ngcc/src/execution/cluster/api.js +0 -20
  300. package/ngcc/src/execution/cluster/executor.js +0 -52
  301. package/ngcc/src/execution/cluster/master.js +0 -311
  302. package/ngcc/src/execution/cluster/package_json_updater.js +0 -79
  303. package/ngcc/src/execution/cluster/utils.js +0 -77
  304. package/ngcc/src/execution/cluster/worker.js +0 -123
  305. package/ngcc/src/execution/create_compile_function.js +0 -76
  306. package/ngcc/src/execution/single_process_executor.js +0 -91
  307. package/ngcc/src/execution/tasks/api.js +0 -35
  308. package/ngcc/src/execution/tasks/completion.js +0 -79
  309. package/ngcc/src/execution/tasks/queues/base_task_queue.js +0 -120
  310. package/ngcc/src/execution/tasks/queues/parallel_task_queue.js +0 -87
  311. package/ngcc/src/execution/tasks/queues/serial_task_queue.js +0 -49
  312. package/ngcc/src/execution/tasks/utils.js +0 -167
  313. package/ngcc/src/host/commonjs_host.js +0 -261
  314. package/ngcc/src/host/commonjs_umd_utils.js +0 -210
  315. package/ngcc/src/host/delegating_host.js +0 -156
  316. package/ngcc/src/host/esm2015_host.js +0 -2441
  317. package/ngcc/src/host/esm5_host.js +0 -745
  318. package/ngcc/src/host/ngcc_host.js +0 -29
  319. package/ngcc/src/host/umd_host.js +0 -539
  320. package/ngcc/src/host/utils.js +0 -26
  321. package/ngcc/src/locking/async_locker.js +0 -121
  322. package/ngcc/src/locking/lock_file.js +0 -18
  323. package/ngcc/src/locking/lock_file_with_child_process/index.js +0 -93
  324. package/ngcc/src/locking/lock_file_with_child_process/unlocker.js +0 -46
  325. package/ngcc/src/locking/lock_file_with_child_process/util.js +0 -43
  326. package/ngcc/src/locking/sync_locker.js +0 -67
  327. package/ngcc/src/main.js +0 -163
  328. package/ngcc/src/migrations/migration.js +0 -13
  329. package/ngcc/src/migrations/missing_injectable_migration.js +0 -227
  330. package/ngcc/src/migrations/undecorated_child_migration.js +0 -90
  331. package/ngcc/src/migrations/undecorated_parent_migration.js +0 -103
  332. package/ngcc/src/migrations/utils.js +0 -137
  333. package/ngcc/src/ngcc_options.js +0 -135
  334. package/ngcc/src/packages/build_marker.js +0 -124
  335. package/ngcc/src/packages/bundle_program.js +0 -80
  336. package/ngcc/src/packages/configuration.js +0 -277
  337. package/ngcc/src/packages/entry_point.js +0 -267
  338. package/ngcc/src/packages/entry_point_bundle.js +0 -96
  339. package/ngcc/src/packages/entry_point_manifest.js +0 -207
  340. package/ngcc/src/packages/ngcc_compiler_host.js +0 -101
  341. package/ngcc/src/packages/patch_ts_expando_initializer.js +0 -174
  342. package/ngcc/src/packages/source_file_cache.js +0 -207
  343. package/ngcc/src/packages/transformer.js +0 -157
  344. package/ngcc/src/path_mappings.js +0 -27
  345. package/ngcc/src/rendering/commonjs_rendering_formatter.js +0 -106
  346. package/ngcc/src/rendering/dts_renderer.js +0 -170
  347. package/ngcc/src/rendering/esm5_rendering_formatter.js +0 -70
  348. package/ngcc/src/rendering/esm_rendering_formatter.js +0 -291
  349. package/ngcc/src/rendering/ngcc_import_rewriter.js +0 -49
  350. package/ngcc/src/rendering/renderer.js +0 -204
  351. package/ngcc/src/rendering/rendering_formatter.js +0 -15
  352. package/ngcc/src/rendering/source_maps.js +0 -68
  353. package/ngcc/src/rendering/umd_rendering_formatter.js +0 -326
  354. package/ngcc/src/rendering/utils.js +0 -35
  355. package/ngcc/src/utils.js +0 -182
  356. package/ngcc/src/writing/cleaning/cleaning_strategies.js +0 -80
  357. package/ngcc/src/writing/cleaning/package_cleaner.js +0 -126
  358. package/ngcc/src/writing/cleaning/utils.js +0 -30
  359. package/ngcc/src/writing/file_writer.js +0 -13
  360. package/ngcc/src/writing/in_place_file_writer.js +0 -90
  361. package/ngcc/src/writing/new_entry_point_file_writer.js +0 -214
  362. package/ngcc/src/writing/package_json_updater.js +0 -182
  363. package/src/diagnostics/translate_diagnostics.js +0 -61
  364. package/src/diagnostics/typescript_version.js +0 -96
  365. package/src/extract_i18n.js +0 -62
  366. package/src/language_services.js +0 -34
  367. package/src/main.js +0 -210
  368. package/src/metadata/bundle_index_host.js +0 -133
  369. package/src/metadata/bundler.js +0 -624
  370. package/src/metadata/collector.js +0 -799
  371. package/src/metadata/evaluator.js +0 -677
  372. package/src/metadata/index.js +0 -24
  373. package/src/metadata/index_writer.js +0 -80
  374. package/src/metadata/schema.js +0 -136
  375. package/src/metadata/symbols.js +0 -149
  376. package/src/ngtsc/annotations/index.js +0 -35
  377. package/src/ngtsc/annotations/src/api.js +0 -20
  378. package/src/ngtsc/annotations/src/component.js +0 -1338
  379. package/src/ngtsc/annotations/src/diagnostics.js +0 -174
  380. package/src/ngtsc/annotations/src/directive.js +0 -724
  381. package/src/ngtsc/annotations/src/factory.js +0 -32
  382. package/src/ngtsc/annotations/src/injectable.js +0 -277
  383. package/src/ngtsc/annotations/src/metadata.js +0 -160
  384. package/src/ngtsc/annotations/src/ng_module.js +0 -677
  385. package/src/ngtsc/annotations/src/pipe.js +0 -171
  386. package/src/ngtsc/annotations/src/references_registry.js +0 -38
  387. package/src/ngtsc/annotations/src/util.js +0 -566
  388. package/src/ngtsc/core/api/index.js +0 -25
  389. package/src/ngtsc/core/api/src/adapter.js +0 -20
  390. package/src/ngtsc/core/api/src/interfaces.js +0 -20
  391. package/src/ngtsc/core/api/src/options.js +0 -20
  392. package/src/ngtsc/core/api/src/public_options.js +0 -20
  393. package/src/ngtsc/core/index.js +0 -25
  394. package/src/ngtsc/core/src/compiler.js +0 -1142
  395. package/src/ngtsc/core/src/host.js +0 -273
  396. package/src/ngtsc/cycles/index.js +0 -26
  397. package/src/ngtsc/cycles/src/analyzer.js +0 -163
  398. package/src/ngtsc/cycles/src/imports.js +0 -175
  399. package/src/ngtsc/diagnostics/index.js +0 -33
  400. package/src/ngtsc/diagnostics/src/error.js +0 -69
  401. package/src/ngtsc/diagnostics/src/error_code.js +0 -235
  402. package/src/ngtsc/diagnostics/src/util.js +0 -35
  403. package/src/ngtsc/entry_point/index.js +0 -29
  404. package/src/ngtsc/entry_point/src/generator.js +0 -45
  405. package/src/ngtsc/entry_point/src/logic.js +0 -61
  406. package/src/ngtsc/entry_point/src/private_export_checker.js +0 -137
  407. package/src/ngtsc/entry_point/src/reference_graph.js +0 -91
  408. package/src/ngtsc/file_system/index.js +0 -45
  409. package/src/ngtsc/file_system/src/compiler_host.js +0 -80
  410. package/src/ngtsc/file_system/src/helpers.js +0 -135
  411. package/src/ngtsc/file_system/src/invalid_file_system.js +0 -120
  412. package/src/ngtsc/file_system/src/logical.js +0 -100
  413. package/src/ngtsc/file_system/src/node_js_file_system.js +0 -179
  414. package/src/ngtsc/file_system/src/types.js +0 -20
  415. package/src/ngtsc/file_system/src/util.js +0 -38
  416. package/src/ngtsc/file_system/testing/index.d.ts +0 -13
  417. package/src/ngtsc/file_system/testing/index.js +0 -32
  418. package/src/ngtsc/file_system/testing/src/mock_file_system.d.ts +0 -72
  419. package/src/ngtsc/file_system/testing/src/mock_file_system.js +0 -333
  420. package/src/ngtsc/file_system/testing/src/mock_file_system_native.d.ts +0 -16
  421. package/src/ngtsc/file_system/testing/src/mock_file_system_native.js +0 -85
  422. package/src/ngtsc/file_system/testing/src/mock_file_system_posix.d.ts +0 -13
  423. package/src/ngtsc/file_system/testing/src/mock_file_system_posix.js +0 -68
  424. package/src/ngtsc/file_system/testing/src/mock_file_system_windows.d.ts +0 -13
  425. package/src/ngtsc/file_system/testing/src/mock_file_system_windows.js +0 -68
  426. package/src/ngtsc/file_system/testing/src/test_helper.d.ts +0 -17
  427. package/src/ngtsc/file_system/testing/src/test_helper.js +0 -143
  428. package/src/ngtsc/imports/index.js +0 -43
  429. package/src/ngtsc/imports/src/alias.js +0 -158
  430. package/src/ngtsc/imports/src/core.js +0 -98
  431. package/src/ngtsc/imports/src/default.js +0 -153
  432. package/src/ngtsc/imports/src/emitter.js +0 -317
  433. package/src/ngtsc/imports/src/find_export.js +0 -82
  434. package/src/ngtsc/imports/src/reexport.js +0 -20
  435. package/src/ngtsc/imports/src/references.js +0 -171
  436. package/src/ngtsc/imports/src/resolver.js +0 -39
  437. package/src/ngtsc/incremental/api.js +0 -20
  438. package/src/ngtsc/incremental/index.js +0 -29
  439. package/src/ngtsc/incremental/semantic_graph/index.js +0 -34
  440. package/src/ngtsc/incremental/semantic_graph/src/api.js +0 -51
  441. package/src/ngtsc/incremental/semantic_graph/src/graph.js +0 -302
  442. package/src/ngtsc/incremental/semantic_graph/src/type_parameters.js +0 -55
  443. package/src/ngtsc/incremental/semantic_graph/src/util.js +0 -111
  444. package/src/ngtsc/incremental/src/dependency_tracking.js +0 -165
  445. package/src/ngtsc/incremental/src/incremental.js +0 -393
  446. package/src/ngtsc/incremental/src/noop.js +0 -26
  447. package/src/ngtsc/incremental/src/state.js +0 -30
  448. package/src/ngtsc/incremental/src/strategy.js +0 -99
  449. package/src/ngtsc/indexer/index.js +0 -27
  450. package/src/ngtsc/indexer/src/api.js +0 -45
  451. package/src/ngtsc/indexer/src/context.js +0 -40
  452. package/src/ngtsc/indexer/src/template.js +0 -324
  453. package/src/ngtsc/indexer/src/transform.js +0 -66
  454. package/src/ngtsc/logging/index.js +0 -25
  455. package/src/ngtsc/logging/src/console_logger.js +0 -75
  456. package/src/ngtsc/logging/src/logger.js +0 -28
  457. package/src/ngtsc/logging/testing/index.js +0 -23
  458. package/src/ngtsc/logging/testing/src/mock_logger.d.ts +0 -20
  459. package/src/ngtsc/logging/testing/src/mock_logger.js +0 -64
  460. package/src/ngtsc/metadata/index.js +0 -39
  461. package/src/ngtsc/metadata/src/api.js +0 -26
  462. package/src/ngtsc/metadata/src/dts.js +0 -168
  463. package/src/ngtsc/metadata/src/inheritance.js +0 -122
  464. package/src/ngtsc/metadata/src/property_mapping.js +0 -244
  465. package/src/ngtsc/metadata/src/registry.js +0 -133
  466. package/src/ngtsc/metadata/src/resource_registry.js +0 -109
  467. package/src/ngtsc/metadata/src/util.js +0 -275
  468. package/src/ngtsc/partial_evaluator/index.js +0 -31
  469. package/src/ngtsc/partial_evaluator/src/builtin.js +0 -125
  470. package/src/ngtsc/partial_evaluator/src/diagnostics.js +0 -193
  471. package/src/ngtsc/partial_evaluator/src/dynamic.js +0 -109
  472. package/src/ngtsc/partial_evaluator/src/interface.js +0 -42
  473. package/src/ngtsc/partial_evaluator/src/interpreter.js +0 -780
  474. package/src/ngtsc/partial_evaluator/src/known_declaration.js +0 -57
  475. package/src/ngtsc/partial_evaluator/src/result.js +0 -72
  476. package/src/ngtsc/partial_evaluator/src/ts_helpers.js +0 -121
  477. package/src/ngtsc/perf/index.js +0 -28
  478. package/src/ngtsc/perf/src/api.js +0 -291
  479. package/src/ngtsc/perf/src/clock.js +0 -31
  480. package/src/ngtsc/perf/src/noop.js +0 -37
  481. package/src/ngtsc/perf/src/recorder.js +0 -143
  482. package/src/ngtsc/program.js +0 -360
  483. package/src/ngtsc/program_driver/index.js +0 -25
  484. package/src/ngtsc/program_driver/src/api.js +0 -36
  485. package/src/ngtsc/program_driver/src/ts_create_program_driver.js +0 -200
  486. package/src/ngtsc/reflection/index.js +0 -36
  487. package/src/ngtsc/reflection/src/host.js +0 -88
  488. package/src/ngtsc/reflection/src/type_to_value.js +0 -259
  489. package/src/ngtsc/reflection/src/typescript.js +0 -640
  490. package/src/ngtsc/reflection/src/util.js +0 -37
  491. package/src/ngtsc/resource/index.js +0 -23
  492. package/src/ngtsc/resource/src/loader.js +0 -285
  493. package/src/ngtsc/routing/index.js +0 -26
  494. package/src/ngtsc/routing/src/analyzer.d.ts +0 -37
  495. package/src/ngtsc/routing/src/analyzer.js +0 -82
  496. package/src/ngtsc/routing/src/lazy.d.ts +0 -19
  497. package/src/ngtsc/routing/src/lazy.js +0 -239
  498. package/src/ngtsc/routing/src/route.d.ts +0 -23
  499. package/src/ngtsc/routing/src/route.js +0 -77
  500. package/src/ngtsc/scope/index.js +0 -29
  501. package/src/ngtsc/scope/src/api.js +0 -20
  502. package/src/ngtsc/scope/src/component_scope.js +0 -69
  503. package/src/ngtsc/scope/src/dependency.js +0 -201
  504. package/src/ngtsc/scope/src/local.js +0 -665
  505. package/src/ngtsc/scope/src/typecheck.js +0 -120
  506. package/src/ngtsc/shims/api.js +0 -13
  507. package/src/ngtsc/shims/index.js +0 -39
  508. package/src/ngtsc/shims/src/adapter.js +0 -266
  509. package/src/ngtsc/shims/src/expando.js +0 -147
  510. package/src/ngtsc/shims/src/factory_generator.js +0 -292
  511. package/src/ngtsc/shims/src/reference_tagger.js +0 -94
  512. package/src/ngtsc/shims/src/summary_generator.js +0 -101
  513. package/src/ngtsc/shims/src/util.js +0 -41
  514. package/src/ngtsc/sourcemaps/index.js +0 -27
  515. package/src/ngtsc/sourcemaps/src/content_origin.js +0 -48
  516. package/src/ngtsc/sourcemaps/src/raw_source_map.js +0 -13
  517. package/src/ngtsc/sourcemaps/src/segment_marker.js +0 -55
  518. package/src/ngtsc/sourcemaps/src/source_file.js +0 -519
  519. package/src/ngtsc/sourcemaps/src/source_file_loader.js +0 -234
  520. package/src/ngtsc/switch/index.js +0 -23
  521. package/src/ngtsc/switch/src/switch.js +0 -141
  522. package/src/ngtsc/transform/index.js +0 -36
  523. package/src/ngtsc/transform/src/alias.js +0 -46
  524. package/src/ngtsc/transform/src/api.js +0 -76
  525. package/src/ngtsc/transform/src/compilation.js +0 -862
  526. package/src/ngtsc/transform/src/declaration.js +0 -234
  527. package/src/ngtsc/transform/src/trait.js +0 -111
  528. package/src/ngtsc/transform/src/transform.js +0 -333
  529. package/src/ngtsc/transform/src/utils.js +0 -73
  530. package/src/ngtsc/translator/index.js +0 -37
  531. package/src/ngtsc/translator/src/api/ast_factory.js +0 -20
  532. package/src/ngtsc/translator/src/api/import_generator.js +0 -20
  533. package/src/ngtsc/translator/src/context.js +0 -47
  534. package/src/ngtsc/translator/src/import_manager.js +0 -77
  535. package/src/ngtsc/translator/src/translator.js +0 -347
  536. package/src/ngtsc/translator/src/type_translator.js +0 -220
  537. package/src/ngtsc/translator/src/typescript_ast_factory.js +0 -251
  538. package/src/ngtsc/translator/src/typescript_translator.js +0 -34
  539. package/src/ngtsc/tsc_plugin.js +0 -129
  540. package/src/ngtsc/typecheck/api/api.js +0 -20
  541. package/src/ngtsc/typecheck/api/checker.js +0 -44
  542. package/src/ngtsc/typecheck/api/completion.js +0 -29
  543. package/src/ngtsc/typecheck/api/context.js +0 -20
  544. package/src/ngtsc/typecheck/api/index.js +0 -27
  545. package/src/ngtsc/typecheck/api/scope.js +0 -20
  546. package/src/ngtsc/typecheck/api/symbols.js +0 -35
  547. package/src/ngtsc/typecheck/diagnostics/index.js +0 -23
  548. package/src/ngtsc/typecheck/diagnostics/src/diagnostic.js +0 -141
  549. package/src/ngtsc/typecheck/diagnostics/src/id.js +0 -37
  550. package/src/ngtsc/typecheck/extended/api/api.js +0 -124
  551. package/src/ngtsc/typecheck/extended/api/extended_template_checker.js +0 -20
  552. package/src/ngtsc/typecheck/extended/api/index.js +0 -23
  553. package/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box/index.js +0 -52
  554. package/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.js +0 -64
  555. package/src/ngtsc/typecheck/extended/index.js +0 -23
  556. package/src/ngtsc/typecheck/extended/src/extended_template_checker.js +0 -55
  557. package/src/ngtsc/typecheck/index.js +0 -29
  558. package/src/ngtsc/typecheck/src/checker.js +0 -764
  559. package/src/ngtsc/typecheck/src/comments.js +0 -181
  560. package/src/ngtsc/typecheck/src/completion.js +0 -230
  561. package/src/ngtsc/typecheck/src/context.js +0 -424
  562. package/src/ngtsc/typecheck/src/diagnostics.js +0 -114
  563. package/src/ngtsc/typecheck/src/dom.js +0 -87
  564. package/src/ngtsc/typecheck/src/environment.js +0 -160
  565. package/src/ngtsc/typecheck/src/expression.js +0 -417
  566. package/src/ngtsc/typecheck/src/line_mappings.js +0 -77
  567. package/src/ngtsc/typecheck/src/oob.js +0 -181
  568. package/src/ngtsc/typecheck/src/shim.js +0 -52
  569. package/src/ngtsc/typecheck/src/source.js +0 -91
  570. package/src/ngtsc/typecheck/src/tcb_util.js +0 -165
  571. package/src/ngtsc/typecheck/src/template_semantics.js +0 -52
  572. package/src/ngtsc/typecheck/src/template_symbol_builder.js +0 -551
  573. package/src/ngtsc/typecheck/src/ts_util.js +0 -202
  574. package/src/ngtsc/typecheck/src/type_check_block.js +0 -2212
  575. package/src/ngtsc/typecheck/src/type_check_file.js +0 -115
  576. package/src/ngtsc/typecheck/src/type_constructor.js +0 -255
  577. package/src/ngtsc/typecheck/src/type_emitter.js +0 -164
  578. package/src/ngtsc/typecheck/src/type_parameter_emitter.js +0 -115
  579. package/src/ngtsc/util/src/path.js +0 -33
  580. package/src/ngtsc/util/src/typescript.js +0 -176
  581. package/src/ngtsc/util/src/visitor.js +0 -119
  582. package/src/ngtsc/xi18n/index.js +0 -22
  583. package/src/ngtsc/xi18n/src/context.js +0 -20
  584. package/src/perform_compile.js +0 -322
  585. package/src/perform_watch.js +0 -263
  586. package/src/tooling.js +0 -47
  587. package/src/transformers/api.js +0 -42
  588. package/src/transformers/compiler_host.js +0 -623
  589. package/src/transformers/downlevel_decorators_transform.js +0 -611
  590. package/src/transformers/entry_points.js +0 -25
  591. package/src/transformers/i18n.js +0 -76
  592. package/src/transformers/inline_resources.js +0 -287
  593. package/src/transformers/lower_expressions.js +0 -365
  594. package/src/transformers/metadata_cache.js +0 -96
  595. package/src/transformers/metadata_reader.js +0 -120
  596. package/src/transformers/node_emitter.js +0 -637
  597. package/src/transformers/node_emitter_transform.js +0 -88
  598. package/src/transformers/patch_alias_reference_resolution.js +0 -129
  599. package/src/transformers/program.js +0 -1000
  600. package/src/transformers/r3_metadata_transform.js +0 -73
  601. package/src/transformers/r3_transform.js +0 -44
  602. package/src/transformers/util.js +0 -122
  603. package/src/typescript_support.js +0 -74
  604. package/src/version.js +0 -28
@@ -1,764 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- (function (factory) {
9
- if (typeof module === "object" && typeof module.exports === "object") {
10
- var v = factory(require, exports);
11
- if (v !== undefined) module.exports = v;
12
- }
13
- else if (typeof define === "function" && define.amd) {
14
- define("@angular/compiler-cli/src/ngtsc/typecheck/src/checker", ["require", "exports", "tslib", "@angular/compiler", "@angular/compiler-cli/src/ngtsc/diagnostics", "@angular/compiler-cli/src/ngtsc/file_system", "@angular/compiler-cli/src/ngtsc/imports", "@angular/compiler-cli/src/ngtsc/perf", "@angular/compiler-cli/src/ngtsc/program_driver", "@angular/compiler-cli/src/ngtsc/reflection", "@angular/compiler-cli/src/ngtsc/shims", "@angular/compiler-cli/src/ngtsc/util/src/typescript", "@angular/compiler-cli/src/ngtsc/typecheck/api", "@angular/compiler-cli/src/ngtsc/typecheck/diagnostics", "@angular/compiler-cli/src/ngtsc/typecheck/src/completion", "@angular/compiler-cli/src/ngtsc/typecheck/src/context", "@angular/compiler-cli/src/ngtsc/typecheck/src/diagnostics", "@angular/compiler-cli/src/ngtsc/typecheck/src/shim", "@angular/compiler-cli/src/ngtsc/typecheck/src/source", "@angular/compiler-cli/src/ngtsc/typecheck/src/tcb_util", "@angular/compiler-cli/src/ngtsc/typecheck/src/template_symbol_builder"], factory);
15
- }
16
- })(function (require, exports) {
17
- "use strict";
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.TemplateTypeCheckerImpl = void 0;
20
- var tslib_1 = require("tslib");
21
- var compiler_1 = require("@angular/compiler");
22
- var diagnostics_1 = require("@angular/compiler-cli/src/ngtsc/diagnostics");
23
- var file_system_1 = require("@angular/compiler-cli/src/ngtsc/file_system");
24
- var imports_1 = require("@angular/compiler-cli/src/ngtsc/imports");
25
- var perf_1 = require("@angular/compiler-cli/src/ngtsc/perf");
26
- var program_driver_1 = require("@angular/compiler-cli/src/ngtsc/program_driver");
27
- var reflection_1 = require("@angular/compiler-cli/src/ngtsc/reflection");
28
- var shims_1 = require("@angular/compiler-cli/src/ngtsc/shims");
29
- var typescript_1 = require("@angular/compiler-cli/src/ngtsc/util/src/typescript");
30
- var api_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/api");
31
- var diagnostics_2 = require("@angular/compiler-cli/src/ngtsc/typecheck/diagnostics");
32
- var completion_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/completion");
33
- var context_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/context");
34
- var diagnostics_3 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/diagnostics");
35
- var shim_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/shim");
36
- var source_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/source");
37
- var tcb_util_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/tcb_util");
38
- var template_symbol_builder_1 = require("@angular/compiler-cli/src/ngtsc/typecheck/src/template_symbol_builder");
39
- var REGISTRY = new compiler_1.DomElementSchemaRegistry();
40
- /**
41
- * Primary template type-checking engine, which performs type-checking using a
42
- * `TypeCheckingProgramStrategy` for type-checking program maintenance, and the
43
- * `ProgramTypeCheckAdapter` for generation of template type-checking code.
44
- */
45
- var TemplateTypeCheckerImpl = /** @class */ (function () {
46
- function TemplateTypeCheckerImpl(originalProgram, programDriver, typeCheckAdapter, config, refEmitter, reflector, compilerHost, priorBuild, componentScopeReader, typeCheckScopeRegistry, perf) {
47
- this.originalProgram = originalProgram;
48
- this.programDriver = programDriver;
49
- this.typeCheckAdapter = typeCheckAdapter;
50
- this.config = config;
51
- this.refEmitter = refEmitter;
52
- this.reflector = reflector;
53
- this.compilerHost = compilerHost;
54
- this.priorBuild = priorBuild;
55
- this.componentScopeReader = componentScopeReader;
56
- this.typeCheckScopeRegistry = typeCheckScopeRegistry;
57
- this.perf = perf;
58
- this.state = new Map();
59
- /**
60
- * Stores the `CompletionEngine` which powers autocompletion for each component class.
61
- *
62
- * Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
63
- * on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
64
- * `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
65
- */
66
- this.completionCache = new Map();
67
- /**
68
- * Stores the `SymbolBuilder` which creates symbols for each component class.
69
- *
70
- * Must be invalidated whenever the component's template or the `ts.Program` changes. Invalidation
71
- * on template changes is performed within this `TemplateTypeCheckerImpl` instance. When the
72
- * `ts.Program` changes, the `TemplateTypeCheckerImpl` as a whole is destroyed and replaced.
73
- */
74
- this.symbolBuilderCache = new Map();
75
- /**
76
- * Stores directives and pipes that are in scope for each component.
77
- *
78
- * Unlike other caches, the scope of a component is not affected by its template. It will be
79
- * destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
80
- * destroyed and replaced.
81
- */
82
- this.scopeCache = new Map();
83
- /**
84
- * Stores potential element tags for each component (a union of DOM tags as well as directive
85
- * tags).
86
- *
87
- * Unlike other caches, the scope of a component is not affected by its template. It will be
88
- * destroyed when the `ts.Program` changes and the `TemplateTypeCheckerImpl` as a whole is
89
- * destroyed and replaced.
90
- */
91
- this.elementTagCache = new Map();
92
- this.isComplete = false;
93
- }
94
- TemplateTypeCheckerImpl.prototype.getTemplate = function (component) {
95
- var data = this.getLatestComponentState(component).data;
96
- if (data === null) {
97
- return null;
98
- }
99
- return data.template;
100
- };
101
- TemplateTypeCheckerImpl.prototype.getLatestComponentState = function (component) {
102
- this.ensureShimForComponent(component);
103
- var sf = component.getSourceFile();
104
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
105
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
106
- var fileRecord = this.getFileData(sfPath);
107
- if (!fileRecord.shimData.has(shimPath)) {
108
- return { data: null, tcb: null, shimPath: shimPath };
109
- }
110
- var templateId = fileRecord.sourceManager.getTemplateId(component);
111
- var shimRecord = fileRecord.shimData.get(shimPath);
112
- var id = fileRecord.sourceManager.getTemplateId(component);
113
- var program = this.programDriver.getProgram();
114
- var shimSf = (0, typescript_1.getSourceFileOrNull)(program, shimPath);
115
- if (shimSf === null || !fileRecord.shimData.has(shimPath)) {
116
- throw new Error("Error: no shim file in program: " + shimPath);
117
- }
118
- var tcb = (0, tcb_util_1.findTypeCheckBlock)(shimSf, id, /*isDiagnosticsRequest*/ false);
119
- if (tcb === null) {
120
- // Try for an inline block.
121
- var inlineSf = (0, file_system_1.getSourceFileOrError)(program, sfPath);
122
- tcb = (0, tcb_util_1.findTypeCheckBlock)(inlineSf, id, /*isDiagnosticsRequest*/ false);
123
- }
124
- var data = null;
125
- if (shimRecord.templates.has(templateId)) {
126
- data = shimRecord.templates.get(templateId);
127
- }
128
- return { data: data, tcb: tcb, shimPath: shimPath };
129
- };
130
- TemplateTypeCheckerImpl.prototype.isTrackedTypeCheckFile = function (filePath) {
131
- return this.getFileAndShimRecordsForPath(filePath) !== null;
132
- };
133
- TemplateTypeCheckerImpl.prototype.getFileAndShimRecordsForPath = function (shimPath) {
134
- var e_1, _a;
135
- try {
136
- for (var _b = (0, tslib_1.__values)(this.state.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
137
- var fileRecord = _c.value;
138
- if (fileRecord.shimData.has(shimPath)) {
139
- return { fileRecord: fileRecord, shimRecord: fileRecord.shimData.get(shimPath) };
140
- }
141
- }
142
- }
143
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
144
- finally {
145
- try {
146
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
147
- }
148
- finally { if (e_1) throw e_1.error; }
149
- }
150
- return null;
151
- };
152
- TemplateTypeCheckerImpl.prototype.getTemplateMappingAtShimLocation = function (_a) {
153
- var shimPath = _a.shimPath, positionInShimFile = _a.positionInShimFile;
154
- var records = this.getFileAndShimRecordsForPath((0, file_system_1.absoluteFrom)(shimPath));
155
- if (records === null) {
156
- return null;
157
- }
158
- var fileRecord = records.fileRecord;
159
- var shimSf = this.programDriver.getProgram().getSourceFile((0, file_system_1.absoluteFrom)(shimPath));
160
- if (shimSf === undefined) {
161
- return null;
162
- }
163
- return (0, tcb_util_1.getTemplateMapping)(shimSf, positionInShimFile, fileRecord.sourceManager, /*isDiagnosticsRequest*/ false);
164
- };
165
- TemplateTypeCheckerImpl.prototype.generateAllTypeCheckBlocks = function () {
166
- this.ensureAllShimsForAllFiles();
167
- };
168
- /**
169
- * Retrieve type-checking and template parse diagnostics from the given `ts.SourceFile` using the
170
- * most recent type-checking program.
171
- */
172
- TemplateTypeCheckerImpl.prototype.getDiagnosticsForFile = function (sf, optimizeFor) {
173
- var _this = this;
174
- switch (optimizeFor) {
175
- case api_1.OptimizeFor.WholeProgram:
176
- this.ensureAllShimsForAllFiles();
177
- break;
178
- case api_1.OptimizeFor.SingleFile:
179
- this.ensureAllShimsForOneFile(sf);
180
- break;
181
- }
182
- return this.perf.inPhase(perf_1.PerfPhase.TtcDiagnostics, function () {
183
- var e_2, _a, e_3, _b;
184
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
185
- var fileRecord = _this.state.get(sfPath);
186
- var typeCheckProgram = _this.programDriver.getProgram();
187
- var diagnostics = [];
188
- if (fileRecord.hasInlines) {
189
- var inlineSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, sfPath);
190
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(inlineSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
191
- }
192
- try {
193
- for (var _c = (0, tslib_1.__values)(fileRecord.shimData), _d = _c.next(); !_d.done; _d = _c.next()) {
194
- var _e = (0, tslib_1.__read)(_d.value, 2), shimPath = _e[0], shimRecord = _e[1];
195
- var shimSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, shimPath);
196
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(shimSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
197
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(shimRecord.genesisDiagnostics), false));
198
- try {
199
- for (var _f = (e_3 = void 0, (0, tslib_1.__values)(shimRecord.templates.values())), _g = _f.next(); !_g.done; _g = _f.next()) {
200
- var templateData = _g.value;
201
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(templateData.templateDiagnostics), false));
202
- }
203
- }
204
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
205
- finally {
206
- try {
207
- if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
208
- }
209
- finally { if (e_3) throw e_3.error; }
210
- }
211
- }
212
- }
213
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
214
- finally {
215
- try {
216
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
217
- }
218
- finally { if (e_2) throw e_2.error; }
219
- }
220
- return diagnostics.filter(function (diag) { return diag !== null; });
221
- });
222
- };
223
- TemplateTypeCheckerImpl.prototype.getDiagnosticsForComponent = function (component) {
224
- var _this = this;
225
- this.ensureShimForComponent(component);
226
- return this.perf.inPhase(perf_1.PerfPhase.TtcDiagnostics, function () {
227
- var e_4, _a;
228
- var sf = component.getSourceFile();
229
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
230
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
231
- var fileRecord = _this.getFileData(sfPath);
232
- if (!fileRecord.shimData.has(shimPath)) {
233
- return [];
234
- }
235
- var templateId = fileRecord.sourceManager.getTemplateId(component);
236
- var shimRecord = fileRecord.shimData.get(shimPath);
237
- var typeCheckProgram = _this.programDriver.getProgram();
238
- var diagnostics = [];
239
- if (shimRecord.hasInlines) {
240
- var inlineSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, sfPath);
241
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(inlineSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
242
- }
243
- var shimSf = (0, file_system_1.getSourceFileOrError)(typeCheckProgram, shimPath);
244
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(typeCheckProgram.getSemanticDiagnostics(shimSf).map(function (diag) { return convertDiagnostic(diag, fileRecord.sourceManager); })), false));
245
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(shimRecord.genesisDiagnostics), false));
246
- try {
247
- for (var _b = (0, tslib_1.__values)(shimRecord.templates.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
248
- var templateData = _c.value;
249
- diagnostics.push.apply(diagnostics, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(templateData.templateDiagnostics), false));
250
- }
251
- }
252
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
253
- finally {
254
- try {
255
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
256
- }
257
- finally { if (e_4) throw e_4.error; }
258
- }
259
- return diagnostics.filter(function (diag) {
260
- return diag !== null && diag.templateId === templateId;
261
- });
262
- });
263
- };
264
- TemplateTypeCheckerImpl.prototype.getTypeCheckBlock = function (component) {
265
- return this.getLatestComponentState(component).tcb;
266
- };
267
- TemplateTypeCheckerImpl.prototype.getGlobalCompletions = function (context, component, node) {
268
- var engine = this.getOrCreateCompletionEngine(component);
269
- if (engine === null) {
270
- return null;
271
- }
272
- return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getGlobalCompletions(context, node); });
273
- };
274
- TemplateTypeCheckerImpl.prototype.getExpressionCompletionLocation = function (ast, component) {
275
- var engine = this.getOrCreateCompletionEngine(component);
276
- if (engine === null) {
277
- return null;
278
- }
279
- return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getExpressionCompletionLocation(ast); });
280
- };
281
- TemplateTypeCheckerImpl.prototype.getLiteralCompletionLocation = function (node, component) {
282
- var engine = this.getOrCreateCompletionEngine(component);
283
- if (engine === null) {
284
- return null;
285
- }
286
- return this.perf.inPhase(perf_1.PerfPhase.TtcAutocompletion, function () { return engine.getLiteralCompletionLocation(node); });
287
- };
288
- TemplateTypeCheckerImpl.prototype.invalidateClass = function (clazz) {
289
- this.completionCache.delete(clazz);
290
- this.symbolBuilderCache.delete(clazz);
291
- this.scopeCache.delete(clazz);
292
- this.elementTagCache.delete(clazz);
293
- var sf = clazz.getSourceFile();
294
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
295
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
296
- var fileData = this.getFileData(sfPath);
297
- var templateId = fileData.sourceManager.getTemplateId(clazz);
298
- fileData.shimData.delete(shimPath);
299
- fileData.isComplete = false;
300
- this.isComplete = false;
301
- };
302
- TemplateTypeCheckerImpl.prototype.makeTemplateDiagnostic = function (clazz, sourceSpan, category, errorCode, message, relatedInformation) {
303
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(clazz.getSourceFile());
304
- var fileRecord = this.state.get(sfPath);
305
- var templateId = fileRecord.sourceManager.getTemplateId(clazz);
306
- var mapping = fileRecord.sourceManager.getSourceMapping(templateId);
307
- return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (0, diagnostics_2.makeTemplateDiagnostic)(templateId, mapping, sourceSpan, category, (0, diagnostics_1.ngErrorCode)(errorCode), message, relatedInformation)), { __ngCode: errorCode });
308
- };
309
- TemplateTypeCheckerImpl.prototype.getOrCreateCompletionEngine = function (component) {
310
- if (this.completionCache.has(component)) {
311
- return this.completionCache.get(component);
312
- }
313
- var _a = this.getLatestComponentState(component), tcb = _a.tcb, data = _a.data, shimPath = _a.shimPath;
314
- if (tcb === null || data === null) {
315
- return null;
316
- }
317
- var engine = new completion_1.CompletionEngine(tcb, data, shimPath);
318
- this.completionCache.set(component, engine);
319
- return engine;
320
- };
321
- TemplateTypeCheckerImpl.prototype.maybeAdoptPriorResultsForFile = function (sf) {
322
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
323
- if (this.state.has(sfPath)) {
324
- var existingResults = this.state.get(sfPath);
325
- if (existingResults.isComplete) {
326
- // All data for this file has already been generated, so no need to adopt anything.
327
- return;
328
- }
329
- }
330
- var previousResults = this.priorBuild.priorTypeCheckingResultsFor(sf);
331
- if (previousResults === null || !previousResults.isComplete) {
332
- return;
333
- }
334
- this.perf.eventCount(perf_1.PerfEvent.ReuseTypeCheckFile);
335
- this.state.set(sfPath, previousResults);
336
- };
337
- TemplateTypeCheckerImpl.prototype.ensureAllShimsForAllFiles = function () {
338
- var _this = this;
339
- if (this.isComplete) {
340
- return;
341
- }
342
- this.perf.inPhase(perf_1.PerfPhase.TcbGeneration, function () {
343
- var e_5, _a;
344
- var host = new WholeProgramTypeCheckingHost(_this);
345
- var ctx = _this.newContext(host);
346
- try {
347
- for (var _b = (0, tslib_1.__values)(_this.originalProgram.getSourceFiles()), _c = _b.next(); !_c.done; _c = _b.next()) {
348
- var sf = _c.value;
349
- if (sf.isDeclarationFile || (0, shims_1.isShim)(sf)) {
350
- continue;
351
- }
352
- _this.maybeAdoptPriorResultsForFile(sf);
353
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
354
- var fileData = _this.getFileData(sfPath);
355
- if (fileData.isComplete) {
356
- continue;
357
- }
358
- _this.typeCheckAdapter.typeCheck(sf, ctx);
359
- fileData.isComplete = true;
360
- }
361
- }
362
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
363
- finally {
364
- try {
365
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
366
- }
367
- finally { if (e_5) throw e_5.error; }
368
- }
369
- _this.updateFromContext(ctx);
370
- _this.isComplete = true;
371
- });
372
- };
373
- TemplateTypeCheckerImpl.prototype.ensureAllShimsForOneFile = function (sf) {
374
- var _this = this;
375
- this.perf.inPhase(perf_1.PerfPhase.TcbGeneration, function () {
376
- _this.maybeAdoptPriorResultsForFile(sf);
377
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
378
- var fileData = _this.getFileData(sfPath);
379
- if (fileData.isComplete) {
380
- // All data for this file is present and accounted for already.
381
- return;
382
- }
383
- var host = new SingleFileTypeCheckingHost(sfPath, fileData, _this);
384
- var ctx = _this.newContext(host);
385
- _this.typeCheckAdapter.typeCheck(sf, ctx);
386
- fileData.isComplete = true;
387
- _this.updateFromContext(ctx);
388
- });
389
- };
390
- TemplateTypeCheckerImpl.prototype.ensureShimForComponent = function (component) {
391
- var sf = component.getSourceFile();
392
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(sf);
393
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
394
- this.maybeAdoptPriorResultsForFile(sf);
395
- var fileData = this.getFileData(sfPath);
396
- if (fileData.shimData.has(shimPath)) {
397
- // All data for this component is available.
398
- return;
399
- }
400
- var host = new SingleShimTypeCheckingHost(sfPath, fileData, this, shimPath);
401
- var ctx = this.newContext(host);
402
- this.typeCheckAdapter.typeCheck(sf, ctx);
403
- this.updateFromContext(ctx);
404
- };
405
- TemplateTypeCheckerImpl.prototype.newContext = function (host) {
406
- var inlining = this.programDriver.supportsInlineOperations ? context_1.InliningMode.InlineOps : context_1.InliningMode.Error;
407
- return new context_1.TypeCheckContextImpl(this.config, this.compilerHost, this.refEmitter, this.reflector, host, inlining, this.perf);
408
- };
409
- /**
410
- * Remove any shim data that depends on inline operations applied to the type-checking program.
411
- *
412
- * This can be useful if new inlines need to be applied, and it's not possible to guarantee that
413
- * they won't overwrite or corrupt existing inlines that are used by such shims.
414
- */
415
- TemplateTypeCheckerImpl.prototype.clearAllShimDataUsingInlines = function () {
416
- var e_6, _a, e_7, _b;
417
- try {
418
- for (var _c = (0, tslib_1.__values)(this.state.values()), _d = _c.next(); !_d.done; _d = _c.next()) {
419
- var fileData = _d.value;
420
- if (!fileData.hasInlines) {
421
- continue;
422
- }
423
- try {
424
- for (var _e = (e_7 = void 0, (0, tslib_1.__values)(fileData.shimData.entries())), _f = _e.next(); !_f.done; _f = _e.next()) {
425
- var _g = (0, tslib_1.__read)(_f.value, 2), shimFile = _g[0], shimData = _g[1];
426
- if (shimData.hasInlines) {
427
- fileData.shimData.delete(shimFile);
428
- }
429
- }
430
- }
431
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
432
- finally {
433
- try {
434
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
435
- }
436
- finally { if (e_7) throw e_7.error; }
437
- }
438
- fileData.hasInlines = false;
439
- fileData.isComplete = false;
440
- this.isComplete = false;
441
- }
442
- }
443
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
444
- finally {
445
- try {
446
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
447
- }
448
- finally { if (e_6) throw e_6.error; }
449
- }
450
- };
451
- TemplateTypeCheckerImpl.prototype.updateFromContext = function (ctx) {
452
- var _this = this;
453
- var updates = ctx.finalize();
454
- return this.perf.inPhase(perf_1.PerfPhase.TcbUpdateProgram, function () {
455
- if (updates.size > 0) {
456
- _this.perf.eventCount(perf_1.PerfEvent.UpdateTypeCheckProgram);
457
- }
458
- _this.programDriver.updateFiles(updates, program_driver_1.UpdateMode.Incremental);
459
- _this.priorBuild.recordSuccessfulTypeCheck(_this.state);
460
- _this.perf.memory(perf_1.PerfCheckpoint.TtcUpdateProgram);
461
- });
462
- };
463
- TemplateTypeCheckerImpl.prototype.getFileData = function (path) {
464
- if (!this.state.has(path)) {
465
- this.state.set(path, {
466
- hasInlines: false,
467
- sourceManager: new source_1.TemplateSourceManager(),
468
- isComplete: false,
469
- shimData: new Map(),
470
- });
471
- }
472
- return this.state.get(path);
473
- };
474
- TemplateTypeCheckerImpl.prototype.getSymbolOfNode = function (node, component) {
475
- var builder = this.getOrCreateSymbolBuilder(component);
476
- if (builder === null) {
477
- return null;
478
- }
479
- return this.perf.inPhase(perf_1.PerfPhase.TtcSymbol, function () { return builder.getSymbol(node); });
480
- };
481
- TemplateTypeCheckerImpl.prototype.getOrCreateSymbolBuilder = function (component) {
482
- var _this = this;
483
- if (this.symbolBuilderCache.has(component)) {
484
- return this.symbolBuilderCache.get(component);
485
- }
486
- var _a = this.getLatestComponentState(component), tcb = _a.tcb, data = _a.data, shimPath = _a.shimPath;
487
- if (tcb === null || data === null) {
488
- return null;
489
- }
490
- var builder = new template_symbol_builder_1.SymbolBuilder(shimPath, tcb, data, this.componentScopeReader, function () { return _this.programDriver.getProgram().getTypeChecker(); });
491
- this.symbolBuilderCache.set(component, builder);
492
- return builder;
493
- };
494
- TemplateTypeCheckerImpl.prototype.getDirectivesInScope = function (component) {
495
- var data = this.getScopeData(component);
496
- if (data === null) {
497
- return null;
498
- }
499
- return data.directives;
500
- };
501
- TemplateTypeCheckerImpl.prototype.getPipesInScope = function (component) {
502
- var data = this.getScopeData(component);
503
- if (data === null) {
504
- return null;
505
- }
506
- return data.pipes;
507
- };
508
- TemplateTypeCheckerImpl.prototype.getDirectiveMetadata = function (dir) {
509
- if (!(0, reflection_1.isNamedClassDeclaration)(dir)) {
510
- return null;
511
- }
512
- return this.typeCheckScopeRegistry.getTypeCheckDirectiveMetadata(new imports_1.Reference(dir));
513
- };
514
- TemplateTypeCheckerImpl.prototype.getPotentialElementTags = function (component) {
515
- var e_8, _a, e_9, _b, e_10, _c;
516
- if (this.elementTagCache.has(component)) {
517
- return this.elementTagCache.get(component);
518
- }
519
- var tagMap = new Map();
520
- try {
521
- for (var _d = (0, tslib_1.__values)(REGISTRY.allKnownElementNames()), _e = _d.next(); !_e.done; _e = _d.next()) {
522
- var tag = _e.value;
523
- tagMap.set(tag, null);
524
- }
525
- }
526
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
527
- finally {
528
- try {
529
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
530
- }
531
- finally { if (e_8) throw e_8.error; }
532
- }
533
- var scope = this.getScopeData(component);
534
- if (scope !== null) {
535
- try {
536
- for (var _f = (0, tslib_1.__values)(scope.directives), _g = _f.next(); !_g.done; _g = _f.next()) {
537
- var directive = _g.value;
538
- try {
539
- for (var _h = (e_10 = void 0, (0, tslib_1.__values)(compiler_1.CssSelector.parse(directive.selector))), _j = _h.next(); !_j.done; _j = _h.next()) {
540
- var selector = _j.value;
541
- if (selector.element === null || tagMap.has(selector.element)) {
542
- // Skip this directive if it doesn't match an element tag, or if another directive has
543
- // already been included with the same element name.
544
- continue;
545
- }
546
- tagMap.set(selector.element, directive);
547
- }
548
- }
549
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
550
- finally {
551
- try {
552
- if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
553
- }
554
- finally { if (e_10) throw e_10.error; }
555
- }
556
- }
557
- }
558
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
559
- finally {
560
- try {
561
- if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
562
- }
563
- finally { if (e_9) throw e_9.error; }
564
- }
565
- }
566
- this.elementTagCache.set(component, tagMap);
567
- return tagMap;
568
- };
569
- TemplateTypeCheckerImpl.prototype.getPotentialDomBindings = function (tagName) {
570
- var attributes = REGISTRY.allKnownAttributesOfElement(tagName);
571
- return attributes.map(function (attribute) { return ({
572
- attribute: attribute,
573
- property: REGISTRY.getMappedPropName(attribute),
574
- }); });
575
- };
576
- TemplateTypeCheckerImpl.prototype.getScopeData = function (component) {
577
- var e_11, _a, e_12, _b;
578
- if (this.scopeCache.has(component)) {
579
- return this.scopeCache.get(component);
580
- }
581
- if (!(0, reflection_1.isNamedClassDeclaration)(component)) {
582
- throw new Error("AssertionError: components must have names");
583
- }
584
- var scope = this.componentScopeReader.getScopeForComponent(component);
585
- if (scope === null) {
586
- return null;
587
- }
588
- var data = {
589
- directives: [],
590
- pipes: [],
591
- isPoisoned: scope.compilation.isPoisoned,
592
- };
593
- var typeChecker = this.programDriver.getProgram().getTypeChecker();
594
- try {
595
- for (var _c = (0, tslib_1.__values)(scope.compilation.directives), _d = _c.next(); !_d.done; _d = _c.next()) {
596
- var dir = _d.value;
597
- if (dir.selector === null) {
598
- // Skip this directive, it can't be added to a template anyway.
599
- continue;
600
- }
601
- var tsSymbol = typeChecker.getSymbolAtLocation(dir.ref.node.name);
602
- if (!(0, typescript_1.isSymbolWithValueDeclaration)(tsSymbol)) {
603
- continue;
604
- }
605
- var ngModule = null;
606
- var moduleScopeOfDir = this.componentScopeReader.getScopeForComponent(dir.ref.node);
607
- if (moduleScopeOfDir !== null) {
608
- ngModule = moduleScopeOfDir.ngModule;
609
- }
610
- data.directives.push({
611
- isComponent: dir.isComponent,
612
- isStructural: dir.isStructural,
613
- selector: dir.selector,
614
- tsSymbol: tsSymbol,
615
- ngModule: ngModule,
616
- });
617
- }
618
- }
619
- catch (e_11_1) { e_11 = { error: e_11_1 }; }
620
- finally {
621
- try {
622
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
623
- }
624
- finally { if (e_11) throw e_11.error; }
625
- }
626
- try {
627
- for (var _e = (0, tslib_1.__values)(scope.compilation.pipes), _f = _e.next(); !_f.done; _f = _e.next()) {
628
- var pipe = _f.value;
629
- var tsSymbol = typeChecker.getSymbolAtLocation(pipe.ref.node.name);
630
- if (tsSymbol === undefined) {
631
- continue;
632
- }
633
- data.pipes.push({
634
- name: pipe.name,
635
- tsSymbol: tsSymbol,
636
- });
637
- }
638
- }
639
- catch (e_12_1) { e_12 = { error: e_12_1 }; }
640
- finally {
641
- try {
642
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
643
- }
644
- finally { if (e_12) throw e_12.error; }
645
- }
646
- this.scopeCache.set(component, data);
647
- return data;
648
- };
649
- return TemplateTypeCheckerImpl;
650
- }());
651
- exports.TemplateTypeCheckerImpl = TemplateTypeCheckerImpl;
652
- function convertDiagnostic(diag, sourceResolver) {
653
- if (!(0, diagnostics_3.shouldReportDiagnostic)(diag)) {
654
- return null;
655
- }
656
- return (0, diagnostics_3.translateDiagnostic)(diag, sourceResolver);
657
- }
658
- /**
659
- * Drives a `TypeCheckContext` to generate type-checking code for every component in the program.
660
- */
661
- var WholeProgramTypeCheckingHost = /** @class */ (function () {
662
- function WholeProgramTypeCheckingHost(impl) {
663
- this.impl = impl;
664
- }
665
- WholeProgramTypeCheckingHost.prototype.getSourceManager = function (sfPath) {
666
- return this.impl.getFileData(sfPath).sourceManager;
667
- };
668
- WholeProgramTypeCheckingHost.prototype.shouldCheckComponent = function (node) {
669
- var sfPath = (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile());
670
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(sfPath);
671
- var fileData = this.impl.getFileData(sfPath);
672
- // The component needs to be checked unless the shim which would contain it already exists.
673
- return !fileData.shimData.has(shimPath);
674
- };
675
- WholeProgramTypeCheckingHost.prototype.recordShimData = function (sfPath, data) {
676
- var fileData = this.impl.getFileData(sfPath);
677
- fileData.shimData.set(data.path, data);
678
- if (data.hasInlines) {
679
- fileData.hasInlines = true;
680
- }
681
- };
682
- WholeProgramTypeCheckingHost.prototype.recordComplete = function (sfPath) {
683
- this.impl.getFileData(sfPath).isComplete = true;
684
- };
685
- return WholeProgramTypeCheckingHost;
686
- }());
687
- /**
688
- * Drives a `TypeCheckContext` to generate type-checking code efficiently for a single input file.
689
- */
690
- var SingleFileTypeCheckingHost = /** @class */ (function () {
691
- function SingleFileTypeCheckingHost(sfPath, fileData, impl) {
692
- this.sfPath = sfPath;
693
- this.fileData = fileData;
694
- this.impl = impl;
695
- this.seenInlines = false;
696
- }
697
- SingleFileTypeCheckingHost.prototype.assertPath = function (sfPath) {
698
- if (this.sfPath !== sfPath) {
699
- throw new Error("AssertionError: querying TypeCheckingHost outside of assigned file");
700
- }
701
- };
702
- SingleFileTypeCheckingHost.prototype.getSourceManager = function (sfPath) {
703
- this.assertPath(sfPath);
704
- return this.fileData.sourceManager;
705
- };
706
- SingleFileTypeCheckingHost.prototype.shouldCheckComponent = function (node) {
707
- if (this.sfPath !== (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile())) {
708
- return false;
709
- }
710
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(this.sfPath);
711
- // Only need to generate a TCB for the class if no shim exists for it currently.
712
- return !this.fileData.shimData.has(shimPath);
713
- };
714
- SingleFileTypeCheckingHost.prototype.recordShimData = function (sfPath, data) {
715
- this.assertPath(sfPath);
716
- // Previous type-checking state may have required the use of inlines (assuming they were
717
- // supported). If the current operation also requires inlines, this presents a problem:
718
- // generating new inlines may invalidate any old inlines that old state depends on.
719
- //
720
- // Rather than resolve this issue by tracking specific dependencies on inlines, if the new state
721
- // relies on inlines, any old state that relied on them is simply cleared. This happens when the
722
- // first new state that uses inlines is encountered.
723
- if (data.hasInlines && !this.seenInlines) {
724
- this.impl.clearAllShimDataUsingInlines();
725
- this.seenInlines = true;
726
- }
727
- this.fileData.shimData.set(data.path, data);
728
- if (data.hasInlines) {
729
- this.fileData.hasInlines = true;
730
- }
731
- };
732
- SingleFileTypeCheckingHost.prototype.recordComplete = function (sfPath) {
733
- this.assertPath(sfPath);
734
- this.fileData.isComplete = true;
735
- };
736
- return SingleFileTypeCheckingHost;
737
- }());
738
- /**
739
- * Drives a `TypeCheckContext` to generate type-checking code efficiently for only those components
740
- * which map to a single shim of a single input file.
741
- */
742
- var SingleShimTypeCheckingHost = /** @class */ (function (_super) {
743
- (0, tslib_1.__extends)(SingleShimTypeCheckingHost, _super);
744
- function SingleShimTypeCheckingHost(sfPath, fileData, impl, shimPath) {
745
- var _this = _super.call(this, sfPath, fileData, impl) || this;
746
- _this.shimPath = shimPath;
747
- return _this;
748
- }
749
- SingleShimTypeCheckingHost.prototype.shouldCheckNode = function (node) {
750
- if (this.sfPath !== (0, file_system_1.absoluteFromSourceFile)(node.getSourceFile())) {
751
- return false;
752
- }
753
- // Only generate a TCB for the component if it maps to the requested shim file.
754
- var shimPath = shim_1.TypeCheckShimGenerator.shimFor(this.sfPath);
755
- if (shimPath !== this.shimPath) {
756
- return false;
757
- }
758
- // Only need to generate a TCB for the class if no shim exists for it currently.
759
- return !this.fileData.shimData.has(shimPath);
760
- };
761
- return SingleShimTypeCheckingHost;
762
- }(SingleFileTypeCheckingHost));
763
- });
764
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbmd0c2MvdHlwZWNoZWNrL3NyYy9jaGVja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7SUFFSCw4Q0FBZ047SUFHaE4sMkVBQXlEO0lBRXpELDJFQUE2RztJQUM3RyxtRUFBMEQ7SUFFMUQsNkRBQThFO0lBQzlFLGlGQUErRDtJQUMvRCx5RUFBMkY7SUFFM0YsK0RBQW1DO0lBQ25DLGtGQUE0RjtJQUM1RixxRUFBa1Q7SUFDbFQscUZBQXNEO0lBRXRELHVGQUE4QztJQUM5QyxpRkFBbUg7SUFDbkgseUZBQTBFO0lBQzFFLDJFQUE4QztJQUM5QywrRUFBK0M7SUFDL0MsbUZBQTBGO0lBQzFGLGlIQUF3RDtJQUd4RCxJQUFNLFFBQVEsR0FBRyxJQUFJLG1DQUF3QixFQUFFLENBQUM7SUFDaEQ7Ozs7T0FJRztJQUNIO1FBeUNFLGlDQUNZLGVBQTJCLEVBQVcsYUFBNEIsRUFDbEUsZ0JBQXlDLEVBQVUsTUFBMEIsRUFDN0UsVUFBNEIsRUFBVSxTQUF5QixFQUMvRCxZQUEyRCxFQUMzRCxVQUEyRCxFQUNsRCxvQkFBMEMsRUFDMUMsc0JBQThDLEVBQzlDLElBQWtCO1lBUDNCLG9CQUFlLEdBQWYsZUFBZSxDQUFZO1lBQVcsa0JBQWEsR0FBYixhQUFhLENBQWU7WUFDbEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtZQUFVLFdBQU0sR0FBTixNQUFNLENBQW9CO1lBQzdFLGVBQVUsR0FBVixVQUFVLENBQWtCO1lBQVUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7WUFDL0QsaUJBQVksR0FBWixZQUFZLENBQStDO1lBQzNELGVBQVUsR0FBVixVQUFVLENBQWlEO1lBQ2xELHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7WUFDMUMsMkJBQXNCLEdBQXRC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QUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQztRQUNILGlDQUFDO0lBQUQsQ0FBQyxBQXJERCxJQXFEQztJQUVEOzs7T0FHRztJQUNIO1FBQXlDLDJEQUEwQjtRQUNqRSxvQ0FDSSxNQUFzQixFQUFFLFFBQThCLEVBQUUsSUFBNkIsRUFDN0UsUUFBd0I7WUFGcEMsWUFHRSxrQkFBTSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUM5QjtZQUZXLGNBQVEsR0FBUixRQUFRLENBQWdCOztRQUVwQyxDQUFDO1FBRUQsb0RBQWUsR0FBZixVQUFnQixJQUF5QjtZQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBQSxvQ0FBc0IsRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRTtnQkFDaEUsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELCtFQUErRTtZQUMvRSxJQUFNLFFBQVEsR0FBRyw2QkFBc0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxnRkFBZ0Y7WUFDaEYsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0gsaUNBQUM7SUFBRCxDQUFDLEFBckJELENBQXlDLDBCQUEwQixHQXFCbEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtBU1QsIENzc1NlbGVjdG9yLCBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnksIExpdGVyYWxQcmltaXRpdmUsIFBhcnNlU291cmNlU3BhbiwgUHJvcGVydHlSZWFkLCBTYWZlUHJvcGVydHlSZWFkLCBUbXBsQXN0RWxlbWVudCwgVG1wbEFzdE5vZGUsIFRtcGxBc3RSZWZlcmVuY2UsIFRtcGxBc3RUZW1wbGF0ZX0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtUZXh0QXR0cmlidXRlfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvcmVuZGVyMy9yM19hc3QnO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge0Vycm9yQ29kZSwgbmdFcnJvckNvZGV9IGZyb20gJy4uLy4uL2RpYWdub3N0aWNzJztcblxuaW1wb3J0IHthYnNvbHV0ZUZyb20sIGFic29sdXRlRnJvbVNvdXJjZUZpbGUsIEFic29sdXRlRnNQYXRoLCBnZXRTb3VyY2VGaWxlT3JFcnJvcn0gZnJvbSAnLi4vLi4vZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtSZWZlcmVuY2UsIFJlZmVyZW5jZUVtaXR0ZXJ9IGZyb20gJy4uLy4uL2ltcG9ydHMnO1xuaW1wb3J0IHtJbmNyZW1lbnRhbEJ1aWxkfSBmcm9tICcuLi8uLi9pbmNyZW1lbnRhbC9hcGknO1xuaW1wb3J0IHtQZXJmQ2hlY2twb2ludCwgUGVyZkV2ZW50LCBQZXJmUGhhc2UsIFBlcmZSZWNvcmRlcn0gZnJvbSAnLi4vLi4vcGVyZic7XG5pbXBvcnQge1Byb2dyYW1Ecml2ZXIsIFVwZGF0ZU1vZGV9IGZyb20gJy4uLy4uL3Byb2dyYW1fZHJpdmVyJztcbmltcG9ydCB7Q2xhc3NEZWNsYXJhdGlvbiwgaXNOYW1lZENsYXNzRGVjbGFyYXRpb24sIFJlZmxlY3Rpb25Ib3N0fSBmcm9tICcuLi8uLi9yZWZsZWN0aW9uJztcbmltcG9ydCB7Q29tcG9uZW50U2NvcGVSZWFkZXIsIFR5cGVDaGVja1Njb3BlUmVnaXN0cnl9IGZyb20gJy4uLy4uL3Njb3BlJztcbmltcG9ydCB7aXNTaGltfSBmcm9tICcuLi8uLi9zaGltcyc7XG5pbXBvcnQge2dldFNvdXJjZUZpbGVPck51bGwsIGlzU3ltYm9sV2l0aFZhbHVlRGVjbGFyYXRpb259IGZyb20gJy4uLy4uL3V0aWwvc3JjL3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJblNjb3BlLCBFbGVtZW50U3ltYm9sLCBGdWxsVGVtcGxhdGVNYXBwaW5nLCBHbG9iYWxDb21wbGV0aW9uLCBOZ1RlbXBsYXRlRGlhZ25vc3RpYywgT3B0aW1pemVGb3IsIFBpcGVJblNjb3BlLCBQcm9ncmFtVHlwZUNoZWNrQWRhcHRlciwgU2hpbUxvY2F0aW9uLCBTeW1ib2wsIFRlbXBsYXRlRGlhZ25vc3RpYywgVGVtcGxhdGVJZCwgVGVtcGxhdGVTeW1ib2wsIFRlbXBsYXRlVHlwZUNoZWNrZXIsIFR5cGVDaGVja2FibGVEaXJlY3RpdmVNZXRhLCBUeXBlQ2hlY2tpbmdDb25maWd9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQge21ha2VUZW1wbGF0ZURpYWdub3N0aWN9IGZyb20gJy4uL2RpYWdub3N0aWNzJztcblxuaW1wb3J0IHtDb21wbGV0aW9uRW5naW5lfSBmcm9tICcuL2NvbXBsZXRpb24nO1xuaW1wb3J0IHtJbmxpbmluZ01vZGUsIFNoaW1UeXBlQ2hlY2tpbmdEYXRhLCBUZW1wbGF0ZURhdGEsIFR5cGVDaGVja0NvbnRleHRJbXBsLCBUeXBlQ2hlY2tpbmdIb3N0fSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHtzaG91bGRSZXBvcnREaWFnbm9zdGljLCB0cmFuc2xhdGVEaWFnbm9zdGljfSBmcm9tICcuL2RpYWdub3N0aWNzJztcbmltcG9ydCB7VHlwZUNoZWNrU2hpbUdlbmVyYXRvcn0gZnJvbSAnLi9zaGltJztcbmltcG9ydCB7VGVtcGxhdGVTb3VyY2VNYW5hZ2VyfSBmcm9tICcuL3NvdXJjZSc7XG5pbXBvcnQge2ZpbmRUeXBlQ2hlY2tCbG9jaywgZ2V0VGVtcGxhdGVNYXBwaW5nLCBUZW1wbGF0ZVNvdXJjZVJlc29sdmVyfSBmcm9tICcuL3RjYl91dGlsJztcbmltcG9ydCB7U3ltYm9sQnVpbGRlcn0gZnJvbSAnLi90ZW1wbGF0ZV9zeW1ib2xfYnVpbGRlcic7XG5cblxuY29uc3QgUkVHSVNUUlkgPSBuZXcgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KCk7XG4vKipcbiAqIFByaW1hcnkgdGVtcGxhdGUgdHlwZS1jaGVja2luZyBlbmdpbmUsIHdoaWNoIHBlcmZvcm1zIHR5cGUtY2hlY2tpbmcgdXNpbmcgYVxuICogYFR5cGVDaGVja2luZ1Byb2dyYW1TdHJhdGVneWAgZm9yIHR5cGUtY2hlY2tpbmcgcHJvZ3JhbSBtYWludGVuYW5jZSwgYW5kIHRoZVxuICogYFByb2dyYW1UeXBlQ2hlY2tBZGFwdGVyYCBmb3IgZ2VuZXJhdGlvbiBvZiB0ZW1wbGF0ZSB0eXBlLWNoZWNraW5nIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlVHlwZUNoZWNrZXIge1xuICBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxBYnNvbHV0ZUZzUGF0aCwgRmlsZVR5cGVDaGVja2luZ0RhdGE+KCk7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgYENvbXBsZXRpb25FbmdpbmVgIHdoaWNoIHBvd2VycyBhdXRvY29tcGxldGlvbiBmb3IgZWFjaCBjb21wb25lbnQgY2xhc3MuXG4gICAqXG4gICAqIE11c3QgYmUgaW52YWxpZGF0ZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlIG9yIHRoZSBgdHMuUHJvZ3JhbWAgY2hhbmdlcy4gSW52YWxpZGF0aW9uXG4gICAqIG9uIHRlbXBsYXRlIGNoYW5nZXMgaXMgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbGAgaW5zdGFuY2UuIFdoZW4gdGhlXG4gICAqIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzLCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRpb25DYWNoZSA9IG5ldyBNYXA8dHMuQ2xhc3NEZWNsYXJhdGlvbiwgQ29tcGxldGlvbkVuZ2luZT4oKTtcbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgYFN5bWJvbEJ1aWxkZXJgIHdoaWNoIGNyZWF0ZXMgc3ltYm9scyBmb3IgZWFjaCBjb21wb25lbnQgY2xhc3MuXG4gICAqXG4gICAqIE11c3QgYmUgaW52YWxpZGF0ZWQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlIG9yIHRoZSBgdHMuUHJvZ3JhbWAgY2hhbmdlcy4gSW52YWxpZGF0aW9uXG4gICAqIG9uIHRlbXBsYXRlIGNoYW5nZXMgaXMgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbGAgaW5zdGFuY2UuIFdoZW4gdGhlXG4gICAqIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzLCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHN5bWJvbEJ1aWxkZXJDYWNoZSA9IG5ldyBNYXA8dHMuQ2xhc3NEZWNsYXJhdGlvbiwgU3ltYm9sQnVpbGRlcj4oKTtcblxuICAvKipcbiAgICogU3RvcmVzIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIHRoYXQgYXJlIGluIHNjb3BlIGZvciBlYWNoIGNvbXBvbmVudC5cbiAgICpcbiAgICogVW5saWtlIG90aGVyIGNhY2hlcywgdGhlIHNjb3BlIG9mIGEgY29tcG9uZW50IGlzIG5vdCBhZmZlY3RlZCBieSBpdHMgdGVtcGxhdGUuIEl0IHdpbGwgYmVcbiAgICogZGVzdHJveWVkIHdoZW4gdGhlIGB0cy5Qcm9ncmFtYCBjaGFuZ2VzIGFuZCB0aGUgYFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsYCBhcyBhIHdob2xlIGlzXG4gICAqIGRlc3Ryb3llZCBhbmQgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHNjb3BlQ2FjaGUgPSBuZXcgTWFwPHRzLkNsYXNzRGVjbGFyYXRpb24sIFNjb3BlRGF0YT4oKTtcblxuICAvKipcbiAgICogU3RvcmVzIHBvdGVudGlhbCBlbGVtZW50IHRhZ3MgZm9yIGVhY2ggY29tcG9uZW50IChhIHVuaW9uIG9mIERPTSB0YWdzIGFzIHdlbGwgYXMgZGlyZWN0aXZlXG4gICAqIHRhZ3MpLlxuICAgKlxuICAgKiBVbmxpa2Ugb3RoZXIgY2FjaGVzLCB0aGUgc2NvcGUgb2YgYSBjb21wb25lbnQgaXMgbm90IGFmZmVjdGVkIGJ5IGl0cyB0ZW1wbGF0ZS4gSXQgd2lsbCBiZVxuICAgKiBkZXN0cm95ZWQgd2hlbiB0aGUgYHRzLlByb2dyYW1gIGNoYW5nZXMgYW5kIHRoZSBgVGVtcGxhdGVUeXBlQ2hlY2tlckltcGxgIGFzIGEgd2hvbGUgaXNcbiAgICogZGVzdHJveWVkIGFuZCByZXBsYWNlZC5cbiAgICovXG4gIHByaXZhdGUgZWxlbWVudFRhZ0NhY2hlID0gbmV3IE1hcDx0cy5DbGFzc0RlY2xhcmF0aW9uLCBNYXA8c3RyaW5nLCBEaXJlY3RpdmVJblNjb3BlfG51bGw+PigpO1xuXG4gIHByaXZhdGUgaXNDb21wbGV0ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBvcmlnaW5hbFByb2dyYW06IHRzLlByb2dyYW0sIHJlYWRvbmx5IHByb2dyYW1Ecml2ZXI6IFByb2dyYW1Ecml2ZXIsXG4gICAgICBwcml2YXRlIHR5cGVDaGVja0FkYXB0ZXI6IFByb2dyYW1UeXBlQ2hlY2tBZGFwdGVyLCBwcml2YXRlIGNvbmZpZzogVHlwZUNoZWNraW5nQ29uZmlnLFxuICAgICAgcHJpdmF0ZSByZWZFbWl0dGVyOiBSZWZlcmVuY2VFbWl0dGVyLCBwcml2YXRlIHJlZmxlY3RvcjogUmVmbGVjdGlvbkhvc3QsXG4gICAgICBwcml2YXRlIGNvbXBpbGVySG9zdDogUGljazx0cy5Db21waWxlckhvc3QsICdnZXRDYW5vbmljYWxGaWxlTmFtZSc+LFxuICAgICAgcHJpdmF0ZSBwcmlvckJ1aWxkOiBJbmNyZW1lbnRhbEJ1aWxkPHVua25vd24sIEZpbGVUeXBlQ2hlY2tpbmdEYXRhPixcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50U2NvcGVSZWFkZXI6IENvbXBvbmVudFNjb3BlUmVhZGVyLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0eXBlQ2hlY2tTY29wZVJlZ2lzdHJ5OiBUeXBlQ2hlY2tTY29wZVJlZ2lzdHJ5LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBwZXJmOiBQZXJmUmVjb3JkZXIpIHt9XG5cbiAgZ2V0VGVtcGxhdGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogVG1wbEFzdE5vZGVbXXxudWxsIHtcbiAgICBjb25zdCB7ZGF0YX0gPSB0aGlzLmdldExhdGVzdENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCk7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS50ZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF0ZXN0Q29tcG9uZW50U3RhdGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTpcbiAgICAgIHtkYXRhOiBUZW1wbGF0ZURhdGF8bnVsbCwgdGNiOiB0cy5Ob2RlfG51bGwsIHNoaW1QYXRoOiBBYnNvbHV0ZUZzUGF0aH0ge1xuICAgIHRoaXMuZW5zdXJlU2hpbUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgY29uc3Qgc2YgPSBjb21wb25lbnQuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG5cbiAgICBjb25zdCBmaWxlUmVjb3JkID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuXG4gICAgaWYgKCFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIHJldHVybiB7ZGF0YTogbnVsbCwgdGNiOiBudWxsLCBzaGltUGF0aH07XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVJZCA9IGZpbGVSZWNvcmQuc291cmNlTWFuYWdlci5nZXRUZW1wbGF0ZUlkKGNvbXBvbmVudCk7XG4gICAgY29uc3Qgc2hpbVJlY29yZCA9IGZpbGVSZWNvcmQuc2hpbURhdGEuZ2V0KHNoaW1QYXRoKSE7XG4gICAgY29uc3QgaWQgPSBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIuZ2V0VGVtcGxhdGVJZChjb21wb25lbnQpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCk7XG4gICAgY29uc3Qgc2hpbVNmID0gZ2V0U291cmNlRmlsZU9yTnVsbChwcm9ncmFtLCBzaGltUGF0aCk7XG5cbiAgICBpZiAoc2hpbVNmID09PSBudWxsIHx8ICFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IG5vIHNoaW0gZmlsZSBpbiBwcm9ncmFtOiAke3NoaW1QYXRofWApO1xuICAgIH1cblxuICAgIGxldCB0Y2I6IHRzLk5vZGV8bnVsbCA9IGZpbmRUeXBlQ2hlY2tCbG9jayhzaGltU2YsIGlkLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuXG4gICAgaWYgKHRjYiA9PT0gbnVsbCkge1xuICAgICAgLy8gVHJ5IGZvciBhbiBpbmxpbmUgYmxvY2suXG4gICAgICBjb25zdCBpbmxpbmVTZiA9IGdldFNvdXJjZUZpbGVPckVycm9yKHByb2dyYW0sIHNmUGF0aCk7XG4gICAgICB0Y2IgPSBmaW5kVHlwZUNoZWNrQmxvY2soaW5saW5lU2YsIGlkLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBUZW1wbGF0ZURhdGF8bnVsbCA9IG51bGw7XG4gICAgaWYgKHNoaW1SZWNvcmQudGVtcGxhdGVzLmhhcyh0ZW1wbGF0ZUlkKSkge1xuICAgICAgZGF0YSA9IHNoaW1SZWNvcmQudGVtcGxhdGVzLmdldCh0ZW1wbGF0ZUlkKSE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkYXRhLCB0Y2IsIHNoaW1QYXRofTtcbiAgfVxuXG4gIGlzVHJhY2tlZFR5cGVDaGVja0ZpbGUoZmlsZVBhdGg6IEFic29sdXRlRnNQYXRoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUFuZFNoaW1SZWNvcmRzRm9yUGF0aChmaWxlUGF0aCkgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEZpbGVBbmRTaGltUmVjb3Jkc0ZvclBhdGgoc2hpbVBhdGg6IEFic29sdXRlRnNQYXRoKTpcbiAgICAgIHtmaWxlUmVjb3JkOiBGaWxlVHlwZUNoZWNraW5nRGF0YSwgc2hpbVJlY29yZDogU2hpbVR5cGVDaGVja2luZ0RhdGF9fG51bGwge1xuICAgIGZvciAoY29uc3QgZmlsZVJlY29yZCBvZiB0aGlzLnN0YXRlLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsZVJlY29yZC5zaGltRGF0YS5oYXMoc2hpbVBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7ZmlsZVJlY29yZCwgc2hpbVJlY29yZDogZmlsZVJlY29yZC5zaGltRGF0YS5nZXQoc2hpbVBhdGgpIX07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0VGVtcGxhdGVNYXBwaW5nQXRTaGltTG9jYXRpb24oe3NoaW1QYXRoLCBwb3NpdGlvbkluU2hpbUZpbGV9OiBTaGltTG9jYXRpb24pOlxuICAgICAgRnVsbFRlbXBsYXRlTWFwcGluZ3xudWxsIHtcbiAgICBjb25zdCByZWNvcmRzID0gdGhpcy5nZXRGaWxlQW5kU2hpbVJlY29yZHNGb3JQYXRoKGFic29sdXRlRnJvbShzaGltUGF0aCkpO1xuICAgIGlmIChyZWNvcmRzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qge2ZpbGVSZWNvcmR9ID0gcmVjb3JkcztcblxuICAgIGNvbnN0IHNoaW1TZiA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCkuZ2V0U291cmNlRmlsZShhYnNvbHV0ZUZyb20oc2hpbVBhdGgpKTtcbiAgICBpZiAoc2hpbVNmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGVtcGxhdGVNYXBwaW5nKFxuICAgICAgICBzaGltU2YsIHBvc2l0aW9uSW5TaGltRmlsZSwgZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyLCAvKmlzRGlhZ25vc3RpY3NSZXF1ZXN0Ki8gZmFsc2UpO1xuICB9XG5cbiAgZ2VuZXJhdGVBbGxUeXBlQ2hlY2tCbG9ja3MoKSB7XG4gICAgdGhpcy5lbnN1cmVBbGxTaGltc0ZvckFsbEZpbGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdHlwZS1jaGVja2luZyBhbmQgdGVtcGxhdGUgcGFyc2UgZGlhZ25vc3RpY3MgZnJvbSB0aGUgZ2l2ZW4gYHRzLlNvdXJjZUZpbGVgIHVzaW5nIHRoZVxuICAgKiBtb3N0IHJlY2VudCB0eXBlLWNoZWNraW5nIHByb2dyYW0uXG4gICAqL1xuICBnZXREaWFnbm9zdGljc0ZvckZpbGUoc2Y6IHRzLlNvdXJjZUZpbGUsIG9wdGltaXplRm9yOiBPcHRpbWl6ZUZvcik6IHRzLkRpYWdub3N0aWNbXSB7XG4gICAgc3dpdGNoIChvcHRpbWl6ZUZvcikge1xuICAgICAgY2FzZSBPcHRpbWl6ZUZvci5XaG9sZVByb2dyYW06XG4gICAgICAgIHRoaXMuZW5zdXJlQWxsU2hpbXNGb3JBbGxGaWxlcygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3B0aW1pemVGb3IuU2luZ2xlRmlsZTpcbiAgICAgICAgdGhpcy5lbnN1cmVBbGxTaGltc0Zvck9uZUZpbGUoc2YpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlR0Y0RpYWdub3N0aWNzLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICAgIGNvbnN0IGZpbGVSZWNvcmQgPSB0aGlzLnN0YXRlLmdldChzZlBhdGgpITtcblxuICAgICAgY29uc3QgdHlwZUNoZWNrUHJvZ3JhbSA9IHRoaXMucHJvZ3JhbURyaXZlci5nZXRQcm9ncmFtKCk7XG5cbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiAodHMuRGlhZ25vc3RpY3xudWxsKVtdID0gW107XG4gICAgICBpZiAoZmlsZVJlY29yZC5oYXNJbmxpbmVzKSB7XG4gICAgICAgIGNvbnN0IGlubGluZVNmID0gZ2V0U291cmNlRmlsZU9yRXJyb3IodHlwZUNoZWNrUHJvZ3JhbSwgc2ZQYXRoKTtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50eXBlQ2hlY2tQcm9ncmFtLmdldFNlbWFudGljRGlhZ25vc3RpY3MoaW5saW5lU2YpLm1hcChcbiAgICAgICAgICAgIGRpYWcgPT4gY29udmVydERpYWdub3N0aWMoZGlhZywgZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyKSkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtzaGltUGF0aCwgc2hpbVJlY29yZF0gb2YgZmlsZVJlY29yZC5zaGltRGF0YSkge1xuICAgICAgICBjb25zdCBzaGltU2YgPSBnZXRTb3VyY2VGaWxlT3JFcnJvcih0eXBlQ2hlY2tQcm9ncmFtLCBzaGltUGF0aCk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4udHlwZUNoZWNrUHJvZ3JhbS5nZXRTZW1hbnRpY0RpYWdub3N0aWNzKHNoaW1TZikubWFwKFxuICAgICAgICAgICAgZGlhZyA9PiBjb252ZXJ0RGlhZ25vc3RpYyhkaWFnLCBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIpKSk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4uc2hpbVJlY29yZC5nZW5lc2lzRGlhZ25vc3RpY3MpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVEYXRhIG9mIHNoaW1SZWNvcmQudGVtcGxhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50ZW1wbGF0ZURhdGEudGVtcGxhdGVEaWFnbm9zdGljcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzLmZpbHRlcigoZGlhZzogdHMuRGlhZ25vc3RpY3xudWxsKTogZGlhZyBpcyB0cy5EaWFnbm9zdGljID0+IGRpYWcgIT09IG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGlhZ25vc3RpY3NGb3JDb21wb25lbnQoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdHMuRGlhZ25vc3RpY1tdIHtcbiAgICB0aGlzLmVuc3VyZVNoaW1Gb3JDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVHRjRGlhZ25vc3RpY3MsICgpID0+IHtcbiAgICAgIGNvbnN0IHNmID0gY29tcG9uZW50LmdldFNvdXJjZUZpbGUoKTtcbiAgICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgICAgY29uc3Qgc2hpbVBhdGggPSBUeXBlQ2hlY2tTaGltR2VuZXJhdG9yLnNoaW1Gb3Ioc2ZQYXRoKTtcblxuICAgICAgY29uc3QgZmlsZVJlY29yZCA9IHRoaXMuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcblxuICAgICAgaWYgKCFmaWxlUmVjb3JkLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gZmlsZVJlY29yZC5zb3VyY2VNYW5hZ2VyLmdldFRlbXBsYXRlSWQoY29tcG9uZW50KTtcbiAgICAgIGNvbnN0IHNoaW1SZWNvcmQgPSBmaWxlUmVjb3JkLnNoaW1EYXRhLmdldChzaGltUGF0aCkhO1xuXG4gICAgICBjb25zdCB0eXBlQ2hlY2tQcm9ncmFtID0gdGhpcy5wcm9ncmFtRHJpdmVyLmdldFByb2dyYW0oKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IChUZW1wbGF0ZURpYWdub3N0aWN8bnVsbClbXSA9IFtdO1xuICAgICAgaWYgKHNoaW1SZWNvcmQuaGFzSW5saW5lcykge1xuICAgICAgICBjb25zdCBpbmxpbmVTZiA9IGdldFNvdXJjZUZpbGVPckVycm9yKHR5cGVDaGVja1Byb2dyYW0sIHNmUGF0aCk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goLi4udHlwZUNoZWNrUHJvZ3JhbS5nZXRTZW1hbnRpY0RpYWdub3N0aWNzKGlubGluZVNmKS5tYXAoXG4gICAgICAgICAgICBkaWFnID0+IGNvbnZlcnREaWFnbm9zdGljKGRpYWcsIGZpbGVSZWNvcmQuc291cmNlTWFuYWdlcikpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hpbVNmID0gZ2V0U291cmNlRmlsZU9yRXJyb3IodHlwZUNoZWNrUHJvZ3JhbSwgc2hpbVBhdGgpO1xuICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50eXBlQ2hlY2tQcm9ncmFtLmdldFNlbWFudGljRGlhZ25vc3RpY3Moc2hpbVNmKS5tYXAoXG4gICAgICAgICAgZGlhZyA9PiBjb252ZXJ0RGlhZ25vc3RpYyhkaWFnLCBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIpKSk7XG4gICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnNoaW1SZWNvcmQuZ2VuZXNpc0RpYWdub3N0aWNzKTtcblxuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZURhdGEgb2Ygc2hpbVJlY29yZC50ZW1wbGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50ZW1wbGF0ZURhdGEudGVtcGxhdGVEaWFnbm9zdGljcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWFnbm9zdGljcy5maWx0ZXIoXG4gICAgICAgICAgKGRpYWc6IFRlbXBsYXRlRGlhZ25vc3RpY3xudWxsKTogZGlhZyBpcyBUZW1wbGF0ZURpYWdub3N0aWMgPT5cbiAgICAgICAgICAgICAgZGlhZyAhPT0gbnVsbCAmJiBkaWFnLnRlbXBsYXRlSWQgPT09IHRlbXBsYXRlSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VHlwZUNoZWNrQmxvY2soY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdHMuTm9kZXxudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpLnRjYjtcbiAgfVxuXG4gIGdldEdsb2JhbENvbXBsZXRpb25zKFxuICAgICAgY29udGV4dDogVG1wbEFzdFRlbXBsYXRlfG51bGwsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgICAgIG5vZGU6IEFTVHxUbXBsQXN0Tm9kZSk6IEdsb2JhbENvbXBsZXRpb258bnVsbCB7XG4gICAgY29uc3QgZW5naW5lID0gdGhpcy5nZXRPckNyZWF0ZUNvbXBsZXRpb25FbmdpbmUoY29tcG9uZW50KTtcbiAgICBpZiAoZW5naW5lID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGVyZi5pblBoYXNlKFxuICAgICAgICBQZXJmUGhhc2UuVHRjQXV0b2NvbXBsZXRpb24sICgpID0+IGVuZ2luZS5nZXRHbG9iYWxDb21wbGV0aW9ucyhjb250ZXh0LCBub2RlKSk7XG4gIH1cblxuICBnZXRFeHByZXNzaW9uQ29tcGxldGlvbkxvY2F0aW9uKFxuICAgICAgYXN0OiBQcm9wZXJ0eVJlYWR8U2FmZVByb3BlcnR5UmVhZCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU2hpbUxvY2F0aW9ufG51bGwge1xuICAgIGNvbnN0IGVuZ2luZSA9IHRoaXMuZ2V0T3JDcmVhdGVDb21wbGV0aW9uRW5naW5lKGNvbXBvbmVudCk7XG4gICAgaWYgKGVuZ2luZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShcbiAgICAgICAgUGVyZlBoYXNlLlR0Y0F1dG9jb21wbGV0aW9uLCAoKSA9PiBlbmdpbmUuZ2V0RXhwcmVzc2lvbkNvbXBsZXRpb25Mb2NhdGlvbihhc3QpKTtcbiAgfVxuXG4gIGdldExpdGVyYWxDb21wbGV0aW9uTG9jYXRpb24oXG4gICAgICBub2RlOiBMaXRlcmFsUHJpbWl0aXZlfFRleHRBdHRyaWJ1dGUsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IFNoaW1Mb2NhdGlvbnxudWxsIHtcbiAgICBjb25zdCBlbmdpbmUgPSB0aGlzLmdldE9yQ3JlYXRlQ29tcGxldGlvbkVuZ2luZShjb21wb25lbnQpO1xuICAgIGlmIChlbmdpbmUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoXG4gICAgICAgIFBlcmZQaGFzZS5UdGNBdXRvY29tcGxldGlvbiwgKCkgPT4gZW5naW5lLmdldExpdGVyYWxDb21wbGV0aW9uTG9jYXRpb24obm9kZSkpO1xuICB9XG5cbiAgaW52YWxpZGF0ZUNsYXNzKGNsYXp6OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jb21wbGV0aW9uQ2FjaGUuZGVsZXRlKGNsYXp6KTtcbiAgICB0aGlzLnN5bWJvbEJ1aWxkZXJDYWNoZS5kZWxldGUoY2xhenopO1xuICAgIHRoaXMuc2NvcGVDYWNoZS5kZWxldGUoY2xhenopO1xuICAgIHRoaXMuZWxlbWVudFRhZ0NhY2hlLmRlbGV0ZShjbGF6eik7XG5cbiAgICBjb25zdCBzZiA9IGNsYXp6LmdldFNvdXJjZUZpbGUoKTtcbiAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICBjb25zdCBzaGltUGF0aCA9IFR5cGVDaGVja1NoaW1HZW5lcmF0b3Iuc2hpbUZvcihzZlBhdGgpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBmaWxlRGF0YS5zb3VyY2VNYW5hZ2VyLmdldFRlbXBsYXRlSWQoY2xhenopO1xuXG4gICAgZmlsZURhdGEuc2hpbURhdGEuZGVsZXRlKHNoaW1QYXRoKTtcbiAgICBmaWxlRGF0YS5pc0NvbXBsZXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLmlzQ29tcGxldGUgPSBmYWxzZTtcbiAgfVxuXG4gIG1ha2VUZW1wbGF0ZURpYWdub3N0aWM8VCBleHRlbmRzIEVycm9yQ29kZT4oXG4gICAgICBjbGF6ejogdHMuQ2xhc3NEZWNsYXJhdGlvbiwgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLCBjYXRlZ29yeTogdHMuRGlhZ25vc3RpY0NhdGVnb3J5LFxuICAgICAgZXJyb3JDb2RlOiBULCBtZXNzYWdlOiBzdHJpbmcsIHJlbGF0ZWRJbmZvcm1hdGlvbj86IHtcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICBzdGFydDogbnVtYmVyLFxuICAgICAgICBlbmQ6IG51bWJlcixcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgIH1bXSk6IE5nVGVtcGxhdGVEaWFnbm9zdGljPFQ+IHtcbiAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKGNsYXp6LmdldFNvdXJjZUZpbGUoKSk7XG4gICAgY29uc3QgZmlsZVJlY29yZCA9IHRoaXMuc3RhdGUuZ2V0KHNmUGF0aCkhO1xuICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBmaWxlUmVjb3JkLnNvdXJjZU1hbmFnZXIuZ2V0VGVtcGxhdGVJZChjbGF6eik7XG4gICAgY29uc3QgbWFwcGluZyA9IGZpbGVSZWNvcmQuc291cmNlTWFuYWdlci5nZXRTb3VyY2VNYXBwaW5nKHRlbXBsYXRlSWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1ha2VUZW1wbGF0ZURpYWdub3N0aWMoXG4gICAgICAgICAgdGVtcGxhdGVJZCwgbWFwcGluZywgc291cmNlU3BhbiwgY2F0ZWdvcnksIG5nRXJyb3JDb2RlKGVycm9yQ29kZSksIG1lc3NhZ2UsXG4gICAgICAgICAgcmVsYXRlZEluZm9ybWF0aW9uKSxcbiAgICAgIF9fbmdDb2RlOiBlcnJvckNvZGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZUNvbXBsZXRpb25FbmdpbmUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogQ29tcGxldGlvbkVuZ2luZXxudWxsIHtcbiAgICBpZiAodGhpcy5jb21wbGV0aW9uQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRpb25DYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3Qge3RjYiwgZGF0YSwgc2hpbVBhdGh9ID0gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmICh0Y2IgPT09IG51bGwgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW5naW5lID0gbmV3IENvbXBsZXRpb25FbmdpbmUodGNiLCBkYXRhLCBzaGltUGF0aCk7XG4gICAgdGhpcy5jb21wbGV0aW9uQ2FjaGUuc2V0KGNvbXBvbmVudCwgZW5naW5lKTtcbiAgICByZXR1cm4gZW5naW5lO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXliZUFkb3B0UHJpb3JSZXN1bHRzRm9yRmlsZShzZjogdHMuU291cmNlRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGlmICh0aGlzLnN0YXRlLmhhcyhzZlBhdGgpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Jlc3VsdHMgPSB0aGlzLnN0YXRlLmdldChzZlBhdGgpITtcblxuICAgICAgaWYgKGV4aXN0aW5nUmVzdWx0cy5pc0NvbXBsZXRlKSB7XG4gICAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQsIHNvIG5vIG5lZWQgdG8gYWRvcHQgYW55dGhpbmcuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdHMgPSB0aGlzLnByaW9yQnVpbGQucHJpb3JUeXBlQ2hlY2tpbmdSZXN1bHRzRm9yKHNmKTtcbiAgICBpZiAocHJldmlvdXNSZXN1bHRzID09PSBudWxsIHx8ICFwcmV2aW91c1Jlc3VsdHMuaXNDb21wbGV0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVyZi5ldmVudENvdW50KFBlcmZFdmVudC5SZXVzZVR5cGVDaGVja0ZpbGUpO1xuICAgIHRoaXMuc3RhdGUuc2V0KHNmUGF0aCwgcHJldmlvdXNSZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQWxsU2hpbXNGb3JBbGxGaWxlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlRjYkdlbmVyYXRpb24sICgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBuZXcgV2hvbGVQcm9ncmFtVHlwZUNoZWNraW5nSG9zdCh0aGlzKTtcbiAgICAgIGNvbnN0IGN0eCA9IHRoaXMubmV3Q29udGV4dChob3N0KTtcblxuICAgICAgZm9yIChjb25zdCBzZiBvZiB0aGlzLm9yaWdpbmFsUHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICAgIGlmIChzZi5pc0RlY2xhcmF0aW9uRmlsZSB8fCBpc1NoaW0oc2YpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heWJlQWRvcHRQcmlvclJlc3VsdHNGb3JGaWxlKHNmKTtcblxuICAgICAgICBjb25zdCBzZlBhdGggPSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKHNmKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSB0aGlzLmdldEZpbGVEYXRhKHNmUGF0aCk7XG4gICAgICAgIGlmIChmaWxlRGF0YS5pc0NvbXBsZXRlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnR5cGVDaGVja0FkYXB0ZXIudHlwZUNoZWNrKHNmLCBjdHgpO1xuXG4gICAgICAgIGZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gICAgICB0aGlzLmlzQ29tcGxldGUgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVBbGxTaGltc0Zvck9uZUZpbGUoc2Y6IHRzLlNvdXJjZUZpbGUpOiB2b2lkIHtcbiAgICB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVGNiR2VuZXJhdGlvbiwgKCkgPT4ge1xuICAgICAgdGhpcy5tYXliZUFkb3B0UHJpb3JSZXN1bHRzRm9yRmlsZShzZik7XG5cbiAgICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuXG4gICAgICBjb25zdCBmaWxlRGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcbiAgICAgIGlmIChmaWxlRGF0YS5pc0NvbXBsZXRlKSB7XG4gICAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGZpbGUgaXMgcHJlc2VudCBhbmQgYWNjb3VudGVkIGZvciBhbHJlYWR5LlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3QgPSBuZXcgU2luZ2xlRmlsZVR5cGVDaGVja2luZ0hvc3Qoc2ZQYXRoLCBmaWxlRGF0YSwgdGhpcyk7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLm5ld0NvbnRleHQoaG9zdCk7XG5cbiAgICAgIHRoaXMudHlwZUNoZWNrQWRhcHRlci50eXBlQ2hlY2soc2YsIGN0eCk7XG5cbiAgICAgIGZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVNoaW1Gb3JDb21wb25lbnQoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2YgPSBjb21wb25lbnQuZ2V0U291cmNlRmlsZSgpO1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUoc2YpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG5cbiAgICB0aGlzLm1heWJlQWRvcHRQcmlvclJlc3VsdHNGb3JGaWxlKHNmKTtcblxuICAgIGNvbnN0IGZpbGVEYXRhID0gdGhpcy5nZXRGaWxlRGF0YShzZlBhdGgpO1xuXG4gICAgaWYgKGZpbGVEYXRhLnNoaW1EYXRhLmhhcyhzaGltUGF0aCkpIHtcbiAgICAgIC8vIEFsbCBkYXRhIGZvciB0aGlzIGNvbXBvbmVudCBpcyBhdmFpbGFibGUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaG9zdCA9IG5ldyBTaW5nbGVTaGltVHlwZUNoZWNraW5nSG9zdChzZlBhdGgsIGZpbGVEYXRhLCB0aGlzLCBzaGltUGF0aCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5uZXdDb250ZXh0KGhvc3QpO1xuXG4gICAgdGhpcy50eXBlQ2hlY2tBZGFwdGVyLnR5cGVDaGVjayhzZiwgY3R4KTtcbiAgICB0aGlzLnVwZGF0ZUZyb21Db250ZXh0KGN0eCk7XG4gIH1cblxuICBwcml2YXRlIG5ld0NvbnRleHQoaG9zdDogVHlwZUNoZWNraW5nSG9zdCk6IFR5cGVDaGVja0NvbnRleHRJbXBsIHtcbiAgICBjb25zdCBpbmxpbmluZyA9XG4gICAgICAgIHRoaXMucHJvZ3JhbURyaXZlci5zdXBwb3J0c0lubGluZU9wZXJhdGlvbnMgPyBJbmxpbmluZ01vZGUuSW5saW5lT3BzIDogSW5saW5pbmdNb2RlLkVycm9yO1xuICAgIHJldHVybiBuZXcgVHlwZUNoZWNrQ29udGV4dEltcGwoXG4gICAgICAgIHRoaXMuY29uZmlnLCB0aGlzLmNvbXBpbGVySG9zdCwgdGhpcy5yZWZFbWl0dGVyLCB0aGlzLnJlZmxlY3RvciwgaG9zdCwgaW5saW5pbmcsIHRoaXMucGVyZik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFueSBzaGltIGRhdGEgdGhhdCBkZXBlbmRzIG9uIGlubGluZSBvcGVyYXRpb25zIGFwcGxpZWQgdG8gdGhlIHR5cGUtY2hlY2tpbmcgcHJvZ3JhbS5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIG5ldyBpbmxpbmVzIG5lZWQgdG8gYmUgYXBwbGllZCwgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGF0XG4gICAqIHRoZXkgd29uJ3Qgb3ZlcndyaXRlIG9yIGNvcnJ1cHQgZXhpc3RpbmcgaW5saW5lcyB0aGF0IGFyZSB1c2VkIGJ5IHN1Y2ggc2hpbXMuXG4gICAqL1xuICBjbGVhckFsbFNoaW1EYXRhVXNpbmdJbmxpbmVzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmlsZURhdGEgb2YgdGhpcy5zdGF0ZS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFmaWxlRGF0YS5oYXNJbmxpbmVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtzaGltRmlsZSwgc2hpbURhdGFdIG9mIGZpbGVEYXRhLnNoaW1EYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoc2hpbURhdGEuaGFzSW5saW5lcykge1xuICAgICAgICAgIGZpbGVEYXRhLnNoaW1EYXRhLmRlbGV0ZShzaGltRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmlsZURhdGEuaGFzSW5saW5lcyA9IGZhbHNlO1xuICAgICAgZmlsZURhdGEuaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGcm9tQ29udGV4dChjdHg6IFR5cGVDaGVja0NvbnRleHRJbXBsKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlcyA9IGN0eC5maW5hbGl6ZSgpO1xuICAgIHJldHVybiB0aGlzLnBlcmYuaW5QaGFzZShQZXJmUGhhc2UuVGNiVXBkYXRlUHJvZ3JhbSwgKCkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy5wZXJmLmV2ZW50Q291bnQoUGVyZkV2ZW50LlVwZGF0ZVR5cGVDaGVja1Byb2dyYW0pO1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9ncmFtRHJpdmVyLnVwZGF0ZUZpbGVzKHVwZGF0ZXMsIFVwZGF0ZU1vZGUuSW5jcmVtZW50YWwpO1xuICAgICAgdGhpcy5wcmlvckJ1aWxkLnJlY29yZFN1Y2Nlc3NmdWxUeXBlQ2hlY2sodGhpcy5zdGF0ZSk7XG4gICAgICB0aGlzLnBlcmYubWVtb3J5KFBlcmZDaGVja3BvaW50LlR0Y1VwZGF0ZVByb2dyYW0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmlsZURhdGEocGF0aDogQWJzb2x1dGVGc1BhdGgpOiBGaWxlVHlwZUNoZWNraW5nRGF0YSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXQocGF0aCwge1xuICAgICAgICBoYXNJbmxpbmVzOiBmYWxzZSxcbiAgICAgICAgc291cmNlTWFuYWdlcjogbmV3IFRlbXBsYXRlU291cmNlTWFuYWdlcigpLFxuICAgICAgICBpc0NvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgc2hpbURhdGE6IG5ldyBNYXAoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXQocGF0aCkhO1xuICB9XG4gIGdldFN5bWJvbE9mTm9kZShub2RlOiBUbXBsQXN0VGVtcGxhdGUsIGNvbXBvbmVudDogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IFRlbXBsYXRlU3ltYm9sfG51bGw7XG4gIGdldFN5bWJvbE9mTm9kZShub2RlOiBUbXBsQXN0RWxlbWVudCwgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogRWxlbWVudFN5bWJvbHxudWxsO1xuICBnZXRTeW1ib2xPZk5vZGUobm9kZTogQVNUfFRtcGxBc3ROb2RlLCBjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBTeW1ib2x8bnVsbCB7XG4gICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZ2V0T3JDcmVhdGVTeW1ib2xCdWlsZGVyKGNvbXBvbmVudCk7XG4gICAgaWYgKGJ1aWxkZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wZXJmLmluUGhhc2UoUGVyZlBoYXNlLlR0Y1N5bWJvbCwgKCkgPT4gYnVpbGRlci5nZXRTeW1ib2wobm9kZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVN5bWJvbEJ1aWxkZXIoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU3ltYm9sQnVpbGRlcnxudWxsIHtcbiAgICBpZiAodGhpcy5zeW1ib2xCdWlsZGVyQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN5bWJvbEJ1aWxkZXJDYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3Qge3RjYiwgZGF0YSwgc2hpbVBhdGh9ID0gdGhpcy5nZXRMYXRlc3RDb21wb25lbnRTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmICh0Y2IgPT09IG51bGwgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBTeW1ib2xCdWlsZGVyKFxuICAgICAgICBzaGltUGF0aCwgdGNiLCBkYXRhLCB0aGlzLmNvbXBvbmVudFNjb3BlUmVhZGVyLFxuICAgICAgICAoKSA9PiB0aGlzLnByb2dyYW1Ecml2ZXIuZ2V0UHJvZ3JhbSgpLmdldFR5cGVDaGVja2VyKCkpO1xuICAgIHRoaXMuc3ltYm9sQnVpbGRlckNhY2hlLnNldChjb21wb25lbnQsIGJ1aWxkZXIpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9XG5cbiAgZ2V0RGlyZWN0aXZlc0luU2NvcGUoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogRGlyZWN0aXZlSW5TY29wZVtdfG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFNjb3BlRGF0YShjb21wb25lbnQpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuZGlyZWN0aXZlcztcbiAgfVxuXG4gIGdldFBpcGVzSW5TY29wZShjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBQaXBlSW5TY29wZVtdfG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFNjb3BlRGF0YShjb21wb25lbnQpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEucGlwZXM7XG4gIH1cblxuICBnZXREaXJlY3RpdmVNZXRhZGF0YShkaXI6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBUeXBlQ2hlY2thYmxlRGlyZWN0aXZlTWV0YXxudWxsIHtcbiAgICBpZiAoIWlzTmFtZWRDbGFzc0RlY2xhcmF0aW9uKGRpcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50eXBlQ2hlY2tTY29wZVJlZ2lzdHJ5LmdldFR5cGVDaGVja0RpcmVjdGl2ZU1ldGFkYXRhKG5ldyBSZWZlcmVuY2UoZGlyKSk7XG4gIH1cblxuICBnZXRQb3RlbnRpYWxFbGVtZW50VGFncyhjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBNYXA8c3RyaW5nLCBEaXJlY3RpdmVJblNjb3BlfG51bGw+IHtcbiAgICBpZiAodGhpcy5lbGVtZW50VGFnQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUYWdDYWNoZS5nZXQoY29tcG9uZW50KSE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFnTWFwID0gbmV3IE1hcDxzdHJpbmcsIERpcmVjdGl2ZUluU2NvcGV8bnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgdGFnIG9mIFJFR0lTVFJZLmFsbEtub3duRWxlbWVudE5hbWVzKCkpIHtcbiAgICAgIHRhZ01hcC5zZXQodGFnLCBudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVEYXRhKGNvbXBvbmVudCk7XG4gICAgaWYgKHNjb3BlICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpcmVjdGl2ZSBvZiBzY29wZS5kaXJlY3RpdmVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgQ3NzU2VsZWN0b3IucGFyc2UoZGlyZWN0aXZlLnNlbGVjdG9yKSkge1xuICAgICAgICAgIGlmIChzZWxlY3Rvci5lbGVtZW50ID09PSBudWxsIHx8IHRhZ01hcC5oYXMoc2VsZWN0b3IuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyBkaXJlY3RpdmUgaWYgaXQgZG9lc24ndCBtYXRjaCBhbiBlbGVtZW50IHRhZywgb3IgaWYgYW5vdGhlciBkaXJlY3RpdmUgaGFzXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgd2l0aCB0aGUgc2FtZSBlbGVtZW50IG5hbWUuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWdNYXAuc2V0KHNlbGVjdG9yLmVsZW1lbnQsIGRpcmVjdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRUYWdDYWNoZS5zZXQoY29tcG9uZW50LCB0YWdNYXApO1xuICAgIHJldHVybiB0YWdNYXA7XG4gIH1cblxuICBnZXRQb3RlbnRpYWxEb21CaW5kaW5ncyh0YWdOYW1lOiBzdHJpbmcpOiB7YXR0cmlidXRlOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmd9W10ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBSRUdJU1RSWS5hbGxLbm93bkF0dHJpYnV0ZXNPZkVsZW1lbnQodGFnTmFtZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXMubWFwKGF0dHJpYnV0ZSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogUkVHSVNUUlkuZ2V0TWFwcGVkUHJvcE5hbWUoYXR0cmlidXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY29wZURhdGEoY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogU2NvcGVEYXRhfG51bGwge1xuICAgIGlmICh0aGlzLnNjb3BlQ2FjaGUuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjb3BlQ2FjaGUuZ2V0KGNvbXBvbmVudCkhO1xuICAgIH1cblxuICAgIGlmICghaXNOYW1lZENsYXNzRGVjbGFyYXRpb24oY29tcG9uZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlcnRpb25FcnJvcjogY29tcG9uZW50cyBtdXN0IGhhdmUgbmFtZXNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuY29tcG9uZW50U2NvcGVSZWFkZXIuZ2V0U2NvcGVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBpZiAoc2NvcGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IFNjb3BlRGF0YSA9IHtcbiAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgcGlwZXM6IFtdLFxuICAgICAgaXNQb2lzb25lZDogc2NvcGUuY29tcGlsYXRpb24uaXNQb2lzb25lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgdHlwZUNoZWNrZXIgPSB0aGlzLnByb2dyYW1Ecml2ZXIuZ2V0UHJvZ3JhbSgpLmdldFR5cGVDaGVja2VyKCk7XG4gICAgZm9yIChjb25zdCBkaXIgb2Ygc2NvcGUuY29tcGlsYXRpb24uZGlyZWN0aXZlcykge1xuICAgICAgaWYgKGRpci5zZWxlY3RvciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBTa2lwIHRoaXMgZGlyZWN0aXZlLCBpdCBjYW4ndCBiZSBhZGRlZCB0byBhIHRlbXBsYXRlIGFueXdheS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0c1N5bWJvbCA9IHR5cGVDaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oZGlyLnJlZi5ub2RlLm5hbWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbFdpdGhWYWx1ZURlY2xhcmF0aW9uKHRzU3ltYm9sKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5nTW9kdWxlOiBDbGFzc0RlY2xhcmF0aW9ufG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgbW9kdWxlU2NvcGVPZkRpciA9IHRoaXMuY29tcG9uZW50U2NvcGVSZWFkZXIuZ2V0U2NvcGVGb3JDb21wb25lbnQoZGlyLnJlZi5ub2RlKTtcbiAgICAgIGlmIChtb2R1bGVTY29wZU9mRGlyICE9PSBudWxsKSB7XG4gICAgICAgIG5nTW9kdWxlID0gbW9kdWxlU2NvcGVPZkRpci5uZ01vZHVsZTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5kaXJlY3RpdmVzLnB1c2goe1xuICAgICAgICBpc0NvbXBvbmVudDogZGlyLmlzQ29tcG9uZW50LFxuICAgICAgICBpc1N0cnVjdHVyYWw6IGRpci5pc1N0cnVjdHVyYWwsXG4gICAgICAgIHNlbGVjdG9yOiBkaXIuc2VsZWN0b3IsXG4gICAgICAgIHRzU3ltYm9sLFxuICAgICAgICBuZ01vZHVsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGlwZSBvZiBzY29wZS5jb21waWxhdGlvbi5waXBlcykge1xuICAgICAgY29uc3QgdHNTeW1ib2wgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKHBpcGUucmVmLm5vZGUubmFtZSk7XG4gICAgICBpZiAodHNTeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGEucGlwZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IHBpcGUubmFtZSxcbiAgICAgICAgdHNTeW1ib2wsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjb3BlQ2FjaGUuc2V0KGNvbXBvbmVudCwgZGF0YSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydERpYWdub3N0aWMoXG4gICAgZGlhZzogdHMuRGlhZ25vc3RpYywgc291cmNlUmVzb2x2ZXI6IFRlbXBsYXRlU291cmNlUmVzb2x2ZXIpOiBUZW1wbGF0ZURpYWdub3N0aWN8bnVsbCB7XG4gIGlmICghc2hvdWxkUmVwb3J0RGlhZ25vc3RpYyhkaWFnKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0cmFuc2xhdGVEaWFnbm9zdGljKGRpYWcsIHNvdXJjZVJlc29sdmVyKTtcbn1cblxuLyoqXG4gKiBEYXRhIGZvciB0ZW1wbGF0ZSB0eXBlLWNoZWNraW5nIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBpbnB1dCBmaWxlIGluIHRoZSB1c2VyJ3MgcHJvZ3JhbSAod2hpY2hcbiAqIGNvbnRhaW5zIGNvbXBvbmVudHMgdG8gYmUgY2hlY2tlZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVR5cGVDaGVja2luZ0RhdGEge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgdHlwZS1jaGVja2luZyBzaGltIHJlcXVpcmVkIGFueSBpbmxpbmUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZSwgd2hpY2ggYWZmZWN0c1xuICAgKiB3aGV0aGVyIHRoZSBzaGltIGNhbiBiZSByZXVzZWQuXG4gICAqL1xuICBoYXNJbmxpbmVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgbWFwcGluZyBkaWFnbm9zdGljcyBmcm9tIGlubGluZWQgdHlwZSBjaGVjayBibG9ja3MgYmFjayB0byB0aGVcbiAgICogb3JpZ2luYWwgdGVtcGxhdGUuXG4gICAqL1xuICBzb3VyY2VNYW5hZ2VyOiBUZW1wbGF0ZVNvdXJjZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIERhdGEgZm9yIGVhY2ggc2hpbSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGlucHV0IGZpbGUuXG4gICAqXG4gICAqIEEgc2luZ2xlIGlucHV0IGZpbGUgd2lsbCBnZW5lcmF0ZSBvbmUgb3IgbW9yZSBzaGltIGZpbGVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiB0ZW1wbGF0ZVxuICAgKiB0eXBlLWNoZWNraW5nIGNvZGUuXG4gICAqL1xuICBzaGltRGF0YTogTWFwPEFic29sdXRlRnNQYXRoLCBTaGltVHlwZUNoZWNraW5nRGF0YT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRlbXBsYXRlIHR5cGUtY2hlY2tlciBpcyBjZXJ0YWluIHRoYXQgYWxsIGNvbXBvbmVudHMgZnJvbSB0aGlzIGlucHV0IGZpbGUgaGF2ZSBoYWRcbiAgICogdHlwZS1jaGVja2luZyBjb2RlIGdlbmVyYXRlZCBpbnRvIHNoaW1zLlxuICAgKi9cbiAgaXNDb21wbGV0ZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEcml2ZXMgYSBgVHlwZUNoZWNrQ29udGV4dGAgdG8gZ2VuZXJhdGUgdHlwZS1jaGVja2luZyBjb2RlIGZvciBldmVyeSBjb21wb25lbnQgaW4gdGhlIHByb2dyYW0uXG4gKi9cbmNsYXNzIFdob2xlUHJvZ3JhbVR5cGVDaGVja2luZ0hvc3QgaW1wbGVtZW50cyBUeXBlQ2hlY2tpbmdIb3N0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbXBsOiBUZW1wbGF0ZVR5cGVDaGVja2VySW1wbCkge31cblxuICBnZXRTb3VyY2VNYW5hZ2VyKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiBUZW1wbGF0ZVNvdXJjZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKS5zb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgc2hvdWxkQ2hlY2tDb21wb25lbnQobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNmUGF0aCA9IGFic29sdXRlRnJvbVNvdXJjZUZpbGUobm9kZS5nZXRTb3VyY2VGaWxlKCkpO1xuICAgIGNvbnN0IHNoaW1QYXRoID0gVHlwZUNoZWNrU2hpbUdlbmVyYXRvci5zaGltRm9yKHNmUGF0aCk7XG4gICAgY29uc3QgZmlsZURhdGEgPSB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKTtcbiAgICAvLyBUaGUgY29tcG9uZW50IG5lZWRzIHRvIGJlIGNoZWNrZWQgdW5sZXNzIHRoZSBzaGltIHdoaWNoIHdvdWxkIGNvbnRhaW4gaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgcmV0dXJuICFmaWxlRGF0YS5zaGltRGF0YS5oYXMoc2hpbVBhdGgpO1xuICB9XG5cbiAgcmVjb3JkU2hpbURhdGEoc2ZQYXRoOiBBYnNvbHV0ZUZzUGF0aCwgZGF0YTogU2hpbVR5cGVDaGVja2luZ0RhdGEpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlRGF0YSA9IHRoaXMuaW1wbC5nZXRGaWxlRGF0YShzZlBhdGgpO1xuICAgIGZpbGVEYXRhLnNoaW1EYXRhLnNldChkYXRhLnBhdGgsIGRhdGEpO1xuICAgIGlmIChkYXRhLmhhc0lubGluZXMpIHtcbiAgICAgIGZpbGVEYXRhLmhhc0lubGluZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZENvbXBsZXRlKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB2b2lkIHtcbiAgICB0aGlzLmltcGwuZ2V0RmlsZURhdGEoc2ZQYXRoKS5pc0NvbXBsZXRlID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERyaXZlcyBhIGBUeXBlQ2hlY2tDb250ZXh0YCB0byBnZW5lcmF0ZSB0eXBlLWNoZWNraW5nIGNvZGUgZWZmaWNpZW50bHkgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUuXG4gKi9cbmNsYXNzIFNpbmdsZUZpbGVUeXBlQ2hlY2tpbmdIb3N0IGltcGxlbWVudHMgVHlwZUNoZWNraW5nSG9zdCB7XG4gIHByaXZhdGUgc2VlbklubGluZXMgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBzZlBhdGg6IEFic29sdXRlRnNQYXRoLCBwcm90ZWN0ZWQgZmlsZURhdGE6IEZpbGVUeXBlQ2hlY2tpbmdEYXRhLFxuICAgICAgcHJvdGVjdGVkIGltcGw6IFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsKSB7fVxuXG4gIHByaXZhdGUgYXNzZXJ0UGF0aChzZlBhdGg6IEFic29sdXRlRnNQYXRoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2ZQYXRoICE9PSBzZlBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uRXJyb3I6IHF1ZXJ5aW5nIFR5cGVDaGVja2luZ0hvc3Qgb3V0c2lkZSBvZiBhc3NpZ25lZCBmaWxlYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U291cmNlTWFuYWdlcihzZlBhdGg6IEFic29sdXRlRnNQYXRoKTogVGVtcGxhdGVTb3VyY2VNYW5hZ2VyIHtcbiAgICB0aGlzLmFzc2VydFBhdGgoc2ZQYXRoKTtcbiAgICByZXR1cm4gdGhpcy5maWxlRGF0YS5zb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgc2hvdWxkQ2hlY2tDb21wb25lbnQobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNmUGF0aCAhPT0gYWJzb2x1dGVGcm9tU291cmNlRmlsZShub2RlLmdldFNvdXJjZUZpbGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2hpbVBhdGggPSBUeXBlQ2hlY2tTaGltR2VuZXJhdG9yLnNoaW1Gb3IodGhpcy5zZlBhdGgpO1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGdlbmVyYXRlIGEgVENCIGZvciB0aGUgY2xhc3MgaWYgbm8gc2hpbSBleGlzdHMgZm9yIGl0IGN1cnJlbnRseS5cbiAgICByZXR1cm4gIXRoaXMuZmlsZURhdGEuc2hpbURhdGEuaGFzKHNoaW1QYXRoKTtcbiAgfVxuXG4gIHJlY29yZFNoaW1EYXRhKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgsIGRhdGE6IFNoaW1UeXBlQ2hlY2tpbmdEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRQYXRoKHNmUGF0aCk7XG5cbiAgICAvLyBQcmV2aW91cyB0eXBlLWNoZWNraW5nIHN0YXRlIG1heSBoYXZlIHJlcXVpcmVkIHRoZSB1c2Ugb2YgaW5saW5lcyAoYXNzdW1pbmcgdGhleSB3ZXJlXG4gICAgLy8gc3VwcG9ydGVkKS4gSWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGFsc28gcmVxdWlyZXMgaW5saW5lcywgdGhpcyBwcmVzZW50cyBhIHByb2JsZW06XG4gICAgLy8gZ2VuZXJhdGluZyBuZXcgaW5saW5lcyBtYXkgaW52YWxpZGF0ZSBhbnkgb2xkIGlubGluZXMgdGhhdCBvbGQgc3RhdGUgZGVwZW5kcyBvbi5cbiAgICAvL1xuICAgIC8vIFJhdGhlciB0aGFuIHJlc29sdmUgdGhpcyBpc3N1ZSBieSB0cmFja2luZyBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgb24gaW5saW5lcywgaWYgdGhlIG5ldyBzdGF0ZVxuICAgIC8vIHJlbGllcyBvbiBpbmxpbmVzLCBhbnkgb2xkIHN0YXRlIHRoYXQgcmVsaWVkIG9uIHRoZW0gaXMgc2ltcGx5IGNsZWFyZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZVxuICAgIC8vIGZpcnN0IG5ldyBzdGF0ZSB0aGF0IHVzZXMgaW5saW5lcyBpcyBlbmNvdW50ZXJlZC5cbiAgICBpZiAoZGF0YS5oYXNJbmxpbmVzICYmICF0aGlzLnNlZW5JbmxpbmVzKSB7XG4gICAgICB0aGlzLmltcGwuY2xlYXJBbGxTaGltRGF0YVVzaW5nSW5saW5lcygpO1xuICAgICAgdGhpcy5zZWVuSW5saW5lcyA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5maWxlRGF0YS5zaGltRGF0YS5zZXQoZGF0YS5wYXRoLCBkYXRhKTtcbiAgICBpZiAoZGF0YS5oYXNJbmxpbmVzKSB7XG4gICAgICB0aGlzLmZpbGVEYXRhLmhhc0lubGluZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZENvbXBsZXRlKHNmUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydFBhdGgoc2ZQYXRoKTtcbiAgICB0aGlzLmZpbGVEYXRhLmlzQ29tcGxldGUgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRHJpdmVzIGEgYFR5cGVDaGVja0NvbnRleHRgIHRvIGdlbmVyYXRlIHR5cGUtY2hlY2tpbmcgY29kZSBlZmZpY2llbnRseSBmb3Igb25seSB0aG9zZSBjb21wb25lbnRzXG4gKiB3aGljaCBtYXAgdG8gYSBzaW5nbGUgc2hpbSBvZiBhIHNpbmdsZSBpbnB1dCBmaWxlLlxuICovXG5jbGFzcyBTaW5nbGVTaGltVHlwZUNoZWNraW5nSG9zdCBleHRlbmRzIFNpbmdsZUZpbGVUeXBlQ2hlY2tpbmdIb3N0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBzZlBhdGg6IEFic29sdXRlRnNQYXRoLCBmaWxlRGF0YTogRmlsZVR5cGVDaGVja2luZ0RhdGEsIGltcGw6IFRlbXBsYXRlVHlwZUNoZWNrZXJJbXBsLFxuICAgICAgcHJpdmF0ZSBzaGltUGF0aDogQWJzb2x1dGVGc1BhdGgpIHtcbiAgICBzdXBlcihzZlBhdGgsIGZpbGVEYXRhLCBpbXBsKTtcbiAgfVxuXG4gIHNob3VsZENoZWNrTm9kZShub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2ZQYXRoICE9PSBhYnNvbHV0ZUZyb21Tb3VyY2VGaWxlKG5vZGUuZ2V0U291cmNlRmlsZSgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZ2VuZXJhdGUgYSBUQ0IgZm9yIHRoZSBjb21wb25lbnQgaWYgaXQgbWFwcyB0byB0aGUgcmVxdWVzdGVkIHNoaW0gZmlsZS5cbiAgICBjb25zdCBzaGltUGF0aCA9IFR5cGVDaGVja1NoaW1HZW5lcmF0b3Iuc2hpbUZvcih0aGlzLnNmUGF0aCk7XG4gICAgaWYgKHNoaW1QYXRoICE9PSB0aGlzLnNoaW1QYXRoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT25seSBuZWVkIHRvIGdlbmVyYXRlIGEgVENCIGZvciB0aGUgY2xhc3MgaWYgbm8gc2hpbSBleGlzdHMgZm9yIGl0IGN1cnJlbnRseS5cbiAgICByZXR1cm4gIXRoaXMuZmlsZURhdGEuc2hpbURhdGEuaGFzKHNoaW1QYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlZCBzY29wZSBpbmZvcm1hdGlvbiBmb3IgYSBjb21wb25lbnQuXG4gKi9cbmludGVyZmFjZSBTY29wZURhdGEge1xuICBkaXJlY3RpdmVzOiBEaXJlY3RpdmVJblNjb3BlW107XG4gIHBpcGVzOiBQaXBlSW5TY29wZVtdO1xuICBpc1BvaXNvbmVkOiBib29sZWFuO1xufVxuIl19