@angular/compiler 19.0.0-next.1 → 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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/compiler.mjs +5465 -4675
  3. package/fesm2022/compiler.mjs.map +1 -1
  4. package/index.d.ts +115 -15
  5. package/package.json +2 -4
  6. package/esm2022/compiler.mjs +0 -13
  7. package/esm2022/index.mjs +0 -13
  8. package/esm2022/public_api.mjs +0 -15
  9. package/esm2022/src/assertions.mjs +0 -31
  10. package/esm2022/src/chars.mjs +0 -90
  11. package/esm2022/src/compiler.mjs +0 -88
  12. package/esm2022/src/compiler_facade_interface.mjs +0 -29
  13. package/esm2022/src/config.mjs +0 -20
  14. package/esm2022/src/constant_pool.mjs +0 -285
  15. package/esm2022/src/core.mjs +0 -96
  16. package/esm2022/src/expression_parser/ast.mjs +0 -755
  17. package/esm2022/src/expression_parser/lexer.mjs +0 -421
  18. package/esm2022/src/expression_parser/parser.mjs +0 -1222
  19. package/esm2022/src/i18n/digest.mjs +0 -322
  20. package/esm2022/src/i18n/extractor_merger.mjs +0 -409
  21. package/esm2022/src/i18n/i18n_ast.mjs +0 -212
  22. package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
  23. package/esm2022/src/i18n/i18n_parser.mjs +0 -247
  24. package/esm2022/src/i18n/index.mjs +0 -16
  25. package/esm2022/src/i18n/message_bundle.mjs +0 -93
  26. package/esm2022/src/i18n/parse_util.mjs +0 -17
  27. package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
  28. package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
  29. package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
  30. package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
  31. package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
  32. package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
  33. package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
  34. package/esm2022/src/i18n/translation_bundle.mjs +0 -164
  35. package/esm2022/src/injectable_compiler_2.mjs +0 -138
  36. package/esm2022/src/jit_compiler_facade.mjs +0 -681
  37. package/esm2022/src/ml_parser/ast.mjs +0 -167
  38. package/esm2022/src/ml_parser/defaults.mjs +0 -24
  39. package/esm2022/src/ml_parser/entities.mjs +0 -2144
  40. package/esm2022/src/ml_parser/html_parser.mjs +0 -18
  41. package/esm2022/src/ml_parser/html_tags.mjs +0 -156
  42. package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
  43. package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
  44. package/esm2022/src/ml_parser/lexer.mjs +0 -1210
  45. package/esm2022/src/ml_parser/parser.mjs +0 -539
  46. package/esm2022/src/ml_parser/tags.mjs +0 -47
  47. package/esm2022/src/ml_parser/tokens.mjs +0 -9
  48. package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
  49. package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
  50. package/esm2022/src/output/abstract_emitter.mjs +0 -524
  51. package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
  52. package/esm2022/src/output/map_util.mjs +0 -19
  53. package/esm2022/src/output/output_ast.mjs +0 -1301
  54. package/esm2022/src/output/output_jit.mjs +0 -138
  55. package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
  56. package/esm2022/src/output/source_map.mjs +0 -150
  57. package/esm2022/src/parse_util.mjs +0 -198
  58. package/esm2022/src/render3/partial/api.mjs +0 -9
  59. package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
  60. package/esm2022/src/render3/partial/component.mjs +0 -197
  61. package/esm2022/src/render3/partial/directive.mjs +0 -264
  62. package/esm2022/src/render3/partial/factory.mjs +0 -35
  63. package/esm2022/src/render3/partial/injectable.mjs +0 -67
  64. package/esm2022/src/render3/partial/injector.mjs +0 -41
  65. package/esm2022/src/render3/partial/ng_module.mjs +0 -63
  66. package/esm2022/src/render3/partial/pipe.mjs +0 -50
  67. package/esm2022/src/render3/partial/util.mjs +0 -79
  68. package/esm2022/src/render3/r3_ast.mjs +0 -493
  69. package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
  70. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
  71. package/esm2022/src/render3/r3_control_flow.mjs +0 -421
  72. package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
  73. package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
  74. package/esm2022/src/render3/r3_factory.mjs +0 -200
  75. package/esm2022/src/render3/r3_identifiers.mjs +0 -480
  76. package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
  77. package/esm2022/src/render3/r3_jit.mjs +0 -29
  78. package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
  79. package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
  80. package/esm2022/src/render3/r3_template_transform.mjs +0 -560
  81. package/esm2022/src/render3/util.mjs +0 -90
  82. package/esm2022/src/render3/view/api.mjs +0 -14
  83. package/esm2022/src/render3/view/compiler.mjs +0 -546
  84. package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
  85. package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
  86. package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
  87. package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
  88. package/esm2022/src/render3/view/i18n/util.mjs +0 -70
  89. package/esm2022/src/render3/view/query_generation.mjs +0 -182
  90. package/esm2022/src/render3/view/t2_api.mjs +0 -9
  91. package/esm2022/src/render3/view/t2_binder.mjs +0 -823
  92. package/esm2022/src/render3/view/template.mjs +0 -113
  93. package/esm2022/src/render3/view/util.mjs +0 -192
  94. package/esm2022/src/resource_loader.mjs +0 -17
  95. package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
  96. package/esm2022/src/schema/dom_security_schema.mjs +0 -96
  97. package/esm2022/src/schema/element_schema_registry.mjs +0 -10
  98. package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
  99. package/esm2022/src/selector.mjs +0 -400
  100. package/esm2022/src/shadow_css.mjs +0 -1053
  101. package/esm2022/src/style_url_resolver.mjs +0 -17
  102. package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
  103. package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
  104. package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
  105. package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
  106. package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
  107. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
  108. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
  109. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
  110. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
  111. package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
  112. package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
  113. package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
  114. package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
  115. package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
  116. package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
  117. package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
  118. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
  119. package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
  120. package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
  121. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
  122. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
  123. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
  124. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
  125. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
  126. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
  127. package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
  128. package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
  129. package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
  130. package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
  131. package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
  132. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
  133. package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
  134. package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
  135. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
  136. package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
  137. package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
  138. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
  139. package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
  140. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
  141. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
  142. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
  143. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
  144. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
  145. package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
  146. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
  147. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
  148. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
  149. package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
  150. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
  151. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
  152. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
  153. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
  154. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
  155. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
  156. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
  157. package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
  158. package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
  159. package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
  160. package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
  161. package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
  162. package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
  163. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
  164. package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
  165. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
  166. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
  167. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
  168. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
  169. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
  170. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
  171. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
  172. package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
  173. package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
  174. package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
  175. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
  176. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
  177. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
  178. package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
  179. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
  180. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
  181. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
  182. package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
  183. package/esm2022/src/template_parser/binding_parser.mjs +0 -465
  184. package/esm2022/src/template_parser/template_preparser.mjs +0 -84
  185. package/esm2022/src/util.mjs +0 -124
  186. package/esm2022/src/version.mjs +0 -15
@@ -1,423 +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
- * Optimize variables declared and used in the IR.
12
- *
13
- * Variables are eagerly generated by pipeline stages for all possible values that could be
14
- * referenced. This stage processes the list of declared variables and all variable usages,
15
- * and optimizes where possible. It performs 3 main optimizations:
16
- *
17
- * * It transforms variable declarations to side effectful expressions when the
18
- * variable is not used, but its initializer has global effects which other
19
- * operations rely upon.
20
- * * It removes variable declarations if those variables are not referenced and
21
- * either they do not have global effects, or nothing relies on them.
22
- * * It inlines variable declarations when those variables are only used once
23
- * and the inlining is semantically safe.
24
- *
25
- * To guarantee correctness, analysis of "fences" in the instruction lists is used to determine
26
- * which optimizations are safe to perform.
27
- */
28
- export function optimizeVariables(job) {
29
- for (const unit of job.units) {
30
- inlineAlwaysInlineVariables(unit.create);
31
- inlineAlwaysInlineVariables(unit.update);
32
- for (const op of unit.create) {
33
- if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
34
- inlineAlwaysInlineVariables(op.handlerOps);
35
- }
36
- }
37
- optimizeVariablesInOpList(unit.create, job.compatibility);
38
- optimizeVariablesInOpList(unit.update, job.compatibility);
39
- for (const op of unit.create) {
40
- if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
41
- optimizeVariablesInOpList(op.handlerOps, job.compatibility);
42
- }
43
- }
44
- }
45
- }
46
- /**
47
- * A [fence](https://en.wikipedia.org/wiki/Memory_barrier) flag for an expression which indicates
48
- * how that expression can be optimized in relation to other expressions or instructions.
49
- *
50
- * `Fence`s are a bitfield, so multiple flags may be set on a single expression.
51
- */
52
- var Fence;
53
- (function (Fence) {
54
- /**
55
- * Empty flag (no fence exists).
56
- */
57
- Fence[Fence["None"] = 0] = "None";
58
- /**
59
- * A context read fence, meaning that the expression in question reads from the "current view"
60
- * context of the runtime.
61
- */
62
- Fence[Fence["ViewContextRead"] = 1] = "ViewContextRead";
63
- /**
64
- * A context write fence, meaning that the expression in question writes to the "current view"
65
- * context of the runtime.
66
- *
67
- * Note that all `ContextWrite` fences are implicitly `ContextRead` fences as operations which
68
- * change the view context do so based on the current one.
69
- */
70
- Fence[Fence["ViewContextWrite"] = 2] = "ViewContextWrite";
71
- /**
72
- * Indicates that a call is required for its side-effects, even if nothing reads its result.
73
- *
74
- * This is also true of `ViewContextWrite` operations **if** they are followed by a
75
- * `ViewContextRead`.
76
- */
77
- Fence[Fence["SideEffectful"] = 4] = "SideEffectful";
78
- })(Fence || (Fence = {}));
79
- function inlineAlwaysInlineVariables(ops) {
80
- const vars = new Map();
81
- for (const op of ops) {
82
- if (op.kind === ir.OpKind.Variable && op.flags & ir.VariableFlags.AlwaysInline) {
83
- ir.visitExpressionsInOp(op, (expr) => {
84
- if (ir.isIrExpression(expr) && fencesForIrExpression(expr) !== Fence.None) {
85
- throw new Error(`AssertionError: A context-sensitive variable was marked AlwaysInline`);
86
- }
87
- });
88
- vars.set(op.xref, op);
89
- }
90
- ir.transformExpressionsInOp(op, (expr) => {
91
- if (expr instanceof ir.ReadVariableExpr && vars.has(expr.xref)) {
92
- const varOp = vars.get(expr.xref);
93
- // Inline by cloning, because we might inline into multiple places.
94
- return varOp.initializer.clone();
95
- }
96
- return expr;
97
- }, ir.VisitorContextFlag.None);
98
- }
99
- for (const op of vars.values()) {
100
- ir.OpList.remove(op);
101
- }
102
- }
103
- /**
104
- * Process a list of operations and optimize variables within that list.
105
- */
106
- function optimizeVariablesInOpList(ops, compatibility) {
107
- const varDecls = new Map();
108
- const varUsages = new Map();
109
- // Track variables that are used outside of the immediate operation list. For example, within
110
- // `ListenerOp` handler operations of listeners in the current operation list.
111
- const varRemoteUsages = new Set();
112
- const opMap = new Map();
113
- // First, extract information about variables declared or used within the whole list.
114
- for (const op of ops) {
115
- if (op.kind === ir.OpKind.Variable) {
116
- if (varDecls.has(op.xref) || varUsages.has(op.xref)) {
117
- throw new Error(`Should not see two declarations of the same variable: ${op.xref}`);
118
- }
119
- varDecls.set(op.xref, op);
120
- varUsages.set(op.xref, 0);
121
- }
122
- opMap.set(op, collectOpInfo(op));
123
- countVariableUsages(op, varUsages, varRemoteUsages);
124
- }
125
- // The next step is to remove any variable declarations for variables that aren't used. The
126
- // variable initializer expressions may be side-effectful, so they may need to be retained as
127
- // expression statements.
128
- // Track whether we've seen an operation which reads from the view context yet. This is used to
129
- // determine whether a write to the view context in a variable initializer can be observed.
130
- let contextIsUsed = false;
131
- // Note that iteration through the list happens in reverse, which guarantees that we'll process
132
- // all reads of a variable prior to processing its declaration.
133
- for (const op of ops.reversed()) {
134
- const opInfo = opMap.get(op);
135
- if (op.kind === ir.OpKind.Variable && varUsages.get(op.xref) === 0) {
136
- // This variable is unused and can be removed. We might need to keep the initializer around,
137
- // though, if something depends on it running.
138
- if ((contextIsUsed && opInfo.fences & Fence.ViewContextWrite) ||
139
- opInfo.fences & Fence.SideEffectful) {
140
- // This variable initializer has a side effect which must be retained. Either:
141
- // * it writes to the view context, and we know there is a future operation which depends
142
- // on that write, or
143
- // * it's an operation which is inherently side-effectful.
144
- // We can't remove the initializer, but we can remove the variable declaration itself and
145
- // replace it with a side-effectful statement.
146
- const stmtOp = ir.createStatementOp(op.initializer.toStmt());
147
- opMap.set(stmtOp, opInfo);
148
- ir.OpList.replace(op, stmtOp);
149
- }
150
- else {
151
- // It's safe to delete this entire variable declaration as nothing depends on it, even
152
- // side-effectfully. Note that doing this might make other variables unused. Since we're
153
- // iterating in reverse order, we should always be processing usages before declarations
154
- // and therefore by the time we get to a declaration, all removable usages will have been
155
- // removed.
156
- uncountVariableUsages(op, varUsages);
157
- ir.OpList.remove(op);
158
- }
159
- opMap.delete(op);
160
- varDecls.delete(op.xref);
161
- varUsages.delete(op.xref);
162
- continue;
163
- }
164
- // Does this operation depend on the view context?
165
- if (opInfo.fences & Fence.ViewContextRead) {
166
- contextIsUsed = true;
167
- }
168
- }
169
- // Next, inline any remaining variables with exactly one usage.
170
- const toInline = [];
171
- for (const [id, count] of varUsages) {
172
- const decl = varDecls.get(id);
173
- // We can inline variables that:
174
- // - are used exactly once, and
175
- // - are not used remotely
176
- // OR
177
- // - are marked for always inlining
178
- const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
179
- if (count !== 1 || isAlwaysInline) {
180
- // We can't inline this variable as it's used more than once.
181
- continue;
182
- }
183
- if (varRemoteUsages.has(id)) {
184
- // This variable is used once, but across an operation boundary, so it can't be inlined.
185
- continue;
186
- }
187
- toInline.push(id);
188
- }
189
- let candidate;
190
- while ((candidate = toInline.pop())) {
191
- // We will attempt to inline this variable. If inlining fails (due to fences for example),
192
- // no future operation will make inlining legal.
193
- const decl = varDecls.get(candidate);
194
- const varInfo = opMap.get(decl);
195
- const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
196
- if (isAlwaysInline) {
197
- throw new Error(`AssertionError: Found an 'AlwaysInline' variable after the always inlining pass.`);
198
- }
199
- // Scan operations following the variable declaration and look for the point where that variable
200
- // is used. There should only be one usage given the precondition above.
201
- for (let targetOp = decl.next; targetOp.kind !== ir.OpKind.ListEnd; targetOp = targetOp.next) {
202
- const opInfo = opMap.get(targetOp);
203
- // Is the variable used in this operation?
204
- if (opInfo.variablesUsed.has(candidate)) {
205
- if (compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder &&
206
- !allowConservativeInlining(decl, targetOp)) {
207
- // We're in conservative mode, and this variable is not eligible for inlining into the
208
- // target operation in this mode.
209
- break;
210
- }
211
- // Yes, try to inline it. Inlining may not be successful if fences in this operation before
212
- // the variable's usage cannot be safely crossed.
213
- if (tryInlineVariableInitializer(candidate, decl.initializer, targetOp, varInfo.fences)) {
214
- // Inlining was successful! Update the tracking structures to reflect the inlined
215
- // variable.
216
- opInfo.variablesUsed.delete(candidate);
217
- // Add all variables used in the variable's initializer to its new usage site.
218
- for (const id of varInfo.variablesUsed) {
219
- opInfo.variablesUsed.add(id);
220
- }
221
- // Merge fences in the variable's initializer into its new usage site.
222
- opInfo.fences |= varInfo.fences;
223
- // Delete tracking info related to the declaration.
224
- varDecls.delete(candidate);
225
- varUsages.delete(candidate);
226
- opMap.delete(decl);
227
- // And finally, delete the original declaration from the operation list.
228
- ir.OpList.remove(decl);
229
- }
230
- // Whether inlining succeeded or failed, we're done processing this variable.
231
- break;
232
- }
233
- // If the variable is not used in this operation, then we'd need to inline across it. Check if
234
- // that's safe to do.
235
- if (!safeToInlinePastFences(opInfo.fences, varInfo.fences)) {
236
- // We can't safely inline this variable beyond this operation, so don't proceed with
237
- // inlining this variable.
238
- break;
239
- }
240
- }
241
- }
242
- }
243
- /**
244
- * Given an `ir.Expression`, returns the `Fence` flags for that expression type.
245
- */
246
- function fencesForIrExpression(expr) {
247
- switch (expr.kind) {
248
- case ir.ExpressionKind.NextContext:
249
- return Fence.ViewContextRead | Fence.ViewContextWrite;
250
- case ir.ExpressionKind.RestoreView:
251
- return Fence.ViewContextRead | Fence.ViewContextWrite | Fence.SideEffectful;
252
- case ir.ExpressionKind.StoreLet:
253
- return Fence.SideEffectful;
254
- case ir.ExpressionKind.Reference:
255
- case ir.ExpressionKind.ContextLetReference:
256
- return Fence.ViewContextRead;
257
- default:
258
- return Fence.None;
259
- }
260
- }
261
- /**
262
- * Build the `OpInfo` structure for the given `op`. This performs two operations:
263
- *
264
- * * It tracks which variables are used in the operation's expressions.
265
- * * It rolls up fence flags for expressions within the operation.
266
- */
267
- function collectOpInfo(op) {
268
- let fences = Fence.None;
269
- const variablesUsed = new Set();
270
- ir.visitExpressionsInOp(op, (expr) => {
271
- if (!ir.isIrExpression(expr)) {
272
- return;
273
- }
274
- switch (expr.kind) {
275
- case ir.ExpressionKind.ReadVariable:
276
- variablesUsed.add(expr.xref);
277
- break;
278
- default:
279
- fences |= fencesForIrExpression(expr);
280
- }
281
- });
282
- return { fences, variablesUsed };
283
- }
284
- /**
285
- * Count the number of usages of each variable, being careful to track whether those usages are
286
- * local or remote.
287
- */
288
- function countVariableUsages(op, varUsages, varRemoteUsage) {
289
- ir.visitExpressionsInOp(op, (expr, flags) => {
290
- if (!ir.isIrExpression(expr)) {
291
- return;
292
- }
293
- if (expr.kind !== ir.ExpressionKind.ReadVariable) {
294
- return;
295
- }
296
- const count = varUsages.get(expr.xref);
297
- if (count === undefined) {
298
- // This variable is declared outside the current scope of optimization.
299
- return;
300
- }
301
- varUsages.set(expr.xref, count + 1);
302
- if (flags & ir.VisitorContextFlag.InChildOperation) {
303
- varRemoteUsage.add(expr.xref);
304
- }
305
- });
306
- }
307
- /**
308
- * Remove usages of a variable in `op` from the `varUsages` tracking.
309
- */
310
- function uncountVariableUsages(op, varUsages) {
311
- ir.visitExpressionsInOp(op, (expr) => {
312
- if (!ir.isIrExpression(expr)) {
313
- return;
314
- }
315
- if (expr.kind !== ir.ExpressionKind.ReadVariable) {
316
- return;
317
- }
318
- const count = varUsages.get(expr.xref);
319
- if (count === undefined) {
320
- // This variable is declared outside the current scope of optimization.
321
- return;
322
- }
323
- else if (count === 0) {
324
- throw new Error(`Inaccurate variable count: ${expr.xref} - found another read but count is already 0`);
325
- }
326
- varUsages.set(expr.xref, count - 1);
327
- });
328
- }
329
- /**
330
- * Checks whether it's safe to inline a variable across a particular operation.
331
- *
332
- * @param fences the fences of the operation which the inlining will cross
333
- * @param declFences the fences of the variable being inlined.
334
- */
335
- function safeToInlinePastFences(fences, declFences) {
336
- if (fences & Fence.ViewContextWrite) {
337
- // It's not safe to inline context reads across context writes.
338
- if (declFences & Fence.ViewContextRead) {
339
- return false;
340
- }
341
- }
342
- else if (fences & Fence.ViewContextRead) {
343
- // It's not safe to inline context writes across context reads.
344
- if (declFences & Fence.ViewContextWrite) {
345
- return false;
346
- }
347
- }
348
- return true;
349
- }
350
- /**
351
- * Attempt to inline the initializer of a variable into a target operation's expressions.
352
- *
353
- * This may or may not be safe to do. For example, the variable could be read following the
354
- * execution of an expression with fences that don't permit the variable to be inlined across them.
355
- */
356
- function tryInlineVariableInitializer(id, initializer, target, declFences) {
357
- // We use `ir.transformExpressionsInOp` to walk the expressions and inline the variable if
358
- // possible. Since this operation is callback-based, once inlining succeeds or fails we can't
359
- // "stop" the expression processing, and have to keep track of whether inlining has succeeded or
360
- // is no longer allowed.
361
- let inlined = false;
362
- let inliningAllowed = true;
363
- ir.transformExpressionsInOp(target, (expr, flags) => {
364
- if (!ir.isIrExpression(expr)) {
365
- return expr;
366
- }
367
- if (inlined || !inliningAllowed) {
368
- // Either the inlining has already succeeded, or we've passed a fence that disallows inlining
369
- // at this point, so don't try.
370
- return expr;
371
- }
372
- else if (flags & ir.VisitorContextFlag.InChildOperation &&
373
- declFences & Fence.ViewContextRead) {
374
- // We cannot inline variables that are sensitive to the current context across operation
375
- // boundaries.
376
- return expr;
377
- }
378
- switch (expr.kind) {
379
- case ir.ExpressionKind.ReadVariable:
380
- if (expr.xref === id) {
381
- // This is the usage site of the variable. Since nothing has disallowed inlining, it's
382
- // safe to inline the initializer here.
383
- inlined = true;
384
- return initializer;
385
- }
386
- break;
387
- default:
388
- // For other types of `ir.Expression`s, whether inlining is allowed depends on their fences.
389
- const exprFences = fencesForIrExpression(expr);
390
- inliningAllowed = inliningAllowed && safeToInlinePastFences(exprFences, declFences);
391
- break;
392
- }
393
- return expr;
394
- }, ir.VisitorContextFlag.None);
395
- return inlined;
396
- }
397
- /**
398
- * Determines whether inlining of `decl` should be allowed in "conservative" mode.
399
- *
400
- * In conservative mode, inlining behavior is limited to those operations which the
401
- * `TemplateDefinitionBuilder` supported, with the goal of producing equivalent output.
402
- */
403
- function allowConservativeInlining(decl, target) {
404
- // TODO(alxhub): understand exactly how TemplateDefinitionBuilder approaches inlining, and record
405
- // that behavior here.
406
- switch (decl.variable.kind) {
407
- case ir.SemanticVariableKind.Identifier:
408
- if (decl.initializer instanceof o.ReadVarExpr && decl.initializer.name === 'ctx') {
409
- // Although TemplateDefinitionBuilder is cautious about inlining, we still want to do so
410
- // when the variable is the context, to imitate its behavior with aliases in control flow
411
- // blocks. This quirky behavior will become dead code once compatibility mode is no longer
412
- // supported.
413
- return true;
414
- }
415
- return false;
416
- case ir.SemanticVariableKind.Context:
417
- // Context can only be inlined into other variables.
418
- return target.kind === ir.OpKind.Variable;
419
- default:
420
- return true;
421
- }
422
- }
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyaWFibGVfb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQW1CO0lBQ25ELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLDJCQUEyQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0UsMkJBQTJCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7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LEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzVDO1lBQ0UsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogT3B0aW1pemUgdmFyaWFibGVzIGRlY2xhcmVkIGFuZCB1c2VkIGluIHRoZSBJUi5cbiAqXG4gKiBWYXJpYWJsZXMgYXJlIGVhZ2VybHkgZ2VuZXJhdGVkIGJ5IHBpcGVsaW5lIHN0YWdlcyBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcyB0aGF0IGNvdWxkIGJlXG4gKiByZWZlcmVuY2VkLiBUaGlzIHN0YWdlIHByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIGFsbCB2YXJpYWJsZSB1c2FnZXMsXG4gKiBhbmQgb3B0aW1pemVzIHdoZXJlIHBvc3NpYmxlLiBJdCBwZXJmb3JtcyAzIG1haW4gb3B0aW1pemF0aW9uczpcbiAqXG4gKiAgICogSXQgdHJhbnNmb3JtcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgdG8gc2lkZSBlZmZlY3RmdWwgZXhwcmVzc2lvbnMgd2hlbiB0aGVcbiAqICAgICB2YXJpYWJsZSBpcyBub3QgdXNlZCwgYnV0IGl0cyBpbml0aWFsaXplciBoYXMgZ2xvYmFsIGVmZmVjdHMgd2hpY2ggb3RoZXJcbiAqICAgICBvcGVyYXRpb25zIHJlbHkgdXBvbi5cbiAqICAgKiBJdCByZW1vdmVzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpZiB0aG9zZSB2YXJpYWJsZXMgYXJlIG5vdCByZWZlcmVuY2VkIGFuZFxuICogICAgIGVpdGhlciB0aGV5IGRvIG5vdCBoYXZlIGdsb2JhbCBlZmZlY3RzLCBvciBub3RoaW5nIHJlbGllcyBvbiB0aGVtLlxuICogICAqIEl0IGlubGluZXMgdmFyaWFibGUgZGVjbGFyYXRpb25zIHdoZW4gdGhvc2UgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWQgb25jZVxuICogICAgIGFuZCB0aGUgaW5saW5pbmcgaXMgc2VtYW50aWNhbGx5IHNhZmUuXG4gKlxuICogVG8gZ3VhcmFudGVlIGNvcnJlY3RuZXNzLCBhbmFseXNpcyBvZiBcImZlbmNlc1wiIGluIHRoZSBpbnN0cnVjdGlvbiBsaXN0cyBpcyB1c2VkIHRvIGRldGVybWluZVxuICogd2hpY2ggb3B0aW1pemF0aW9ucyBhcmUgc2FmZSB0byBwZXJmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW1pemVWYXJpYWJsZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKHVuaXQuY3JlYXRlKTtcbiAgICBpbmxpbmVBbHdheXNJbmxpbmVWYXJpYWJsZXModW5pdC51cGRhdGUpO1xuXG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5MaXN0ZW5lciB8fCBvcC5raW5kID09PSBpci5PcEtpbmQuVHdvV2F5TGlzdGVuZXIpIHtcbiAgICAgICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKG9wLmhhbmRsZXJPcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QodW5pdC5jcmVhdGUsIGpvYi5jb21wYXRpYmlsaXR5KTtcbiAgICBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KHVuaXQudXBkYXRlLCBqb2IuY29tcGF0aWJpbGl0eSk7XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLkxpc3RlbmVyIHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ud29XYXlMaXN0ZW5lcikge1xuICAgICAgICBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KG9wLmhhbmRsZXJPcHMsIGpvYi5jb21wYXRpYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIFtmZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVtb3J5X2JhcnJpZXIpIGZsYWcgZm9yIGFuIGV4cHJlc3Npb24gd2hpY2ggaW5kaWNhdGVzXG4gKiBob3cgdGhhdCBleHByZXNzaW9uIGNhbiBiZSBvcHRpbWl6ZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgZXhwcmVzc2lvbnMgb3IgaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIGBGZW5jZWBzIGFyZSBhIGJpdGZpZWxkLCBzbyBtdWx0aXBsZSBmbGFncyBtYXkgYmUgc2V0IG9uIGEgc2luZ2xlIGV4cHJlc3Npb24uXG4gKi9cbmVudW0gRmVuY2Uge1xuICAvKipcbiAgICogRW1wdHkgZmxhZyAobm8gZmVuY2UgZXhpc3RzKS5cbiAgICovXG4gIE5vbmUgPSAwYjAwMCxcblxuICAvKipcbiAgICogQSBjb250ZXh0IHJlYWQgZmVuY2UsIG1lYW5pbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiBpbiBxdWVzdGlvbiByZWFkcyBmcm9tIHRoZSBcImN1cnJlbnQgdmlld1wiXG4gICAqIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUuXG4gICAqL1xuICBWaWV3Q29udGV4dFJlYWQgPSAwYjAwMSxcblxuICAvKipcbiAgICogQSBjb250ZXh0IHdyaXRlIGZlbmNlLCBtZWFuaW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gaW4gcXVlc3Rpb24gd3JpdGVzIHRvIHRoZSBcImN1cnJlbnQgdmlld1wiXG4gICAqIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbGwgYENvbnRleHRXcml0ZWAgZmVuY2VzIGFyZSBpbXBsaWNpdGx5IGBDb250ZXh0UmVhZGAgZmVuY2VzIGFzIG9wZXJhdGlvbnMgd2hpY2hcbiAgICogY2hhbmdlIHRoZSB2aWV3IGNvbnRleHQgZG8gc28gYmFzZWQgb24gdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgVmlld0NvbnRleHRXcml0ZSA9IDBiMDEwLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGNhbGwgaXMgcmVxdWlyZWQgZm9yIGl0cyBzaWRlLWVmZmVjdHMsIGV2ZW4gaWYgbm90aGluZyByZWFkcyBpdHMgcmVzdWx0LlxuICAgKlxuICAgKiBUaGlzIGlzIGFsc28gdHJ1ZSBvZiBgVmlld0NvbnRleHRXcml0ZWAgb3BlcmF0aW9ucyAqKmlmKiogdGhleSBhcmUgZm9sbG93ZWQgYnkgYVxuICAgKiBgVmlld0NvbnRleHRSZWFkYC5cbiAgICovXG4gIFNpZGVFZmZlY3RmdWwgPSAwYjEwMCxcbn1cblxuLyoqXG4gKiBTdW1tYXJ5IGRhdGEgY29sbGVjdGVkIGZvciBlYWNoIGBPcGAgaW4gYSBsaXN0LlxuICpcbiAqIFRyYWNraW5nIHRoaXMgZGF0YSBwZXIgb3BlcmF0aW9uIGFsbG93cyB0aGUgb3B0aW1pemVyIHRvIHByb2Nlc3Mgb3BlcmF0aW9ucyBhdCBhIGhpZ2hlciBsZXZlbFxuICogdGhhbiBhbHdheXMgc2Nhbm5pbmcgZXhwcmVzc2lvbnMuXG4gKi9cbmludGVyZmFjZSBPcEluZm8ge1xuICAvKipcbiAgICogQSBgU2V0YCBvZiB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBleHByZXNzaW9ucyBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICovXG4gIHZhcmlhYmxlc1VzZWQ6IFNldDxpci5YcmVmSWQ+O1xuXG4gIC8qKlxuICAgKiBGbGFncyBpbmRpY2F0aW5nIGFueSBgRmVuY2VgcyBwcmVzZW50IGZvciB0aGlzIG9wZXJhdGlvbi5cbiAgICovXG4gIGZlbmNlczogRmVuY2U7XG59XG5cbmZ1bmN0aW9uIGlubGluZUFsd2F5c0lubGluZVZhcmlhYmxlcyhvcHM6IGlyLk9wTGlzdDxpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wPik6IHZvaWQge1xuICBjb25zdCB2YXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlZhcmlhYmxlT3A8aXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcD4+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5WYXJpYWJsZSAmJiBvcC5mbGFncyAmIGlyLlZhcmlhYmxlRmxhZ3MuQWx3YXlzSW5saW5lKSB7XG4gICAgICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIpID0+IHtcbiAgICAgICAgaWYgKGlyLmlzSXJFeHByZXNzaW9uKGV4cHIpICYmIGZlbmNlc0ZvcklyRXhwcmVzc2lvbihleHByKSAhPT0gRmVuY2UuTm9uZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uRXJyb3I6IEEgY29udGV4dC1zZW5zaXRpdmUgdmFyaWFibGUgd2FzIG1hcmtlZCBBbHdheXNJbmxpbmVgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXJzLnNldChvcC54cmVmLCBvcCk7XG4gICAgfVxuXG4gICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgb3AsXG4gICAgICAoZXhwcikgPT4ge1xuICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLlJlYWRWYXJpYWJsZUV4cHIgJiYgdmFycy5oYXMoZXhwci54cmVmKSkge1xuICAgICAgICAgIGNvbnN0IHZhck9wID0gdmFycy5nZXQoZXhwci54cmVmKSE7XG4gICAgICAgICAgLy8gSW5saW5lIGJ5IGNsb25pbmcsIGJlY2F1c2Ugd2UgbWlnaHQgaW5saW5lIGludG8gbXVsdGlwbGUgcGxhY2VzLlxuICAgICAgICAgIHJldHVybiB2YXJPcC5pbml0aWFsaXplci5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByO1xuICAgICAgfSxcbiAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lLFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHZhcnMudmFsdWVzKCkpIHtcbiAgICBpci5PcExpc3QucmVtb3ZlKG9wIGFzIGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApO1xuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhIGxpc3Qgb2Ygb3BlcmF0aW9ucyBhbmQgb3B0aW1pemUgdmFyaWFibGVzIHdpdGhpbiB0aGF0IGxpc3QuXG4gKi9cbmZ1bmN0aW9uIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QoXG4gIG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuICBjb21wYXRpYmlsaXR5OiBpci5Db21wYXRpYmlsaXR5TW9kZSxcbik6IHZvaWQge1xuICBjb25zdCB2YXJEZWNscyA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5WYXJpYWJsZU9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+PigpO1xuICBjb25zdCB2YXJVc2FnZXMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgbnVtYmVyPigpO1xuXG4gIC8vIFRyYWNrIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIG91dHNpZGUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYXRpb24gbGlzdC4gRm9yIGV4YW1wbGUsIHdpdGhpblxuICAvLyBgTGlzdGVuZXJPcGAgaGFuZGxlciBvcGVyYXRpb25zIG9mIGxpc3RlbmVycyBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbGlzdC5cbiAgY29uc3QgdmFyUmVtb3RlVXNhZ2VzID0gbmV3IFNldDxpci5YcmVmSWQ+KCk7XG4gIGNvbnN0IG9wTWFwID0gbmV3IE1hcDxpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLCBPcEluZm8+KCk7XG5cbiAgLy8gRmlyc3QsIGV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgdmFyaWFibGVzIGRlY2xhcmVkIG9yIHVzZWQgd2l0aGluIHRoZSB3aG9sZSBsaXN0LlxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUpIHtcbiAgICAgIGlmICh2YXJEZWNscy5oYXMob3AueHJlZikgfHwgdmFyVXNhZ2VzLmhhcyhvcC54cmVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNob3VsZCBub3Qgc2VlIHR3byBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgdmFyaWFibGU6ICR7b3AueHJlZn1gKTtcbiAgICAgIH1cbiAgICAgIHZhckRlY2xzLnNldChvcC54cmVmLCBvcCk7XG4gICAgICB2YXJVc2FnZXMuc2V0KG9wLnhyZWYsIDApO1xuICAgIH1cblxuICAgIG9wTWFwLnNldChvcCwgY29sbGVjdE9wSW5mbyhvcCkpO1xuICAgIGNvdW50VmFyaWFibGVVc2FnZXMob3AsIHZhclVzYWdlcywgdmFyUmVtb3RlVXNhZ2VzKTtcbiAgfVxuXG4gIC8vIFRoZSBuZXh0IHN0ZXAgaXMgdG8gcmVtb3ZlIGFueSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCB1c2VkLiBUaGVcbiAgLy8gdmFyaWFibGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgbWF5IGJlIHNpZGUtZWZmZWN0ZnVsLCBzbyB0aGV5IG1heSBuZWVkIHRvIGJlIHJldGFpbmVkIGFzXG4gIC8vIGV4cHJlc3Npb24gc3RhdGVtZW50cy5cblxuICAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIHNlZW4gYW4gb3BlcmF0aW9uIHdoaWNoIHJlYWRzIGZyb20gdGhlIHZpZXcgY29udGV4dCB5ZXQuIFRoaXMgaXMgdXNlZCB0b1xuICAvLyBkZXRlcm1pbmUgd2hldGhlciBhIHdyaXRlIHRvIHRoZSB2aWV3IGNvbnRleHQgaW4gYSB2YXJpYWJsZSBpbml0aWFsaXplciBjYW4gYmUgb2JzZXJ2ZWQuXG4gIGxldCBjb250ZXh0SXNVc2VkID0gZmFsc2U7XG5cbiAgLy8gTm90ZSB0aGF0IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsaXN0IGhhcHBlbnMgaW4gcmV2ZXJzZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHdlJ2xsIHByb2Nlc3NcbiAgLy8gYWxsIHJlYWRzIG9mIGEgdmFyaWFibGUgcHJpb3IgdG8gcHJvY2Vzc2luZyBpdHMgZGVjbGFyYXRpb24uXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzLnJldmVyc2VkKCkpIHtcbiAgICBjb25zdCBvcEluZm8gPSBvcE1hcC5nZXQob3ApITtcblxuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUgJiYgdmFyVXNhZ2VzLmdldChvcC54cmVmKSEgPT09IDApIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdW51c2VkIGFuZCBjYW4gYmUgcmVtb3ZlZC4gV2UgbWlnaHQgbmVlZCB0byBrZWVwIHRoZSBpbml0aWFsaXplciBhcm91bmQsXG4gICAgICAvLyB0aG91Z2gsIGlmIHNvbWV0aGluZyBkZXBlbmRzIG9uIGl0IHJ1bm5pbmcuXG4gICAgICBpZiAoXG4gICAgICAgIChjb250ZXh0SXNVc2VkICYmIG9wSW5mby5mZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFdyaXRlKSB8fFxuICAgICAgICBvcEluZm8uZmVuY2VzICYgRmVuY2UuU2lkZUVmZmVjdGZ1bFxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgdmFyaWFibGUgaW5pdGlhbGl6ZXIgaGFzIGEgc2lkZSBlZmZlY3Qgd2hpY2ggbXVzdCBiZSByZXRhaW5lZC4gRWl0aGVyOlxuICAgICAgICAvLyAgKiBpdCB3cml0ZXMgdG8gdGhlIHZpZXcgY29udGV4dCwgYW5kIHdlIGtub3cgdGhlcmUgaXMgYSBmdXR1cmUgb3BlcmF0aW9uIHdoaWNoIGRlcGVuZHNcbiAgICAgICAgLy8gICAgb24gdGhhdCB3cml0ZSwgb3JcbiAgICAgICAgLy8gICogaXQncyBhbiBvcGVyYXRpb24gd2hpY2ggaXMgaW5oZXJlbnRseSBzaWRlLWVmZmVjdGZ1bC5cbiAgICAgICAgLy8gV2UgY2FuJ3QgcmVtb3ZlIHRoZSBpbml0aWFsaXplciwgYnV0IHdlIGNhbiByZW1vdmUgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGl0c2VsZiBhbmRcbiAgICAgICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgc2lkZS1lZmZlY3RmdWwgc3RhdGVtZW50LlxuICAgICAgICBjb25zdCBzdG10T3AgPSBpci5jcmVhdGVTdGF0ZW1lbnRPcChvcC5pbml0aWFsaXplci50b1N0bXQoKSkgYXMgaXIuVXBkYXRlT3A7XG4gICAgICAgIG9wTWFwLnNldChzdG10T3AsIG9wSW5mbyk7XG4gICAgICAgIGlyLk9wTGlzdC5yZXBsYWNlKG9wIGFzIGlyLlVwZGF0ZU9wLCBzdG10T3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXQncyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGVudGlyZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhcyBub3RoaW5nIGRlcGVuZHMgb24gaXQsIGV2ZW5cbiAgICAgICAgLy8gc2lkZS1lZmZlY3RmdWxseS4gTm90ZSB0aGF0IGRvaW5nIHRoaXMgbWlnaHQgbWFrZSBvdGhlciB2YXJpYWJsZXMgdW51c2VkLiBTaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpdGVyYXRpbmcgaW4gcmV2ZXJzZSBvcmRlciwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBwcm9jZXNzaW5nIHVzYWdlcyBiZWZvcmUgZGVjbGFyYXRpb25zXG4gICAgICAgIC8vIGFuZCB0aGVyZWZvcmUgYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIGEgZGVjbGFyYXRpb24sIGFsbCByZW1vdmFibGUgdXNhZ2VzIHdpbGwgaGF2ZSBiZWVuXG4gICAgICAgIC8vIHJlbW92ZWQuXG4gICAgICAgIHVuY291bnRWYXJpYWJsZVVzYWdlcyhvcCwgdmFyVXNhZ2VzKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlbW92ZShvcCBhcyBpci5VcGRhdGVPcCk7XG4gICAgICB9XG5cbiAgICAgIG9wTWFwLmRlbGV0ZShvcCk7XG4gICAgICB2YXJEZWNscy5kZWxldGUob3AueHJlZik7XG4gICAgICB2YXJVc2FnZXMuZGVsZXRlKG9wLnhyZWYpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRG9lcyB0aGlzIG9wZXJhdGlvbiBkZXBlbmQgb24gdGhlIHZpZXcgY29udGV4dD9cbiAgICBpZiAob3BJbmZvLmZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgICAgY29udGV4dElzVXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gTmV4dCwgaW5saW5lIGFueSByZW1haW5pbmcgdmFyaWFibGVzIHdpdGggZXhhY3RseSBvbmUgdXNhZ2UuXG4gIGNvbnN0IHRvSW5saW5lOiBpci5YcmVmSWRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpZCwgY291bnRdIG9mIHZhclVzYWdlcykge1xuICAgIGNvbnN0IGRlY2wgPSB2YXJEZWNscy5nZXQoaWQpITtcbiAgICAvLyBXZSBjYW4gaW5saW5lIHZhcmlhYmxlcyB0aGF0OlxuICAgIC8vICAtIGFyZSB1c2VkIGV4YWN0bHkgb25jZSwgYW5kXG4gICAgLy8gIC0gYXJlIG5vdCB1c2VkIHJlbW90ZWx5XG4gICAgLy8gT1JcbiAgICAvLyAgLSBhcmUgbWFya2VkIGZvciBhbHdheXMgaW5saW5pbmdcbiAgICBjb25zdCBpc0Fsd2F5c0lubGluZSA9ICEhKGRlY2wuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSk7XG4gICAgaWYgKGNvdW50ICE9PSAxIHx8IGlzQWx3YXlzSW5saW5lKSB7XG4gICAgICAvLyBXZSBjYW4ndCBpbmxpbmUgdGhpcyB2YXJpYWJsZSBhcyBpdCdzIHVzZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFyUmVtb3RlVXNhZ2VzLmhhcyhpZCkpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBvbmNlLCBidXQgYWNyb3NzIGFuIG9wZXJhdGlvbiBib3VuZGFyeSwgc28gaXQgY2FuJ3QgYmUgaW5saW5lZC5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRvSW5saW5lLnB1c2goaWQpO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZTogaXIuWHJlZklkIHwgdW5kZWZpbmVkO1xuICB3aGlsZSAoKGNhbmRpZGF0ZSA9IHRvSW5saW5lLnBvcCgpKSkge1xuICAgIC8vIFdlIHdpbGwgYXR0ZW1wdCB0byBpbmxpbmUgdGhpcyB2YXJpYWJsZS4gSWYgaW5saW5pbmcgZmFpbHMgKGR1ZSB0byBmZW5jZXMgZm9yIGV4YW1wbGUpLFxuICAgIC8vIG5vIGZ1dHVyZSBvcGVyYXRpb24gd2lsbCBtYWtlIGlubGluaW5nIGxlZ2FsLlxuICAgIGNvbnN0IGRlY2wgPSB2YXJEZWNscy5nZXQoY2FuZGlkYXRlKSE7XG4gICAgY29uc3QgdmFySW5mbyA9IG9wTWFwLmdldChkZWNsIGFzIGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApITtcbiAgICBjb25zdCBpc0Fsd2F5c0lubGluZSA9ICEhKGRlY2wuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSk7XG5cbiAgICBpZiAoaXNBbHdheXNJbmxpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFzc2VydGlvbkVycm9yOiBGb3VuZCBhbiAnQWx3YXlzSW5saW5lJyB2YXJpYWJsZSBhZnRlciB0aGUgYWx3YXlzIGlubGluaW5nIHBhc3MuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiBvcGVyYXRpb25zIGZvbGxvd2luZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIGxvb2sgZm9yIHRoZSBwb2ludCB3aGVyZSB0aGF0IHZhcmlhYmxlXG4gICAgLy8gaXMgdXNlZC4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHVzYWdlIGdpdmVuIHRoZSBwcmVjb25kaXRpb24gYWJvdmUuXG4gICAgZm9yIChcbiAgICAgIGxldCB0YXJnZXRPcCA9IGRlY2wubmV4dCE7XG4gICAgICB0YXJnZXRPcC5raW5kICE9PSBpci5PcEtpbmQuTGlzdEVuZDtcbiAgICAgIHRhcmdldE9wID0gdGFyZ2V0T3AubmV4dCFcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wSW5mbyA9IG9wTWFwLmdldCh0YXJnZXRPcCkhO1xuXG4gICAgICAvLyBJcyB0aGUgdmFyaWFibGUgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbj9cbiAgICAgIGlmIChvcEluZm8udmFyaWFibGVzVXNlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29tcGF0aWJpbGl0eSA9PT0gaXIuQ29tcGF0aWJpbGl0eU1vZGUuVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlciAmJlxuICAgICAgICAgICFhbGxvd0NvbnNlcnZhdGl2ZUlubGluaW5nKGRlY2wsIHRhcmdldE9wKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBXZSdyZSBpbiBjb25zZXJ2YXRpdmUgbW9kZSwgYW5kIHRoaXMgdmFyaWFibGUgaXMgbm90IGVsaWdpYmxlIGZvciBpbmxpbmluZyBpbnRvIHRoZVxuICAgICAgICAgIC8vIHRhcmdldCBvcGVyYXRpb24gaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWWVzLCB0cnkgdG8gaW5saW5lIGl0LiBJbmxpbmluZyBtYXkgbm90IGJlIHN1Y2Nlc3NmdWwgaWYgZmVuY2VzIGluIHRoaXMgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAvLyB0aGUgdmFyaWFibGUncyB1c2FnZSBjYW5ub3QgYmUgc2FmZWx5IGNyb3NzZWQuXG4gICAgICAgIGlmICh0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKGNhbmRpZGF0ZSwgZGVjbC5pbml0aWFsaXplciwgdGFyZ2V0T3AsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAgIC8vIElubGluaW5nIHdhcyBzdWNjZXNzZnVsISBVcGRhdGUgdGhlIHRyYWNraW5nIHN0cnVjdHVyZXMgdG8gcmVmbGVjdCB0aGUgaW5saW5lZFxuICAgICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmRlbGV0ZShjYW5kaWRhdGUpO1xuXG4gICAgICAgICAgLy8gQWRkIGFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgdmFyaWFibGUncyBpbml0aWFsaXplciB0byBpdHMgbmV3IHVzYWdlIHNpdGUuXG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiB2YXJJbmZvLnZhcmlhYmxlc1VzZWQpIHtcbiAgICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmFkZChpZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWVyZ2UgZmVuY2VzIGluIHRoZSB2YXJpYWJsZSdzIGluaXRpYWxpemVyIGludG8gaXRzIG5ldyB1c2FnZSBzaXRlLlxuICAgICAgICAgIG9wSW5mby5mZW5jZXMgfD0gdmFySW5mby5mZW5jZXM7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdHJhY2tpbmcgaW5mbyByZWxhdGVkIHRvIHRoZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICB2YXJEZWNscy5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgICAgICB2YXJVc2FnZXMuZGVsZXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgb3BNYXAuZGVsZXRlKGRlY2wgYXMgaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCk7XG5cbiAgICAgICAgICAvLyBBbmQgZmluYWxseSwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb24gbGlzdC5cbiAgICAgICAgICBpci5PcExpc3QucmVtb3ZlKGRlY2wgYXMgaXIuVXBkYXRlT3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hldGhlciBpbmxpbmluZyBzdWNjZWVkZWQgb3IgZmFpbGVkLCB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbiwgdGhlbiB3ZSdkIG5lZWQgdG8gaW5saW5lIGFjcm9zcyBpdC4gQ2hlY2sgaWZcbiAgICAgIC8vIHRoYXQncyBzYWZlIHRvIGRvLlxuICAgICAgaWYgKCFzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKG9wSW5mby5mZW5jZXMsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAvLyBXZSBjYW4ndCBzYWZlbHkgaW5saW5lIHRoaXMgdmFyaWFibGUgYmV5b25kIHRoaXMgb3BlcmF0aW9uLCBzbyBkb24ndCBwcm9jZWVkIHdpdGhcbiAgICAgICAgLy8gaW5saW5pbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYGlyLkV4cHJlc3Npb25gLCByZXR1cm5zIHRoZSBgRmVuY2VgIGZsYWdzIGZvciB0aGF0IGV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHI6IGlyLkV4cHJlc3Npb24pOiBGZW5jZSB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5OZXh0Q29udGV4dDpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFJlYWQgfCBGZW5jZS5WaWV3Q29udGV4dFdyaXRlO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVzdG9yZVZpZXc6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRSZWFkIHwgRmVuY2UuVmlld0NvbnRleHRXcml0ZSB8IEZlbmNlLlNpZGVFZmZlY3RmdWw7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5TdG9yZUxldDpcbiAgICAgIHJldHVybiBGZW5jZS5TaWRlRWZmZWN0ZnVsO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVmZXJlbmNlOlxuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuQ29udGV4dExldFJlZmVyZW5jZTpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFJlYWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGZW5jZS5Ob25lO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBPcEluZm9gIHN0cnVjdHVyZSBmb3IgdGhlIGdpdmVuIGBvcGAuIFRoaXMgcGVyZm9ybXMgdHdvIG9wZXJhdGlvbnM6XG4gKlxuICogICogSXQgdHJhY2tzIHdoaWNoIHZhcmlhYmxlcyBhcmUgdXNlZCBpbiB0aGUgb3BlcmF0aW9uJ3MgZXhwcmVzc2lvbnMuXG4gKiAgKiBJdCByb2xscyB1cCBmZW5jZSBmbGFncyBmb3IgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RPcEluZm8ob3A6IGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApOiBPcEluZm8ge1xuICBsZXQgZmVuY2VzID0gRmVuY2UuTm9uZTtcbiAgY29uc3QgdmFyaWFibGVzVXNlZCA9IG5ldyBTZXQ8aXIuWHJlZklkPigpO1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIpID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICB2YXJpYWJsZXNVc2VkLmFkZChleHByLnhyZWYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZlbmNlcyB8PSBmZW5jZXNGb3JJckV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtmZW5jZXMsIHZhcmlhYmxlc1VzZWR9O1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgdXNhZ2VzIG9mIGVhY2ggdmFyaWFibGUsIGJlaW5nIGNhcmVmdWwgdG8gdHJhY2sgd2hldGhlciB0aG9zZSB1c2FnZXMgYXJlXG4gKiBsb2NhbCBvciByZW1vdGUuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmFyaWFibGVVc2FnZXMoXG4gIG9wOiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4gIHZhclJlbW90ZVVzYWdlOiBTZXQ8aXIuWHJlZklkPixcbik6IHZvaWQge1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIsIGZsYWdzKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXJVc2FnZXMuc2V0KGV4cHIueHJlZiwgY291bnQgKyAxKTtcblxuICAgIGlmIChmbGFncyAmIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5JbkNoaWxkT3BlcmF0aW9uKSB7XG4gICAgICB2YXJSZW1vdGVVc2FnZS5hZGQoZXhwci54cmVmKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbW92ZSB1c2FnZXMgb2YgYSB2YXJpYWJsZSBpbiBgb3BgIGZyb20gdGhlIGB2YXJVc2FnZXNgIHRyYWNraW5nLlxuICovXG5mdW5jdGlvbiB1bmNvdW50VmFyaWFibGVVc2FnZXMoXG4gIG9wOiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4pOiB2b2lkIHtcbiAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIChleHByKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluYWNjdXJhdGUgdmFyaWFibGUgY291bnQ6ICR7ZXhwci54cmVmfSAtIGZvdW5kIGFub3RoZXIgcmVhZCBidXQgY291bnQgaXMgYWxyZWFkeSAwYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHZhclVzYWdlcy5zZXQoZXhwci54cmVmLCBjb3VudCAtIDEpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpdCdzIHNhZmUgdG8gaW5saW5lIGEgdmFyaWFibGUgYWNyb3NzIGEgcGFydGljdWxhciBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIGZlbmNlcyB0aGUgZmVuY2VzIG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggdGhlIGlubGluaW5nIHdpbGwgY3Jvc3NcbiAqIEBwYXJhbSBkZWNsRmVuY2VzIHRoZSBmZW5jZXMgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGlubGluZWQuXG4gKi9cbmZ1bmN0aW9uIHNhZmVUb0lubGluZVBhc3RGZW5jZXMoZmVuY2VzOiBGZW5jZSwgZGVjbEZlbmNlczogRmVuY2UpOiBib29sZWFuIHtcbiAgaWYgKGZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0V3JpdGUpIHtcbiAgICAvLyBJdCdzIG5vdCBzYWZlIHRvIGlubGluZSBjb250ZXh0IHJlYWRzIGFjcm9zcyBjb250ZXh0IHdyaXRlcy5cbiAgICBpZiAoZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFJlYWQpIHtcbiAgICAvLyBJdCdzIG5vdCBzYWZlIHRvIGlubGluZSBjb250ZXh0IHdyaXRlcyBhY3Jvc3MgY29udGV4dCByZWFkcy5cbiAgICBpZiAoZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0V3JpdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIG9mIGEgdmFyaWFibGUgaW50byBhIHRhcmdldCBvcGVyYXRpb24ncyBleHByZXNzaW9ucy5cbiAqXG4gKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIHNhZmUgdG8gZG8uIEZvciBleGFtcGxlLCB0aGUgdmFyaWFibGUgY291bGQgYmUgcmVhZCBmb2xsb3dpbmcgdGhlXG4gKiBleGVjdXRpb24gb2YgYW4gZXhwcmVzc2lvbiB3aXRoIGZlbmNlcyB0aGF0IGRvbid0IHBlcm1pdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5saW5lZCBhY3Jvc3MgdGhlbS5cbiAqL1xuZnVuY3Rpb24gdHJ5SW5saW5lVmFyaWFibGVJbml0aWFsaXplcihcbiAgaWQ6IGlyLlhyZWZJZCxcbiAgaW5pdGlhbGl6ZXI6IG8uRXhwcmVzc2lvbixcbiAgdGFyZ2V0OiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICBkZWNsRmVuY2VzOiBGZW5jZSxcbik6IGJvb2xlYW4ge1xuICAvLyBXZSB1c2UgYGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcGAgdG8gd2FsayB0aGUgZXhwcmVzc2lvbnMgYW5kIGlubGluZSB0aGUgdmFyaWFibGUgaWZcbiAgLy8gcG9zc2libGUuIFNpbmNlIHRoaXMgb3BlcmF0aW9uIGlzIGNhbGxiYWNrLWJhc2VkLCBvbmNlIGlubGluaW5nIHN1Y2NlZWRzIG9yIGZhaWxzIHdlIGNhbid0XG4gIC8vIFwic3RvcFwiIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcsIGFuZCBoYXZlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpbmxpbmluZyBoYXMgc3VjY2VlZGVkIG9yXG4gIC8vIGlzIG5vIGxvbmdlciBhbGxvd2VkLlxuICBsZXQgaW5saW5lZCA9IGZhbHNlO1xuICBsZXQgaW5saW5pbmdBbGxvd2VkID0gdHJ1ZTtcblxuICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3AoXG4gICAgdGFyZ2V0LFxuICAgIChleHByLCBmbGFncykgPT4ge1xuICAgICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZWQgfHwgIWlubGluaW5nQWxsb3dlZCkge1xuICAgICAgICAvLyBFaXRoZXIgdGhlIGlubGluaW5nIGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCwgb3Igd2UndmUgcGFzc2VkIGEgZmVuY2UgdGhhdCBkaXNhbGxvd3MgaW5saW5pbmdcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgc28gZG9uJ3QgdHJ5LlxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZsYWdzICYgaXIuVmlzaXRvckNvbnRleHRGbGFnLkluQ2hpbGRPcGVyYXRpb24gJiZcbiAgICAgICAgZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZFxuICAgICAgKSB7XG4gICAgICAgIC8vIFdlIGNhbm5vdCBpbmxpbmUgdmFyaWFibGVzIHRoYXQgYXJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0IGFjcm9zcyBvcGVyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcy5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICAgIGlmIChleHByLnhyZWYgPT09IGlkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSB1c2FnZSBzaXRlIG9mIHRoZSB2YXJpYWJsZS4gU2luY2Ugbm90aGluZyBoYXMgZGlzYWxsb3dlZCBpbmxpbmluZywgaXQnc1xuICAgICAgICAgICAgLy8gc2FmZSB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIGhlcmUuXG4gICAgICAgICAgICBpbmxpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRm9yIG90aGVyIHR5cGVzIG9mIGBpci5FeHByZXNzaW9uYHMsIHdoZXRoZXIgaW5saW5pbmcgaXMgYWxsb3dlZCBkZXBlbmRzIG9uIHRoZWlyIGZlbmNlcy5cbiAgICAgICAgICBjb25zdCBleHByRmVuY2VzID0gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHIpO1xuICAgICAgICAgIGlubGluaW5nQWxsb3dlZCA9IGlubGluaW5nQWxsb3dlZCAmJiBzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKGV4cHJGZW5jZXMsIGRlY2xGZW5jZXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfSxcbiAgICBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSxcbiAgKTtcbiAgcmV0dXJuIGlubGluZWQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGlubGluaW5nIG9mIGBkZWNsYCBzaG91bGQgYmUgYWxsb3dlZCBpbiBcImNvbnNlcnZhdGl2ZVwiIG1vZGUuXG4gKlxuICogSW4gY29uc2VydmF0aXZlIG1vZGUsIGlubGluaW5nIGJlaGF2aW9yIGlzIGxpbWl0ZWQgdG8gdGhvc2Ugb3BlcmF0aW9ucyB3aGljaCB0aGVcbiAqIGBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyYCBzdXBwb3J0ZWQsIHdpdGggdGhlIGdvYWwgb2YgcHJvZHVjaW5nIGVxdWl2YWxlbnQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBhbGxvd0NvbnNlcnZhdGl2ZUlubGluaW5nKFxuICBkZWNsOiBpci5WYXJpYWJsZU9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuICB0YXJnZXQ6IGlyLk9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuKTogYm9vbGVhbiB7XG4gIC8vIFRPRE8oYWx4aHViKTogdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyIGFwcHJvYWNoZXMgaW5saW5pbmcsIGFuZCByZWNvcmRcbiAgLy8gdGhhdCBiZWhhdmlvciBoZXJlLlxuICBzd2l0Y2ggKGRlY2wudmFyaWFibGUua2luZCkge1xuICAgIGNhc2UgaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuSWRlbnRpZmllcjpcbiAgICAgIGlmIChkZWNsLmluaXRpYWxpemVyIGluc3RhbmNlb2Ygby5SZWFkVmFyRXhwciAmJiBkZWNsLmluaXRpYWxpemVyLm5hbWUgPT09ICdjdHgnKSB7XG4gICAgICAgIC8vIEFsdGhvdWdoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgY2F1dGlvdXMgYWJvdXQgaW5saW5pbmcsIHdlIHN0aWxsIHdhbnQgdG8gZG8gc29cbiAgICAgICAgLy8gd2hlbiB0aGUgdmFyaWFibGUgaXMgdGhlIGNvbnRleHQsIHRvIGltaXRhdGUgaXRzIGJlaGF2aW9yIHdpdGggYWxpYXNlcyBpbiBjb250cm9sIGZsb3dcbiAgICAgICAgLy8gYmxvY2tzLiBUaGlzIHF1aXJreSBiZWhhdmlvciB3aWxsIGJlY29tZSBkZWFkIGNvZGUgb25jZSBjb21wYXRpYmlsaXR5IG1vZGUgaXMgbm8gbG9uZ2VyXG4gICAgICAgIC8vIHN1cHBvcnRlZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBpci5TZW1hbnRpY1ZhcmlhYmxlS2luZC5Db250ZXh0OlxuICAgICAgLy8gQ29udGV4dCBjYW4gb25seSBiZSBpbmxpbmVkIGludG8gb3RoZXIgdmFyaWFibGVzLlxuICAgICAgcmV0dXJuIHRhcmdldC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
@@ -1,41 +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
- * Wraps ICUs that do not already belong to an i18n block in a new i18n block.
11
- */
12
- export function wrapI18nIcus(job) {
13
- for (const unit of job.units) {
14
- let currentI18nOp = null;
15
- let addedI18nId = null;
16
- for (const op of unit.create) {
17
- switch (op.kind) {
18
- case ir.OpKind.I18nStart:
19
- currentI18nOp = op;
20
- break;
21
- case ir.OpKind.I18nEnd:
22
- currentI18nOp = null;
23
- break;
24
- case ir.OpKind.IcuStart:
25
- if (currentI18nOp === null) {
26
- addedI18nId = job.allocateXrefId();
27
- // ICU i18n start/end ops should not receive source spans.
28
- ir.OpList.insertBefore(ir.createI18nStartOp(addedI18nId, op.message, undefined, null), op);
29
- }
30
- break;
31
- case ir.OpKind.IcuEnd:
32
- if (addedI18nId !== null) {
33
- ir.OpList.insertAfter(ir.createI18nEndOp(addedI18nId, null), op);
34
- addedI18nId = null;
35
- }
36
- break;
37
- }
38
- }
39
- }
40
- }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcF9pY3VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvd3JhcF9pY3VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFtQjtJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLGFBQWEsR0FBMEIsSUFBSSxDQUFDO1FBQ2hELElBQUksV0FBVyxHQUFxQixJQUFJLENBQUM7UUFDekMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUN0QixhQUFhLEdBQUcsRUFBRSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNwQixhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUNyQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRO29CQUNyQixJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDM0IsV0FBVyxHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDbkMsMERBQTBEO3dCQUMxRCxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FDcEIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFDOUQsRUFBRSxDQUNILENBQUM7b0JBQ0osQ0FBQztvQkFDRCxNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNuQixJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDekIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQWMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzlFLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ3JCLENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIFdyYXBzIElDVXMgdGhhdCBkbyBub3QgYWxyZWFkeSBiZWxvbmcgdG8gYW4gaTE4biBibG9jayBpbiBhIG5ldyBpMThuIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEkxOG5JY3VzKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGxldCBjdXJyZW50STE4bk9wOiBpci5JMThuU3RhcnRPcCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBhZGRlZEkxOG5JZDogaXIuWHJlZklkIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5TdGFydDpcbiAgICAgICAgICBjdXJyZW50STE4bk9wID0gb3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5FbmQ6XG4gICAgICAgICAgY3VycmVudEkxOG5PcCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkljdVN0YXJ0OlxuICAgICAgICAgIGlmIChjdXJyZW50STE4bk9wID09PSBudWxsKSB7XG4gICAgICAgICAgICBhZGRlZEkxOG5JZCA9IGpvYi5hbGxvY2F0ZVhyZWZJZCgpO1xuICAgICAgICAgICAgLy8gSUNVIGkxOG4gc3RhcnQvZW5kIG9wcyBzaG91bGQgbm90IHJlY2VpdmUgc291cmNlIHNwYW5zLlxuICAgICAgICAgICAgaXIuT3BMaXN0Lmluc2VydEJlZm9yZTxpci5DcmVhdGVPcD4oXG4gICAgICAgICAgICAgIGlyLmNyZWF0ZUkxOG5TdGFydE9wKGFkZGVkSTE4bklkLCBvcC5tZXNzYWdlLCB1bmRlZmluZWQsIG51bGwpLFxuICAgICAgICAgICAgICBvcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5JY3VFbmQ6XG4gICAgICAgICAgaWYgKGFkZGVkSTE4bklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpci5PcExpc3QuaW5zZXJ0QWZ0ZXI8aXIuQ3JlYXRlT3A+KGlyLmNyZWF0ZUkxOG5FbmRPcChhZGRlZEkxOG5JZCwgbnVsbCksIG9wKTtcbiAgICAgICAgICAgIGFkZGVkSTE4bklkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,29 +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
- * Gets a map of all elements in the given view by their xref id.
11
- */
12
- export function createOpXrefMap(unit) {
13
- const map = new Map();
14
- for (const op of unit.create) {
15
- if (!ir.hasConsumesSlotTrait(op)) {
16
- continue;
17
- }
18
- map.set(op.xref, op);
19
- // TODO(dylhunn): `@for` loops with `@empty` blocks need to be special-cased here,
20
- // because the slot consumer trait currently only supports one slot per consumer and we
21
- // need two. This should be revisited when making the refactors mentioned in:
22
- // https://github.com/angular/angular/pull/53620#discussion_r1430918822
23
- if (op.kind === ir.OpKind.RepeaterCreate && op.emptyView !== null) {
24
- map.set(op.emptyView, op);
25
- }
26
- }
27
- return map;
28
- }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3V0aWwvZWxlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFxQjtJQUVyQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztJQUN2RSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsU0FBUztRQUNYLENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckIsa0ZBQWtGO1FBQ2xGLHVGQUF1RjtRQUN2Riw2RUFBNkU7UUFDN0UsdUVBQXVFO1FBQ3ZFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQgdHlwZSB7Q29tcGlsYXRpb25Vbml0fSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogR2V0cyBhIG1hcCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHZpZXcgYnkgdGhlaXIgeHJlZiBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wWHJlZk1hcChcbiAgdW5pdDogQ29tcGlsYXRpb25Vbml0LFxuKTogTWFwPGlyLlhyZWZJZCwgaXIuQ29uc3VtZXNTbG90T3BUcmFpdCAmIGlyLkNyZWF0ZU9wPiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5Db25zdW1lc1Nsb3RPcFRyYWl0ICYgaXIuQ3JlYXRlT3A+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICBpZiAoIWlyLmhhc0NvbnN1bWVzU2xvdFRyYWl0KG9wKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG1hcC5zZXQob3AueHJlZiwgb3ApO1xuXG4gICAgLy8gVE9ETyhkeWxodW5uKTogYEBmb3JgIGxvb3BzIHdpdGggYEBlbXB0eWAgYmxvY2tzIG5lZWQgdG8gYmUgc3BlY2lhbC1jYXNlZCBoZXJlLFxuICAgIC8vIGJlY2F1c2UgdGhlIHNsb3QgY29uc3VtZXIgdHJhaXQgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgb25lIHNsb3QgcGVyIGNvbnN1bWVyIGFuZCB3ZVxuICAgIC8vIG5lZWQgdHdvLiBUaGlzIHNob3VsZCBiZSByZXZpc2l0ZWQgd2hlbiBtYWtpbmcgdGhlIHJlZmFjdG9ycyBtZW50aW9uZWQgaW46XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9wdWxsLzUzNjIwI2Rpc2N1c3Npb25fcjE0MzA5MTg4MjJcbiAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlICYmIG9wLmVtcHR5VmlldyAhPT0gbnVsbCkge1xuICAgICAgbWFwLnNldChvcC5lbXB0eVZpZXcsIG9wKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==