@angular/compiler 19.0.0-next.0 → 19.0.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/compiler.mjs +4742 -4473
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +35 -3
- package/package.json +2 -4
- package/esm2022/compiler.mjs +0 -13
- package/esm2022/index.mjs +0 -13
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/assertions.mjs +0 -31
- package/esm2022/src/chars.mjs +0 -90
- package/esm2022/src/compiler.mjs +0 -88
- package/esm2022/src/compiler_facade_interface.mjs +0 -29
- package/esm2022/src/config.mjs +0 -20
- package/esm2022/src/constant_pool.mjs +0 -285
- package/esm2022/src/core.mjs +0 -96
- package/esm2022/src/expression_parser/ast.mjs +0 -755
- package/esm2022/src/expression_parser/lexer.mjs +0 -421
- package/esm2022/src/expression_parser/parser.mjs +0 -1222
- package/esm2022/src/i18n/digest.mjs +0 -322
- package/esm2022/src/i18n/extractor_merger.mjs +0 -409
- package/esm2022/src/i18n/i18n_ast.mjs +0 -212
- package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
- package/esm2022/src/i18n/i18n_parser.mjs +0 -247
- package/esm2022/src/i18n/index.mjs +0 -16
- package/esm2022/src/i18n/message_bundle.mjs +0 -93
- package/esm2022/src/i18n/parse_util.mjs +0 -17
- package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
- package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
- package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
- package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
- package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
- package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
- package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
- package/esm2022/src/i18n/translation_bundle.mjs +0 -164
- package/esm2022/src/injectable_compiler_2.mjs +0 -138
- package/esm2022/src/jit_compiler_facade.mjs +0 -681
- package/esm2022/src/ml_parser/ast.mjs +0 -167
- package/esm2022/src/ml_parser/defaults.mjs +0 -24
- package/esm2022/src/ml_parser/entities.mjs +0 -2144
- package/esm2022/src/ml_parser/html_parser.mjs +0 -18
- package/esm2022/src/ml_parser/html_tags.mjs +0 -156
- package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
- package/esm2022/src/ml_parser/lexer.mjs +0 -1210
- package/esm2022/src/ml_parser/parser.mjs +0 -539
- package/esm2022/src/ml_parser/tags.mjs +0 -47
- package/esm2022/src/ml_parser/tokens.mjs +0 -9
- package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
- package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
- package/esm2022/src/output/abstract_emitter.mjs +0 -524
- package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
- package/esm2022/src/output/map_util.mjs +0 -19
- package/esm2022/src/output/output_ast.mjs +0 -1301
- package/esm2022/src/output/output_jit.mjs +0 -138
- package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
- package/esm2022/src/output/source_map.mjs +0 -150
- package/esm2022/src/parse_util.mjs +0 -198
- package/esm2022/src/render3/partial/api.mjs +0 -9
- package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
- package/esm2022/src/render3/partial/component.mjs +0 -197
- package/esm2022/src/render3/partial/directive.mjs +0 -264
- package/esm2022/src/render3/partial/factory.mjs +0 -35
- package/esm2022/src/render3/partial/injectable.mjs +0 -67
- package/esm2022/src/render3/partial/injector.mjs +0 -41
- package/esm2022/src/render3/partial/ng_module.mjs +0 -63
- package/esm2022/src/render3/partial/pipe.mjs +0 -50
- package/esm2022/src/render3/partial/util.mjs +0 -79
- package/esm2022/src/render3/r3_ast.mjs +0 -493
- package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
- package/esm2022/src/render3/r3_control_flow.mjs +0 -421
- package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
- package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
- package/esm2022/src/render3/r3_factory.mjs +0 -200
- package/esm2022/src/render3/r3_identifiers.mjs +0 -480
- package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
- package/esm2022/src/render3/r3_jit.mjs +0 -29
- package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
- package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_template_transform.mjs +0 -560
- package/esm2022/src/render3/util.mjs +0 -90
- package/esm2022/src/render3/view/api.mjs +0 -14
- package/esm2022/src/render3/view/compiler.mjs +0 -546
- package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
- package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
- package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
- package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
- package/esm2022/src/render3/view/i18n/util.mjs +0 -70
- package/esm2022/src/render3/view/query_generation.mjs +0 -182
- package/esm2022/src/render3/view/t2_api.mjs +0 -9
- package/esm2022/src/render3/view/t2_binder.mjs +0 -823
- package/esm2022/src/render3/view/template.mjs +0 -113
- package/esm2022/src/render3/view/util.mjs +0 -192
- package/esm2022/src/resource_loader.mjs +0 -17
- package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
- package/esm2022/src/schema/dom_security_schema.mjs +0 -96
- package/esm2022/src/schema/element_schema_registry.mjs +0 -10
- package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
- package/esm2022/src/selector.mjs +0 -400
- package/esm2022/src/shadow_css.mjs +0 -1053
- package/esm2022/src/style_url_resolver.mjs +0 -17
- package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
- package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
- package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
- package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
- package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
- package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
- package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
- package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
- package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
- package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
- package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
- package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
- package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
- package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
- package/esm2022/src/template_parser/binding_parser.mjs +0 -465
- package/esm2022/src/template_parser/template_preparser.mjs +0 -84
- package/esm2022/src/util.mjs +0 -124
- package/esm2022/src/version.mjs +0 -15
|
@@ -1,36 +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
|
-
* It's not allowed to access a `@let` declaration before it has been defined. This is enforced
|
|
12
|
-
* already via template type checking, however it can trip some of the assertions in the pipeline.
|
|
13
|
-
* E.g. the naming phase can fail because we resolved the variable here, but the variable doesn't
|
|
14
|
-
* exist anymore because the optimization phase removed it since it's invalid. To avoid surfacing
|
|
15
|
-
* confusing errors to users in the case where template type checking isn't running (e.g. in JIT
|
|
16
|
-
* mode) this phase detects illegal forward references and replaces them with `undefined`.
|
|
17
|
-
* Eventually users will see the proper error from the template type checker.
|
|
18
|
-
*/
|
|
19
|
-
export function removeIllegalLetReferences(job) {
|
|
20
|
-
for (const unit of job.units) {
|
|
21
|
-
for (const op of unit.update) {
|
|
22
|
-
if (op.kind !== ir.OpKind.Variable ||
|
|
23
|
-
op.variable.kind !== ir.SemanticVariableKind.Identifier ||
|
|
24
|
-
!(op.initializer instanceof ir.StoreLetExpr)) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const name = op.variable.identifier;
|
|
28
|
-
let current = op;
|
|
29
|
-
while (current && current.kind !== ir.OpKind.ListEnd) {
|
|
30
|
-
ir.transformExpressionsInOp(current, (expr) => expr instanceof ir.LexicalReadExpr && expr.name === name ? o.literal(undefined) : expr, ir.VisitorContextFlag.None);
|
|
31
|
-
current = current.prev;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlX2lsbGVnYWxfbGV0X3JlZmVyZW5jZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9yZW1vdmVfaWxsZWdhbF9sZXRfcmVmZXJlbmNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEdBQW1CO0lBQzVELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQ0UsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQzlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVO2dCQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQzVDLENBQUM7Z0JBQ0QsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLE9BQU8sR0FBdUIsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckQsRUFBRSxDQUFDLHdCQUF3QixDQUN6QixPQUFPLEVBQ1AsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksWUFBWSxFQUFFLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3hGLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNCLENBQUM7Z0JBQ0YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBJdCdzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyBhIGBAbGV0YCBkZWNsYXJhdGlvbiBiZWZvcmUgaXQgaGFzIGJlZW4gZGVmaW5lZC4gVGhpcyBpcyBlbmZvcmNlZFxuICogYWxyZWFkeSB2aWEgdGVtcGxhdGUgdHlwZSBjaGVja2luZywgaG93ZXZlciBpdCBjYW4gdHJpcCBzb21lIG9mIHRoZSBhc3NlcnRpb25zIGluIHRoZSBwaXBlbGluZS5cbiAqIEUuZy4gdGhlIG5hbWluZyBwaGFzZSBjYW4gZmFpbCBiZWNhdXNlIHdlIHJlc29sdmVkIHRoZSB2YXJpYWJsZSBoZXJlLCBidXQgdGhlIHZhcmlhYmxlIGRvZXNuJ3RcbiAqIGV4aXN0IGFueW1vcmUgYmVjYXVzZSB0aGUgb3B0aW1pemF0aW9uIHBoYXNlIHJlbW92ZWQgaXQgc2luY2UgaXQncyBpbnZhbGlkLiBUbyBhdm9pZCBzdXJmYWNpbmdcbiAqIGNvbmZ1c2luZyBlcnJvcnMgdG8gdXNlcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGVtcGxhdGUgdHlwZSBjaGVja2luZyBpc24ndCBydW5uaW5nIChlLmcuIGluIEpJVFxuICogbW9kZSkgdGhpcyBwaGFzZSBkZXRlY3RzIGlsbGVnYWwgZm9yd2FyZCByZWZlcmVuY2VzIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggYHVuZGVmaW5lZGAuXG4gKiBFdmVudHVhbGx5IHVzZXJzIHdpbGwgc2VlIHRoZSBwcm9wZXIgZXJyb3IgZnJvbSB0aGUgdGVtcGxhdGUgdHlwZSBjaGVja2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSWxsZWdhbExldFJlZmVyZW5jZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LnVwZGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICBvcC5raW5kICE9PSBpci5PcEtpbmQuVmFyaWFibGUgfHxcbiAgICAgICAgb3AudmFyaWFibGUua2luZCAhPT0gaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuSWRlbnRpZmllciB8fFxuICAgICAgICAhKG9wLmluaXRpYWxpemVyIGluc3RhbmNlb2YgaXIuU3RvcmVMZXRFeHByKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gb3AudmFyaWFibGUuaWRlbnRpZmllcjtcbiAgICAgIGxldCBjdXJyZW50OiBpci5VcGRhdGVPcCB8IG51bGwgPSBvcDtcbiAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQua2luZCAhPT0gaXIuT3BLaW5kLkxpc3RFbmQpIHtcbiAgICAgICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgKGV4cHIpID0+XG4gICAgICAgICAgICBleHByIGluc3RhbmNlb2YgaXIuTGV4aWNhbFJlYWRFeHByICYmIGV4cHIubmFtZSA9PT0gbmFtZSA/IG8ubGl0ZXJhbCh1bmRlZmluZWQpIDogZXhwcixcbiAgICAgICAgICBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,33 +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
|
-
* i18nAttributes ops will be generated for each i18n attribute. However, not all i18n attribues
|
|
11
|
-
* will contain dynamic content, and so some of these i18nAttributes ops may be unnecessary.
|
|
12
|
-
*/
|
|
13
|
-
export function removeUnusedI18nAttributesOps(job) {
|
|
14
|
-
for (const unit of job.units) {
|
|
15
|
-
const ownersWithI18nExpressions = new Set();
|
|
16
|
-
for (const op of unit.update) {
|
|
17
|
-
switch (op.kind) {
|
|
18
|
-
case ir.OpKind.I18nExpression:
|
|
19
|
-
ownersWithI18nExpressions.add(op.i18nOwner);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
for (const op of unit.create) {
|
|
23
|
-
switch (op.kind) {
|
|
24
|
-
case ir.OpKind.I18nAttributes:
|
|
25
|
-
if (ownersWithI18nExpressions.has(op.xref)) {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
ir.OpList.remove(op);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlX3VudXNlZF9pMThuX2F0dHJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvcmVtb3ZlX3VudXNlZF9pMThuX2F0dHJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxHQUFtQjtJQUMvRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7UUFFdkQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjO29CQUMzQix5QkFBeUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjO29CQUMzQixJQUFJLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDM0MsU0FBUztvQkFDWCxDQUFDO29CQUNELEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIGkxOG5BdHRyaWJ1dGVzIG9wcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBpMThuIGF0dHJpYnV0ZS4gSG93ZXZlciwgbm90IGFsbCBpMThuIGF0dHJpYnVlc1xuICogd2lsbCBjb250YWluIGR5bmFtaWMgY29udGVudCwgYW5kIHNvIHNvbWUgb2YgdGhlc2UgaTE4bkF0dHJpYnV0ZXMgb3BzIG1heSBiZSB1bm5lY2Vzc2FyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVVudXNlZEkxOG5BdHRyaWJ1dGVzT3BzKGpvYjogQ29tcGlsYXRpb25Kb2IpIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGNvbnN0IG93bmVyc1dpdGhJMThuRXhwcmVzc2lvbnMgPSBuZXcgU2V0PGlyLlhyZWZJZD4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC51cGRhdGUpIHtcbiAgICAgIHN3aXRjaCAob3Aua2luZCkge1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5JMThuRXhwcmVzc2lvbjpcbiAgICAgICAgICBvd25lcnNXaXRoSTE4bkV4cHJlc3Npb25zLmFkZChvcC5pMThuT3duZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIHN3aXRjaCAob3Aua2luZCkge1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5JMThuQXR0cmlidXRlczpcbiAgICAgICAgICBpZiAob3duZXJzV2l0aEkxOG5FeHByZXNzaW9ucy5oYXMob3AueHJlZikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpci5PcExpc3QucmVtb3ZlPGlyLkNyZWF0ZU9wPihvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,60 +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
|
-
* Resolves `ir.ContextExpr` expressions (which represent embedded view or component contexts) to
|
|
12
|
-
* either the `ctx` parameter to component functions (for the current view context) or to variables
|
|
13
|
-
* that store those contexts (for contexts accessed via the `nextContext()` instruction).
|
|
14
|
-
*/
|
|
15
|
-
export function resolveContexts(job) {
|
|
16
|
-
for (const unit of job.units) {
|
|
17
|
-
processLexicalScope(unit, unit.create);
|
|
18
|
-
processLexicalScope(unit, unit.update);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function processLexicalScope(view, ops) {
|
|
22
|
-
// Track the expressions used to access all available contexts within the current view, by the
|
|
23
|
-
// view `ir.XrefId`.
|
|
24
|
-
const scope = new Map();
|
|
25
|
-
// The current view's context is accessible via the `ctx` parameter.
|
|
26
|
-
scope.set(view.xref, o.variable('ctx'));
|
|
27
|
-
for (const op of ops) {
|
|
28
|
-
switch (op.kind) {
|
|
29
|
-
case ir.OpKind.Variable:
|
|
30
|
-
switch (op.variable.kind) {
|
|
31
|
-
case ir.SemanticVariableKind.Context:
|
|
32
|
-
scope.set(op.variable.view, new ir.ReadVariableExpr(op.xref));
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
break;
|
|
36
|
-
case ir.OpKind.Listener:
|
|
37
|
-
case ir.OpKind.TwoWayListener:
|
|
38
|
-
processLexicalScope(view, op.handlerOps);
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (view === view.job.root) {
|
|
43
|
-
// Prefer `ctx` of the root view to any variables which happen to contain the root context.
|
|
44
|
-
scope.set(view.xref, o.variable('ctx'));
|
|
45
|
-
}
|
|
46
|
-
for (const op of ops) {
|
|
47
|
-
ir.transformExpressionsInOp(op, (expr) => {
|
|
48
|
-
if (expr instanceof ir.ContextExpr) {
|
|
49
|
-
if (!scope.has(expr.view)) {
|
|
50
|
-
throw new Error(`No context found for reference to view ${expr.view} from view ${view.xref}`);
|
|
51
|
-
}
|
|
52
|
-
return scope.get(expr.view);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
return expr;
|
|
56
|
-
}
|
|
57
|
-
}, ir.VisitorContextFlag.None);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZV9jb250ZXh0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL3Jlc29sdmVfY29udGV4dHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVEvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFtQjtJQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixJQUFxQixFQUNyQixHQUF5QztJQUV6Qyw4RkFBOEY7SUFDOUYsb0JBQW9CO0lBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO0lBRWpELG9FQUFvRTtJQUNwRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXhDLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxFQUFFLENBQUMsb0JBQW9CLENBQUMsT0FBTzt3QkFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDOUQsTUFBTTtnQkFDVixDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ3hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjO2dCQUMzQixtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLDJGQUEyRjtRQUMzRixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyx3QkFBd0IsQ0FDekIsRUFBRSxFQUNGLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDUCxJQUFJLElBQUksWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMxQixNQUFNLElBQUksS0FBSyxDQUNiLDBDQUEwQyxJQUFJLENBQUMsSUFBSSxjQUFjLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FDN0UsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFFLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsRUFDRCxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUMzQixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQge1xuICBDb21waWxhdGlvbkpvYixcbiAgQ29tcGlsYXRpb25Vbml0LFxuICBDb21wb25lbnRDb21waWxhdGlvbkpvYixcbiAgVmlld0NvbXBpbGF0aW9uVW5pdCxcbn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIFJlc29sdmVzIGBpci5Db250ZXh0RXhwcmAgZXhwcmVzc2lvbnMgKHdoaWNoIHJlcHJlc2VudCBlbWJlZGRlZCB2aWV3IG9yIGNvbXBvbmVudCBjb250ZXh0cykgdG9cbiAqIGVpdGhlciB0aGUgYGN0eGAgcGFyYW1ldGVyIHRvIGNvbXBvbmVudCBmdW5jdGlvbnMgKGZvciB0aGUgY3VycmVudCB2aWV3IGNvbnRleHQpIG9yIHRvIHZhcmlhYmxlc1xuICogdGhhdCBzdG9yZSB0aG9zZSBjb250ZXh0cyAoZm9yIGNvbnRleHRzIGFjY2Vzc2VkIHZpYSB0aGUgYG5leHRDb250ZXh0KClgIGluc3RydWN0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZXh0cyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBwcm9jZXNzTGV4aWNhbFNjb3BlKHVuaXQsIHVuaXQuY3JlYXRlKTtcbiAgICBwcm9jZXNzTGV4aWNhbFNjb3BlKHVuaXQsIHVuaXQudXBkYXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzTGV4aWNhbFNjb3BlKFxuICB2aWV3OiBDb21waWxhdGlvblVuaXQsXG4gIG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuKTogdm9pZCB7XG4gIC8vIFRyYWNrIHRoZSBleHByZXNzaW9ucyB1c2VkIHRvIGFjY2VzcyBhbGwgYXZhaWxhYmxlIGNvbnRleHRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3LCBieSB0aGVcbiAgLy8gdmlldyBgaXIuWHJlZklkYC5cbiAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwPGlyLlhyZWZJZCwgby5FeHByZXNzaW9uPigpO1xuXG4gIC8vIFRoZSBjdXJyZW50IHZpZXcncyBjb250ZXh0IGlzIGFjY2Vzc2libGUgdmlhIHRoZSBgY3R4YCBwYXJhbWV0ZXIuXG4gIHNjb3BlLnNldCh2aWV3LnhyZWYsIG8udmFyaWFibGUoJ2N0eCcpKTtcblxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgIHN3aXRjaCAob3Aua2luZCkge1xuICAgICAgY2FzZSBpci5PcEtpbmQuVmFyaWFibGU6XG4gICAgICAgIHN3aXRjaCAob3AudmFyaWFibGUua2luZCkge1xuICAgICAgICAgIGNhc2UgaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuQ29udGV4dDpcbiAgICAgICAgICAgIHNjb3BlLnNldChvcC52YXJpYWJsZS52aWV3LCBuZXcgaXIuUmVhZFZhcmlhYmxlRXhwcihvcC54cmVmKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgaXIuT3BLaW5kLkxpc3RlbmVyOlxuICAgICAgY2FzZSBpci5PcEtpbmQuVHdvV2F5TGlzdGVuZXI6XG4gICAgICAgIHByb2Nlc3NMZXhpY2FsU2NvcGUodmlldywgb3AuaGFuZGxlck9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2aWV3ID09PSB2aWV3LmpvYi5yb290KSB7XG4gICAgLy8gUHJlZmVyIGBjdHhgIG9mIHRoZSByb290IHZpZXcgdG8gYW55IHZhcmlhYmxlcyB3aGljaCBoYXBwZW4gdG8gY29udGFpbiB0aGUgcm9vdCBjb250ZXh0LlxuICAgIHNjb3BlLnNldCh2aWV3LnhyZWYsIG8udmFyaWFibGUoJ2N0eCcpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgb3AsXG4gICAgICAoZXhwcikgPT4ge1xuICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLkNvbnRleHRFeHByKSB7XG4gICAgICAgICAgaWYgKCFzY29wZS5oYXMoZXhwci52aWV3KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgTm8gY29udGV4dCBmb3VuZCBmb3IgcmVmZXJlbmNlIHRvIHZpZXcgJHtleHByLnZpZXd9IGZyb20gdmlldyAke3ZpZXcueHJlZn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNjb3BlLmdldChleHByLnZpZXcpITtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,31 +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
|
-
* Resolve the dependency function of a deferred block.
|
|
11
|
-
*/
|
|
12
|
-
export function resolveDeferDepsFns(job) {
|
|
13
|
-
for (const unit of job.units) {
|
|
14
|
-
for (const op of unit.create) {
|
|
15
|
-
if (op.kind === ir.OpKind.Defer) {
|
|
16
|
-
if (op.resolverFn !== null) {
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (op.ownResolverFn !== null) {
|
|
20
|
-
if (op.handle.slot === null) {
|
|
21
|
-
throw new Error('AssertionError: slot must be assigned before extracting defer deps functions');
|
|
22
|
-
}
|
|
23
|
-
const fullPathName = unit.fnName?.replace('_Template', '');
|
|
24
|
-
op.resolverFn = job.pool.getSharedFunctionReference(op.ownResolverFn, `${fullPathName}_Defer_${op.handle.slot}_DepsFn`,
|
|
25
|
-
/* Don't use unique names for TDB compatibility */ false);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZV9kZWZlcl9kZXBzX2Zucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL3Jlc29sdmVfZGVmZXJfZGVwc19mbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBNEI7SUFDOUQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksRUFBRSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDM0IsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksRUFBRSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEUsQ0FDL0UsQ0FBQztvQkFDSixDQUFDO29CQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0QsRUFBRSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUNqRCxFQUFFLENBQUMsYUFBYSxFQUNoQixHQUFHLFlBQVksVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUztvQkFDaEQsa0RBQWtELENBQUMsS0FBSyxDQUN6RCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcG9uZW50Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBkZXBlbmRlbmN5IGZ1bmN0aW9uIG9mIGEgZGVmZXJyZWQgYmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmZXJEZXBzRm5zKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuRGVmZXIpIHtcbiAgICAgICAgaWYgKG9wLnJlc29sdmVyRm4gIT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcC5vd25SZXNvbHZlckZuICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKG9wLmhhbmRsZS5zbG90ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdBc3NlcnRpb25FcnJvcjogc2xvdCBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBleHRyYWN0aW5nIGRlZmVyIGRlcHMgZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoTmFtZSA9IHVuaXQuZm5OYW1lPy5yZXBsYWNlKCdfVGVtcGxhdGUnLCAnJyk7XG4gICAgICAgICAgb3AucmVzb2x2ZXJGbiA9IGpvYi5wb29sLmdldFNoYXJlZEZ1bmN0aW9uUmVmZXJlbmNlKFxuICAgICAgICAgICAgb3Aub3duUmVzb2x2ZXJGbixcbiAgICAgICAgICAgIGAke2Z1bGxQYXRoTmFtZX1fRGVmZXJfJHtvcC5oYW5kbGUuc2xvdH1fRGVwc0ZuYCxcbiAgICAgICAgICAgIC8qIERvbid0IHVzZSB1bmlxdWUgbmFtZXMgZm9yIFREQiBjb21wYXRpYmlsaXR5ICovIGZhbHNlLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,36 +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
|
-
* Any variable inside a listener with the name `$event` will be transformed into a output lexical
|
|
12
|
-
* read immediately, and does not participate in any of the normal logic for handling variables.
|
|
13
|
-
*/
|
|
14
|
-
export function resolveDollarEvent(job) {
|
|
15
|
-
for (const unit of job.units) {
|
|
16
|
-
transformDollarEvent(unit.create);
|
|
17
|
-
transformDollarEvent(unit.update);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function transformDollarEvent(ops) {
|
|
21
|
-
for (const op of ops) {
|
|
22
|
-
if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
|
|
23
|
-
ir.transformExpressionsInOp(op, (expr) => {
|
|
24
|
-
if (expr instanceof ir.LexicalReadExpr && expr.name === '$event') {
|
|
25
|
-
// Two-way listeners always consume `$event` so they omit this field.
|
|
26
|
-
if (op.kind === ir.OpKind.Listener) {
|
|
27
|
-
op.consumesDollarEvent = true;
|
|
28
|
-
}
|
|
29
|
-
return new o.ReadVarExpr(expr.name);
|
|
30
|
-
}
|
|
31
|
-
return expr;
|
|
32
|
-
}, ir.VisitorContextFlag.InChildOperation);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZV9kb2xsYXJfZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9yZXNvbHZlX2RvbGxhcl9ldmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFtQjtJQUNwRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxHQUFvRDtJQUNoRixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0UsRUFBRSxDQUFDLHdCQUF3QixDQUN6QixFQUFFLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDUCxJQUFJLElBQUksWUFBWSxFQUFFLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2pFLHFFQUFxRTtvQkFDckUsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ25DLEVBQUUsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7b0JBQ2hDLENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIEFueSB2YXJpYWJsZSBpbnNpZGUgYSBsaXN0ZW5lciB3aXRoIHRoZSBuYW1lIGAkZXZlbnRgIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBhIG91dHB1dCBsZXhpY2FsXG4gKiByZWFkIGltbWVkaWF0ZWx5LCBhbmQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYW55IG9mIHRoZSBub3JtYWwgbG9naWMgZm9yIGhhbmRsaW5nIHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb2xsYXJFdmVudChqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICB0cmFuc2Zvcm1Eb2xsYXJFdmVudCh1bml0LmNyZWF0ZSk7XG4gICAgdHJhbnNmb3JtRG9sbGFyRXZlbnQodW5pdC51cGRhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybURvbGxhckV2ZW50KG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wPiB8IGlyLk9wTGlzdDxpci5VcGRhdGVPcD4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLkxpc3RlbmVyIHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ud29XYXlMaXN0ZW5lcikge1xuICAgICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgICBvcCxcbiAgICAgICAgKGV4cHIpID0+IHtcbiAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLkxleGljYWxSZWFkRXhwciAmJiBleHByLm5hbWUgPT09ICckZXZlbnQnKSB7XG4gICAgICAgICAgICAvLyBUd28td2F5IGxpc3RlbmVycyBhbHdheXMgY29uc3VtZSBgJGV2ZW50YCBzbyB0aGV5IG9taXQgdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgb3AuY29uc3VtZXNEb2xsYXJFdmVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IG8uUmVhZFZhckV4cHIoZXhwci5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgIH0sXG4gICAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5JbkNoaWxkT3BlcmF0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,266 +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
|
-
* Resolve the element placeholders in i18n messages.
|
|
11
|
-
*/
|
|
12
|
-
export function resolveI18nElementPlaceholders(job) {
|
|
13
|
-
// Record all of the element and i18n context ops for use later.
|
|
14
|
-
const i18nContexts = new Map();
|
|
15
|
-
const elements = new Map();
|
|
16
|
-
for (const unit of job.units) {
|
|
17
|
-
for (const op of unit.create) {
|
|
18
|
-
switch (op.kind) {
|
|
19
|
-
case ir.OpKind.I18nContext:
|
|
20
|
-
i18nContexts.set(op.xref, op);
|
|
21
|
-
break;
|
|
22
|
-
case ir.OpKind.ElementStart:
|
|
23
|
-
elements.set(op.xref, op);
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
resolvePlaceholdersForView(job, job.root, i18nContexts, elements);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Recursively resolves element and template tag placeholders in the given view.
|
|
32
|
-
*/
|
|
33
|
-
function resolvePlaceholdersForView(job, unit, i18nContexts, elements, pendingStructuralDirective) {
|
|
34
|
-
// Track the current i18n op and corresponding i18n context op as we step through the creation
|
|
35
|
-
// IR.
|
|
36
|
-
let currentOps = null;
|
|
37
|
-
let pendingStructuralDirectiveCloses = new Map();
|
|
38
|
-
for (const op of unit.create) {
|
|
39
|
-
switch (op.kind) {
|
|
40
|
-
case ir.OpKind.I18nStart:
|
|
41
|
-
if (!op.context) {
|
|
42
|
-
throw Error('Could not find i18n context for i18n op');
|
|
43
|
-
}
|
|
44
|
-
currentOps = { i18nBlock: op, i18nContext: i18nContexts.get(op.context) };
|
|
45
|
-
break;
|
|
46
|
-
case ir.OpKind.I18nEnd:
|
|
47
|
-
currentOps = null;
|
|
48
|
-
break;
|
|
49
|
-
case ir.OpKind.ElementStart:
|
|
50
|
-
// For elements with i18n placeholders, record its slot value in the params map under the
|
|
51
|
-
// corresponding tag start placeholder.
|
|
52
|
-
if (op.i18nPlaceholder !== undefined) {
|
|
53
|
-
if (currentOps === null) {
|
|
54
|
-
throw Error('i18n tag placeholder should only occur inside an i18n block');
|
|
55
|
-
}
|
|
56
|
-
recordElementStart(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
57
|
-
// If there is a separate close tag placeholder for this element, save the pending
|
|
58
|
-
// structural directive so we can pass it to the closing tag as well.
|
|
59
|
-
if (pendingStructuralDirective && op.i18nPlaceholder.closeName) {
|
|
60
|
-
pendingStructuralDirectiveCloses.set(op.xref, pendingStructuralDirective);
|
|
61
|
-
}
|
|
62
|
-
// Clear out the pending structural directive now that its been accounted for.
|
|
63
|
-
pendingStructuralDirective = undefined;
|
|
64
|
-
}
|
|
65
|
-
break;
|
|
66
|
-
case ir.OpKind.ElementEnd:
|
|
67
|
-
// For elements with i18n placeholders, record its slot value in the params map under the
|
|
68
|
-
// corresponding tag close placeholder.
|
|
69
|
-
const startOp = elements.get(op.xref);
|
|
70
|
-
if (startOp && startOp.i18nPlaceholder !== undefined) {
|
|
71
|
-
if (currentOps === null) {
|
|
72
|
-
throw Error('AssertionError: i18n tag placeholder should only occur inside an i18n block');
|
|
73
|
-
}
|
|
74
|
-
recordElementClose(startOp, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirectiveCloses.get(op.xref));
|
|
75
|
-
// Clear out the pending structural directive close that was accounted for.
|
|
76
|
-
pendingStructuralDirectiveCloses.delete(op.xref);
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
case ir.OpKind.Projection:
|
|
80
|
-
// For content projections with i18n placeholders, record its slot value in the params map
|
|
81
|
-
// under the corresponding tag start and close placeholders.
|
|
82
|
-
if (op.i18nPlaceholder !== undefined) {
|
|
83
|
-
if (currentOps === null) {
|
|
84
|
-
throw Error('i18n tag placeholder should only occur inside an i18n block');
|
|
85
|
-
}
|
|
86
|
-
recordElementStart(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
87
|
-
recordElementClose(op, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
88
|
-
// Clear out the pending structural directive now that its been accounted for.
|
|
89
|
-
pendingStructuralDirective = undefined;
|
|
90
|
-
}
|
|
91
|
-
break;
|
|
92
|
-
case ir.OpKind.Template:
|
|
93
|
-
const view = job.views.get(op.xref);
|
|
94
|
-
if (op.i18nPlaceholder === undefined) {
|
|
95
|
-
// If there is no i18n placeholder, just recurse into the view in case it contains i18n
|
|
96
|
-
// blocks.
|
|
97
|
-
resolvePlaceholdersForView(job, view, i18nContexts, elements);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
if (currentOps === null) {
|
|
101
|
-
throw Error('i18n tag placeholder should only occur inside an i18n block');
|
|
102
|
-
}
|
|
103
|
-
if (op.templateKind === ir.TemplateKind.Structural) {
|
|
104
|
-
// If this is a structural directive template, don't record anything yet. Instead pass
|
|
105
|
-
// the current template as a pending structural directive to be recorded when we find
|
|
106
|
-
// the element, content, or template it belongs to. This allows us to create combined
|
|
107
|
-
// values that represent, e.g. the start of a template and element at the same time.
|
|
108
|
-
resolvePlaceholdersForView(job, view, i18nContexts, elements, op);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
// If this is some other kind of template, we can record its start, recurse into its
|
|
112
|
-
// view, and then record its end.
|
|
113
|
-
recordTemplateStart(job, view, op.handle.slot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
114
|
-
resolvePlaceholdersForView(job, view, i18nContexts, elements);
|
|
115
|
-
recordTemplateClose(job, view, op.handle.slot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
116
|
-
pendingStructuralDirective = undefined;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
case ir.OpKind.RepeaterCreate:
|
|
121
|
-
if (pendingStructuralDirective !== undefined) {
|
|
122
|
-
throw Error('AssertionError: Unexpected structural directive associated with @for block');
|
|
123
|
-
}
|
|
124
|
-
// RepeaterCreate has 3 slots: the first is for the op itself, the second is for the @for
|
|
125
|
-
// template and the (optional) third is for the @empty template.
|
|
126
|
-
const forSlot = op.handle.slot + 1;
|
|
127
|
-
const forView = job.views.get(op.xref);
|
|
128
|
-
// First record all of the placeholders for the @for template.
|
|
129
|
-
if (op.i18nPlaceholder === undefined) {
|
|
130
|
-
// If there is no i18n placeholder, just recurse into the view in case it contains i18n
|
|
131
|
-
// blocks.
|
|
132
|
-
resolvePlaceholdersForView(job, forView, i18nContexts, elements);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
if (currentOps === null) {
|
|
136
|
-
throw Error('i18n tag placeholder should only occur inside an i18n block');
|
|
137
|
-
}
|
|
138
|
-
recordTemplateStart(job, forView, forSlot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
139
|
-
resolvePlaceholdersForView(job, forView, i18nContexts, elements);
|
|
140
|
-
recordTemplateClose(job, forView, forSlot, op.i18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
141
|
-
pendingStructuralDirective = undefined;
|
|
142
|
-
}
|
|
143
|
-
// Then if there's an @empty template, add its placeholders as well.
|
|
144
|
-
if (op.emptyView !== null) {
|
|
145
|
-
// RepeaterCreate has 3 slots: the first is for the op itself, the second is for the @for
|
|
146
|
-
// template and the (optional) third is for the @empty template.
|
|
147
|
-
const emptySlot = op.handle.slot + 2;
|
|
148
|
-
const emptyView = job.views.get(op.emptyView);
|
|
149
|
-
if (op.emptyI18nPlaceholder === undefined) {
|
|
150
|
-
// If there is no i18n placeholder, just recurse into the view in case it contains i18n
|
|
151
|
-
// blocks.
|
|
152
|
-
resolvePlaceholdersForView(job, emptyView, i18nContexts, elements);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
if (currentOps === null) {
|
|
156
|
-
throw Error('i18n tag placeholder should only occur inside an i18n block');
|
|
157
|
-
}
|
|
158
|
-
recordTemplateStart(job, emptyView, emptySlot, op.emptyI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
159
|
-
resolvePlaceholdersForView(job, emptyView, i18nContexts, elements);
|
|
160
|
-
recordTemplateClose(job, emptyView, emptySlot, op.emptyI18nPlaceholder, currentOps.i18nContext, currentOps.i18nBlock, pendingStructuralDirective);
|
|
161
|
-
pendingStructuralDirective = undefined;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Records an i18n param value for the start of an element.
|
|
170
|
-
*/
|
|
171
|
-
function recordElementStart(op, i18nContext, i18nBlock, structuralDirective) {
|
|
172
|
-
const { startName, closeName } = op.i18nPlaceholder;
|
|
173
|
-
let flags = ir.I18nParamValueFlags.ElementTag | ir.I18nParamValueFlags.OpenTag;
|
|
174
|
-
let value = op.handle.slot;
|
|
175
|
-
// If the element is associated with a structural directive, start it as well.
|
|
176
|
-
if (structuralDirective !== undefined) {
|
|
177
|
-
flags |= ir.I18nParamValueFlags.TemplateTag;
|
|
178
|
-
value = { element: value, template: structuralDirective.handle.slot };
|
|
179
|
-
}
|
|
180
|
-
// For self-closing tags, there is no close tag placeholder. Instead, the start tag
|
|
181
|
-
// placeholder accounts for the start and close of the element.
|
|
182
|
-
if (!closeName) {
|
|
183
|
-
flags |= ir.I18nParamValueFlags.CloseTag;
|
|
184
|
-
}
|
|
185
|
-
addParam(i18nContext.params, startName, value, i18nBlock.subTemplateIndex, flags);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Records an i18n param value for the closing of an element.
|
|
189
|
-
*/
|
|
190
|
-
function recordElementClose(op, i18nContext, i18nBlock, structuralDirective) {
|
|
191
|
-
const { closeName } = op.i18nPlaceholder;
|
|
192
|
-
// Self-closing tags don't have a closing tag placeholder, instead the element closing is
|
|
193
|
-
// recorded via an additional flag on the element start value.
|
|
194
|
-
if (closeName) {
|
|
195
|
-
let flags = ir.I18nParamValueFlags.ElementTag | ir.I18nParamValueFlags.CloseTag;
|
|
196
|
-
let value = op.handle.slot;
|
|
197
|
-
// If the element is associated with a structural directive, close it as well.
|
|
198
|
-
if (structuralDirective !== undefined) {
|
|
199
|
-
flags |= ir.I18nParamValueFlags.TemplateTag;
|
|
200
|
-
value = { element: value, template: structuralDirective.handle.slot };
|
|
201
|
-
}
|
|
202
|
-
addParam(i18nContext.params, closeName, value, i18nBlock.subTemplateIndex, flags);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Records an i18n param value for the start of a template.
|
|
207
|
-
*/
|
|
208
|
-
function recordTemplateStart(job, view, slot, i18nPlaceholder, i18nContext, i18nBlock, structuralDirective) {
|
|
209
|
-
let { startName, closeName } = i18nPlaceholder;
|
|
210
|
-
let flags = ir.I18nParamValueFlags.TemplateTag | ir.I18nParamValueFlags.OpenTag;
|
|
211
|
-
// For self-closing tags, there is no close tag placeholder. Instead, the start tag
|
|
212
|
-
// placeholder accounts for the start and close of the element.
|
|
213
|
-
if (!closeName) {
|
|
214
|
-
flags |= ir.I18nParamValueFlags.CloseTag;
|
|
215
|
-
}
|
|
216
|
-
// If the template is associated with a structural directive, record the structural directive's
|
|
217
|
-
// start first. Since this template must be in the structural directive's view, we can just
|
|
218
|
-
// directly use the current i18n block's sub-template index.
|
|
219
|
-
if (structuralDirective !== undefined) {
|
|
220
|
-
addParam(i18nContext.params, startName, structuralDirective.handle.slot, i18nBlock.subTemplateIndex, flags);
|
|
221
|
-
}
|
|
222
|
-
// Record the start of the template. For the sub-template index, pass the index for the template's
|
|
223
|
-
// view, rather than the current i18n block's index.
|
|
224
|
-
addParam(i18nContext.params, startName, slot, getSubTemplateIndexForTemplateTag(job, i18nBlock, view), flags);
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Records an i18n param value for the closing of a template.
|
|
228
|
-
*/
|
|
229
|
-
function recordTemplateClose(job, view, slot, i18nPlaceholder, i18nContext, i18nBlock, structuralDirective) {
|
|
230
|
-
const { closeName } = i18nPlaceholder;
|
|
231
|
-
const flags = ir.I18nParamValueFlags.TemplateTag | ir.I18nParamValueFlags.CloseTag;
|
|
232
|
-
// Self-closing tags don't have a closing tag placeholder, instead the template's closing is
|
|
233
|
-
// recorded via an additional flag on the template start value.
|
|
234
|
-
if (closeName) {
|
|
235
|
-
// Record the closing of the template. For the sub-template index, pass the index for the
|
|
236
|
-
// template's view, rather than the current i18n block's index.
|
|
237
|
-
addParam(i18nContext.params, closeName, slot, getSubTemplateIndexForTemplateTag(job, i18nBlock, view), flags);
|
|
238
|
-
// If the template is associated with a structural directive, record the structural directive's
|
|
239
|
-
// closing after. Since this template must be in the structural directive's view, we can just
|
|
240
|
-
// directly use the current i18n block's sub-template index.
|
|
241
|
-
if (structuralDirective !== undefined) {
|
|
242
|
-
addParam(i18nContext.params, closeName, structuralDirective.handle.slot, i18nBlock.subTemplateIndex, flags);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get the subTemplateIndex for the given template op. For template ops, use the subTemplateIndex of
|
|
248
|
-
* the child i18n block inside the template.
|
|
249
|
-
*/
|
|
250
|
-
function getSubTemplateIndexForTemplateTag(job, i18nOp, view) {
|
|
251
|
-
for (const childOp of view.create) {
|
|
252
|
-
if (childOp.kind === ir.OpKind.I18nStart) {
|
|
253
|
-
return childOp.subTemplateIndex;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return i18nOp.subTemplateIndex;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Add a param value to the given params map.
|
|
260
|
-
*/
|
|
261
|
-
function addParam(params, placeholder, value, subTemplateIndex, flags) {
|
|
262
|
-
const values = params.get(placeholder) ?? [];
|
|
263
|
-
values.push({ value, subTemplateIndex, flags });
|
|
264
|
-
params.set(placeholder, values);
|
|
265
|
-
}
|
|
266
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZV9pMThuX2VsZW1lbnRfcGxhY2Vob2xkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvcmVzb2x2ZV9pMThuX2VsZW1lbnRfcGxhY2Vob2xkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COztHQUVHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLEdBQTRCO0lBQ3pFLGdFQUFnRTtJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVc7b0JBQ3hCLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDOUIsTUFBTTtnQkFDUixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWTtvQkFDekIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7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V0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaTE4biBmcm9tICcuLi8uLi8uLi8uLi9pMThuL2kxOG5fYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcG9uZW50Q29tcGlsYXRpb25Kb2IsIFZpZXdDb21waWxhdGlvblVuaXR9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlbGVtZW50IHBsYWNlaG9sZGVycyBpbiBpMThuIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUkxOG5FbGVtZW50UGxhY2Vob2xkZXJzKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpIHtcbiAgLy8gUmVjb3JkIGFsbCBvZiB0aGUgZWxlbWVudCBhbmQgaTE4biBjb250ZXh0IG9wcyBmb3IgdXNlIGxhdGVyLlxuICBjb25zdCBpMThuQ29udGV4dHMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuSTE4bkNvbnRleHRPcD4oKTtcbiAgY29uc3QgZWxlbWVudHMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuRWxlbWVudFN0YXJ0T3A+KCk7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICAgICAgY2FzZSBpci5PcEtpbmQuSTE4bkNvbnRleHQ6XG4gICAgICAgICAgaTE4bkNvbnRleHRzLnNldChvcC54cmVmLCBvcCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkVsZW1lbnRTdGFydDpcbiAgICAgICAgICBlbGVtZW50cy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgam9iLnJvb3QsIGkxOG5Db250ZXh0cywgZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHJlc29sdmVzIGVsZW1lbnQgYW5kIHRlbXBsYXRlIHRhZyBwbGFjZWhvbGRlcnMgaW4gdGhlIGdpdmVuIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KFxuICBqb2I6IENvbXBvbmVudENvbXBpbGF0aW9uSm9iLFxuICB1bml0OiBWaWV3Q29tcGlsYXRpb25Vbml0LFxuICBpMThuQ29udGV4dHM6IE1hcDxpci5YcmVmSWQsIGlyLkkxOG5Db250ZXh0T3A+LFxuICBlbGVtZW50czogTWFwPGlyLlhyZWZJZCwgaXIuRWxlbWVudFN0YXJ0T3A+LFxuICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZT86IGlyLlRlbXBsYXRlT3AsXG4pIHtcbiAgLy8gVHJhY2sgdGhlIGN1cnJlbnQgaTE4biBvcCBhbmQgY29ycmVzcG9uZGluZyBpMThuIGNvbnRleHQgb3AgYXMgd2Ugc3RlcCB0aHJvdWdoIHRoZSBjcmVhdGlvblxuICAvLyBJUi5cbiAgbGV0IGN1cnJlbnRPcHM6IHtpMThuQmxvY2s6IGlyLkkxOG5TdGFydE9wOyBpMThuQ29udGV4dDogaXIuSTE4bkNvbnRleHRPcH0gfCBudWxsID0gbnVsbDtcbiAgbGV0IHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlQ2xvc2VzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlRlbXBsYXRlT3A+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5TdGFydDpcbiAgICAgICAgaWYgKCFvcC5jb250ZXh0KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGkxOG4gY29udGV4dCBmb3IgaTE4biBvcCcpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRPcHMgPSB7aTE4bkJsb2NrOiBvcCwgaTE4bkNvbnRleHQ6IGkxOG5Db250ZXh0cy5nZXQob3AuY29udGV4dCkhfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGlyLk9wS2luZC5JMThuRW5kOlxuICAgICAgICBjdXJyZW50T3BzID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGlyLk9wS2luZC5FbGVtZW50U3RhcnQ6XG4gICAgICAgIC8vIEZvciBlbGVtZW50cyB3aXRoIGkxOG4gcGxhY2Vob2xkZXJzLCByZWNvcmQgaXRzIHNsb3QgdmFsdWUgaW4gdGhlIHBhcmFtcyBtYXAgdW5kZXIgdGhlXG4gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdGFnIHN0YXJ0IHBsYWNlaG9sZGVyLlxuICAgICAgICBpZiAob3AuaTE4blBsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY3VycmVudE9wcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2kxOG4gdGFnIHBsYWNlaG9sZGVyIHNob3VsZCBvbmx5IG9jY3VyIGluc2lkZSBhbiBpMThuIGJsb2NrJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZEVsZW1lbnRTdGFydChcbiAgICAgICAgICAgIG9wLFxuICAgICAgICAgICAgY3VycmVudE9wcy5pMThuQ29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnRPcHMuaTE4bkJsb2NrLFxuICAgICAgICAgICAgcGVuZGluZ1N0cnVjdHVyYWxEaXJlY3RpdmUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNlcGFyYXRlIGNsb3NlIHRhZyBwbGFjZWhvbGRlciBmb3IgdGhpcyBlbGVtZW50LCBzYXZlIHRoZSBwZW5kaW5nXG4gICAgICAgICAgLy8gc3RydWN0dXJhbCBkaXJlY3RpdmUgc28gd2UgY2FuIHBhc3MgaXQgdG8gdGhlIGNsb3NpbmcgdGFnIGFzIHdlbGwuXG4gICAgICAgICAgaWYgKHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlICYmIG9wLmkxOG5QbGFjZWhvbGRlci5jbG9zZU5hbWUpIHtcbiAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlQ2xvc2VzLnNldChvcC54cmVmLCBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgcGVuZGluZyBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSBub3cgdGhhdCBpdHMgYmVlbiBhY2NvdW50ZWQgZm9yLlxuICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBpci5PcEtpbmQuRWxlbWVudEVuZDpcbiAgICAgICAgLy8gRm9yIGVsZW1lbnRzIHdpdGggaTE4biBwbGFjZWhvbGRlcnMsIHJlY29yZCBpdHMgc2xvdCB2YWx1ZSBpbiB0aGUgcGFyYW1zIG1hcCB1bmRlciB0aGVcbiAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0YWcgY2xvc2UgcGxhY2Vob2xkZXIuXG4gICAgICAgIGNvbnN0IHN0YXJ0T3AgPSBlbGVtZW50cy5nZXQob3AueHJlZik7XG4gICAgICAgIGlmIChzdGFydE9wICYmIHN0YXJ0T3AuaTE4blBsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY3VycmVudE9wcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdBc3NlcnRpb25FcnJvcjogaTE4biB0YWcgcGxhY2Vob2xkZXIgc2hvdWxkIG9ubHkgb2NjdXIgaW5zaWRlIGFuIGkxOG4gYmxvY2snLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3JkRWxlbWVudENsb3NlKFxuICAgICAgICAgICAgc3RhcnRPcCxcbiAgICAgICAgICAgIGN1cnJlbnRPcHMuaTE4bkNvbnRleHQsXG4gICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5CbG9jayxcbiAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlQ2xvc2VzLmdldChvcC54cmVmKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgcGVuZGluZyBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSBjbG9zZSB0aGF0IHdhcyBhY2NvdW50ZWQgZm9yLlxuICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlQ2xvc2VzLmRlbGV0ZShvcC54cmVmKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgaXIuT3BLaW5kLlByb2plY3Rpb246XG4gICAgICAgIC8vIEZvciBjb250ZW50IHByb2plY3Rpb25zIHdpdGggaTE4biBwbGFjZWhvbGRlcnMsIHJlY29yZCBpdHMgc2xvdCB2YWx1ZSBpbiB0aGUgcGFyYW1zIG1hcFxuICAgICAgICAvLyB1bmRlciB0aGUgY29ycmVzcG9uZGluZyB0YWcgc3RhcnQgYW5kIGNsb3NlIHBsYWNlaG9sZGVycy5cbiAgICAgICAgaWYgKG9wLmkxOG5QbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRPcHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdpMThuIHRhZyBwbGFjZWhvbGRlciBzaG91bGQgb25seSBvY2N1ciBpbnNpZGUgYW4gaTE4biBibG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRFbGVtZW50U3RhcnQoXG4gICAgICAgICAgICBvcCxcbiAgICAgICAgICAgIGN1cnJlbnRPcHMuaTE4bkNvbnRleHQsXG4gICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5CbG9jayxcbiAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVjb3JkRWxlbWVudENsb3NlKFxuICAgICAgICAgICAgb3AsXG4gICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5Db250ZXh0LFxuICAgICAgICAgICAgY3VycmVudE9wcy5pMThuQmxvY2ssXG4gICAgICAgICAgICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgcGVuZGluZyBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSBub3cgdGhhdCBpdHMgYmVlbiBhY2NvdW50ZWQgZm9yLlxuICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBpci5PcEtpbmQuVGVtcGxhdGU6XG4gICAgICAgIGNvbnN0IHZpZXcgPSBqb2Iudmlld3MuZ2V0KG9wLnhyZWYpITtcbiAgICAgICAgaWYgKG9wLmkxOG5QbGFjZWhvbGRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaTE4biBwbGFjZWhvbGRlciwganVzdCByZWN1cnNlIGludG8gdGhlIHZpZXcgaW4gY2FzZSBpdCBjb250YWlucyBpMThuXG4gICAgICAgICAgLy8gYmxvY2tzLlxuICAgICAgICAgIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgdmlldywgaTE4bkNvbnRleHRzLCBlbGVtZW50cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRPcHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdpMThuIHRhZyBwbGFjZWhvbGRlciBzaG91bGQgb25seSBvY2N1ciBpbnNpZGUgYW4gaTE4biBibG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3AudGVtcGxhdGVLaW5kID09PSBpci5UZW1wbGF0ZUtpbmQuU3RydWN0dXJhbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHRlbXBsYXRlLCBkb24ndCByZWNvcmQgYW55dGhpbmcgeWV0LiBJbnN0ZWFkIHBhc3NcbiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHRlbXBsYXRlIGFzIGEgcGVuZGluZyBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB0byBiZSByZWNvcmRlZCB3aGVuIHdlIGZpbmRcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50LCBjb250ZW50LCBvciB0ZW1wbGF0ZSBpdCBiZWxvbmdzIHRvLiBUaGlzIGFsbG93cyB1cyB0byBjcmVhdGUgY29tYmluZWRcbiAgICAgICAgICAgIC8vIHZhbHVlcyB0aGF0IHJlcHJlc2VudCwgZS5nLiB0aGUgc3RhcnQgb2YgYSB0ZW1wbGF0ZSBhbmQgZWxlbWVudCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgICAgICAgcmVzb2x2ZVBsYWNlaG9sZGVyc0ZvclZpZXcoam9iLCB2aWV3LCBpMThuQ29udGV4dHMsIGVsZW1lbnRzLCBvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgc29tZSBvdGhlciBraW5kIG9mIHRlbXBsYXRlLCB3ZSBjYW4gcmVjb3JkIGl0cyBzdGFydCwgcmVjdXJzZSBpbnRvIGl0c1xuICAgICAgICAgICAgLy8gdmlldywgYW5kIHRoZW4gcmVjb3JkIGl0cyBlbmQuXG4gICAgICAgICAgICByZWNvcmRUZW1wbGF0ZVN0YXJ0KFxuICAgICAgICAgICAgICBqb2IsXG4gICAgICAgICAgICAgIHZpZXcsXG4gICAgICAgICAgICAgIG9wLmhhbmRsZS5zbG90ISxcbiAgICAgICAgICAgICAgb3AuaTE4blBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5Db250ZXh0LFxuICAgICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5CbG9jayxcbiAgICAgICAgICAgICAgcGVuZGluZ1N0cnVjdHVyYWxEaXJlY3RpdmUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzb2x2ZVBsYWNlaG9sZGVyc0ZvclZpZXcoam9iLCB2aWV3LCBpMThuQ29udGV4dHMsIGVsZW1lbnRzKTtcbiAgICAgICAgICAgIHJlY29yZFRlbXBsYXRlQ2xvc2UoXG4gICAgICAgICAgICAgIGpvYixcbiAgICAgICAgICAgICAgdmlldyxcbiAgICAgICAgICAgICAgb3AuaGFuZGxlLnNsb3QhLFxuICAgICAgICAgICAgICBvcC5pMThuUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnRPcHMhLmkxOG5Db250ZXh0LFxuICAgICAgICAgICAgICBjdXJyZW50T3BzIS5pMThuQmxvY2ssXG4gICAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlOlxuICAgICAgICBpZiAocGVuZGluZ1N0cnVjdHVyYWxEaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdBc3NlcnRpb25FcnJvcjogVW5leHBlY3RlZCBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSBhc3NvY2lhdGVkIHdpdGggQGZvciBibG9jaycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlcGVhdGVyQ3JlYXRlIGhhcyAzIHNsb3RzOiB0aGUgZmlyc3QgaXMgZm9yIHRoZSBvcCBpdHNlbGYsIHRoZSBzZWNvbmQgaXMgZm9yIHRoZSBAZm9yXG4gICAgICAgIC8vIHRlbXBsYXRlIGFuZCB0aGUgKG9wdGlvbmFsKSB0aGlyZCBpcyBmb3IgdGhlIEBlbXB0eSB0ZW1wbGF0ZS5cbiAgICAgICAgY29uc3QgZm9yU2xvdCA9IG9wLmhhbmRsZS5zbG90ISArIDE7XG4gICAgICAgIGNvbnN0IGZvclZpZXcgPSBqb2Iudmlld3MuZ2V0KG9wLnhyZWYpITtcbiAgICAgICAgLy8gRmlyc3QgcmVjb3JkIGFsbCBvZiB0aGUgcGxhY2Vob2xkZXJzIGZvciB0aGUgQGZvciB0ZW1wbGF0ZS5cbiAgICAgICAgaWYgKG9wLmkxOG5QbGFjZWhvbGRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaTE4biBwbGFjZWhvbGRlciwganVzdCByZWN1cnNlIGludG8gdGhlIHZpZXcgaW4gY2FzZSBpdCBjb250YWlucyBpMThuXG4gICAgICAgICAgLy8gYmxvY2tzLlxuICAgICAgICAgIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgZm9yVmlldywgaTE4bkNvbnRleHRzLCBlbGVtZW50cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRPcHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdpMThuIHRhZyBwbGFjZWhvbGRlciBzaG91bGQgb25seSBvY2N1ciBpbnNpZGUgYW4gaTE4biBibG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRUZW1wbGF0ZVN0YXJ0KFxuICAgICAgICAgICAgam9iLFxuICAgICAgICAgICAgZm9yVmlldyxcbiAgICAgICAgICAgIGZvclNsb3QsXG4gICAgICAgICAgICBvcC5pMThuUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICBjdXJyZW50T3BzLmkxOG5Db250ZXh0LFxuICAgICAgICAgICAgY3VycmVudE9wcy5pMThuQmxvY2ssXG4gICAgICAgICAgICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgZm9yVmlldywgaTE4bkNvbnRleHRzLCBlbGVtZW50cyk7XG4gICAgICAgICAgcmVjb3JkVGVtcGxhdGVDbG9zZShcbiAgICAgICAgICAgIGpvYixcbiAgICAgICAgICAgIGZvclZpZXcsXG4gICAgICAgICAgICBmb3JTbG90LFxuICAgICAgICAgICAgb3AuaTE4blBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgY3VycmVudE9wcyEuaTE4bkNvbnRleHQsXG4gICAgICAgICAgICBjdXJyZW50T3BzIS5pMThuQmxvY2ssXG4gICAgICAgICAgICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZW4gaWYgdGhlcmUncyBhbiBAZW1wdHkgdGVtcGxhdGUsIGFkZCBpdHMgcGxhY2Vob2xkZXJzIGFzIHdlbGwuXG4gICAgICAgIGlmIChvcC5lbXB0eVZpZXcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXBlYXRlckNyZWF0ZSBoYXMgMyBzbG90czogdGhlIGZpcnN0IGlzIGZvciB0aGUgb3AgaXRzZWxmLCB0aGUgc2Vjb25kIGlzIGZvciB0aGUgQGZvclxuICAgICAgICAgIC8vIHRlbXBsYXRlIGFuZCB0aGUgKG9wdGlvbmFsKSB0aGlyZCBpcyBmb3IgdGhlIEBlbXB0eSB0ZW1wbGF0ZS5cbiAgICAgICAgICBjb25zdCBlbXB0eVNsb3QgPSBvcC5oYW5kbGUuc2xvdCEgKyAyO1xuICAgICAgICAgIGNvbnN0IGVtcHR5VmlldyA9IGpvYi52aWV3cy5nZXQob3AuZW1wdHlWaWV3ISkhO1xuICAgICAgICAgIGlmIChvcC5lbXB0eUkxOG5QbGFjZWhvbGRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBpMThuIHBsYWNlaG9sZGVyLCBqdXN0IHJlY3Vyc2UgaW50byB0aGUgdmlldyBpbiBjYXNlIGl0IGNvbnRhaW5zIGkxOG5cbiAgICAgICAgICAgIC8vIGJsb2Nrcy5cbiAgICAgICAgICAgIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgZW1wdHlWaWV3LCBpMThuQ29udGV4dHMsIGVsZW1lbnRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRPcHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2kxOG4gdGFnIHBsYWNlaG9sZGVyIHNob3VsZCBvbmx5IG9jY3VyIGluc2lkZSBhbiBpMThuIGJsb2NrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmRUZW1wbGF0ZVN0YXJ0KFxuICAgICAgICAgICAgICBqb2IsXG4gICAgICAgICAgICAgIGVtcHR5VmlldyxcbiAgICAgICAgICAgICAgZW1wdHlTbG90LFxuICAgICAgICAgICAgICBvcC5lbXB0eUkxOG5QbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgY3VycmVudE9wcy5pMThuQ29udGV4dCxcbiAgICAgICAgICAgICAgY3VycmVudE9wcy5pMThuQmxvY2ssXG4gICAgICAgICAgICAgIHBlbmRpbmdTdHJ1Y3R1cmFsRGlyZWN0aXZlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmVQbGFjZWhvbGRlcnNGb3JWaWV3KGpvYiwgZW1wdHlWaWV3LCBpMThuQ29udGV4dHMsIGVsZW1lbnRzKTtcbiAgICAgICAgICAgIHJlY29yZFRlbXBsYXRlQ2xvc2UoXG4gICAgICAgICAgICAgIGpvYixcbiAgICAgICAgICAgICAgZW1wdHlWaWV3LFxuICAgICAgICAgICAgICBlbXB0eVNsb3QsXG4gICAgICAgICAgICAgIG9wLmVtcHR5STE4blBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICBjdXJyZW50T3BzIS5pMThuQ29udGV4dCxcbiAgICAgICAgICAgICAgY3VycmVudE9wcyEuaTE4bkJsb2NrLFxuICAgICAgICAgICAgICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwZW5kaW5nU3RydWN0dXJhbERpcmVjdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVjb3JkcyBhbiBpMThuIHBhcmFtIHZhbHVlIGZvciB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkRWxlbWVudFN0YXJ0KFxuICBvcDogaXIuRWxlbWVudFN0YXJ0T3AgfCBpci5Qcm9qZWN0aW9uT3AsXG4gIGkxOG5Db250ZXh0OiBpci5JMThuQ29udGV4dE9wLFxuICBpMThuQmxvY2s6IGlyLkkxOG5TdGFydE9wLFxuICBzdHJ1Y3R1cmFsRGlyZWN0aXZlPzogaXIuVGVtcGxhdGVPcCxcbikge1xuICBjb25zdCB7c3RhcnROYW1lLCBjbG9zZU5hbWV9ID0gb3AuaTE4blBsYWNlaG9sZGVyITtcbiAgbGV0IGZsYWdzID0gaXIuSTE4blBhcmFtVmFsdWVGbGFncy5FbGVtZW50VGFnIHwgaXIuSTE4blBhcmFtVmFsdWVGbGFncy5PcGVuVGFnO1xuICBsZXQgdmFsdWU6IGlyLkkxOG5QYXJhbVZhbHVlWyd2YWx1ZSddID0gb3AuaGFuZGxlLnNsb3QhO1xuICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSwgc3RhcnQgaXQgYXMgd2VsbC5cbiAgaWYgKHN0cnVjdHVyYWxEaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGZsYWdzIHw9IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuVGVtcGxhdGVUYWc7XG4gICAgdmFsdWUgPSB7ZWxlbWVudDogdmFsdWUsIHRlbXBsYXRlOiBzdHJ1Y3R1cmFsRGlyZWN0aXZlLmhhbmRsZS5zbG90IX07XG4gIH1cbiAgLy8gRm9yIHNlbGYtY2xvc2luZyB0YWdzLCB0aGVyZSBpcyBubyBjbG9zZSB0YWcgcGxhY2Vob2xkZXIuIEluc3RlYWQsIHRoZSBzdGFydCB0YWdcbiAgLy8gcGxhY2Vob2xkZXIgYWNjb3VudHMgZm9yIHRoZSBzdGFydCBhbmQgY2xvc2Ugb2YgdGhlIGVsZW1lbnQuXG4gIGlmICghY2xvc2VOYW1lKSB7XG4gICAgZmxhZ3MgfD0gaXIuSTE4blBhcmFtVmFsdWVGbGFncy5DbG9zZVRhZztcbiAgfVxuICBhZGRQYXJhbShpMThuQ29udGV4dC5wYXJhbXMsIHN0YXJ0TmFtZSwgdmFsdWUsIGkxOG5CbG9jay5zdWJUZW1wbGF0ZUluZGV4LCBmbGFncyk7XG59XG5cbi8qKlxuICogUmVjb3JkcyBhbiBpMThuIHBhcmFtIHZhbHVlIGZvciB0aGUgY2xvc2luZyBvZiBhbiBlbGVtZW50LlxuICovXG5mdW5jdGlvbiByZWNvcmRFbGVtZW50Q2xvc2UoXG4gIG9wOiBpci5FbGVtZW50U3RhcnRPcCB8IGlyLlByb2plY3Rpb25PcCxcbiAgaTE4bkNvbnRleHQ6IGlyLkkxOG5Db250ZXh0T3AsXG4gIGkxOG5CbG9jazogaXIuSTE4blN0YXJ0T3AsXG4gIHN0cnVjdHVyYWxEaXJlY3RpdmU/OiBpci5UZW1wbGF0ZU9wLFxuKSB7XG4gIGNvbnN0IHtjbG9zZU5hbWV9ID0gb3AuaTE4blBsYWNlaG9sZGVyITtcbiAgLy8gU2VsZi1jbG9zaW5nIHRhZ3MgZG9uJ3QgaGF2ZSBhIGNsb3NpbmcgdGFnIHBsYWNlaG9sZGVyLCBpbnN0ZWFkIHRoZSBlbGVtZW50IGNsb3NpbmcgaXNcbiAgLy8gcmVjb3JkZWQgdmlhIGFuIGFkZGl0aW9uYWwgZmxhZyBvbiB0aGUgZWxlbWVudCBzdGFydCB2YWx1ZS5cbiAgaWYgKGNsb3NlTmFtZSkge1xuICAgIGxldCBmbGFncyA9IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuRWxlbWVudFRhZyB8IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuQ2xvc2VUYWc7XG4gICAgbGV0IHZhbHVlOiBpci5JMThuUGFyYW1WYWx1ZVsndmFsdWUnXSA9IG9wLmhhbmRsZS5zbG90ITtcbiAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSwgY2xvc2UgaXQgYXMgd2VsbC5cbiAgICBpZiAoc3RydWN0dXJhbERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmbGFncyB8PSBpci5JMThuUGFyYW1WYWx1ZUZsYWdzLlRlbXBsYXRlVGFnO1xuICAgICAgdmFsdWUgPSB7ZWxlbWVudDogdmFsdWUsIHRlbXBsYXRlOiBzdHJ1Y3R1cmFsRGlyZWN0aXZlLmhhbmRsZS5zbG90IX07XG4gICAgfVxuICAgIGFkZFBhcmFtKGkxOG5Db250ZXh0LnBhcmFtcywgY2xvc2VOYW1lLCB2YWx1ZSwgaTE4bkJsb2NrLnN1YlRlbXBsYXRlSW5kZXgsIGZsYWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29yZHMgYW4gaTE4biBwYXJhbSB2YWx1ZSBmb3IgdGhlIHN0YXJ0IG9mIGEgdGVtcGxhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRlbXBsYXRlU3RhcnQoXG4gIGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IsXG4gIHZpZXc6IFZpZXdDb21waWxhdGlvblVuaXQsXG4gIHNsb3Q6IG51bWJlcixcbiAgaTE4blBsYWNlaG9sZGVyOiBpMThuLlRhZ1BsYWNlaG9sZGVyIHwgaTE4bi5CbG9ja1BsYWNlaG9sZGVyLFxuICBpMThuQ29udGV4dDogaXIuSTE4bkNvbnRleHRPcCxcbiAgaTE4bkJsb2NrOiBpci5JMThuU3RhcnRPcCxcbiAgc3RydWN0dXJhbERpcmVjdGl2ZT86IGlyLlRlbXBsYXRlT3AsXG4pIHtcbiAgbGV0IHtzdGFydE5hbWUsIGNsb3NlTmFtZX0gPSBpMThuUGxhY2Vob2xkZXI7XG4gIGxldCBmbGFncyA9IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuVGVtcGxhdGVUYWcgfCBpci5JMThuUGFyYW1WYWx1ZUZsYWdzLk9wZW5UYWc7XG4gIC8vIEZvciBzZWxmLWNsb3NpbmcgdGFncywgdGhlcmUgaXMgbm8gY2xvc2UgdGFnIHBsYWNlaG9sZGVyLiBJbnN0ZWFkLCB0aGUgc3RhcnQgdGFnXG4gIC8vIHBsYWNlaG9sZGVyIGFjY291bnRzIGZvciB0aGUgc3RhcnQgYW5kIGNsb3NlIG9mIHRoZSBlbGVtZW50LlxuICBpZiAoIWNsb3NlTmFtZSkge1xuICAgIGZsYWdzIHw9IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuQ2xvc2VUYWc7XG4gIH1cbiAgLy8gSWYgdGhlIHRlbXBsYXRlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHN0cnVjdHVyYWwgZGlyZWN0aXZlLCByZWNvcmQgdGhlIHN0cnVjdHVyYWwgZGlyZWN0aXZlJ3NcbiAgLy8gc3RhcnQgZmlyc3QuIFNpbmNlIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbiB0aGUgc3RydWN0dXJhbCBkaXJlY3RpdmUncyB2aWV3LCB3ZSBjYW4ganVzdFxuICAvLyBkaXJlY3RseSB1c2UgdGhlIGN1cnJlbnQgaTE4biBibG9jaydzIHN1Yi10ZW1wbGF0ZSBpbmRleC5cbiAgaWYgKHN0cnVjdHVyYWxEaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFkZFBhcmFtKFxuICAgICAgaTE4bkNvbnRleHQucGFyYW1zLFxuICAgICAgc3RhcnROYW1lLFxuICAgICAgc3RydWN0dXJhbERpcmVjdGl2ZS5oYW5kbGUuc2xvdCEsXG4gICAgICBpMThuQmxvY2suc3ViVGVtcGxhdGVJbmRleCxcbiAgICAgIGZsYWdzLFxuICAgICk7XG4gIH1cbiAgLy8gUmVjb3JkIHRoZSBzdGFydCBvZiB0aGUgdGVtcGxhdGUuIEZvciB0aGUgc3ViLXRlbXBsYXRlIGluZGV4LCBwYXNzIHRoZSBpbmRleCBmb3IgdGhlIHRlbXBsYXRlJ3NcbiAgLy8gdmlldywgcmF0aGVyIHRoYW4gdGhlIGN1cnJlbnQgaTE4biBibG9jaydzIGluZGV4LlxuICBhZGRQYXJhbShcbiAgICBpMThuQ29udGV4dC5wYXJhbXMsXG4gICAgc3RhcnROYW1lLFxuICAgIHNsb3QsXG4gICAgZ2V0U3ViVGVtcGxhdGVJbmRleEZvclRlbXBsYXRlVGFnKGpvYiwgaTE4bkJsb2NrLCB2aWV3KSxcbiAgICBmbGFncyxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIGFuIGkxOG4gcGFyYW0gdmFsdWUgZm9yIHRoZSBjbG9zaW5nIG9mIGEgdGVtcGxhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRlbXBsYXRlQ2xvc2UoXG4gIGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IsXG4gIHZpZXc6IFZpZXdDb21waWxhdGlvblVuaXQsXG4gIHNsb3Q6IG51bWJlcixcbiAgaTE4blBsYWNlaG9sZGVyOiBpMThuLlRhZ1BsYWNlaG9sZGVyIHwgaTE4bi5CbG9ja1BsYWNlaG9sZGVyLFxuICBpMThuQ29udGV4dDogaXIuSTE4bkNvbnRleHRPcCxcbiAgaTE4bkJsb2NrOiBpci5JMThuU3RhcnRPcCxcbiAgc3RydWN0dXJhbERpcmVjdGl2ZT86IGlyLlRlbXBsYXRlT3AsXG4pIHtcbiAgY29uc3Qge2Nsb3NlTmFtZX0gPSBpMThuUGxhY2Vob2xkZXI7XG4gIGNvbnN0IGZsYWdzID0gaXIuSTE4blBhcmFtVmFsdWVGbGFncy5UZW1wbGF0ZVRhZyB8IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MuQ2xvc2VUYWc7XG4gIC8vIFNlbGYtY2xvc2luZyB0YWdzIGRvbid0IGhhdmUgYSBjbG9zaW5nIHRhZyBwbGFjZWhvbGRlciwgaW5zdGVhZCB0aGUgdGVtcGxhdGUncyBjbG9zaW5nIGlzXG4gIC8vIHJlY29yZGVkIHZpYSBhbiBhZGRpdGlvbmFsIGZsYWcgb24gdGhlIHRlbXBsYXRlIHN0YXJ0IHZhbHVlLlxuICBpZiAoY2xvc2VOYW1lKSB7XG4gICAgLy8gUmVjb3JkIHRoZSBjbG9zaW5nIG9mIHRoZSB0ZW1wbGF0ZS4gRm9yIHRoZSBzdWItdGVtcGxhdGUgaW5kZXgsIHBhc3MgdGhlIGluZGV4IGZvciB0aGVcbiAgICAvLyB0ZW1wbGF0ZSdzIHZpZXcsIHJhdGhlciB0aGFuIHRoZSBjdXJyZW50IGkxOG4gYmxvY2sncyBpbmRleC5cbiAgICBhZGRQYXJhbShcbiAgICAgIGkxOG5Db250ZXh0LnBhcmFtcyxcbiAgICAgIGNsb3NlTmFtZSxcbiAgICAgIHNsb3QsXG4gICAgICBnZXRTdWJUZW1wbGF0ZUluZGV4Rm9yVGVtcGxhdGVUYWcoam9iLCBpMThuQmxvY2ssIHZpZXcpLFxuICAgICAgZmxhZ3MsXG4gICAgKTtcbiAgICAvLyBJZiB0aGUgdGVtcGxhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3RydWN0dXJhbCBkaXJlY3RpdmUsIHJlY29yZCB0aGUgc3RydWN0dXJhbCBkaXJlY3RpdmUnc1xuICAgIC8vIGNsb3NpbmcgYWZ0ZXIuIFNpbmNlIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbiB0aGUgc3RydWN0dXJhbCBkaXJlY3RpdmUncyB2aWV3LCB3ZSBjYW4ganVzdFxuICAgIC8vIGRpcmVjdGx5IHVzZSB0aGUgY3VycmVudCBpMThuIGJsb2NrJ3Mgc3ViLXRlbXBsYXRlIGluZGV4LlxuICAgIGlmIChzdHJ1Y3R1cmFsRGlyZWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZFBhcmFtKFxuICAgICAgICBpMThuQ29udGV4dC5wYXJhbXMsXG4gICAgICAgIGNsb3NlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbERpcmVjdGl2ZS5oYW5kbGUuc2xvdCEsXG4gICAgICAgIGkxOG5CbG9jay5zdWJUZW1wbGF0ZUluZGV4LFxuICAgICAgICBmbGFncyxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdWJUZW1wbGF0ZUluZGV4IGZvciB0aGUgZ2l2ZW4gdGVtcGxhdGUgb3AuIEZvciB0ZW1wbGF0ZSBvcHMsIHVzZSB0aGUgc3ViVGVtcGxhdGVJbmRleCBvZlxuICogdGhlIGNoaWxkIGkxOG4gYmxvY2sgaW5zaWRlIHRoZSB0ZW1wbGF0ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0U3ViVGVtcGxhdGVJbmRleEZvclRlbXBsYXRlVGFnKFxuICBqb2I6IENvbXBvbmVudENvbXBpbGF0aW9uSm9iLFxuICBpMThuT3A6IGlyLkkxOG5TdGFydE9wLFxuICB2aWV3OiBWaWV3Q29tcGlsYXRpb25Vbml0LFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGZvciAoY29uc3QgY2hpbGRPcCBvZiB2aWV3LmNyZWF0ZSkge1xuICAgIGlmIChjaGlsZE9wLmtpbmQgPT09IGlyLk9wS2luZC5JMThuU3RhcnQpIHtcbiAgICAgIHJldHVybiBjaGlsZE9wLnN1YlRlbXBsYXRlSW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMThuT3Auc3ViVGVtcGxhdGVJbmRleDtcbn1cblxuLyoqXG4gKiBBZGQgYSBwYXJhbSB2YWx1ZSB0byB0aGUgZ2l2ZW4gcGFyYW1zIG1hcC5cbiAqL1xuZnVuY3Rpb24gYWRkUGFyYW0oXG4gIHBhcmFtczogTWFwPHN0cmluZywgaXIuSTE4blBhcmFtVmFsdWVbXT4sXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB7ZWxlbWVudDogbnVtYmVyOyB0ZW1wbGF0ZTogbnVtYmVyfSxcbiAgc3ViVGVtcGxhdGVJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgZmxhZ3M6IGlyLkkxOG5QYXJhbVZhbHVlRmxhZ3MsXG4pIHtcbiAgY29uc3QgdmFsdWVzID0gcGFyYW1zLmdldChwbGFjZWhvbGRlcikgPz8gW107XG4gIHZhbHVlcy5wdXNoKHt2YWx1ZSwgc3ViVGVtcGxhdGVJbmRleCwgZmxhZ3N9KTtcbiAgcGFyYW1zLnNldChwbGFjZWhvbGRlciwgdmFsdWVzKTtcbn1cbiJdfQ==
|