@angular/compiler 19.0.0-next.0 → 19.0.0-next.10

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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/fesm2022/compiler.mjs +5465 -4675
  4. package/fesm2022/compiler.mjs.map +1 -1
  5. package/index.d.ts +115 -15
  6. package/package.json +2 -4
  7. package/esm2022/compiler.mjs +0 -13
  8. package/esm2022/index.mjs +0 -13
  9. package/esm2022/public_api.mjs +0 -15
  10. package/esm2022/src/assertions.mjs +0 -31
  11. package/esm2022/src/chars.mjs +0 -90
  12. package/esm2022/src/compiler.mjs +0 -88
  13. package/esm2022/src/compiler_facade_interface.mjs +0 -29
  14. package/esm2022/src/config.mjs +0 -20
  15. package/esm2022/src/constant_pool.mjs +0 -285
  16. package/esm2022/src/core.mjs +0 -96
  17. package/esm2022/src/expression_parser/ast.mjs +0 -755
  18. package/esm2022/src/expression_parser/lexer.mjs +0 -421
  19. package/esm2022/src/expression_parser/parser.mjs +0 -1222
  20. package/esm2022/src/i18n/digest.mjs +0 -322
  21. package/esm2022/src/i18n/extractor_merger.mjs +0 -409
  22. package/esm2022/src/i18n/i18n_ast.mjs +0 -212
  23. package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
  24. package/esm2022/src/i18n/i18n_parser.mjs +0 -247
  25. package/esm2022/src/i18n/index.mjs +0 -16
  26. package/esm2022/src/i18n/message_bundle.mjs +0 -93
  27. package/esm2022/src/i18n/parse_util.mjs +0 -17
  28. package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
  29. package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
  30. package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
  31. package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
  32. package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
  33. package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
  34. package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
  35. package/esm2022/src/i18n/translation_bundle.mjs +0 -164
  36. package/esm2022/src/injectable_compiler_2.mjs +0 -138
  37. package/esm2022/src/jit_compiler_facade.mjs +0 -681
  38. package/esm2022/src/ml_parser/ast.mjs +0 -167
  39. package/esm2022/src/ml_parser/defaults.mjs +0 -24
  40. package/esm2022/src/ml_parser/entities.mjs +0 -2144
  41. package/esm2022/src/ml_parser/html_parser.mjs +0 -18
  42. package/esm2022/src/ml_parser/html_tags.mjs +0 -156
  43. package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
  44. package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
  45. package/esm2022/src/ml_parser/lexer.mjs +0 -1210
  46. package/esm2022/src/ml_parser/parser.mjs +0 -539
  47. package/esm2022/src/ml_parser/tags.mjs +0 -47
  48. package/esm2022/src/ml_parser/tokens.mjs +0 -9
  49. package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
  50. package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
  51. package/esm2022/src/output/abstract_emitter.mjs +0 -524
  52. package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
  53. package/esm2022/src/output/map_util.mjs +0 -19
  54. package/esm2022/src/output/output_ast.mjs +0 -1301
  55. package/esm2022/src/output/output_jit.mjs +0 -138
  56. package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
  57. package/esm2022/src/output/source_map.mjs +0 -150
  58. package/esm2022/src/parse_util.mjs +0 -198
  59. package/esm2022/src/render3/partial/api.mjs +0 -9
  60. package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
  61. package/esm2022/src/render3/partial/component.mjs +0 -197
  62. package/esm2022/src/render3/partial/directive.mjs +0 -264
  63. package/esm2022/src/render3/partial/factory.mjs +0 -35
  64. package/esm2022/src/render3/partial/injectable.mjs +0 -67
  65. package/esm2022/src/render3/partial/injector.mjs +0 -41
  66. package/esm2022/src/render3/partial/ng_module.mjs +0 -63
  67. package/esm2022/src/render3/partial/pipe.mjs +0 -50
  68. package/esm2022/src/render3/partial/util.mjs +0 -79
  69. package/esm2022/src/render3/r3_ast.mjs +0 -493
  70. package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
  71. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
  72. package/esm2022/src/render3/r3_control_flow.mjs +0 -421
  73. package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
  74. package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
  75. package/esm2022/src/render3/r3_factory.mjs +0 -200
  76. package/esm2022/src/render3/r3_identifiers.mjs +0 -480
  77. package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
  78. package/esm2022/src/render3/r3_jit.mjs +0 -29
  79. package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
  80. package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
  81. package/esm2022/src/render3/r3_template_transform.mjs +0 -560
  82. package/esm2022/src/render3/util.mjs +0 -90
  83. package/esm2022/src/render3/view/api.mjs +0 -14
  84. package/esm2022/src/render3/view/compiler.mjs +0 -546
  85. package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
  86. package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
  87. package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
  88. package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
  89. package/esm2022/src/render3/view/i18n/util.mjs +0 -70
  90. package/esm2022/src/render3/view/query_generation.mjs +0 -182
  91. package/esm2022/src/render3/view/t2_api.mjs +0 -9
  92. package/esm2022/src/render3/view/t2_binder.mjs +0 -823
  93. package/esm2022/src/render3/view/template.mjs +0 -113
  94. package/esm2022/src/render3/view/util.mjs +0 -192
  95. package/esm2022/src/resource_loader.mjs +0 -17
  96. package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
  97. package/esm2022/src/schema/dom_security_schema.mjs +0 -96
  98. package/esm2022/src/schema/element_schema_registry.mjs +0 -10
  99. package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
  100. package/esm2022/src/selector.mjs +0 -400
  101. package/esm2022/src/shadow_css.mjs +0 -1053
  102. package/esm2022/src/style_url_resolver.mjs +0 -17
  103. package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
  104. package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
  105. package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
  106. package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
  107. package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
  108. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
  109. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
  110. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
  111. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
  112. package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
  113. package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
  114. package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
  115. package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
  116. package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
  117. package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
  118. package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
  119. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
  120. package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
  121. package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
  122. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
  123. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
  124. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
  125. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
  126. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
  127. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
  128. package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
  129. package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
  130. package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
  131. package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
  132. package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
  133. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
  134. package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
  135. package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
  136. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
  137. package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
  138. package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
  139. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
  140. package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
  141. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
  142. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
  143. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
  144. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
  145. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
  146. package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
  147. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
  148. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
  149. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
  150. package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
  151. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
  152. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
  153. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
  154. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
  155. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
  156. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
  157. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
  158. package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
  159. package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
  160. package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
  161. package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
  162. package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
  163. package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
  164. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
  165. package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
  166. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
  167. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
  168. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
  169. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
  170. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
  171. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
  172. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
  173. package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
  174. package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
  175. package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
  176. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
  177. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
  178. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
  179. package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
  180. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
  181. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
  182. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
  183. package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
  184. package/esm2022/src/template_parser/binding_parser.mjs +0 -465
  185. package/esm2022/src/template_parser/template_preparser.mjs +0 -84
  186. package/esm2022/src/util.mjs +0 -124
  187. package/esm2022/src/version.mjs +0 -15
@@ -1,28 +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
- import * as o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * `ir.ConstCollectedExpr` may be present in any IR expression. This means that expression needs to
12
- * be lifted into the component const array, and replaced with a reference to the const array at its
13
- *
14
- * usage site. This phase walks the IR and performs this transformation.
15
- */
16
- export function collectConstExpressions(job) {
17
- for (const unit of job.units) {
18
- for (const op of unit.ops()) {
19
- ir.transformExpressionsInOp(op, (expr) => {
20
- if (!(expr instanceof ir.ConstCollectedExpr)) {
21
- return expr;
22
- }
23
- return o.literal(job.addConst(expr.expr));
24
- }, ir.VisitorContextFlag.None);
25
- }
26
- }
27
- }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzX2NvbnN0X2V4cHJlc3Npb25fY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL2hhc19jb25zdF9leHByZXNzaW9uX2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUE0QjtJQUNsRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVCLEVBQUUsQ0FBQyx3QkFBd0IsQ0FDekIsRUFBRSxFQUNGLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxFQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQgdHlwZSB7Q29tcG9uZW50Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBgaXIuQ29uc3RDb2xsZWN0ZWRFeHByYCBtYXkgYmUgcHJlc2VudCBpbiBhbnkgSVIgZXhwcmVzc2lvbi4gVGhpcyBtZWFucyB0aGF0IGV4cHJlc3Npb24gbmVlZHMgdG9cbiAqIGJlIGxpZnRlZCBpbnRvIHRoZSBjb21wb25lbnQgY29uc3QgYXJyYXksIGFuZCByZXBsYWNlZCB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBjb25zdCBhcnJheSBhdCBpdHNcbiAqXG4gKiB1c2FnZSBzaXRlLiBUaGlzIHBoYXNlIHdhbGtzIHRoZSBJUiBhbmQgcGVyZm9ybXMgdGhpcyB0cmFuc2Zvcm1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RDb25zdEV4cHJlc3Npb25zKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5vcHMoKSkge1xuICAgICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgICBvcCxcbiAgICAgICAgKGV4cHIpID0+IHtcbiAgICAgICAgICBpZiAoIShleHByIGluc3RhbmNlb2YgaXIuQ29uc3RDb2xsZWN0ZWRFeHByKSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvLmxpdGVyYWwoam9iLmFkZENvbnN0KGV4cHIuZXhwcikpO1xuICAgICAgICB9LFxuICAgICAgICBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,81 +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
- import * as ir from '../../ir';
9
- const STYLE_DOT = 'style.';
10
- const CLASS_DOT = 'class.';
11
- const STYLE_BANG = 'style!';
12
- const CLASS_BANG = 'class!';
13
- const BANG_IMPORTANT = '!important';
14
- /**
15
- * Host bindings are compiled using a different parser entrypoint, and are parsed quite differently
16
- * as a result. Therefore, we need to do some extra parsing for host style properties, as compared
17
- * to non-host style properties.
18
- * TODO: Unify host bindings and non-host bindings in the parser.
19
- */
20
- export function parseHostStyleProperties(job) {
21
- for (const op of job.root.update) {
22
- if (!(op.kind === ir.OpKind.Binding && op.bindingKind === ir.BindingKind.Property)) {
23
- continue;
24
- }
25
- if (op.name.endsWith(BANG_IMPORTANT)) {
26
- // Delete any `!important` suffixes from the binding name.
27
- op.name = op.name.substring(0, op.name.length - BANG_IMPORTANT.length);
28
- }
29
- if (op.name.startsWith(STYLE_DOT)) {
30
- op.bindingKind = ir.BindingKind.StyleProperty;
31
- op.name = op.name.substring(STYLE_DOT.length);
32
- if (!isCssCustomProperty(op.name)) {
33
- op.name = hyphenate(op.name);
34
- }
35
- const { property, suffix } = parseProperty(op.name);
36
- op.name = property;
37
- op.unit = suffix;
38
- }
39
- else if (op.name.startsWith(STYLE_BANG)) {
40
- op.bindingKind = ir.BindingKind.StyleProperty;
41
- op.name = 'style';
42
- }
43
- else if (op.name.startsWith(CLASS_DOT)) {
44
- op.bindingKind = ir.BindingKind.ClassName;
45
- op.name = parseProperty(op.name.substring(CLASS_DOT.length)).property;
46
- }
47
- else if (op.name.startsWith(CLASS_BANG)) {
48
- op.bindingKind = ir.BindingKind.ClassName;
49
- op.name = parseProperty(op.name.substring(CLASS_BANG.length)).property;
50
- }
51
- }
52
- }
53
- /**
54
- * Checks whether property name is a custom CSS property.
55
- * See: https://www.w3.org/TR/css-variables-1
56
- */
57
- function isCssCustomProperty(name) {
58
- return name.startsWith('--');
59
- }
60
- function hyphenate(value) {
61
- return value
62
- .replace(/[a-z][A-Z]/g, (v) => {
63
- return v.charAt(0) + '-' + v.charAt(1);
64
- })
65
- .toLowerCase();
66
- }
67
- function parseProperty(name) {
68
- const overrideIndex = name.indexOf('!important');
69
- if (overrideIndex !== -1) {
70
- name = overrideIndex > 0 ? name.substring(0, overrideIndex) : '';
71
- }
72
- let suffix = null;
73
- let property = name;
74
- const unitIndex = name.lastIndexOf('.');
75
- if (unitIndex > 0) {
76
- suffix = name.slice(unitIndex + 1);
77
- property = name.substring(0, unitIndex);
78
- }
79
- return { property, suffix };
80
- }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdF9zdHlsZV9wcm9wZXJ0eV9wYXJzaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvaG9zdF9zdHlsZV9wcm9wZXJ0eV9wYXJzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSS9CLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUMzQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFFM0IsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBQzVCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQUM1QixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFFcEM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsR0FBbUI7SUFDMUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbkYsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDckMsMERBQTBEO1lBQzFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsSUFBSSxF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LENBQUM7SUFDeEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcblxuaW1wb3J0IHR5cGUge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbmNvbnN0IFNUWUxFX0RPVCA9ICdzdHlsZS4nO1xuY29uc3QgQ0xBU1NfRE9UID0gJ2NsYXNzLic7XG5cbmNvbnN0IFNUWUxFX0JBTkcgPSAnc3R5bGUhJztcbmNvbnN0IENMQVNTX0JBTkcgPSAnY2xhc3MhJztcbmNvbnN0IEJBTkdfSU1QT1JUQU5UID0gJyFpbXBvcnRhbnQnO1xuXG4vKipcbiAqIEhvc3QgYmluZGluZ3MgYXJlIGNvbXBpbGVkIHVzaW5nIGEgZGlmZmVyZW50IHBhcnNlciBlbnRyeXBvaW50LCBhbmQgYXJlIHBhcnNlZCBxdWl0ZSBkaWZmZXJlbnRseVxuICogYXMgYSByZXN1bHQuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBkbyBzb21lIGV4dHJhIHBhcnNpbmcgZm9yIGhvc3Qgc3R5bGUgcHJvcGVydGllcywgYXMgY29tcGFyZWRcbiAqIHRvIG5vbi1ob3N0IHN0eWxlIHByb3BlcnRpZXMuXG4gKiBUT0RPOiBVbmlmeSBob3N0IGJpbmRpbmdzIGFuZCBub24taG9zdCBiaW5kaW5ncyBpbiB0aGUgcGFyc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIb3N0U3R5bGVQcm9wZXJ0aWVzKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBvcCBvZiBqb2Iucm9vdC51cGRhdGUpIHtcbiAgICBpZiAoIShvcC5raW5kID09PSBpci5PcEtpbmQuQmluZGluZyAmJiBvcC5iaW5kaW5nS2luZCA9PT0gaXIuQmluZGluZ0tpbmQuUHJvcGVydHkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3AubmFtZS5lbmRzV2l0aChCQU5HX0lNUE9SVEFOVCkpIHtcbiAgICAgIC8vIERlbGV0ZSBhbnkgYCFpbXBvcnRhbnRgIHN1ZmZpeGVzIGZyb20gdGhlIGJpbmRpbmcgbmFtZS5cbiAgICAgIG9wLm5hbWUgPSBvcC5uYW1lLnN1YnN0cmluZygwLCBvcC5uYW1lLmxlbmd0aCAtIEJBTkdfSU1QT1JUQU5ULmxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKG9wLm5hbWUuc3RhcnRzV2l0aChTVFlMRV9ET1QpKSB7XG4gICAgICBvcC5iaW5kaW5nS2luZCA9IGlyLkJpbmRpbmdLaW5kLlN0eWxlUHJvcGVydHk7XG4gICAgICBvcC5uYW1lID0gb3AubmFtZS5zdWJzdHJpbmcoU1RZTEVfRE9ULmxlbmd0aCk7XG5cbiAgICAgIGlmICghaXNDc3NDdXN0b21Qcm9wZXJ0eShvcC5uYW1lKSkge1xuICAgICAgICBvcC5uYW1lID0gaHlwaGVuYXRlKG9wLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7cHJvcGVydHksIHN1ZmZpeH0gPSBwYXJzZVByb3BlcnR5KG9wLm5hbWUpO1xuICAgICAgb3AubmFtZSA9IHByb3BlcnR5O1xuICAgICAgb3AudW5pdCA9IHN1ZmZpeDtcbiAgICB9IGVsc2UgaWYgKG9wLm5hbWUuc3RhcnRzV2l0aChTVFlMRV9CQU5HKSkge1xuICAgICAgb3AuYmluZGluZ0tpbmQgPSBpci5CaW5kaW5nS2luZC5TdHlsZVByb3BlcnR5O1xuICAgICAgb3AubmFtZSA9ICdzdHlsZSc7XG4gICAgfSBlbHNlIGlmIChvcC5uYW1lLnN0YXJ0c1dpdGgoQ0xBU1NfRE9UKSkge1xuICAgICAgb3AuYmluZGluZ0tpbmQgPSBpci5CaW5kaW5nS2luZC5DbGFzc05hbWU7XG4gICAgICBvcC5uYW1lID0gcGFyc2VQcm9wZXJ0eShvcC5uYW1lLnN1YnN0cmluZyhDTEFTU19ET1QubGVuZ3RoKSkucHJvcGVydHk7XG4gICAgfSBlbHNlIGlmIChvcC5uYW1lLnN0YXJ0c1dpdGgoQ0xBU1NfQkFORykpIHtcbiAgICAgIG9wLmJpbmRpbmdLaW5kID0gaXIuQmluZGluZ0tpbmQuQ2xhc3NOYW1lO1xuICAgICAgb3AubmFtZSA9IHBhcnNlUHJvcGVydHkob3AubmFtZS5zdWJzdHJpbmcoQ0xBU1NfQkFORy5sZW5ndGgpKS5wcm9wZXJ0eTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBwcm9wZXJ0eSBuYW1lIGlzIGEgY3VzdG9tIENTUyBwcm9wZXJ0eS5cbiAqIFNlZTogaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy12YXJpYWJsZXMtMVxuICovXG5mdW5jdGlvbiBpc0Nzc0N1c3RvbVByb3BlcnR5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCctLScpO1xufVxuXG5mdW5jdGlvbiBoeXBoZW5hdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC9bYS16XVtBLVpdL2csICh2KSA9PiB7XG4gICAgICByZXR1cm4gdi5jaGFyQXQoMCkgKyAnLScgKyB2LmNoYXJBdCgxKTtcbiAgICB9KVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVByb3BlcnR5KG5hbWU6IHN0cmluZyk6IHtwcm9wZXJ0eTogc3RyaW5nOyBzdWZmaXg6IHN0cmluZyB8IG51bGx9IHtcbiAgY29uc3Qgb3ZlcnJpZGVJbmRleCA9IG5hbWUuaW5kZXhPZignIWltcG9ydGFudCcpO1xuICBpZiAob3ZlcnJpZGVJbmRleCAhPT0gLTEpIHtcbiAgICBuYW1lID0gb3ZlcnJpZGVJbmRleCA+IDAgPyBuYW1lLnN1YnN0cmluZygwLCBvdmVycmlkZUluZGV4KSA6ICcnO1xuICB9XG5cbiAgbGV0IHN1ZmZpeDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBwcm9wZXJ0eSA9IG5hbWU7XG4gIGNvbnN0IHVuaXRJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKHVuaXRJbmRleCA+IDApIHtcbiAgICBzdWZmaXggPSBuYW1lLnNsaWNlKHVuaXRJbmRleCArIDEpO1xuICAgIHByb3BlcnR5ID0gbmFtZS5zdWJzdHJpbmcoMCwgdW5pdEluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB7cHJvcGVydHksIHN1ZmZpeH07XG59XG4iXX0=
@@ -1,309 +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
- import { mapLiteral } from '../../../../output/map_util';
9
- import * as o from '../../../../output/output_ast';
10
- import { sanitizeIdentifier } from '../../../../parse_util';
11
- import { Identifiers } from '../../../../render3/r3_identifiers';
12
- import { createGoogleGetMsgStatements } from '../../../../render3/view/i18n/get_msg_utils';
13
- import { createLocalizeStatements } from '../../../../render3/view/i18n/localize_utils';
14
- import { formatI18nPlaceholderNamesInMap } from '../../../../render3/view/i18n/util';
15
- import * as ir from '../../ir';
16
- /** Name of the global variable that is used to determine if we use Closure translations or not */
17
- const NG_I18N_CLOSURE_MODE = 'ngI18nClosureMode';
18
- /**
19
- * Prefix for non-`goog.getMsg` i18n-related vars.
20
- * Note: the prefix uses lowercase characters intentionally due to a Closure behavior that
21
- * considers variables like `I18N_0` as constants and throws an error when their value changes.
22
- */
23
- const TRANSLATION_VAR_PREFIX = 'i18n_';
24
- /** Prefix of ICU expressions for post processing */
25
- export const I18N_ICU_MAPPING_PREFIX = 'I18N_EXP_';
26
- /**
27
- * The escape sequence used for message param values.
28
- */
29
- const ESCAPE = '\uFFFD';
30
- /* Closure variables holding messages must be named `MSG_[A-Z0-9]+` */
31
- const CLOSURE_TRANSLATION_VAR_PREFIX = 'MSG_';
32
- /**
33
- * Generates a prefix for translation const name.
34
- *
35
- * @param extra Additional local prefix that should be injected into translation var name
36
- * @returns Complete translation const prefix
37
- */
38
- export function getTranslationConstPrefix(extra) {
39
- return `${CLOSURE_TRANSLATION_VAR_PREFIX}${extra}`.toUpperCase();
40
- }
41
- /**
42
- * Generate AST to declare a variable. E.g. `var I18N_1;`.
43
- * @param variable the name of the variable to declare.
44
- */
45
- export function declareI18nVariable(variable) {
46
- return new o.DeclareVarStmt(variable.name, undefined, o.INFERRED_TYPE, undefined, variable.sourceSpan);
47
- }
48
- /**
49
- * Lifts i18n properties into the consts array.
50
- * TODO: Can we use `ConstCollectedExpr`?
51
- * TODO: The way the various attributes are linked together is very complex. Perhaps we could
52
- * simplify the process, maybe by combining the context and message ops?
53
- */
54
- export function collectI18nConsts(job) {
55
- const fileBasedI18nSuffix = job.relativeContextFilePath.replace(/[^A-Za-z0-9]/g, '_').toUpperCase() + '_';
56
- // Step One: Build up various lookup maps we need to collect all the consts.
57
- // Context Xref -> Extracted Attribute Ops
58
- const extractedAttributesByI18nContext = new Map();
59
- // Element/ElementStart Xref -> I18n Attributes config op
60
- const i18nAttributesByElement = new Map();
61
- // Element/ElementStart Xref -> All I18n Expression ops for attrs on that target
62
- const i18nExpressionsByElement = new Map();
63
- // I18n Message Xref -> I18n Message Op (TODO: use a central op map)
64
- const messages = new Map();
65
- for (const unit of job.units) {
66
- for (const op of unit.ops()) {
67
- if (op.kind === ir.OpKind.ExtractedAttribute && op.i18nContext !== null) {
68
- const attributes = extractedAttributesByI18nContext.get(op.i18nContext) ?? [];
69
- attributes.push(op);
70
- extractedAttributesByI18nContext.set(op.i18nContext, attributes);
71
- }
72
- else if (op.kind === ir.OpKind.I18nAttributes) {
73
- i18nAttributesByElement.set(op.target, op);
74
- }
75
- else if (op.kind === ir.OpKind.I18nExpression &&
76
- op.usage === ir.I18nExpressionFor.I18nAttribute) {
77
- const expressions = i18nExpressionsByElement.get(op.target) ?? [];
78
- expressions.push(op);
79
- i18nExpressionsByElement.set(op.target, expressions);
80
- }
81
- else if (op.kind === ir.OpKind.I18nMessage) {
82
- messages.set(op.xref, op);
83
- }
84
- }
85
- }
86
- // Step Two: Serialize the extracted i18n messages for root i18n blocks and i18n attributes into
87
- // the const array.
88
- //
89
- // Also, each i18n message will have a variable expression that can refer to its
90
- // value. Store these expressions in the appropriate place:
91
- // 1. For normal i18n content, it also goes in the const array. We save the const index to use
92
- // later.
93
- // 2. For extracted attributes, it becomes the value of the extracted attribute instruction.
94
- // 3. For i18n bindings, it will go in a separate const array instruction below; for now, we just
95
- // save it.
96
- const i18nValuesByContext = new Map();
97
- const messageConstIndices = new Map();
98
- for (const unit of job.units) {
99
- for (const op of unit.create) {
100
- if (op.kind === ir.OpKind.I18nMessage) {
101
- if (op.messagePlaceholder === null) {
102
- const { mainVar, statements } = collectMessage(job, fileBasedI18nSuffix, messages, op);
103
- if (op.i18nBlock !== null) {
104
- // This is a regular i18n message with a corresponding i18n block. Collect it into the
105
- // const array.
106
- const i18nConst = job.addConst(mainVar, statements);
107
- messageConstIndices.set(op.i18nBlock, i18nConst);
108
- }
109
- else {
110
- // This is an i18n attribute. Extract the initializers into the const pool.
111
- job.constsInitializers.push(...statements);
112
- // Save the i18n variable value for later.
113
- i18nValuesByContext.set(op.i18nContext, mainVar);
114
- // This i18n message may correspond to an individual extracted attribute. If so, The
115
- // value of that attribute is updated to read the extracted i18n variable.
116
- const attributesForMessage = extractedAttributesByI18nContext.get(op.i18nContext);
117
- if (attributesForMessage !== undefined) {
118
- for (const attr of attributesForMessage) {
119
- attr.expression = mainVar.clone();
120
- }
121
- }
122
- }
123
- }
124
- ir.OpList.remove(op);
125
- }
126
- }
127
- }
128
- // Step Three: Serialize I18nAttributes configurations into the const array. Each I18nAttributes
129
- // instruction has a config array, which contains k-v pairs describing each binding name, and the
130
- // i18n variable that provides the value.
131
- for (const unit of job.units) {
132
- for (const elem of unit.create) {
133
- if (ir.isElementOrContainerOp(elem)) {
134
- const i18nAttributes = i18nAttributesByElement.get(elem.xref);
135
- if (i18nAttributes === undefined) {
136
- // This element is not associated with an i18n attributes configuration instruction.
137
- continue;
138
- }
139
- let i18nExpressions = i18nExpressionsByElement.get(elem.xref);
140
- if (i18nExpressions === undefined) {
141
- // Unused i18nAttributes should have already been removed.
142
- // TODO: Should the removal of those dead instructions be merged with this phase?
143
- throw new Error('AssertionError: Could not find any i18n expressions associated with an I18nAttributes instruction');
144
- }
145
- // Find expressions for all the unique property names, removing duplicates.
146
- const seenPropertyNames = new Set();
147
- i18nExpressions = i18nExpressions.filter((i18nExpr) => {
148
- const seen = seenPropertyNames.has(i18nExpr.name);
149
- seenPropertyNames.add(i18nExpr.name);
150
- return !seen;
151
- });
152
- const i18nAttributeConfig = i18nExpressions.flatMap((i18nExpr) => {
153
- const i18nExprValue = i18nValuesByContext.get(i18nExpr.context);
154
- if (i18nExprValue === undefined) {
155
- throw new Error("AssertionError: Could not find i18n expression's value");
156
- }
157
- return [o.literal(i18nExpr.name), i18nExprValue];
158
- });
159
- i18nAttributes.i18nAttributesConfig = job.addConst(new o.LiteralArrayExpr(i18nAttributeConfig));
160
- }
161
- }
162
- }
163
- // Step Four: Propagate the extracted const index into i18n ops that messages were extracted from.
164
- for (const unit of job.units) {
165
- for (const op of unit.create) {
166
- if (op.kind === ir.OpKind.I18nStart) {
167
- const msgIndex = messageConstIndices.get(op.root);
168
- if (msgIndex === undefined) {
169
- throw new Error('AssertionError: Could not find corresponding i18n block index for an i18n message op; was an i18n message incorrectly assumed to correspond to an attribute?');
170
- }
171
- op.messageIndex = msgIndex;
172
- }
173
- }
174
- }
175
- }
176
- /**
177
- * Collects the given message into a set of statements that can be added to the const array.
178
- * This will recursively collect any sub-messages referenced from the parent message as well.
179
- */
180
- function collectMessage(job, fileBasedI18nSuffix, messages, messageOp) {
181
- // Recursively collect any sub-messages, record each sub-message's main variable under its
182
- // placeholder so that we can add them to the params for the parent message. It is possible
183
- // that multiple sub-messages will share the same placeholder, so we need to track an array of
184
- // variables for each placeholder.
185
- const statements = [];
186
- const subMessagePlaceholders = new Map();
187
- for (const subMessageId of messageOp.subMessages) {
188
- const subMessage = messages.get(subMessageId);
189
- const { mainVar: subMessageVar, statements: subMessageStatements } = collectMessage(job, fileBasedI18nSuffix, messages, subMessage);
190
- statements.push(...subMessageStatements);
191
- const subMessages = subMessagePlaceholders.get(subMessage.messagePlaceholder) ?? [];
192
- subMessages.push(subMessageVar);
193
- subMessagePlaceholders.set(subMessage.messagePlaceholder, subMessages);
194
- }
195
- addSubMessageParams(messageOp, subMessagePlaceholders);
196
- // Sort the params for consistency with TemaplateDefinitionBuilder output.
197
- messageOp.params = new Map([...messageOp.params.entries()].sort());
198
- const mainVar = o.variable(job.pool.uniqueName(TRANSLATION_VAR_PREFIX));
199
- // Closure Compiler requires const names to start with `MSG_` but disallows any other
200
- // const to start with `MSG_`. We define a variable starting with `MSG_` just for the
201
- // `goog.getMsg` call
202
- const closureVar = i18nGenerateClosureVar(job.pool, messageOp.message.id, fileBasedI18nSuffix, job.i18nUseExternalIds);
203
- let transformFn = undefined;
204
- // If nescessary, add a post-processing step and resolve any placeholder params that are
205
- // set in post-processing.
206
- if (messageOp.needsPostprocessing || messageOp.postprocessingParams.size > 0) {
207
- // Sort the post-processing params for consistency with TemaplateDefinitionBuilder output.
208
- const postprocessingParams = Object.fromEntries([...messageOp.postprocessingParams.entries()].sort());
209
- const formattedPostprocessingParams = formatI18nPlaceholderNamesInMap(postprocessingParams,
210
- /* useCamelCase */ false);
211
- const extraTransformFnParams = [];
212
- if (messageOp.postprocessingParams.size > 0) {
213
- extraTransformFnParams.push(mapLiteral(formattedPostprocessingParams, /* quoted */ true));
214
- }
215
- transformFn = (expr) => o.importExpr(Identifiers.i18nPostprocess).callFn([expr, ...extraTransformFnParams]);
216
- }
217
- // Add the message's statements
218
- statements.push(...getTranslationDeclStmts(messageOp.message, mainVar, closureVar, messageOp.params, transformFn));
219
- return { mainVar, statements };
220
- }
221
- /**
222
- * Adds the given subMessage placeholders to the given message op.
223
- *
224
- * If a placeholder only corresponds to a single sub-message variable, we just set that variable
225
- * as the param value. However, if the placeholder corresponds to multiple sub-message
226
- * variables, we need to add a special placeholder value that is handled by the post-processing
227
- * step. We then add the array of variables as a post-processing param.
228
- */
229
- function addSubMessageParams(messageOp, subMessagePlaceholders) {
230
- for (const [placeholder, subMessages] of subMessagePlaceholders) {
231
- if (subMessages.length === 1) {
232
- messageOp.params.set(placeholder, subMessages[0]);
233
- }
234
- else {
235
- messageOp.params.set(placeholder, o.literal(`${ESCAPE}${I18N_ICU_MAPPING_PREFIX}${placeholder}${ESCAPE}`));
236
- messageOp.postprocessingParams.set(placeholder, o.literalArr(subMessages));
237
- }
238
- }
239
- }
240
- /**
241
- * Generate statements that define a given translation message.
242
- *
243
- * ```
244
- * var I18N_1;
245
- * if (typeof ngI18nClosureMode !== undefined && ngI18nClosureMode) {
246
- * var MSG_EXTERNAL_XXX = goog.getMsg(
247
- * "Some message with {$interpolation}!",
248
- * { "interpolation": "\uFFFD0\uFFFD" }
249
- * );
250
- * I18N_1 = MSG_EXTERNAL_XXX;
251
- * }
252
- * else {
253
- * I18N_1 = $localize`Some message with ${'\uFFFD0\uFFFD'}!`;
254
- * }
255
- * ```
256
- *
257
- * @param message The original i18n AST message node
258
- * @param variable The variable that will be assigned the translation, e.g. `I18N_1`.
259
- * @param closureVar The variable for Closure `goog.getMsg` calls, e.g. `MSG_EXTERNAL_XXX`.
260
- * @param params Object mapping placeholder names to their values (e.g.
261
- * `{ "interpolation": "\uFFFD0\uFFFD" }`).
262
- * @param transformFn Optional transformation function that will be applied to the translation
263
- * (e.g.
264
- * post-processing).
265
- * @returns An array of statements that defined a given translation.
266
- */
267
- function getTranslationDeclStmts(message, variable, closureVar, params, transformFn) {
268
- const paramsObject = Object.fromEntries(params);
269
- const statements = [
270
- declareI18nVariable(variable),
271
- o.ifStmt(createClosureModeGuard(), createGoogleGetMsgStatements(variable, message, closureVar, paramsObject), createLocalizeStatements(variable, message, formatI18nPlaceholderNamesInMap(paramsObject, /* useCamelCase */ false))),
272
- ];
273
- if (transformFn) {
274
- statements.push(new o.ExpressionStatement(variable.set(transformFn(variable))));
275
- }
276
- return statements;
277
- }
278
- /**
279
- * Create the expression that will be used to guard the closure mode block
280
- * It is equivalent to:
281
- *
282
- * ```
283
- * typeof ngI18nClosureMode !== undefined && ngI18nClosureMode
284
- * ```
285
- */
286
- function createClosureModeGuard() {
287
- return o
288
- .typeofExpr(o.variable(NG_I18N_CLOSURE_MODE))
289
- .notIdentical(o.literal('undefined', o.STRING_TYPE))
290
- .and(o.variable(NG_I18N_CLOSURE_MODE));
291
- }
292
- /**
293
- * Generates vars with Closure-specific names for i18n blocks (i.e. `MSG_XXX`).
294
- */
295
- function i18nGenerateClosureVar(pool, messageId, fileBasedI18nSuffix, useExternalIds) {
296
- let name;
297
- const suffix = fileBasedI18nSuffix;
298
- if (useExternalIds) {
299
- const prefix = getTranslationConstPrefix(`EXTERNAL_`);
300
- const uniqueSuffix = pool.uniqueName(suffix);
301
- name = `${prefix}${sanitizeIdentifier(messageId)}$$${uniqueSuffix}`;
302
- }
303
- else {
304
- const prefix = getTranslationConstPrefix(suffix);
305
- name = pool.uniqueName(prefix);
306
- }
307
- return o.variable(name);
308
- }
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bl9jb25zdF9jb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvaTE4bl9jb25zdF9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUlILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixrR0FBa0c7QUFDbEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUM7QUFFdkMsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLFdBQVcsQ0FBQztBQUVuRDs7R0FFRztBQUNILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUV4QixzRUFBc0U7QUFDdEUsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUM7QUFFOUM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBYTtJQUNyRCxPQUFPLEdBQUcsOEJBQThCLEdBQUcsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLENB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LENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxHQUFHLEdBQUcsTUFBTSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDO0lBQ3RFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxNQUFNLEdBQUcseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7dHlwZSBDb25zdGFudFBvb2x9IGZyb20gJy4uLy4uLy4uLy4uL2NvbnN0YW50X3Bvb2wnO1xuaW1wb3J0ICogYXMgaTE4biBmcm9tICcuLi8uLi8uLi8uLi9pMThuL2kxOG5fYXN0JztcbmltcG9ydCB7bWFwTGl0ZXJhbH0gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L21hcF91dGlsJztcbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0IHtzYW5pdGl6ZUlkZW50aWZpZXJ9IGZyb20gJy4uLy4uLy4uLy4uL3BhcnNlX3V0aWwnO1xuaW1wb3J0IHtJZGVudGlmaWVyc30gZnJvbSAnLi4vLi4vLi4vLi4vcmVuZGVyMy9yM19pZGVudGlmaWVycyc7XG5pbXBvcnQge2NyZWF0ZUdvb2dsZUdldE1zZ1N0YXRlbWVudHN9IGZyb20gJy4uLy4uLy4uLy4uL3JlbmRlcjMvdmlldy9pMThuL2dldF9tc2dfdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVMb2NhbGl6ZVN0YXRlbWVudHN9IGZyb20gJy4uLy4uLy4uLy4uL3JlbmRlcjMvdmlldy9pMThuL2xvY2FsaXplX3V0aWxzJztcbmltcG9ydCB7Zm9ybWF0STE4blBsYWNlaG9sZGVyTmFtZXNJbk1hcH0gZnJvbSAnLi4vLi4vLi4vLi4vcmVuZGVyMy92aWV3L2kxOG4vdXRpbCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQge0NvbXBvbmVudENvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKiBOYW1lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSB1c2UgQ2xvc3VyZSB0cmFuc2xhdGlvbnMgb3Igbm90ICovXG5jb25zdCBOR19JMThOX0NMT1NVUkVfTU9ERSA9ICduZ0kxOG5DbG9zdXJlTW9kZSc7XG5cbi8qKlxuICogUHJlZml4IGZvciBub24tYGdvb2cuZ2V0TXNnYCBpMThuLXJlbGF0ZWQgdmFycy5cbiAqIE5vdGU6IHRoZSBwcmVmaXggdXNlcyBsb3dlcmNhc2UgY2hhcmFjdGVycyBpbnRlbnRpb25hbGx5IGR1ZSB0byBhIENsb3N1cmUgYmVoYXZpb3IgdGhhdFxuICogY29uc2lkZXJzIHZhcmlhYmxlcyBsaWtlIGBJMThOXzBgIGFzIGNvbnN0YW50cyBhbmQgdGhyb3dzIGFuIGVycm9yIHdoZW4gdGhlaXIgdmFsdWUgY2hhbmdlcy5cbiAqL1xuY29uc3QgVFJBTlNMQVRJT05fVkFSX1BSRUZJWCA9ICdpMThuXyc7XG5cbi8qKiBQcmVmaXggb2YgSUNVIGV4cHJlc3Npb25zIGZvciBwb3N0IHByb2Nlc3NpbmcgKi9cbmV4cG9ydCBjb25zdCBJMThOX0lDVV9NQVBQSU5HX1BSRUZJWCA9ICdJMThOX0VYUF8nO1xuXG4vKipcbiAqIFRoZSBlc2NhcGUgc2VxdWVuY2UgdXNlZCBmb3IgbWVzc2FnZSBwYXJhbSB2YWx1ZXMuXG4gKi9cbmNvbnN0IEVTQ0FQRSA9ICdcXHVGRkZEJztcblxuLyogQ2xvc3VyZSB2YXJpYWJsZXMgaG9sZGluZyBtZXNzYWdlcyBtdXN0IGJlIG5hbWVkIGBNU0dfW0EtWjAtOV0rYCAqL1xuY29uc3QgQ0xPU1VSRV9UUkFOU0xBVElPTl9WQVJfUFJFRklYID0gJ01TR18nO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHByZWZpeCBmb3IgdHJhbnNsYXRpb24gY29uc3QgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0cmEgQWRkaXRpb25hbCBsb2NhbCBwcmVmaXggdGhhdCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0cmFuc2xhdGlvbiB2YXIgbmFtZVxuICogQHJldHVybnMgQ29tcGxldGUgdHJhbnNsYXRpb24gY29uc3QgcHJlZml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbkNvbnN0UHJlZml4KGV4dHJhOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Q0xPU1VSRV9UUkFOU0xBVElPTl9WQVJfUFJFRklYfSR7ZXh0cmF9YC50b1VwcGVyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIEFTVCB0byBkZWNsYXJlIGEgdmFyaWFibGUuIEUuZy4gYHZhciBJMThOXzE7YC5cbiAqIEBwYXJhbSB2YXJpYWJsZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZGVjbGFyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmVJMThuVmFyaWFibGUodmFyaWFibGU6IG8uUmVhZFZhckV4cHIpOiBvLlN0YXRlbWVudCB7XG4gIHJldHVybiBuZXcgby5EZWNsYXJlVmFyU3RtdChcbiAgICB2YXJpYWJsZS5uYW1lISxcbiAgICB1bmRlZmluZWQsXG4gICAgby5JTkZFUlJFRF9UWVBFLFxuICAgIHVuZGVmaW5lZCxcbiAgICB2YXJpYWJsZS5zb3VyY2VTcGFuLFxuICApO1xufVxuXG4vKipcbiAqIExpZnRzIGkxOG4gcHJvcGVydGllcyBpbnRvIHRoZSBjb25zdHMgYXJyYXkuXG4gKiBUT0RPOiBDYW4gd2UgdXNlIGBDb25zdENvbGxlY3RlZEV4cHJgP1xuICogVE9ETzogVGhlIHdheSB0aGUgdmFyaW91cyBhdHRyaWJ1dGVzIGFyZSBsaW5rZWQgdG9nZXRoZXIgaXMgdmVyeSBjb21wbGV4LiBQZXJoYXBzIHdlIGNvdWxkXG4gKiBzaW1wbGlmeSB0aGUgcHJvY2VzcywgbWF5YmUgYnkgY29tYmluaW5nIHRoZSBjb250ZXh0IGFuZCBtZXNzYWdlIG9wcz9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RJMThuQ29uc3RzKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgY29uc3QgZmlsZUJhc2VkSTE4blN1ZmZpeCA9XG4gICAgam9iLnJlbGF0aXZlQ29udGV4dEZpbGVQYXRoLnJlcGxhY2UoL1teQS1aYS16MC05XS9nLCAnXycpLnRvVXBwZXJDYXNlKCkgKyAnXyc7XG4gIC8vIFN0ZXAgT25lOiBCdWlsZCB1cCB2YXJpb3VzIGxvb2t1cCBtYXBzIHdlIG5lZWQgdG8gY29sbGVjdCBhbGwgdGhlIGNvbnN0cy5cblxuICAvLyBDb250ZXh0IFhyZWYgLT4gRXh0cmFjdGVkIEF0dHJpYnV0ZSBPcHNcbiAgY29uc3QgZXh0cmFjdGVkQXR0cmlidXRlc0J5STE4bkNvbnRleHQgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuRXh0cmFjdGVkQXR0cmlidXRlT3BbXT4oKTtcbiAgLy8gRWxlbWVudC9FbGVtZW50U3RhcnQgWHJlZiAtPiBJMThuIEF0dHJpYnV0ZXMgY29uZmlnIG9wXG4gIGNvbnN0IGkxOG5BdHRyaWJ1dGVzQnlFbGVtZW50ID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLkkxOG5BdHRyaWJ1dGVzT3A+KCk7XG4gIC8vIEVsZW1lbnQvRWxlbWVudFN0YXJ0IFhyZWYgLT4gQWxsIEkxOG4gRXhwcmVzc2lvbiBvcHMgZm9yIGF0dHJzIG9uIHRoYXQgdGFyZ2V0XG4gIGNvbnN0IGkxOG5FeHByZXNzaW9uc0J5RWxlbWVudCA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5JMThuRXhwcmVzc2lvbk9wW10+KCk7XG4gIC8vIEkxOG4gTWVzc2FnZSBYcmVmIC0+IEkxOG4gTWVzc2FnZSBPcCAoVE9ETzogdXNlIGEgY2VudHJhbCBvcCBtYXApXG4gIGNvbnN0IG1lc3NhZ2VzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLkkxOG5NZXNzYWdlT3A+KCk7XG5cbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5vcHMoKSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5FeHRyYWN0ZWRBdHRyaWJ1dGUgJiYgb3AuaTE4bkNvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGV4dHJhY3RlZEF0dHJpYnV0ZXNCeUkxOG5Db250ZXh0LmdldChvcC5pMThuQ29udGV4dCkgPz8gW107XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChvcCk7XG4gICAgICAgIGV4dHJhY3RlZEF0dHJpYnV0ZXNCeUkxOG5Db250ZXh0LnNldChvcC5pMThuQ29udGV4dCwgYXR0cmlidXRlcyk7XG4gICAgICB9IGVsc2UgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5JMThuQXR0cmlidXRlcykge1xuICAgICAgICBpMThuQXR0cmlidXRlc0J5RWxlbWVudC5zZXQob3AudGFyZ2V0LCBvcCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBvcC5raW5kID09PSBpci5PcEtpbmQuSTE4bkV4cHJlc3Npb24gJiZcbiAgICAgICAgb3AudXNhZ2UgPT09IGlyLkkxOG5FeHByZXNzaW9uRm9yLkkxOG5BdHRyaWJ1dGVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IGkxOG5FeHByZXNzaW9uc0J5RWxlbWVudC5nZXQob3AudGFyZ2V0KSA/PyBbXTtcbiAgICAgICAgZXhwcmVzc2lvbnMucHVzaChvcCk7XG4gICAgICAgIGkxOG5FeHByZXNzaW9uc0J5RWxlbWVudC5zZXQob3AudGFyZ2V0LCBleHByZXNzaW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5JMThuTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlcy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgVHdvOiBTZXJpYWxpemUgdGhlIGV4dHJhY3RlZCBpMThuIG1lc3NhZ2VzIGZvciByb290IGkxOG4gYmxvY2tzIGFuZCBpMThuIGF0dHJpYnV0ZXMgaW50b1xuICAvLyB0aGUgY29uc3QgYXJyYXkuXG4gIC8vXG4gIC8vIEFsc28sIGVhY2ggaTE4biBtZXNzYWdlIHdpbGwgaGF2ZSBhIHZhcmlhYmxlIGV4cHJlc3Npb24gdGhhdCBjYW4gcmVmZXIgdG8gaXRzXG4gIC8vIHZhbHVlLiBTdG9yZSB0aGVzZSBleHByZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2U6XG4gIC8vIDEuIEZvciBub3JtYWwgaTE4biBjb250ZW50LCBpdCBhbHNvIGdvZXMgaW4gdGhlIGNvbnN0IGFycmF5LiBXZSBzYXZlIHRoZSBjb25zdCBpbmRleCB0byB1c2VcbiAgLy8gbGF0ZXIuXG4gIC8vIDIuIEZvciBleHRyYWN0ZWQgYXR0cmlidXRlcywgaXQgYmVjb21lcyB0aGUgdmFsdWUgb2YgdGhlIGV4dHJhY3RlZCBhdHRyaWJ1dGUgaW5zdHJ1Y3Rpb24uXG4gIC8vIDMuIEZvciBpMThuIGJpbmRpbmdzLCBpdCB3aWxsIGdvIGluIGEgc2VwYXJhdGUgY29uc3QgYXJyYXkgaW5zdHJ1Y3Rpb24gYmVsb3c7IGZvciBub3csIHdlIGp1c3RcbiAgLy8gc2F2ZSBpdC5cblxuICBjb25zdCBpMThuVmFsdWVzQnlDb250ZXh0ID0gbmV3IE1hcDxpci5YcmVmSWQsIG8uRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgbWVzc2FnZUNvbnN0SW5kaWNlcyA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5Db25zdEluZGV4PigpO1xuXG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLkkxOG5NZXNzYWdlKSB7XG4gICAgICAgIGlmIChvcC5tZXNzYWdlUGxhY2Vob2xkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB7bWFpblZhciwgc3RhdGVtZW50c30gPSBjb2xsZWN0TWVzc2FnZShqb2IsIGZpbGVCYXNlZEkxOG5TdWZmaXgsIG1lc3NhZ2VzLCBvcCk7XG4gICAgICAgICAgaWYgKG9wLmkxOG5CbG9jayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgaTE4biBtZXNzYWdlIHdpdGggYSBjb3JyZXNwb25kaW5nIGkxOG4gYmxvY2suIENvbGxlY3QgaXQgaW50byB0aGVcbiAgICAgICAgICAgIC8vIGNvbnN0IGFycmF5LlxuICAgICAgICAgICAgY29uc3QgaTE4bkNvbnN0ID0gam9iLmFkZENvbnN0KG1haW5WYXIsIHN0YXRlbWVudHMpO1xuICAgICAgICAgICAgbWVzc2FnZUNvbnN0SW5kaWNlcy5zZXQob3AuaTE4bkJsb2NrLCBpMThuQ29uc3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGkxOG4gYXR0cmlidXRlLiBFeHRyYWN0IHRoZSBpbml0aWFsaXplcnMgaW50byB0aGUgY29uc3QgcG9vbC5cbiAgICAgICAgICAgIGpvYi5jb25zdHNJbml0aWFsaXplcnMucHVzaCguLi5zdGF0ZW1lbnRzKTtcblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgaTE4biB2YXJpYWJsZSB2YWx1ZSBmb3IgbGF0ZXIuXG4gICAgICAgICAgICBpMThuVmFsdWVzQnlDb250ZXh0LnNldChvcC5pMThuQ29udGV4dCwgbWFpblZhcik7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgaTE4biBtZXNzYWdlIG1heSBjb3JyZXNwb25kIHRvIGFuIGluZGl2aWR1YWwgZXh0cmFjdGVkIGF0dHJpYnV0ZS4gSWYgc28sIFRoZVxuICAgICAgICAgICAgLy8gdmFsdWUgb2YgdGhhdCBhdHRyaWJ1dGUgaXMgdXBkYXRlZCB0byByZWFkIHRoZSBleHRyYWN0ZWQgaTE4biB2YXJpYWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNGb3JNZXNzYWdlID0gZXh0cmFjdGVkQXR0cmlidXRlc0J5STE4bkNvbnRleHQuZ2V0KG9wLmkxOG5Db250ZXh0KTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzRm9yTWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzRm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGF0dHIuZXhwcmVzc2lvbiA9IG1haW5WYXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpci5PcExpc3QucmVtb3ZlPGlyLkNyZWF0ZU9wPihvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCBUaHJlZTogU2VyaWFsaXplIEkxOG5BdHRyaWJ1dGVzIGNvbmZpZ3VyYXRpb25zIGludG8gdGhlIGNvbnN0IGFycmF5LiBFYWNoIEkxOG5BdHRyaWJ1dGVzXG4gIC8vIGluc3RydWN0aW9uIGhhcyBhIGNvbmZpZyBhcnJheSwgd2hpY2ggY29udGFpbnMgay12IHBhaXJzIGRlc2NyaWJpbmcgZWFjaCBiaW5kaW5nIG5hbWUsIGFuZCB0aGVcbiAgLy8gaTE4biB2YXJpYWJsZSB0aGF0IHByb3ZpZGVzIHRoZSB2YWx1ZS5cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAoaXIuaXNFbGVtZW50T3JDb250YWluZXJPcChlbGVtKSkge1xuICAgICAgICBjb25zdCBpMThuQXR0cmlidXRlcyA9IGkxOG5BdHRyaWJ1dGVzQnlFbGVtZW50LmdldChlbGVtLnhyZWYpO1xuICAgICAgICBpZiAoaTE4bkF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGkxOG4gYXR0cmlidXRlcyBjb25maWd1cmF0aW9uIGluc3RydWN0aW9uLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkxOG5FeHByZXNzaW9ucyA9IGkxOG5FeHByZXNzaW9uc0J5RWxlbWVudC5nZXQoZWxlbS54cmVmKTtcbiAgICAgICAgaWYgKGkxOG5FeHByZXNzaW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVW51c2VkIGkxOG5BdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLlxuICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGUgcmVtb3ZhbCBvZiB0aG9zZSBkZWFkIGluc3RydWN0aW9ucyBiZSBtZXJnZWQgd2l0aCB0aGlzIHBoYXNlP1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdBc3NlcnRpb25FcnJvcjogQ291bGQgbm90IGZpbmQgYW55IGkxOG4gZXhwcmVzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEkxOG5BdHRyaWJ1dGVzIGluc3RydWN0aW9uJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCBleHByZXNzaW9ucyBmb3IgYWxsIHRoZSB1bmlxdWUgcHJvcGVydHkgbmFtZXMsIHJlbW92aW5nIGR1cGxpY2F0ZXMuXG4gICAgICAgIGNvbnN0IHNlZW5Qcm9wZXJ0eU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGkxOG5FeHByZXNzaW9ucyA9IGkxOG5FeHByZXNzaW9ucy5maWx0ZXIoKGkxOG5FeHByKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VlbiA9IHNlZW5Qcm9wZXJ0eU5hbWVzLmhhcyhpMThuRXhwci5uYW1lKTtcbiAgICAgICAgICBzZWVuUHJvcGVydHlOYW1lcy5hZGQoaTE4bkV4cHIubmFtZSk7XG4gICAgICAgICAgcmV0dXJuICFzZWVuO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpMThuQXR0cmlidXRlQ29uZmlnID0gaTE4bkV4cHJlc3Npb25zLmZsYXRNYXAoKGkxOG5FeHByKSA9PiB7XG4gICAgICAgICAgY29uc3QgaTE4bkV4cHJWYWx1ZSA9IGkxOG5WYWx1ZXNCeUNvbnRleHQuZ2V0KGkxOG5FeHByLmNvbnRleHQpO1xuICAgICAgICAgIGlmIChpMThuRXhwclZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbkVycm9yOiBDb3VsZCBub3QgZmluZCBpMThuIGV4cHJlc3Npb24ncyB2YWx1ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtvLmxpdGVyYWwoaTE4bkV4cHIubmFtZSksIGkxOG5FeHByVmFsdWVdO1xuICAgICAgICB9KTtcblxuICAgICAgICBpMThuQXR0cmlidXRlcy5pMThuQXR0cmlidXRlc0NvbmZpZyA9IGpvYi5hZGRDb25zdChcbiAgICAgICAgICBuZXcgby5MaXRlcmFsQXJyYXlFeHByKGkxOG5BdHRyaWJ1dGVDb25maWcpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgRm91cjogUHJvcGFnYXRlIHRoZSBleHRyYWN0ZWQgY29uc3QgaW5kZXggaW50byBpMThuIG9wcyB0aGF0IG1lc3NhZ2VzIHdlcmUgZXh0cmFjdGVkIGZyb20uXG5cbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuSTE4blN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IG1zZ0luZGV4ID0gbWVzc2FnZUNvbnN0SW5kaWNlcy5nZXQob3Aucm9vdCk7XG4gICAgICAgIGlmIChtc2dJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0Fzc2VydGlvbkVycm9yOiBDb3VsZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGkxOG4gYmxvY2sgaW5kZXggZm9yIGFuIGkxOG4gbWVzc2FnZSBvcDsgd2FzIGFuIGkxOG4gbWVzc2FnZSBpbmNvcnJlY3RseSBhc3N1bWVkIHRvIGNvcnJlc3BvbmQgdG8gYW4gYXR0cmlidXRlPycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBvcC5tZXNzYWdlSW5kZXggPSBtc2dJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnRvIGEgc2V0IG9mIHN0YXRlbWVudHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbnN0IGFycmF5LlxuICogVGhpcyB3aWxsIHJlY3Vyc2l2ZWx5IGNvbGxlY3QgYW55IHN1Yi1tZXNzYWdlcyByZWZlcmVuY2VkIGZyb20gdGhlIHBhcmVudCBtZXNzYWdlIGFzIHdlbGwuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RNZXNzYWdlKFxuICBqb2I6IENvbXBvbmVudENvbXBpbGF0aW9uSm9iLFxuICBmaWxlQmFzZWRJMThuU3VmZml4OiBzdHJpbmcsXG4gIG1lc3NhZ2VzOiBNYXA8aXIuWHJlZklkLCBpci5JMThuTWVzc2FnZU9wPixcbiAgbWVzc2FnZU9wOiBpci5JMThuTWVzc2FnZU9wLFxuKToge21haW5WYXI6IG8uUmVhZFZhckV4cHI7IHN0YXRlbWVudHM6IG8uU3RhdGVtZW50W119IHtcbiAgLy8gUmVjdXJzaXZlbHkgY29sbGVjdCBhbnkgc3ViLW1lc3NhZ2VzLCByZWNvcmQgZWFjaCBzdWItbWVzc2FnZSdzIG1haW4gdmFyaWFibGUgdW5kZXIgaXRzXG4gIC8vIHBsYWNlaG9sZGVyIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGVtIHRvIHRoZSBwYXJhbXMgZm9yIHRoZSBwYXJlbnQgbWVzc2FnZS4gSXQgaXMgcG9zc2libGVcbiAgLy8gdGhhdCBtdWx0aXBsZSBzdWItbWVzc2FnZXMgd2lsbCBzaGFyZSB0aGUgc2FtZSBwbGFjZWhvbGRlciwgc28gd2UgbmVlZCB0byB0cmFjayBhbiBhcnJheSBvZlxuICAvLyB2YXJpYWJsZXMgZm9yIGVhY2ggcGxhY2Vob2xkZXIuXG4gIGNvbnN0IHN0YXRlbWVudHM6IG8uU3RhdGVtZW50W10gPSBbXTtcbiAgY29uc3Qgc3ViTWVzc2FnZVBsYWNlaG9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBvLkV4cHJlc3Npb25bXT4oKTtcbiAgZm9yIChjb25zdCBzdWJNZXNzYWdlSWQgb2YgbWVzc2FnZU9wLnN1Yk1lc3NhZ2VzKSB7XG4gICAgY29uc3Qgc3ViTWVzc2FnZSA9IG1lc3NhZ2VzLmdldChzdWJNZXNzYWdlSWQpITtcbiAgICBjb25zdCB7bWFpblZhcjogc3ViTWVzc2FnZVZhciwgc3RhdGVtZW50czogc3ViTWVzc2FnZVN0YXRlbWVudHN9ID0gY29sbGVjdE1lc3NhZ2UoXG4gICAgICBqb2IsXG4gICAgICBmaWxlQmFzZWRJMThuU3VmZml4LFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBzdWJNZXNzYWdlLFxuICAgICk7XG4gICAgc3RhdGVtZW50cy5wdXNoKC4uLnN1Yk1lc3NhZ2VTdGF0ZW1lbnRzKTtcbiAgICBjb25zdCBzdWJNZXNzYWdlcyA9IHN1Yk1lc3NhZ2VQbGFjZWhvbGRlcnMuZ2V0KHN1Yk1lc3NhZ2UubWVzc2FnZVBsYWNlaG9sZGVyISkgPz8gW107XG4gICAgc3ViTWVzc2FnZXMucHVzaChzdWJNZXNzYWdlVmFyKTtcbiAgICBzdWJNZXNzYWdlUGxhY2Vob2xkZXJzLnNldChzdWJNZXNzYWdlLm1lc3NhZ2VQbGFjZWhvbGRlciEsIHN1Yk1lc3NhZ2VzKTtcbiAgfVxuICBhZGRTdWJNZXNzYWdlUGFyYW1zKG1lc3NhZ2VPcCwgc3ViTWVzc2FnZVBsYWNlaG9sZGVycyk7XG5cbiAgLy8gU29ydCB0aGUgcGFyYW1zIGZvciBjb25zaXN0ZW5jeSB3aXRoIFRlbWFwbGF0ZURlZmluaXRpb25CdWlsZGVyIG91dHB1dC5cbiAgbWVzc2FnZU9wLnBhcmFtcyA9IG5ldyBNYXAoWy4uLm1lc3NhZ2VPcC5wYXJhbXMuZW50cmllcygpXS5zb3J0KCkpO1xuXG4gIGNvbnN0IG1haW5WYXIgPSBvLnZhcmlhYmxlKGpvYi5wb29sLnVuaXF1ZU5hbWUoVFJBTlNMQVRJT05fVkFSX1BSRUZJWCkpO1xuICAvLyBDbG9zdXJlIENvbXBpbGVyIHJlcXVpcmVzIGNvbnN0IG5hbWVzIHRvIHN0YXJ0IHdpdGggYE1TR19gIGJ1dCBkaXNhbGxvd3MgYW55IG90aGVyXG4gIC8vIGNvbnN0IHRvIHN0YXJ0IHdpdGggYE1TR19gLiBXZSBkZWZpbmUgYSB2YXJpYWJsZSBzdGFydGluZyB3aXRoIGBNU0dfYCBqdXN0IGZvciB0aGVcbiAgLy8gYGdvb2cuZ2V0TXNnYCBjYWxsXG4gIGNvbnN0IGNsb3N1cmVWYXIgPSBpMThuR2VuZXJhdGVDbG9zdXJlVmFyKFxuICAgIGpvYi5wb29sLFxuICAgIG1lc3NhZ2VPcC5tZXNzYWdlLmlkLFxuICAgIGZpbGVCYXNlZEkxOG5TdWZmaXgsXG4gICAgam9iLmkxOG5Vc2VFeHRlcm5hbElkcyxcbiAgKTtcbiAgbGV0IHRyYW5zZm9ybUZuID0gdW5kZWZpbmVkO1xuXG4gIC8vIElmIG5lc2Nlc3NhcnksIGFkZCBhIHBvc3QtcHJvY2Vzc2luZyBzdGVwIGFuZCByZXNvbHZlIGFueSBwbGFjZWhvbGRlciBwYXJhbXMgdGhhdCBhcmVcbiAgLy8gc2V0IGluIHBvc3QtcHJvY2Vzc2luZy5cbiAgaWYgKG1lc3NhZ2VPcC5uZWVkc1Bvc3Rwcm9jZXNzaW5nIHx8IG1lc3NhZ2VPcC5wb3N0cHJvY2Vzc2luZ1BhcmFtcy5zaXplID4gMCkge1xuICAgIC8vIFNvcnQgdGhlIHBvc3QtcHJvY2Vzc2luZyBwYXJhbXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggVGVtYXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgb3V0cHV0LlxuICAgIGNvbnN0IHBvc3Rwcm9jZXNzaW5nUGFyYW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgWy4uLm1lc3NhZ2VPcC5wb3N0cHJvY2Vzc2luZ1BhcmFtcy5lbnRyaWVzKCldLnNvcnQoKSxcbiAgICApO1xuICAgIGNvbnN0IGZvcm1hdHRlZFBvc3Rwcm9jZXNzaW5nUGFyYW1zID0gZm9ybWF0STE4blBsYWNlaG9sZGVyTmFtZXNJbk1hcChcbiAgICAgIHBvc3Rwcm9jZXNzaW5nUGFyYW1zLFxuICAgICAgLyogdXNlQ2FtZWxDYXNlICovIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZXh0cmFUcmFuc2Zvcm1GblBhcmFtczogby5FeHByZXNzaW9uW10gPSBbXTtcbiAgICBpZiAobWVzc2FnZU9wLnBvc3Rwcm9jZXNzaW5nUGFyYW1zLnNpemUgPiAwKSB7XG4gICAgICBleHRyYVRyYW5zZm9ybUZuUGFyYW1zLnB1c2gobWFwTGl0ZXJhbChmb3JtYXR0ZWRQb3N0cHJvY2Vzc2luZ1BhcmFtcywgLyogcXVvdGVkICovIHRydWUpKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRm4gPSAoZXhwcjogby5SZWFkVmFyRXhwcikgPT5cbiAgICAgIG8uaW1wb3J0RXhwcihJZGVudGlmaWVycy5pMThuUG9zdHByb2Nlc3MpLmNhbGxGbihbZXhwciwgLi4uZXh0cmFUcmFuc2Zvcm1GblBhcmFtc10pO1xuICB9XG5cbiAgLy8gQWRkIHRoZSBtZXNzYWdlJ3Mgc3RhdGVtZW50c1xuICBzdGF0ZW1lbnRzLnB1c2goXG4gICAgLi4uZ2V0VHJhbnNsYXRpb25EZWNsU3RtdHMoXG4gICAgICBtZXNzYWdlT3AubWVzc2FnZSxcbiAgICAgIG1haW5WYXIsXG4gICAgICBjbG9zdXJlVmFyLFxuICAgICAgbWVzc2FnZU9wLnBhcmFtcyxcbiAgICAgIHRyYW5zZm9ybUZuLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIHttYWluVmFyLCBzdGF0ZW1lbnRzfTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBnaXZlbiBzdWJNZXNzYWdlIHBsYWNlaG9sZGVycyB0byB0aGUgZ2l2ZW4gbWVzc2FnZSBvcC5cbiAqXG4gKiBJZiBhIHBsYWNlaG9sZGVyIG9ubHkgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgc3ViLW1lc3NhZ2UgdmFyaWFibGUsIHdlIGp1c3Qgc2V0IHRoYXQgdmFyaWFibGVcbiAqIGFzIHRoZSBwYXJhbSB2YWx1ZS4gSG93ZXZlciwgaWYgdGhlIHBsYWNlaG9sZGVyIGNvcnJlc3BvbmRzIHRvIG11bHRpcGxlIHN1Yi1tZXNzYWdlXG4gKiB2YXJpYWJsZXMsIHdlIG5lZWQgdG8gYWRkIGEgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSB0aGF0IGlzIGhhbmRsZWQgYnkgdGhlIHBvc3QtcHJvY2Vzc2luZ1xuICogc3RlcC4gV2UgdGhlbiBhZGQgdGhlIGFycmF5IG9mIHZhcmlhYmxlcyBhcyBhIHBvc3QtcHJvY2Vzc2luZyBwYXJhbS5cbiAqL1xuZnVuY3Rpb24gYWRkU3ViTWVzc2FnZVBhcmFtcyhcbiAgbWVzc2FnZU9wOiBpci5JMThuTWVzc2FnZU9wLFxuICBzdWJNZXNzYWdlUGxhY2Vob2xkZXJzOiBNYXA8c3RyaW5nLCBvLkV4cHJlc3Npb25bXT4sXG4pIHtcbiAgZm9yIChjb25zdCBbcGxhY2Vob2xkZXIsIHN1Yk1lc3NhZ2VzXSBvZiBzdWJNZXNzYWdlUGxhY2Vob2xkZXJzKSB7XG4gICAgaWYgKHN1Yk1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbWVzc2FnZU9wLnBhcmFtcy5zZXQocGxhY2Vob2xkZXIsIHN1Yk1lc3NhZ2VzWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZU9wLnBhcmFtcy5zZXQoXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICBvLmxpdGVyYWwoYCR7RVNDQVBFfSR7STE4Tl9JQ1VfTUFQUElOR19QUkVGSVh9JHtwbGFjZWhvbGRlcn0ke0VTQ0FQRX1gKSxcbiAgICAgICk7XG4gICAgICBtZXNzYWdlT3AucG9zdHByb2Nlc3NpbmdQYXJhbXMuc2V0KHBsYWNlaG9sZGVyLCBvLmxpdGVyYWxBcnIoc3ViTWVzc2FnZXMpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBzdGF0ZW1lbnRzIHRoYXQgZGVmaW5lIGEgZ2l2ZW4gdHJhbnNsYXRpb24gbWVzc2FnZS5cbiAqXG4gKiBgYGBcbiAqIHZhciBJMThOXzE7XG4gKiBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSB1bmRlZmluZWQgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHtcbiAqICAgICB2YXIgTVNHX0VYVEVSTkFMX1hYWCA9IGdvb2cuZ2V0TXNnKFxuICogICAgICAgICAgXCJTb21lIG1lc3NhZ2Ugd2l0aCB7JGludGVycG9sYXRpb259IVwiLFxuICogICAgICAgICAgeyBcImludGVycG9sYXRpb25cIjogXCJcXHVGRkZEMFxcdUZGRkRcIiB9XG4gKiAgICAgKTtcbiAqICAgICBJMThOXzEgPSBNU0dfRVhURVJOQUxfWFhYO1xuICogfVxuICogZWxzZSB7XG4gKiAgICAgSTE4Tl8xID0gJGxvY2FsaXplYFNvbWUgbWVzc2FnZSB3aXRoICR7J1xcdUZGRkQwXFx1RkZGRCd9IWA7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgb3JpZ2luYWwgaTE4biBBU1QgbWVzc2FnZSBub2RlXG4gKiBAcGFyYW0gdmFyaWFibGUgVGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0aGUgdHJhbnNsYXRpb24sIGUuZy4gYEkxOE5fMWAuXG4gKiBAcGFyYW0gY2xvc3VyZVZhciBUaGUgdmFyaWFibGUgZm9yIENsb3N1cmUgYGdvb2cuZ2V0TXNnYCBjYWxscywgZS5nLiBgTVNHX0VYVEVSTkFMX1hYWGAuXG4gKiBAcGFyYW0gcGFyYW1zIE9iamVjdCBtYXBwaW5nIHBsYWNlaG9sZGVyIG5hbWVzIHRvIHRoZWlyIHZhbHVlcyAoZS5nLlxuICogYHsgXCJpbnRlcnBvbGF0aW9uXCI6IFwiXFx1RkZGRDBcXHVGRkZEXCIgfWApLlxuICogQHBhcmFtIHRyYW5zZm9ybUZuIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSB0cmFuc2xhdGlvblxuICogICAgIChlLmcuXG4gKiBwb3N0LXByb2Nlc3NpbmcpLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RhdGVtZW50cyB0aGF0IGRlZmluZWQgYSBnaXZlbiB0cmFuc2xhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25EZWNsU3RtdHMoXG4gIG1lc3NhZ2U6IGkxOG4uTWVzc2FnZSxcbiAgdmFyaWFibGU6IG8uUmVhZFZhckV4cHIsXG4gIGNsb3N1cmVWYXI6IG8uUmVhZFZhckV4cHIsXG4gIHBhcmFtczogTWFwPHN0cmluZywgby5FeHByZXNzaW9uPixcbiAgdHJhbnNmb3JtRm4/OiAocmF3OiBvLlJlYWRWYXJFeHByKSA9PiBvLkV4cHJlc3Npb24sXG4pOiBvLlN0YXRlbWVudFtdIHtcbiAgY29uc3QgcGFyYW1zT2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKHBhcmFtcyk7XG4gIGNvbnN0IHN0YXRlbWVudHM6IG8uU3RhdGVtZW50W10gPSBbXG4gICAgZGVjbGFyZUkxOG5WYXJpYWJsZSh2YXJpYWJsZSksXG4gICAgby5pZlN0bXQoXG4gICAgICBjcmVhdGVDbG9zdXJlTW9kZUd1YXJkKCksXG4gICAgICBjcmVhdGVHb29nbGVHZXRNc2dTdGF0ZW1lbnRzKHZhcmlhYmxlLCBtZXNzYWdlLCBjbG9zdXJlVmFyLCBwYXJhbXNPYmplY3QpLFxuICAgICAgY3JlYXRlTG9jYWxpemVTdGF0ZW1lbnRzKFxuICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZm9ybWF0STE4blBsYWNlaG9sZGVyTmFtZXNJbk1hcChwYXJhbXNPYmplY3QsIC8qIHVzZUNhbWVsQ2FzZSAqLyBmYWxzZSksXG4gICAgICApLFxuICAgICksXG4gIF07XG5cbiAgaWYgKHRyYW5zZm9ybUZuKSB7XG4gICAgc3RhdGVtZW50cy5wdXNoKG5ldyBvLkV4cHJlc3Npb25TdGF0ZW1lbnQodmFyaWFibGUuc2V0KHRyYW5zZm9ybUZuKHZhcmlhYmxlKSkpKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBndWFyZCB0aGUgY2xvc3VyZSBtb2RlIGJsb2NrXG4gKiBJdCBpcyBlcXVpdmFsZW50IHRvOlxuICpcbiAqIGBgYFxuICogdHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSB1bmRlZmluZWQgJiYgbmdJMThuQ2xvc3VyZU1vZGVcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjcmVhdGVDbG9zdXJlTW9kZUd1YXJkKCk6IG8uQmluYXJ5T3BlcmF0b3JFeHByIHtcbiAgcmV0dXJuIG9cbiAgICAudHlwZW9mRXhwcihvLnZhcmlhYmxlKE5HX0kxOE5fQ0xPU1VSRV9NT0RFKSlcbiAgICAubm90SWRlbnRpY2FsKG8ubGl0ZXJhbCgndW5kZWZpbmVkJywgby5TVFJJTkdfVFlQRSkpXG4gICAgLmFuZChvLnZhcmlhYmxlKE5HX0kxOE5fQ0xPU1VSRV9NT0RFKSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHZhcnMgd2l0aCBDbG9zdXJlLXNwZWNpZmljIG5hbWVzIGZvciBpMThuIGJsb2NrcyAoaS5lLiBgTVNHX1hYWGApLlxuICovXG5mdW5jdGlvbiBpMThuR2VuZXJhdGVDbG9zdXJlVmFyKFxuICBwb29sOiBDb25zdGFudFBvb2wsXG4gIG1lc3NhZ2VJZDogc3RyaW5nLFxuICBmaWxlQmFzZWRJMThuU3VmZml4OiBzdHJpbmcsXG4gIHVzZUV4dGVybmFsSWRzOiBib29sZWFuLFxuKTogby5SZWFkVmFyRXhwciB7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGNvbnN0IHN1ZmZpeCA9IGZpbGVCYXNlZEkxOG5TdWZmaXg7XG4gIGlmICh1c2VFeHRlcm5hbElkcykge1xuICAgIGNvbnN0IHByZWZpeCA9IGdldFRyYW5zbGF0aW9uQ29uc3RQcmVmaXgoYEVYVEVSTkFMX2ApO1xuICAgIGNvbnN0IHVuaXF1ZVN1ZmZpeCA9IHBvb2wudW5pcXVlTmFtZShzdWZmaXgpO1xuICAgIG5hbWUgPSBgJHtwcmVmaXh9JHtzYW5pdGl6ZUlkZW50aWZpZXIobWVzc2FnZUlkKX0kJCR7dW5pcXVlU3VmZml4fWA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJlZml4ID0gZ2V0VHJhbnNsYXRpb25Db25zdFByZWZpeChzdWZmaXgpO1xuICAgIG5hbWUgPSBwb29sLnVuaXF1ZU5hbWUocHJlZml4KTtcbiAgfVxuICByZXR1cm4gby52YXJpYWJsZShuYW1lKTtcbn1cbiJdfQ==
@@ -1,97 +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
- import * as ir from '../../ir';
9
- /**
10
- * Removes text nodes within i18n blocks since they are already hardcoded into the i18n message.
11
- * Also, replaces interpolations on these text nodes with i18n expressions of the non-text portions,
12
- * which will be applied later.
13
- */
14
- export function convertI18nText(job) {
15
- for (const unit of job.units) {
16
- // Remove all text nodes within i18n blocks, their content is already captured in the i18n
17
- // message.
18
- let currentI18n = null;
19
- let currentIcu = null;
20
- const textNodeI18nBlocks = new Map();
21
- const textNodeIcus = new Map();
22
- const icuPlaceholderByText = new Map();
23
- for (const op of unit.create) {
24
- switch (op.kind) {
25
- case ir.OpKind.I18nStart:
26
- if (op.context === null) {
27
- throw Error('I18n op should have its context set.');
28
- }
29
- currentI18n = op;
30
- break;
31
- case ir.OpKind.I18nEnd:
32
- currentI18n = null;
33
- break;
34
- case ir.OpKind.IcuStart:
35
- if (op.context === null) {
36
- throw Error('Icu op should have its context set.');
37
- }
38
- currentIcu = op;
39
- break;
40
- case ir.OpKind.IcuEnd:
41
- currentIcu = null;
42
- break;
43
- case ir.OpKind.Text:
44
- if (currentI18n !== null) {
45
- textNodeI18nBlocks.set(op.xref, currentI18n);
46
- textNodeIcus.set(op.xref, currentIcu);
47
- if (op.icuPlaceholder !== null) {
48
- // Create an op to represent the ICU placeholder. Initially set its static text to the
49
- // value of the text op, though this may be overwritten later if this text op is a
50
- // placeholder for an interpolation.
51
- const icuPlaceholderOp = ir.createIcuPlaceholderOp(job.allocateXrefId(), op.icuPlaceholder, [op.initialValue]);
52
- ir.OpList.replace(op, icuPlaceholderOp);
53
- icuPlaceholderByText.set(op.xref, icuPlaceholderOp);
54
- }
55
- else {
56
- // Otherwise just remove the text op, since its value is already accounted for in the
57
- // translated message.
58
- ir.OpList.remove(op);
59
- }
60
- }
61
- break;
62
- }
63
- }
64
- // Update any interpolations to the removed text, and instead represent them as a series of i18n
65
- // expressions that we then apply.
66
- for (const op of unit.update) {
67
- switch (op.kind) {
68
- case ir.OpKind.InterpolateText:
69
- if (!textNodeI18nBlocks.has(op.target)) {
70
- continue;
71
- }
72
- const i18nOp = textNodeI18nBlocks.get(op.target);
73
- const icuOp = textNodeIcus.get(op.target);
74
- const icuPlaceholder = icuPlaceholderByText.get(op.target);
75
- const contextId = icuOp ? icuOp.context : i18nOp.context;
76
- const resolutionTime = icuOp
77
- ? ir.I18nParamResolutionTime.Postproccessing
78
- : ir.I18nParamResolutionTime.Creation;
79
- const ops = [];
80
- for (let i = 0; i < op.interpolation.expressions.length; i++) {
81
- const expr = op.interpolation.expressions[i];
82
- // For now, this i18nExpression depends on the slot context of the enclosing i18n block.
83
- // Later, we will modify this, and advance to a different point.
84
- ops.push(ir.createI18nExpressionOp(contextId, i18nOp.xref, i18nOp.xref, i18nOp.handle, expr, icuPlaceholder?.xref ?? null, op.interpolation.i18nPlaceholders[i] ?? null, resolutionTime, ir.I18nExpressionFor.I18nText, '', expr.sourceSpan ?? op.sourceSpan));
85
- }
86
- ir.OpList.replaceWithMany(op, ops);
87
- // If this interpolation is part of an ICU placeholder, add the strings and expressions to
88
- // the placeholder.
89
- if (icuPlaceholder !== undefined) {
90
- icuPlaceholder.strings = op.interpolation.strings;
91
- }
92
- break;
93
- }
94
- }
95
- }
96
- }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bl90ZXh0X2V4dHJhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9pMThuX3RleHRfZXh0cmFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFtQjtJQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QiwwRkFBMEY7UUFDMUYsV0FBVztRQUNYLElBQUksV0FBVyxHQUEwQixJQUFJLENBQUM7UUFDOUMsSUFBSSxVQUFVLEdBQXlCLElBQUksQ0FBQztRQUM1QyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO1FBQ2hFLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBQ2hFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7UUFDdkUsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUN0QixJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7b0JBQ3RELENBQUM7b0JBQ0QsV0FBVyxHQUFHLEVBQUUsQ0FBQztvQkFDakIsTUFBTTtnQkFDUixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztvQkFDcEIsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDbkIsTUFB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LENBQUMsQ0FBQyxDQUFDO3dCQUM3Qyx3RkFBd0Y7d0JBQ3hGLGdFQUFnRTt3QkFDaEUsR0FBRyxDQUFDLElBQUksQ0FDTixFQUFFLENBQUMsc0JBQXNCLENBQ3ZCLFNBQVUsRUFDVixNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLE1BQU0sRUFDYixJQUFJLEVBQ0osY0FBYyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQzVCLEVBQUUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUM1QyxjQUFjLEVBQ2QsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFDN0IsRUFBRSxFQUNGLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FDakMsQ0FDRixDQUFDO29CQUNKLENBQUM7b0JBQ0QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDbEQsMEZBQTBGO29CQUMxRixtQkFBbUI7b0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNqQyxjQUFjLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO29CQUNwRCxDQUFDO29CQUNELE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBSZW1vdmVzIHRleHQgbm9kZXMgd2l0aGluIGkxOG4gYmxvY2tzIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgaGFyZGNvZGVkIGludG8gdGhlIGkxOG4gbWVzc2FnZS5cbiAqIEFsc28sIHJlcGxhY2VzIGludGVycG9sYXRpb25zIG9uIHRoZXNlIHRleHQgbm9kZXMgd2l0aCBpMThuIGV4cHJlc3Npb25zIG9mIHRoZSBub24tdGV4dCBwb3J0aW9ucyxcbiAqIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBsYXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRJMThuVGV4dChqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICAvLyBSZW1vdmUgYWxsIHRleHQgbm9kZXMgd2l0aGluIGkxOG4gYmxvY2tzLCB0aGVpciBjb250ZW50IGlzIGFscmVhZHkgY2FwdHVyZWQgaW4gdGhlIGkxOG5cbiAgICAvLyBtZXNzYWdlLlxuICAgIGxldCBjdXJyZW50STE4bjogaXIuSTE4blN0YXJ0T3AgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3VycmVudEljdTogaXIuSWN1U3RhcnRPcCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRleHROb2RlSTE4bkJsb2NrcyA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5JMThuU3RhcnRPcD4oKTtcbiAgICBjb25zdCB0ZXh0Tm9kZUljdXMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuSWN1U3RhcnRPcCB8IG51bGw+KCk7XG4gICAgY29uc3QgaWN1UGxhY2Vob2xkZXJCeVRleHQgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuSWN1UGxhY2Vob2xkZXJPcD4oKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICAgICAgY2FzZSBpci5PcEtpbmQuSTE4blN0YXJ0OlxuICAgICAgICAgIGlmIChvcC5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignSTE4biBvcCBzaG91bGQgaGF2ZSBpdHMgY29udGV4dCBzZXQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRJMThuID0gb3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5FbmQ6XG4gICAgICAgICAgY3VycmVudEkxOG4gPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5JY3VTdGFydDpcbiAgICAgICAgICBpZiAob3AuY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0ljdSBvcCBzaG91bGQgaGF2ZSBpdHMgY29udGV4dCBzZXQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRJY3UgPSBvcDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBpci5PcEtpbmQuSWN1RW5kOlxuICAgICAgICAgIGN1cnJlbnRJY3UgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5UZXh0OlxuICAgICAgICAgIGlmIChjdXJyZW50STE4biAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGV4dE5vZGVJMThuQmxvY2tzLnNldChvcC54cmVmLCBjdXJyZW50STE4bik7XG4gICAgICAgICAgICB0ZXh0Tm9kZUljdXMuc2V0KG9wLnhyZWYsIGN1cnJlbnRJY3UpO1xuICAgICAgICAgICAgaWYgKG9wLmljdVBsYWNlaG9sZGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBvcCB0byByZXByZXNlbnQgdGhlIElDVSBwbGFjZWhvbGRlci4gSW5pdGlhbGx5IHNldCBpdHMgc3RhdGljIHRleHQgdG8gdGhlXG4gICAgICAgICAgICAgIC8vIHZhbHVlIG9mIHRoZSB0ZXh0IG9wLCB0aG91Z2ggdGhpcyBtYXkgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIgaWYgdGhpcyB0ZXh0IG9wIGlzIGFcbiAgICAgICAgICAgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGFuIGludGVycG9sYXRpb24uXG4gICAgICAgICAgICAgIGNvbnN0IGljdVBsYWNlaG9sZGVyT3AgPSBpci5jcmVhdGVJY3VQbGFjZWhvbGRlck9wKFxuICAgICAgICAgICAgICAgIGpvYi5hbGxvY2F0ZVhyZWZJZCgpLFxuICAgICAgICAgICAgICAgIG9wLmljdVBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgIFtvcC5pbml0aWFsVmFsdWVdLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpci5PcExpc3QucmVwbGFjZTxpci5DcmVhdGVPcD4ob3AsIGljdVBsYWNlaG9sZGVyT3ApO1xuICAgICAgICAgICAgICBpY3VQbGFjZWhvbGRlckJ5VGV4dC5zZXQob3AueHJlZiwgaWN1UGxhY2Vob2xkZXJPcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBPdGhlcndpc2UganVzdCByZW1vdmUgdGhlIHRleHQgb3AsIHNpbmNlIGl0cyB2YWx1ZSBpcyBhbHJlYWR5IGFjY291bnRlZCBmb3IgaW4gdGhlXG4gICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZWQgbWVzc2FnZS5cbiAgICAgICAgICAgICAgaXIuT3BMaXN0LnJlbW92ZTxpci5DcmVhdGVPcD4ob3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgYW55IGludGVycG9sYXRpb25zIHRvIHRoZSByZW1vdmVkIHRleHQsIGFuZCBpbnN0ZWFkIHJlcHJlc2VudCB0aGVtIGFzIGEgc2VyaWVzIG9mIGkxOG5cbiAgICAvLyBleHByZXNzaW9ucyB0aGF0IHdlIHRoZW4gYXBwbHkuXG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LnVwZGF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkludGVycG9sYXRlVGV4dDpcbiAgICAgICAgICBpZiAoIXRleHROb2RlSTE4bkJsb2Nrcy5oYXMob3AudGFyZ2V0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaTE4bk9wID0gdGV4dE5vZGVJMThuQmxvY2tzLmdldChvcC50YXJnZXQpITtcbiAgICAgICAgICBjb25zdCBpY3VPcCA9IHRleHROb2RlSWN1cy5nZXQob3AudGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCBpY3VQbGFjZWhvbGRlciA9IGljdVBsYWNlaG9sZGVyQnlUZXh0LmdldChvcC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHRJZCA9IGljdU9wID8gaWN1T3AuY29udGV4dCA6IGkxOG5PcC5jb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25UaW1lID0gaWN1T3BcbiAgICAgICAgICAgID8gaXIuSTE4blBhcmFtUmVzb2x1dGlvblRpbWUuUG9zdHByb2NjZXNzaW5nXG4gICAgICAgICAgICA6IGlyLkkxOG5QYXJhbVJlc29sdXRpb25UaW1lLkNyZWF0aW9uO1xuICAgICAgICAgIGNvbnN0IG9wczogaXIuSTE4bkV4cHJlc3Npb25PcFtdID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcC5pbnRlcnBvbGF0aW9uLmV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleHByID0gb3AuaW50ZXJwb2xhdGlvbi5leHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIC8vIEZvciBub3csIHRoaXMgaTE4bkV4cHJlc3Npb24gZGVwZW5kcyBvbiB0aGUgc2xvdCBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgaTE4biBibG9jay5cbiAgICAgICAgICAgIC8vIExhdGVyLCB3ZSB3aWxsIG1vZGlmeSB0aGlzLCBhbmQgYWR2YW5jZSB0byBhIGRpZmZlcmVudCBwb2ludC5cbiAgICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgICBpci5jcmVhdGVJMThuRXhwcmVzc2lvbk9wKFxuICAgICAgICAgICAgICAgIGNvbnRleHRJZCEsXG4gICAgICAgICAgICAgICAgaTE4bk9wLnhyZWYsXG4gICAgICAgICAgICAgICAgaTE4bk9wLnhyZWYsXG4gICAgICAgICAgICAgICAgaTE4bk9wLmhhbmRsZSxcbiAgICAgICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgICAgIGljdVBsYWNlaG9sZGVyPy54cmVmID8/IG51bGwsXG4gICAgICAgICAgICAgICAgb3AuaW50ZXJwb2xhdGlvbi5pMThuUGxhY2Vob2xkZXJzW2ldID8/IG51bGwsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvblRpbWUsXG4gICAgICAgICAgICAgICAgaXIuSTE4bkV4cHJlc3Npb25Gb3IuSTE4blRleHQsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgZXhwci5zb3VyY2VTcGFuID8/IG9wLnNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpci5PcExpc3QucmVwbGFjZVdpdGhNYW55KG9wIGFzIGlyLlVwZGF0ZU9wLCBvcHMpO1xuICAgICAgICAgIC8vIElmIHRoaXMgaW50ZXJwb2xhdGlvbiBpcyBwYXJ0IG9mIGFuIElDVSBwbGFjZWhvbGRlciwgYWRkIHRoZSBzdHJpbmdzIGFuZCBleHByZXNzaW9ucyB0b1xuICAgICAgICAgIC8vIHRoZSBwbGFjZWhvbGRlci5cbiAgICAgICAgICBpZiAoaWN1UGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWN1UGxhY2Vob2xkZXIuc3RyaW5ncyA9IG9wLmludGVycG9sYXRpb24uc3RyaW5ncztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=