@angular/compiler 17.1.0-next.5 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/esm2022/src/compiler_facade_interface.mjs +1 -1
  2. package/esm2022/src/core.mjs +8 -1
  3. package/esm2022/src/jit_compiler_facade.mjs +9 -7
  4. package/esm2022/src/output/abstract_emitter.mjs +4 -1
  5. package/esm2022/src/output/output_ast.mjs +11 -7
  6. package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
  7. package/esm2022/src/render3/partial/directive.mjs +4 -4
  8. package/esm2022/src/render3/partial/factory.mjs +1 -1
  9. package/esm2022/src/render3/partial/injectable.mjs +1 -1
  10. package/esm2022/src/render3/partial/injector.mjs +1 -1
  11. package/esm2022/src/render3/partial/ng_module.mjs +1 -1
  12. package/esm2022/src/render3/partial/pipe.mjs +1 -1
  13. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +2 -2
  14. package/esm2022/src/render3/r3_identifiers.mjs +5 -1
  15. package/esm2022/src/render3/view/api.mjs +1 -1
  16. package/esm2022/src/render3/view/compiler.mjs +26 -2
  17. package/esm2022/src/render3/view/style_parser.mjs +2 -1
  18. package/esm2022/src/render3/view/t2_api.mjs +1 -1
  19. package/esm2022/src/render3/view/t2_binder.mjs +18 -3
  20. package/esm2022/src/render3/view/template.mjs +9 -5
  21. package/esm2022/src/render3/view/util.mjs +35 -7
  22. package/esm2022/src/template/pipeline/ir/src/enums.mjs +1 -11
  23. package/esm2022/src/template/pipeline/ir/src/expression.mjs +1 -21
  24. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +3 -2
  25. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +3 -2
  26. package/esm2022/src/template/pipeline/src/conversion.mjs +2 -1
  27. package/esm2022/src/template/pipeline/src/emit.mjs +1 -3
  28. package/esm2022/src/template/pipeline/src/ingest.mjs +40 -15
  29. package/esm2022/src/template/pipeline/src/instruction.mjs +8 -7
  30. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +6 -5
  31. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -2
  32. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +8 -12
  33. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +2 -2
  34. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
  35. package/esm2022/src/template/pipeline/src/phases/reify.mjs +2 -2
  36. package/esm2022/src/version.mjs +1 -1
  37. package/fesm2022/compiler.mjs +198 -145
  38. package/fesm2022/compiler.mjs.map +1 -1
  39. package/index.d.ts +135 -9
  40. package/package.json +2 -2
  41. package/esm2022/src/template/pipeline/src/phases/repeater_derived_vars.mjs +0 -45
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.1.0-next.5
2
+ * @license Angular v17.1.0
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -334,12 +334,13 @@ export declare enum BinaryOperator {
334
334
  Modulo = 8,
335
335
  And = 9,
336
336
  Or = 10,
337
- BitwiseAnd = 11,
338
- Lower = 12,
339
- LowerEquals = 13,
340
- Bigger = 14,
341
- BiggerEquals = 15,
342
- NullishCoalesce = 16
337
+ BitwiseOr = 11,
338
+ BitwiseAnd = 12,
339
+ Lower = 13,
340
+ LowerEquals = 14,
341
+ Bigger = 15,
342
+ BiggerEquals = 16,
343
+ NullishCoalesce = 17
343
344
  }
344
345
 
345
346
  export declare class BinaryOperatorExpr extends Expression {
@@ -578,6 +579,10 @@ export declare interface BoundTarget<DirectiveT extends DirectiveMeta> {
578
579
  * @param trigger Trigger whose target is being looked up.
579
580
  */
580
581
  getDeferredTriggerTarget(block: TmplAstDeferredBlock, trigger: TmplAstDeferredTrigger): TmplAstElement | null;
582
+ /**
583
+ * Whether a given node is located in a `@defer` block.
584
+ */
585
+ isDeferred(node: TmplAstElement): boolean;
581
586
  }
582
587
 
583
588
  export declare class BuiltinType extends Type {
@@ -686,7 +691,7 @@ export declare type CompileClassMetadataFn = (metadata: R3ClassMetadata) => outp
686
691
  * Similar to the `setClassMetadata` call, it's wrapped into the `ngDevMode`
687
692
  * check to tree-shake away this code in production mode.
688
693
  */
689
- export declare function compileComponentClassMetadata(metadata: R3ClassMetadata, deferrableTypes: Map<string, string>): outputAst.Expression;
694
+ export declare function compileComponentClassMetadata(metadata: R3ClassMetadata, deferrableTypes: Map<string, string> | null): outputAst.Expression;
690
695
 
691
696
  /**
692
697
  * Compile a component for the render3 runtime as defined by the `R3ComponentMetadata`.
@@ -841,6 +846,7 @@ declare namespace core {
841
846
  ViewEncapsulation,
842
847
  ChangeDetectionStrategy,
843
848
  Input,
849
+ InputFlags,
844
850
  Output,
845
851
  HostBinding,
846
852
  HostListener,
@@ -1015,6 +1021,30 @@ export declare class DeclareVarStmt extends Statement {
1015
1021
 
1016
1022
  export declare const DEFAULT_INTERPOLATION_CONFIG: InterpolationConfig;
1017
1023
 
1024
+ /**
1025
+ * Defines how dynamic imports for deferred dependencies should be emitted in the
1026
+ * generated output:
1027
+ * - either in a function on per-component basis (in case of local compilation)
1028
+ * - or in a function on per-block basis (in full compilation mode)
1029
+ */
1030
+ export declare const enum DeferBlockDepsEmitMode {
1031
+ /**
1032
+ * Dynamic imports are grouped on per-block basis.
1033
+ *
1034
+ * This is used in full compilation mode, when compiler has more information
1035
+ * about particular dependencies that belong to this block.
1036
+ */
1037
+ PerBlock = 0,
1038
+ /**
1039
+ * Dynamic imports are grouped on per-component basis.
1040
+ *
1041
+ * In local compilation, compiler doesn't have enough information to determine
1042
+ * which deferred dependencies belong to which block. In this case we group all
1043
+ * dynamic imports into a single file on per-component basis.
1044
+ */
1045
+ PerComponent = 1
1046
+ }
1047
+
1018
1048
  export declare function devOnlyGuardedExpression(expr: outputAst.Expression): outputAst.Expression;
1019
1049
 
1020
1050
  /**
@@ -1244,6 +1274,7 @@ export declare abstract class Expression {
1244
1274
  multiply(rhs: Expression, sourceSpan?: ParseSourceSpan | null): BinaryOperatorExpr;
1245
1275
  modulo(rhs: Expression, sourceSpan?: ParseSourceSpan | null): BinaryOperatorExpr;
1246
1276
  and(rhs: Expression, sourceSpan?: ParseSourceSpan | null): BinaryOperatorExpr;
1277
+ bitwiseOr(rhs: Expression, sourceSpan?: ParseSourceSpan | null, parens?: boolean): BinaryOperatorExpr;
1247
1278
  bitwiseAnd(rhs: Expression, sourceSpan?: ParseSourceSpan | null, parens?: boolean): BinaryOperatorExpr;
1248
1279
  or(rhs: Expression, sourceSpan?: ParseSourceSpan | null): BinaryOperatorExpr;
1249
1280
  lower(rhs: Expression, sourceSpan?: ParseSourceSpan | null): BinaryOperatorExpr;
@@ -1582,6 +1613,14 @@ declare interface Input {
1582
1613
  alias?: string;
1583
1614
  required?: boolean;
1584
1615
  transform?: (value: any) => any;
1616
+ isSignal: boolean;
1617
+ }
1618
+
1619
+ /** Flags describing an input for a directive. */
1620
+ declare enum InputFlags {
1621
+ None = 0,
1622
+ SignalBased = 1,
1623
+ HasDecoratorInputTransform = 2
1585
1624
  }
1586
1625
 
1587
1626
  /**
@@ -2859,10 +2898,11 @@ export declare class R3BoundTarget<DirectiveT extends DirectiveMeta> implements
2859
2898
  private usedPipes;
2860
2899
  private eagerPipes;
2861
2900
  private deferredBlocks;
2901
+ private rootScope;
2862
2902
  constructor(target: Target, directives: Map<TmplAstElement | TmplAstTemplate, DirectiveT[]>, eagerDirectives: DirectiveT[], bindings: Map<TmplAstBoundAttribute | TmplAstBoundEvent | TmplAstTextAttribute, DirectiveT | TmplAstElement | TmplAstTemplate>, references: Map<TmplAstBoundAttribute | TmplAstBoundEvent | TmplAstReference | TmplAstTextAttribute, {
2863
2903
  directive: DirectiveT;
2864
2904
  node: TmplAstElement | TmplAstTemplate;
2865
- } | TmplAstElement | TmplAstTemplate>, exprTargets: Map<AST, TmplAstReference | TmplAstVariable>, symbols: Map<TmplAstReference | TmplAstVariable, TmplAstTemplate>, nestingLevel: Map<ScopedNode, number>, scopedNodeEntities: Map<ScopedNode | null, ReadonlySet<TmplAstReference | TmplAstVariable>>, usedPipes: Set<string>, eagerPipes: Set<string>, deferredBlocks: Set<TmplAstDeferredBlock>);
2905
+ } | TmplAstElement | TmplAstTemplate>, exprTargets: Map<AST, TmplAstReference | TmplAstVariable>, symbols: Map<TmplAstReference | TmplAstVariable, TmplAstTemplate>, nestingLevel: Map<ScopedNode, number>, scopedNodeEntities: Map<ScopedNode | null, ReadonlySet<TmplAstReference | TmplAstVariable>>, usedPipes: Set<string>, eagerPipes: Set<string>, deferredBlocks: Set<TmplAstDeferredBlock>, rootScope: Scope);
2866
2906
  getEntitiesInScope(node: ScopedNode | null): ReadonlySet<TmplAstReference | TmplAstVariable>;
2867
2907
  getDirectivesOfNode(node: TmplAstElement | TmplAstTemplate): DirectiveT[] | null;
2868
2908
  getReferenceTarget(ref: TmplAstReference): ReferenceTarget<DirectiveT> | null;
@@ -2876,6 +2916,7 @@ export declare class R3BoundTarget<DirectiveT extends DirectiveMeta> implements
2876
2916
  getEagerlyUsedPipes(): string[];
2877
2917
  getDeferBlocks(): TmplAstDeferredBlock[];
2878
2918
  getDeferredTriggerTarget(block: TmplAstDeferredBlock, trigger: TmplAstDeferredTrigger): TmplAstElement | null;
2919
+ isDeferred(element: TmplAstElement): boolean;
2879
2920
  /**
2880
2921
  * Finds an entity with a specific name in a scope.
2881
2922
  * @param rootNode Root node of the scope.
@@ -2987,6 +3028,16 @@ export declare interface R3ComponentMetadata<DeclarationT extends R3TemplateDepe
2987
3028
  * Map of `@defer` blocks -> their corresponding metadata.
2988
3029
  */
2989
3030
  deferBlocks: Map<t.DeferredBlock, R3DeferBlockMetadata>;
3031
+ /**
3032
+ * Defines how dynamic imports for deferred dependencies should be grouped:
3033
+ * - either in a function on per-component basis (in case of local compilation)
3034
+ * - or in a function on per-block basis (in full compilation mode)
3035
+ */
3036
+ deferBlockDepsEmitMode: DeferBlockDepsEmitMode;
3037
+ /**
3038
+ * Map of deferrable symbol names -> corresponding import paths.
3039
+ */
3040
+ deferrableTypes: Map<string, string>;
2990
3041
  /**
2991
3042
  * Specifies how the 'directives' and/or `pipes` array, if generated, need to be emitted.
2992
3043
  */
@@ -3984,6 +4035,7 @@ export declare class R3Identifiers {
3984
4035
  static InputTransformsFeatureFeature: outputAst.ExternalReference;
3985
4036
  static listener: outputAst.ExternalReference;
3986
4037
  static getInheritedFactory: outputAst.ExternalReference;
4038
+ static InputFlags: outputAst.ExternalReference;
3987
4039
  static sanitizeHtml: outputAst.ExternalReference;
3988
4040
  static sanitizeStyle: outputAst.ExternalReference;
3989
4041
  static sanitizeResourceUrl: outputAst.ExternalReference;
@@ -4517,6 +4569,80 @@ export declare interface SchemaMetadata {
4517
4569
  name: string;
4518
4570
  }
4519
4571
 
4572
+ /**
4573
+ * Represents a binding scope within a template.
4574
+ *
4575
+ * Any variables, references, or other named entities declared within the template will
4576
+ * be captured and available by name in `namedEntities`. Additionally, child templates will
4577
+ * be analyzed and have their child `Scope`s available in `childScopes`.
4578
+ */
4579
+ declare class Scope implements Visitor_3 {
4580
+ readonly parentScope: Scope | null;
4581
+ readonly rootNode: ScopedNode | null;
4582
+ /**
4583
+ * Named members of the `Scope`, such as `Reference`s or `Variable`s.
4584
+ */
4585
+ readonly namedEntities: Map<string, TmplAstVariable | TmplAstReference>;
4586
+ /**
4587
+ * Set of elements that belong to this scope.
4588
+ */
4589
+ readonly elementsInScope: Set<TmplAstElement>;
4590
+ /**
4591
+ * Child `Scope`s for immediately nested `ScopedNode`s.
4592
+ */
4593
+ readonly childScopes: Map<ScopedNode, Scope>;
4594
+ /** Whether this scope is deferred or if any of its ancestors are deferred. */
4595
+ readonly isDeferred: boolean;
4596
+ private constructor();
4597
+ static newRootScope(): Scope;
4598
+ /**
4599
+ * Process a template (either as a `Template` sub-template with variables, or a plain array of
4600
+ * template `Node`s) and construct its `Scope`.
4601
+ */
4602
+ static apply(template: TmplAstNode[]): Scope;
4603
+ /**
4604
+ * Internal method to process the scoped node and populate the `Scope`.
4605
+ */
4606
+ private ingest;
4607
+ visitElement(element: TmplAstElement): void;
4608
+ visitTemplate(template: TmplAstTemplate): void;
4609
+ visitVariable(variable: TmplAstVariable): void;
4610
+ visitReference(reference: TmplAstReference): void;
4611
+ visitDeferredBlock(deferred: TmplAstDeferredBlock): void;
4612
+ visitDeferredBlockPlaceholder(block: TmplAstDeferredBlockPlaceholder): void;
4613
+ visitDeferredBlockError(block: TmplAstDeferredBlockError): void;
4614
+ visitDeferredBlockLoading(block: TmplAstDeferredBlockLoading): void;
4615
+ visitSwitchBlock(block: TmplAstSwitchBlock): void;
4616
+ visitSwitchBlockCase(block: TmplAstSwitchBlockCase): void;
4617
+ visitForLoopBlock(block: TmplAstForLoopBlock): void;
4618
+ visitForLoopBlockEmpty(block: TmplAstForLoopBlockEmpty): void;
4619
+ visitIfBlock(block: TmplAstIfBlock): void;
4620
+ visitIfBlockBranch(block: TmplAstIfBlockBranch): void;
4621
+ visitContent(content: TmplAstContent): void;
4622
+ visitBoundAttribute(attr: TmplAstBoundAttribute): void;
4623
+ visitBoundEvent(event: TmplAstBoundEvent): void;
4624
+ visitBoundText(text: TmplAstBoundText): void;
4625
+ visitText(text: TmplAstText): void;
4626
+ visitTextAttribute(attr: TmplAstTextAttribute): void;
4627
+ visitIcu(icu: TmplAstIcu): void;
4628
+ visitDeferredTrigger(trigger: TmplAstDeferredTrigger): void;
4629
+ visitUnknownBlock(block: TmplAstUnknownBlock): void;
4630
+ private maybeDeclare;
4631
+ /**
4632
+ * Look up a variable within this `Scope`.
4633
+ *
4634
+ * This can recurse into a parent `Scope` if it's available.
4635
+ */
4636
+ lookup(name: string): TmplAstReference | TmplAstVariable | null;
4637
+ /**
4638
+ * Get the child scope for a `ScopedNode`.
4639
+ *
4640
+ * This should always be defined.
4641
+ */
4642
+ getChildScope(node: ScopedNode): Scope;
4643
+ private ingestScopedNode;
4644
+ }
4645
+
4520
4646
  /** Node that has a `Scope` associated with it. */
4521
4647
  export declare type ScopedNode = TmplAstTemplate | TmplAstSwitchBlockCase | TmplAstIfBlockBranch | TmplAstForLoopBlock | TmplAstForLoopBlockEmpty | TmplAstDeferredBlock | TmplAstDeferredBlockError | TmplAstDeferredBlockLoading | TmplAstDeferredBlockPlaceholder;
4522
4648
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/compiler",
3
- "version": "17.1.0-next.5",
3
+ "version": "17.1.0",
4
4
  "description": "Angular - the compiler library",
5
5
  "author": "angular",
6
6
  "license": "MIT",
@@ -11,7 +11,7 @@
11
11
  "tslib": "^2.3.0"
12
12
  },
13
13
  "peerDependencies": {
14
- "@angular/core": "17.1.0-next.5"
14
+ "@angular/core": "17.1.0"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "@angular/core": {
@@ -1,45 +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
- * Inside the body of a repeater, certain context variables (such as `$first`) are ambiently
12
- * available. This phase finds those variable usages, and replaces them with the appropriate
13
- * expression.
14
- */
15
- export function generateRepeaterDerivedVars(job) {
16
- const repeaters = new Map();
17
- for (const unit of job.units) {
18
- for (const op of unit.ops()) {
19
- if (op.kind === ir.OpKind.RepeaterCreate) {
20
- repeaters.set(op.xref, op);
21
- }
22
- }
23
- }
24
- for (const unit of job.units) {
25
- for (const op of unit.ops()) {
26
- ir.transformExpressionsInOp(op, expr => {
27
- if (!(expr instanceof ir.DerivedRepeaterVarExpr)) {
28
- return expr;
29
- }
30
- const repeaterOp = repeaters.get(expr.xref);
31
- switch (expr.identity) {
32
- case ir.DerivedRepeaterVarIdentity.First:
33
- return new o.BinaryOperatorExpr(o.BinaryOperator.Identical, new ir.LexicalReadExpr(repeaterOp.varNames.$index), o.literal(0));
34
- case ir.DerivedRepeaterVarIdentity.Last:
35
- return new o.BinaryOperatorExpr(o.BinaryOperator.Identical, new ir.LexicalReadExpr(repeaterOp.varNames.$index), new o.BinaryOperatorExpr(o.BinaryOperator.Minus, new ir.LexicalReadExpr(repeaterOp.varNames.$count), o.literal(1)));
36
- case ir.DerivedRepeaterVarIdentity.Even:
37
- return new o.BinaryOperatorExpr(o.BinaryOperator.Identical, new o.BinaryOperatorExpr(o.BinaryOperator.Modulo, new ir.LexicalReadExpr(repeaterOp.varNames.$index), o.literal(2)), o.literal(0));
38
- case ir.DerivedRepeaterVarIdentity.Odd:
39
- return new o.BinaryOperatorExpr(o.BinaryOperator.NotIdentical, new o.BinaryOperatorExpr(o.BinaryOperator.Modulo, new ir.LexicalReadExpr(repeaterOp.varNames.$index), o.literal(2)), o.literal(0));
40
- }
41
- }, ir.VisitorContextFlag.None);
42
- }
43
- }
44
- }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXJfZGVyaXZlZF92YXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvcmVwZWF0ZXJfZGVyaXZlZF92YXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxHQUFtQjtJQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztJQUU1RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztvQkFDakQsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUUsQ0FBQztnQkFFN0MsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLEtBQUssRUFBRSxDQUFDLDBCQUEwQixDQUFDLEtBQUs7d0JBQ3RDLE9BQU8sSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQzNCLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUM5RSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BCLEtBQUssRUFBRSxDQUFDLDBCQUEwQixDQUFDLElBQUk7d0JBQ3JDLE9BQU8sSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQzNCLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUM5RSxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FDcEIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQzFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixLQUFLLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJO3dCQUNyQyxPQUFPLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUMzQixDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFDMUIsSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQ3BCLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUMzRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2pCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsS0FBSyxFQUFFLENBQUMsMEJBQTBCLENBQUMsR0FBRzt3QkFDcEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FDM0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQzdCLElBQUksQ0FBQyxDQUFDLGtCQUFrQixDQUNwQixDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDM0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcblxuaW1wb3J0IHR5cGUge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogSW5zaWRlIHRoZSBib2R5IG9mIGEgcmVwZWF0ZXIsIGNlcnRhaW4gY29udGV4dCB2YXJpYWJsZXMgKHN1Y2ggYXMgYCRmaXJzdGApIGFyZSBhbWJpZW50bHlcbiAqIGF2YWlsYWJsZS4gVGhpcyBwaGFzZSBmaW5kcyB0aG9zZSB2YXJpYWJsZSB1c2FnZXMsIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggdGhlIGFwcHJvcHJpYXRlXG4gKiBleHByZXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZXBlYXRlckRlcml2ZWRWYXJzKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgY29uc3QgcmVwZWF0ZXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlJlcGVhdGVyQ3JlYXRlT3A+KCk7XG5cbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5vcHMoKSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5SZXBlYXRlckNyZWF0ZSkge1xuICAgICAgICByZXBlYXRlcnMuc2V0KG9wLnhyZWYsIG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0Lm9wcygpKSB7XG4gICAgICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3Aob3AsIGV4cHIgPT4ge1xuICAgICAgICBpZiAoIShleHByIGluc3RhbmNlb2YgaXIuRGVyaXZlZFJlcGVhdGVyVmFyRXhwcikpIHtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXBlYXRlck9wID0gcmVwZWF0ZXJzLmdldChleHByLnhyZWYpITtcblxuICAgICAgICBzd2l0Y2ggKGV4cHIuaWRlbnRpdHkpIHtcbiAgICAgICAgICBjYXNlIGlyLkRlcml2ZWRSZXBlYXRlclZhcklkZW50aXR5LkZpcnN0OlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBvLkJpbmFyeU9wZXJhdG9yRXhwcihcbiAgICAgICAgICAgICAgICBvLkJpbmFyeU9wZXJhdG9yLklkZW50aWNhbCwgbmV3IGlyLkxleGljYWxSZWFkRXhwcihyZXBlYXRlck9wLnZhck5hbWVzLiRpbmRleCksXG4gICAgICAgICAgICAgICAgby5saXRlcmFsKDApKTtcbiAgICAgICAgICBjYXNlIGlyLkRlcml2ZWRSZXBlYXRlclZhcklkZW50aXR5Lkxhc3Q6XG4gICAgICAgICAgICByZXR1cm4gbmV3IG8uQmluYXJ5T3BlcmF0b3JFeHByKFxuICAgICAgICAgICAgICAgIG8uQmluYXJ5T3BlcmF0b3IuSWRlbnRpY2FsLCBuZXcgaXIuTGV4aWNhbFJlYWRFeHByKHJlcGVhdGVyT3AudmFyTmFtZXMuJGluZGV4KSxcbiAgICAgICAgICAgICAgICBuZXcgby5CaW5hcnlPcGVyYXRvckV4cHIoXG4gICAgICAgICAgICAgICAgICAgIG8uQmluYXJ5T3BlcmF0b3IuTWludXMsIG5ldyBpci5MZXhpY2FsUmVhZEV4cHIocmVwZWF0ZXJPcC52YXJOYW1lcy4kY291bnQpLFxuICAgICAgICAgICAgICAgICAgICBvLmxpdGVyYWwoMSkpKTtcbiAgICAgICAgICBjYXNlIGlyLkRlcml2ZWRSZXBlYXRlclZhcklkZW50aXR5LkV2ZW46XG4gICAgICAgICAgICByZXR1cm4gbmV3IG8uQmluYXJ5T3BlcmF0b3JFeHByKFxuICAgICAgICAgICAgICAgIG8uQmluYXJ5T3BlcmF0b3IuSWRlbnRpY2FsLFxuICAgICAgICAgICAgICAgIG5ldyBvLkJpbmFyeU9wZXJhdG9yRXhwcihcbiAgICAgICAgICAgICAgICAgICAgby5CaW5hcnlPcGVyYXRvci5Nb2R1bG8sIG5ldyBpci5MZXhpY2FsUmVhZEV4cHIocmVwZWF0ZXJPcC52YXJOYW1lcy4kaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICBvLmxpdGVyYWwoMikpLFxuICAgICAgICAgICAgICAgIG8ubGl0ZXJhbCgwKSk7XG4gICAgICAgICAgY2FzZSBpci5EZXJpdmVkUmVwZWF0ZXJWYXJJZGVudGl0eS5PZGQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IG8uQmluYXJ5T3BlcmF0b3JFeHByKFxuICAgICAgICAgICAgICAgIG8uQmluYXJ5T3BlcmF0b3IuTm90SWRlbnRpY2FsLFxuICAgICAgICAgICAgICAgIG5ldyBvLkJpbmFyeU9wZXJhdG9yRXhwcihcbiAgICAgICAgICAgICAgICAgICAgby5CaW5hcnlPcGVyYXRvci5Nb2R1bG8sIG5ldyBpci5MZXhpY2FsUmVhZEV4cHIocmVwZWF0ZXJPcC52YXJOYW1lcy4kaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICBvLmxpdGVyYWwoMikpLFxuICAgICAgICAgICAgICAgIG8ubGl0ZXJhbCgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==