@angular/compiler 17.0.0-next.1 → 17.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.
Files changed (66) hide show
  1. package/esm2022/src/compiler.mjs +2 -2
  2. package/esm2022/src/output/abstract_emitter.mjs +1 -1
  3. package/esm2022/src/output/abstract_js_emitter.mjs +25 -1
  4. package/esm2022/src/output/output_ast.mjs +44 -1
  5. package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
  6. package/esm2022/src/render3/partial/directive.mjs +1 -1
  7. package/esm2022/src/render3/partial/factory.mjs +1 -1
  8. package/esm2022/src/render3/partial/injectable.mjs +1 -1
  9. package/esm2022/src/render3/partial/injector.mjs +1 -1
  10. package/esm2022/src/render3/partial/ng_module.mjs +1 -1
  11. package/esm2022/src/render3/partial/pipe.mjs +1 -1
  12. package/esm2022/src/render3/r3_ast.mjs +1 -1
  13. package/esm2022/src/render3/r3_identifiers.mjs +5 -1
  14. package/esm2022/src/render3/view/compiler.mjs +26 -9
  15. package/esm2022/src/render3/view/template.mjs +115 -26
  16. package/esm2022/src/render3/view/util.mjs +2 -1
  17. package/esm2022/src/template/pipeline/ir/src/enums.mjs +41 -17
  18. package/esm2022/src/template/pipeline/ir/src/expression.mjs +69 -2
  19. package/esm2022/src/template/pipeline/ir/src/operations.mjs +13 -1
  20. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +46 -25
  21. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +3 -2
  22. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +18 -2
  23. package/esm2022/src/template/pipeline/src/compilation.mjs +107 -87
  24. package/esm2022/src/template/pipeline/src/emit.mjs +69 -72
  25. package/esm2022/src/template/pipeline/src/ingest.mjs +93 -58
  26. package/esm2022/src/template/pipeline/src/instruction.mjs +27 -9
  27. package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +4 -4
  28. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -4
  29. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +34 -12
  30. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -5
  31. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +4 -1
  32. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +44 -0
  33. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +49 -13
  34. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +5 -4
  35. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +5 -5
  36. package/esm2022/src/template/pipeline/src/phases/generate_i18n_blocks.mjs +38 -0
  37. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +3 -3
  38. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +10 -4
  39. package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +108 -0
  40. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +32 -0
  41. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +5 -5
  42. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +3 -3
  43. package/esm2022/src/template/pipeline/src/phases/naming.mjs +19 -14
  44. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +5 -5
  45. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +4 -4
  46. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +3 -3
  47. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +97 -0
  48. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
  49. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +9 -9
  50. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +4 -4
  51. package/esm2022/src/template/pipeline/src/phases/reify.mjs +31 -3
  52. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +6 -6
  53. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +63 -0
  54. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
  55. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +8 -8
  56. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +8 -8
  57. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +3 -3
  58. package/esm2022/src/template/pipeline/src/util/elements.mjs +3 -3
  59. package/esm2022/src/version.mjs +1 -1
  60. package/fesm2022/compiler.mjs +10130 -9417
  61. package/fesm2022/compiler.mjs.map +1 -1
  62. package/fesm2022/testing.mjs +1 -1
  63. package/index.d.ts +24 -4
  64. package/package.json +2 -2
  65. package/testing/index.d.ts +1 -1
  66. package/esm2022/src/template/pipeline/src/phases/property_ordering.mjs +0 -99
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.2
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.2
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -34,6 +34,18 @@ export declare class ArrayType extends Type {
34
34
  visitType(visitor: TypeVisitor, context: any): any;
35
35
  }
36
36
 
37
+ declare function arrowFn(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null): ArrowFunctionExpr;
38
+
39
+ export declare class ArrowFunctionExpr extends Expression {
40
+ params: FnParam[];
41
+ body: Expression | Statement[];
42
+ constructor(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null);
43
+ isEquivalent(e: Expression): boolean;
44
+ isConstant(): boolean;
45
+ visitExpression(visitor: ExpressionVisitor, context: any): any;
46
+ clone(): Expression;
47
+ }
48
+
37
49
  export declare abstract class AST {
38
50
  span: ParseSpan;
39
51
  /**
@@ -1291,6 +1303,7 @@ export declare interface ExpressionVisitor {
1291
1303
  visitCommaExpr(ast: CommaExpr, context: any): any;
1292
1304
  visitWrappedNodeExpr(ast: WrappedNodeExpr<any>, context: any): any;
1293
1305
  visitTypeofExpr(ast: TypeofExpr, context: any): any;
1306
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
1294
1307
  }
1295
1308
 
1296
1309
  export declare class ExternalExpr extends Expression {
@@ -2042,6 +2055,7 @@ declare namespace outputAst {
2042
2055
  unary,
2043
2056
  not,
2044
2057
  fn,
2058
+ arrowFn,
2045
2059
  ifStmt,
2046
2060
  taggedTemplate,
2047
2061
  literal,
@@ -2091,6 +2105,7 @@ declare namespace outputAst {
2091
2105
  NotExpr,
2092
2106
  FnParam,
2093
2107
  FunctionExpr,
2108
+ ArrowFunctionExpr,
2094
2109
  UnaryOperatorExpr,
2095
2110
  BinaryOperatorExpr,
2096
2111
  ReadPropExpr,
@@ -3729,6 +3744,10 @@ export declare class R3Identifiers {
3729
3744
  static deferPrefetchOnInteraction: outputAst.ExternalReference;
3730
3745
  static deferPrefetchOnViewport: outputAst.ExternalReference;
3731
3746
  static conditional: outputAst.ExternalReference;
3747
+ static repeater: outputAst.ExternalReference;
3748
+ static repeaterCreate: outputAst.ExternalReference;
3749
+ static repeaterTrackByIndex: outputAst.ExternalReference;
3750
+ static repeaterTrackByIdentity: outputAst.ExternalReference;
3732
3751
  static text: outputAst.ExternalReference;
3733
3752
  static enableBindings: outputAst.ExternalReference;
3734
3753
  static disableBindings: outputAst.ExternalReference;
@@ -4259,6 +4278,7 @@ declare class RecursiveAstVisitor_2 implements StatementVisitor, ExpressionVisit
4259
4278
  visitConditionalExpr(ast: ConditionalExpr, context: any): any;
4260
4279
  visitNotExpr(ast: NotExpr, context: any): any;
4261
4280
  visitFunctionExpr(ast: FunctionExpr, context: any): any;
4281
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
4262
4282
  visitUnaryOperatorExpr(ast: UnaryOperatorExpr, context: any): any;
4263
4283
  visitBinaryOperatorExpr(ast: BinaryOperatorExpr, context: any): any;
4264
4284
  visitReadPropExpr(ast: ReadPropExpr, context: any): any;
@@ -4811,15 +4831,15 @@ export declare class TmplAstElement implements TmplAstNode {
4811
4831
 
4812
4832
  export declare class TmplAstForLoopBlock implements TmplAstNode {
4813
4833
  itemName: string;
4814
- expression: AST;
4815
- trackBy: AST;
4834
+ expression: ASTWithSource;
4835
+ trackBy: ASTWithSource;
4816
4836
  contextVariables: ForLoopBlockContext | null;
4817
4837
  children: TmplAstNode[];
4818
4838
  empty: TmplAstForLoopBlockEmpty | null;
4819
4839
  sourceSpan: ParseSourceSpan;
4820
4840
  startSourceSpan: ParseSourceSpan;
4821
4841
  endSourceSpan: ParseSourceSpan | null;
4822
- constructor(itemName: string, expression: AST, trackBy: AST, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4842
+ constructor(itemName: string, expression: ASTWithSource, trackBy: ASTWithSource, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4823
4843
  visit<Result>(visitor: Visitor_3<Result>): Result;
4824
4844
  }
4825
4845
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/compiler",
3
- "version": "17.0.0-next.1",
3
+ "version": "17.0.0-next.2",
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.0.0-next.1"
14
+ "@angular/core": "17.0.0-next.2"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "@angular/core": {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.2
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -1,99 +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
- function kindTest(kind) {
10
- return (op) => op.kind === kind;
11
- }
12
- /**
13
- * Defines the groups based on `OpKind` that ops will be divided into. Ops will be collected into
14
- * groups, then optionally transformed, before recombining the groups in the order defined here.
15
- */
16
- const ORDERING = [
17
- { test: kindTest(ir.OpKind.StyleMap), transform: keepLast },
18
- { test: kindTest(ir.OpKind.ClassMap), transform: keepLast },
19
- { test: kindTest(ir.OpKind.StyleProp) },
20
- { test: kindTest(ir.OpKind.ClassProp) },
21
- {
22
- test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
23
- op.expression instanceof ir.Interpolation
24
- },
25
- {
26
- test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
27
- !(op.expression instanceof ir.Interpolation)
28
- },
29
- { test: kindTest(ir.OpKind.Attribute) },
30
- ];
31
- /**
32
- * The set of all op kinds we handle in the reordering phase.
33
- */
34
- const handledOpKinds = new Set([
35
- ir.OpKind.StyleMap,
36
- ir.OpKind.ClassMap,
37
- ir.OpKind.StyleProp,
38
- ir.OpKind.ClassProp,
39
- ir.OpKind.Property,
40
- ir.OpKind.HostProperty,
41
- ir.OpKind.Attribute,
42
- ]);
43
- /**
44
- * Reorders property and attribute ops according to the following ordering:
45
- * 1. styleMap & styleMapInterpolate (drops all but the last op in the group)
46
- * 2. classMap & classMapInterpolate (drops all but the last op in the group)
47
- * 3. styleProp & stylePropInterpolate (ordering preserved within group)
48
- * 4. classProp (ordering preserved within group)
49
- * 5. propertyInterpolate (ordering preserved within group)
50
- * 6. property (ordering preserved within group)
51
- * 7. attribute & attributeInterpolate (ordering preserve within group)
52
- */
53
- export function phasePropertyOrdering(cpl) {
54
- for (const unit of cpl.units) {
55
- let opsToOrder = [];
56
- for (const op of unit.update) {
57
- if (handledOpKinds.has(op.kind)) {
58
- // Pull out ops that need o be ordered.
59
- opsToOrder.push(op);
60
- ir.OpList.remove(op);
61
- }
62
- else {
63
- // When we encounter an op that shouldn't be reordered, put the ones we've pulled so far
64
- // back in the correct order.
65
- for (const orderedOp of reorder(opsToOrder)) {
66
- ir.OpList.insertBefore(orderedOp, op);
67
- }
68
- opsToOrder = [];
69
- }
70
- }
71
- // If we still have ops pulled at the end, put them back in the correct order.
72
- for (const orderedOp of reorder(opsToOrder)) {
73
- unit.update.push(orderedOp);
74
- }
75
- }
76
- }
77
- /**
78
- * Reorders the given list of ops according to the ordering defined by `ORDERING`.
79
- */
80
- function reorder(ops) {
81
- // Break the ops list into groups based on OpKind.
82
- const groups = Array.from(ORDERING, () => new Array());
83
- for (const op of ops) {
84
- const groupIndex = ORDERING.findIndex(o => o.test(op));
85
- groups[groupIndex].push(op);
86
- }
87
- // Reassemble the groups into a single list, in the correct order.
88
- return groups.flatMap((group, i) => {
89
- const transform = ORDERING[i].transform;
90
- return transform ? transform(group) : group;
91
- });
92
- }
93
- /**
94
- * Keeps only the last op in a list of ops.
95
- */
96
- function keepLast(ops) {
97
- return ops.slice(ops.length - 1);
98
- }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHlfb3JkZXJpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9wcm9wZXJ0eV9vcmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixTQUFTLFFBQVEsQ0FBQyxJQUFlO0lBQy9CLE9BQU8sQ0FBQyxFQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFFBQVEsR0FJVjtJQUNFLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7SUFDekQsRUFBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQztJQUN6RCxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQyxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQztRQUNFLElBQUksRUFBRSxDQUFDLEVBQWUsRUFBRSxFQUFFLENBQ3RCLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ3RFLEVBQUUsQ0FBQyxVQUFVLFlBQVksRUFBRSxDQUFDLGFBQWE7S0FDOUM7SUFDRDtRQUNFLElBQUks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QUVEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQUksR0FBYTtJQUNoQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG5mdW5jdGlvbiBraW5kVGVzdChraW5kOiBpci5PcEtpbmQpOiAob3A6IGlyLlVwZGF0ZU9wKSA9PiBib29sZWFuIHtcbiAgcmV0dXJuIChvcDogaXIuVXBkYXRlT3ApID0+IG9wLmtpbmQgPT09IGtpbmQ7XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZ3JvdXBzIGJhc2VkIG9uIGBPcEtpbmRgIHRoYXQgb3BzIHdpbGwgYmUgZGl2aWRlZCBpbnRvLiBPcHMgd2lsbCBiZSBjb2xsZWN0ZWQgaW50b1xuICogZ3JvdXBzLCB0aGVuIG9wdGlvbmFsbHkgdHJhbnNmb3JtZWQsIGJlZm9yZSByZWNvbWJpbmluZyB0aGUgZ3JvdXBzIGluIHRoZSBvcmRlciBkZWZpbmVkIGhlcmUuXG4gKi9cbmNvbnN0IE9SREVSSU5HOiB7XG4gIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+IGJvb2xlYW4sXG4gIHRyYW5zZm9ybT86IChvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPikgPT4gQXJyYXk8aXIuVXBkYXRlT3A+XG59W10gPVxuICAgIFtcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQ2xhc3NNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVQcm9wKX0sXG4gICAgICB7dGVzdDoga2luZFRlc3QoaXIuT3BLaW5kLkNsYXNzUHJvcCl9LFxuICAgICAge1xuICAgICAgICB0ZXN0OiAob3A6IGlyLlVwZGF0ZU9wKSA9PlxuICAgICAgICAgICAgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5Qcm9wZXJ0eSB8fCBvcC5raW5kID09PSBpci5PcEtpbmQuSG9zdFByb3BlcnR5KSAmJlxuICAgICAgICAgICAgb3AuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGlyLkludGVycG9sYXRpb25cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+XG4gICAgICAgICAgICAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlByb3BlcnR5IHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ib3N0UHJvcGVydHkpICYmXG4gICAgICAgICAgICAhKG9wLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBpci5JbnRlcnBvbGF0aW9uKVxuICAgICAgfSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQXR0cmlidXRlKX0sXG4gICAgXTtcblxuLyoqXG4gKiBUaGUgc2V0IG9mIGFsbCBvcCBraW5kcyB3ZSBoYW5kbGUgaW4gdGhlIHJlb3JkZXJpbmcgcGhhc2UuXG4gKi9cbmNvbnN0IGhhbmRsZWRPcEtpbmRzID0gbmV3IFNldChbXG4gIGlyLk9wS2luZC5TdHlsZU1hcCxcbiAgaXIuT3BLaW5kLkNsYXNzTWFwLFxuICBpci5PcEtpbmQuU3R5bGVQcm9wLFxuICBpci5PcEtpbmQuQ2xhc3NQcm9wLFxuICBpci5PcEtpbmQuUHJvcGVydHksXG4gIGlyLk9wS2luZC5Ib3N0UHJvcGVydHksXG4gIGlyLk9wS2luZC5BdHRyaWJ1dGUsXG5dKTtcblxuLyoqXG4gKiBSZW9yZGVycyBwcm9wZXJ0eSBhbmQgYXR0cmlidXRlIG9wcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBvcmRlcmluZzpcbiAqIDEuIHN0eWxlTWFwICYgc3R5bGVNYXBJbnRlcnBvbGF0ZSAoZHJvcHMgYWxsIGJ1dCB0aGUgbGFzdCBvcCBpbiB0aGUgZ3JvdXApXG4gKiAyLiBjbGFzc01hcCAmIGNsYXNzTWFwSW50ZXJwb2xhdGUgKGRyb3BzIGFsbCBidXQgdGhlIGxhc3Qgb3AgaW4gdGhlIGdyb3VwKVxuICogMy4gc3R5bGVQcm9wICYgc3R5bGVQcm9wSW50ZXJwb2xhdGUgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA0LiBjbGFzc1Byb3AgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA1LiBwcm9wZXJ0eUludGVycG9sYXRlIChvcmRlcmluZyBwcmVzZXJ2ZWQgd2l0aGluIGdyb3VwKVxuICogNi4gcHJvcGVydHkgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA3LiBhdHRyaWJ1dGUgJiBhdHRyaWJ1dGVJbnRlcnBvbGF0ZSAob3JkZXJpbmcgcHJlc2VydmUgd2l0aGluIGdyb3VwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGhhc2VQcm9wZXJ0eU9yZGVyaW5nKGNwbDogQ29tcGlsYXRpb25Kb2IpIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGNwbC51bml0cykge1xuICAgIGxldCBvcHNUb09yZGVyID0gW107XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LnVwZGF0ZSkge1xuICAgICAgaWYgKGhhbmRsZWRPcEtpbmRzLmhhcyhvcC5raW5kKSkge1xuICAgICAgICAvLyBQdWxsIG91dCBvcHMgdGhhdCBuZWVkIG8gYmUgb3JkZXJlZC5cbiAgICAgICAgb3BzVG9PcmRlci5wdXNoKG9wKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlbW92ZShvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHdlIGVuY291bnRlciBhbiBvcCB0aGF0IHNob3VsZG4ndCBiZSByZW9yZGVyZWQsIHB1dCB0aGUgb25lcyB3ZSd2ZSBwdWxsZWQgc28gZmFyXG4gICAgICAgIC8vIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZE9wIG9mIHJlb3JkZXIob3BzVG9PcmRlcikpIHtcbiAgICAgICAgICBpci5PcExpc3QuaW5zZXJ0QmVmb3JlKG9yZGVyZWRPcCwgb3ApO1xuICAgICAgICB9XG4gICAgICAgIG9wc1RvT3JkZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBvcHMgcHVsbGVkIGF0IHRoZSBlbmQsIHB1dCB0aGVtIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgZm9yIChjb25zdCBvcmRlcmVkT3Agb2YgcmVvcmRlcihvcHNUb09yZGVyKSkge1xuICAgICAgdW5pdC51cGRhdGUucHVzaChvcmRlcmVkT3ApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlb3JkZXJzIHRoZSBnaXZlbiBsaXN0IG9mIG9wcyBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyaW5nIGRlZmluZWQgYnkgYE9SREVSSU5HYC5cbiAqL1xuZnVuY3Rpb24gcmVvcmRlcihvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPik6IEFycmF5PGlyLlVwZGF0ZU9wPiB7XG4gIC8vIEJyZWFrIHRoZSBvcHMgbGlzdCBpbnRvIGdyb3VwcyBiYXNlZCBvbiBPcEtpbmQuXG4gIGNvbnN0IGdyb3VwcyA9IEFycmF5LmZyb20oT1JERVJJTkcsICgpID0+IG5ldyBBcnJheTxpci5VcGRhdGVPcD4oKSk7XG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgY29uc3QgZ3JvdXBJbmRleCA9IE9SREVSSU5HLmZpbmRJbmRleChvID0+IG8udGVzdChvcCkpO1xuICAgIGdyb3Vwc1tncm91cEluZGV4XS5wdXNoKG9wKTtcbiAgfVxuICAvLyBSZWFzc2VtYmxlIHRoZSBncm91cHMgaW50byBhIHNpbmdsZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgcmV0dXJuIGdyb3Vwcy5mbGF0TWFwKChncm91cCwgaSkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IE9SREVSSU5HW2ldLnRyYW5zZm9ybTtcbiAgICByZXR1cm4gdHJhbnNmb3JtID8gdHJhbnNmb3JtKGdyb3VwKSA6IGdyb3VwO1xuICB9KTtcbn1cblxuLyoqXG4gKiBLZWVwcyBvbmx5IHRoZSBsYXN0IG9wIGluIGEgbGlzdCBvZiBvcHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBMYXN0PFQ+KG9wczogQXJyYXk8VD4pIHtcbiAgcmV0dXJuIG9wcy5zbGljZShvcHMubGVuZ3RoIC0gMSk7XG59XG4iXX0=