semantifold 0.11.0 → 0.13.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 (71) hide show
  1. package/README.md +2 -1
  2. package/build/src/backends/c.d.ts +2 -1
  3. package/build/src/backends/c.d.ts.map +1 -1
  4. package/build/src/backends/c.js +26 -5
  5. package/build/src/backends/cpp.js +3 -1
  6. package/build/src/backends/effects.js +3 -2
  7. package/build/src/backends/java.js +33 -14
  8. package/build/src/backends/javascript.js +83 -18
  9. package/build/src/backends/ordered-expressions.d.ts +19 -7
  10. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  11. package/build/src/backends/ordered-expressions.js +46 -11
  12. package/build/src/backends/php.js +33 -14
  13. package/build/src/backends/ruby.js +37 -12
  14. package/build/src/backends/shared.d.ts.map +1 -1
  15. package/build/src/backends/shared.js +92 -37
  16. package/build/src/backends/typescript.js +83 -18
  17. package/build/src/frontends/c.d.ts +34 -1
  18. package/build/src/frontends/c.d.ts.map +1 -1
  19. package/build/src/frontends/c.js +128 -21
  20. package/build/src/frontends/java.d.ts +8 -0
  21. package/build/src/frontends/java.d.ts.map +1 -1
  22. package/build/src/frontends/java.js +77 -33
  23. package/build/src/frontends/javascript-typescript.d.ts +2 -0
  24. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  25. package/build/src/frontends/javascript-typescript.js +118 -37
  26. package/build/src/frontends/php.d.ts +8 -0
  27. package/build/src/frontends/php.d.ts.map +1 -1
  28. package/build/src/frontends/php.js +68 -29
  29. package/build/src/frontends/ruby.d.ts +3 -0
  30. package/build/src/frontends/ruby.d.ts.map +1 -1
  31. package/build/src/frontends/ruby.js +103 -30
  32. package/build/src/language-registry.d.ts.map +1 -1
  33. package/build/src/language-registry.js +16 -1
  34. package/build/src/semantic/effects.d.ts.map +1 -1
  35. package/build/src/semantic/effects.js +18 -6
  36. package/build/src/semantic/lifetime.js +28 -4
  37. package/build/src/semantic/provenance.d.ts.map +1 -1
  38. package/build/src/semantic/provenance.js +26 -7
  39. package/build/src/semantic/types.d.ts +76 -16
  40. package/build/src/semantic/types.d.ts.map +1 -1
  41. package/build/src/semantic/types.js +23 -7
  42. package/build/src/semantic/validate.d.ts.map +1 -1
  43. package/build/src/semantic/validate.js +106 -35
  44. package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
  45. package/docs/adr-numeric-tower.md +156 -0
  46. package/docs/architecture.md +1 -1
  47. package/docs/c.md +1 -1
  48. package/docs/language-support.md +10 -9
  49. package/docs/testing.md +8 -5
  50. package/package.json +1 -1
  51. package/src/backends/c.js +23 -4
  52. package/src/backends/cpp.js +1 -0
  53. package/src/backends/effects.js +2 -1
  54. package/src/backends/java.js +33 -14
  55. package/src/backends/javascript.js +83 -18
  56. package/src/backends/ordered-expressions.js +46 -10
  57. package/src/backends/php.js +33 -14
  58. package/src/backends/ruby.js +36 -12
  59. package/src/backends/shared.js +89 -42
  60. package/src/backends/typescript.js +83 -18
  61. package/src/frontends/c.js +135 -19
  62. package/src/frontends/java.js +82 -33
  63. package/src/frontends/javascript-typescript.js +130 -38
  64. package/src/frontends/php.js +68 -27
  65. package/src/frontends/ruby.js +107 -28
  66. package/src/language-registry.js +15 -0
  67. package/src/semantic/effects.js +17 -5
  68. package/src/semantic/lifetime.js +29 -3
  69. package/src/semantic/provenance.js +27 -12
  70. package/src/semantic/types.js +24 -6
  71. package/src/semantic/validate.js +105 -36
@@ -1,9 +1,10 @@
1
1
  export type Expression = import("../semantic/types.js").Expression;
2
2
  export type Scalar = import("../semantic/types.js").SemanticTypeName;
3
+ export type PlannedType = Scalar | "void";
3
4
  export type PlannedValue = {
4
5
  expression: Expression;
5
6
  path: string;
6
- type: Scalar;
7
+ type: PlannedType;
7
8
  name?: string;
8
9
  };
9
10
  export type PlannedStep = {
@@ -14,13 +15,14 @@ export type PlannedStep = {
14
15
  export type Signature = Array<string | number | boolean | Signature>;
15
16
  /** @typedef {import("../semantic/types.js").Expression} Expression */
16
17
  /** @typedef {import("../semantic/types.js").SemanticTypeName} Scalar */
17
- /** @typedef {{expression: Expression, path: string, type: Scalar, name?: string}} PlannedValue */
18
+ /** @typedef {Scalar | "void"} PlannedType */
19
+ /** @typedef {{expression: Expression, path: string, type: PlannedType, name?: string}} PlannedValue */
18
20
  /** @typedef {{result: PlannedValue, operands: PlannedValue[], rightSteps?: PlannedStep[]}} PlannedStep */
19
21
  /** @typedef {Array<string | number | boolean | Signature>} Signature */
20
22
  /** Private occurrence-based native expression sequencer; it never rewrites the IR. */
21
23
  export declare class OrderedExpressionPlanner {
22
24
  language: "c" | "cpp";
23
- functions: Map<string, import("../semantic/types.js").SemanticTypeName>;
25
+ functions: Map<string, PlannedType>;
24
26
  nextTemporary: number;
25
27
  /**
26
28
  * Indexes already validated callable return types.
@@ -32,9 +34,9 @@ export declare class OrderedExpressionPlanner {
32
34
  * Resolves an expression type from the validated lexical environment.
33
35
  * @param {Expression} expression - Semantic expression.
34
36
  * @param {Map<string, Scalar>} bindings - Lexical scalar types.
35
- * @returns {Scalar} Exact semantic result type.
37
+ * @returns {PlannedType} Exact semantic result type.
36
38
  */
37
- type(expression: Expression, bindings: Map<string, Scalar>): Scalar;
39
+ type(expression: Expression, bindings: Map<string, Scalar>): PlannedType;
38
40
  /**
39
41
  * Plans one expression in semantic order, keeping the short-circuit RHS conditional.
40
42
  * @param {Expression} expression - Original occurrence.
@@ -44,6 +46,15 @@ export declare class OrderedExpressionPlanner {
44
46
  * @returns {PlannedValue} Pure final value.
45
47
  */
46
48
  plan(expression: Expression, path: string, bindings: Map<string, Scalar>, steps: PlannedStep[]): PlannedValue;
49
+ /**
50
+ * Plans the arguments of one terminal void call without inventing a void temporary.
51
+ * @param {Expression} expression - Terminal expression occurrence.
52
+ * @param {string} path - Occurrence path.
53
+ * @param {Map<string, Scalar>} bindings - Visible scalar bindings.
54
+ * @param {PlannedStep[]} steps - Ordered enclosing prelude.
55
+ * @returns {PlannedStep} Terminal direct-call step.
56
+ */
57
+ terminal(expression: Expression, path: string, bindings: Map<string, Scalar>, steps: PlannedStep[]): PlannedStep;
47
58
  /**
48
59
  * Allocates one bounded deterministic occurrence name.
49
60
  * @param {Expression} expression - Related expression.
@@ -61,9 +72,10 @@ export declare function statementSignature(statement: import("../semantic/types.
61
72
  export type StatementPlan = {
62
73
  id: string;
63
74
  steps: PlannedStep[];
64
- value: PlannedValue;
75
+ value?: PlannedValue;
76
+ terminal?: PlannedStep;
65
77
  };
66
- /** @typedef {{id: string, steps: PlannedStep[], value: PlannedValue}} StatementPlan */
78
+ /** @typedef {{id: string, steps: PlannedStep[], value?: PlannedValue, terminal?: PlannedStep}} StatementPlan */
67
79
  /**
68
80
  * Plans every occurrence before constructing a writer or exposing either artifact.
69
81
  * @param {import("../semantic/types.js").SemanticModule} module - Validated module.
@@ -1 +1 @@
1
- {"version":3,"file":"ordered-expressions.d.ts","sourceRoot":"","sources":["../../../src/backends/ordered-expressions.js"],"names":[],"mappings":"AAKI,YAAqD,UAAU,GAArD,OAAO,sBAAsB,EAAE,UAAU,CAAY;AAC/D,YAA2D,MAAM,GAAvD,OAAO,sBAAsB,EAAE,gBAAgB,CAAQ;AACjE,YAA+E,YAAY,GAAjF;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAc;AAC3F,YAAwF,WAAW,GAAzF;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAC,CAAa;AACnG,YAAwD,SAAS,GAAvD,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAW;AAJrE,sEAAsE;AACtE,wEAAwE;AACxE,kGAAkG;AAClG,0GAA0G;AAC1G,wEAAwE;AAExE,sFAAsF;AACtF,qBAAa,wBAAwB;IAO5B,QAAQ;IACR,SAAS;IAIT,aAAa;IAXpB;;;;OAIG;IACH,YAAY,MAAM,EAHP,OAAO,sBAAsB,EAAE,cAGxB,EAAE,QAAQ,AAFzB,CACF,EADU,GAAG,GAAG,KAEiB,EAOjC;IAED;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAJJ,UAII,EAAE,QAAQ,EAHd,GAAG,CAAC,MAAM,EAAE,MAAM,CAGJ,GAFZ,MAAM,CAclB;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,UAAU,EANJ,UAMI,EAAE,IAAI,EALV,MAKU,EAAE,QAAQ,EAJpB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIE,EAAE,KAAK,EAH3B,WAAW,EAGgB,GAFzB,YAAY,CA6BxB;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAHR,UAGQ,GAFN,MAAM,CAKlB;CACF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAHjC,OAAO,sBAAsB,EAAE,SAGE,GAF/B,MAAM,CAclB;AAiBG,YAAmE,aAAa,GAAtE;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAC,CAAe;AAApF,uFAAuF;AACvF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAJ5B,OAAO,sBAAsB,EAAE,cAIH,EAAE,QAAQ,AAH9C,CACA,EADQ,GAAG,GAAG,KAGsC,GAF1C,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA4CtC"}
1
+ {"version":3,"file":"ordered-expressions.d.ts","sourceRoot":"","sources":["../../../src/backends/ordered-expressions.js"],"names":[],"mappings":"AAKI,YAAqD,UAAU,GAArD,OAAO,sBAAsB,EAAE,UAAU,CAAY;AAC/D,YAA2D,MAAM,GAAvD,OAAO,sBAAsB,EAAE,gBAAgB,CAAQ;AACjE,YAA2B,WAAW,GAA5B,MAAM,GAAG,MAAM,CAAa;AACtC,YAAoF,YAAY,GAAtF;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAc;AAChG,YAAwF,WAAW,GAAzF;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAC,CAAa;AACnG,YAAwD,SAAS,GAAvD,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAW;AALrE,sEAAsE;AACtE,wEAAwE;AACxE,6CAA6C;AAC7C,uGAAuG;AACvG,0GAA0G;AAC1G,wEAAwE;AAExE,sFAAsF;AACtF,qBAAa,wBAAwB;IAO5B,QAAQ;IACR,SAAS;IAIT,aAAa;IAXpB;;;;OAIG;IACH,YAAY,MAAM,EAHP,OAAO,sBAAsB,EAAE,cAGxB,EAAE,QAAQ,AAFzB,CACF,EADU,GAAG,GAAG,KAEiB,EAOjC;IAED;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAJJ,UAII,EAAE,QAAQ,EAHd,GAAG,CAAC,MAAM,EAAE,MAAM,CAGJ,GAFZ,WAAW,CAcvB;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,UAAU,EANJ,UAMI,EAAE,IAAI,EALV,MAKU,EAAE,QAAQ,EAJpB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIE,EAAE,KAAK,EAH3B,WAAW,EAGgB,GAFzB,YAAY,CA8BxB;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,EANR,UAMQ,EAAE,IAAI,EALd,MAKc,EAAE,QAAQ,EAJxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIM,EAAE,KAAK,EAH/B,WAAW,EAGoB,GAF7B,WAAW,CAUvB;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAHR,UAGQ,GAFN,MAAM,CAKlB;CACF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAHjC,OAAO,sBAAsB,EAAE,SAGE,GAF/B,MAAM,CAclB;AAiBG,YAA4F,aAAa,GAA/F;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAC,CAAe;AAA7G,gHAAgH;AAChH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAJ5B,OAAO,sBAAsB,EAAE,cAIH,EAAE,QAAQ,AAH9C,CACA,EADQ,GAAG,GAAG,KAGsC,GAF1C,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA6CtC"}
@@ -3,7 +3,8 @@ import { createHash } from "node:crypto";
3
3
  import { unsupportedCapability } from "../diagnostic.js";
4
4
  /** @typedef {import("../semantic/types.js").Expression} Expression */
5
5
  /** @typedef {import("../semantic/types.js").SemanticTypeName} Scalar */
6
- /** @typedef {{expression: Expression, path: string, type: Scalar, name?: string}} PlannedValue */
6
+ /** @typedef {Scalar | "void"} PlannedType */
7
+ /** @typedef {{expression: Expression, path: string, type: PlannedType, name?: string}} PlannedValue */
7
8
  /** @typedef {{result: PlannedValue, operands: PlannedValue[], rightSteps?: PlannedStep[]}} PlannedStep */
8
9
  /** @typedef {Array<string | number | boolean | Signature>} Signature */
9
10
  /** Private occurrence-based native expression sequencer; it never rewrites the IR. */
@@ -17,7 +18,7 @@ export class OrderedExpressionPlanner {
17
18
  this.language = language;
18
19
  this.functions = new Map(module.functions.map((declaration) => [
19
20
  declaration.name,
20
- scalarName(declaration.returnType, language, declaration.location)
21
+ returnName(declaration.returnType, language, declaration.location)
21
22
  ]));
22
23
  this.nextTemporary = 1;
23
24
  }
@@ -25,7 +26,7 @@ export class OrderedExpressionPlanner {
25
26
  * Resolves an expression type from the validated lexical environment.
26
27
  * @param {Expression} expression - Semantic expression.
27
28
  * @param {Map<string, Scalar>} bindings - Lexical scalar types.
28
- * @returns {Scalar} Exact semantic result type.
29
+ * @returns {PlannedType} Exact semantic result type.
29
30
  */
30
31
  type(expression, bindings) {
31
32
  if (expression.kind == "IntegerLiteral")
@@ -76,10 +77,28 @@ export class OrderedExpressionPlanner {
76
77
  }
77
78
  operands.push(this.plan(expression.right, `${path}/right`, bindings, steps));
78
79
  }
80
+ if (result.type == "void")
81
+ throw new Error("Void call reached native value planning.");
79
82
  const planned = { ...result, name: this.allocate(expression) };
80
83
  steps.push({ operands, result: planned });
81
84
  return planned;
82
85
  }
86
+ /**
87
+ * Plans the arguments of one terminal void call without inventing a void temporary.
88
+ * @param {Expression} expression - Terminal expression occurrence.
89
+ * @param {string} path - Occurrence path.
90
+ * @param {Map<string, Scalar>} bindings - Visible scalar bindings.
91
+ * @param {PlannedStep[]} steps - Ordered enclosing prelude.
92
+ * @returns {PlannedStep} Terminal direct-call step.
93
+ */
94
+ terminal(expression, path, bindings, steps) {
95
+ if (expression.kind != "CallExpression" || this.type(expression, bindings) != "void") {
96
+ throw new Error("Non-void expression reached native terminal-call planning.");
97
+ }
98
+ const result = { expression, path, type: /** @type {const} */ ("void") };
99
+ const operands = expression.arguments.map((argument, index) => this.plan(argument, `${path}/arguments/${index}`, bindings, steps));
100
+ return { operands, result };
101
+ }
83
102
  /**
84
103
  * Allocates one bounded deterministic occurrence name.
85
104
  * @param {Expression} expression - Related expression.
@@ -105,9 +124,9 @@ export function statementSignature(statement) {
105
124
  statement.kind == "LocalDeclaration" ? statement.initializer :
106
125
  statement.kind == "AssignmentStatement" || statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" ? statement.expression :
107
126
  statement.kind == "ReturnStatement" ? statement.expression : undefined;
108
- if (!expression)
127
+ if (!expression && statement.kind != "ReturnStatement")
109
128
  throw new TypeError("Bare return reached native statement signature planning.");
110
- return createHash("sha256").update(JSON.stringify([consumer, expressionSignature(expression)])).digest("hex");
129
+ return createHash("sha256").update(JSON.stringify([consumer, expression ? expressionSignature(expression) : null])).digest("hex");
111
130
  }
112
131
  /**
113
132
  * Serializes only the closed semantic expression fields.
@@ -127,7 +146,7 @@ function expressionSignature(expression) {
127
146
  return [expression.kind];
128
147
  return [expression.kind, expression.operation, expression.type, expressionSignature(expression.left), expressionSignature(expression.right)];
129
148
  }
130
- /** @typedef {{id: string, steps: PlannedStep[], value: PlannedValue}} StatementPlan */
149
+ /** @typedef {{id: string, steps: PlannedStep[], value?: PlannedValue, terminal?: PlannedStep}} StatementPlan */
131
150
  /**
132
151
  * Plans every occurrence before constructing a writer or exposing either artifact.
133
152
  * @param {import("../semantic/types.js").SemanticModule} module - Validated module.
@@ -156,12 +175,15 @@ export function planNativeModule(module, language = "c") {
156
175
  statement.kind == "ReturnStatement" ? statement.expression : undefined;
157
176
  /** @type {PlannedStep[]} */
158
177
  const steps = [];
159
- if (!expression)
160
- throw new TypeError("Bare return reached native expression planning.");
161
- const value = planner.plan(expression, `${statementPath}/${field}`, bindings, steps);
178
+ /** @type {StatementPlan} */
179
+ const plan = { id: String(plans.size + 1).padStart(6, "0"), steps };
162
180
  if (plans.size >= 999999)
163
181
  unsupportedCapability(language, "ordered statement limit", statement.location);
164
- plans.set(statementPath, { id: String(plans.size + 1).padStart(6, "0"), steps, value });
182
+ if (statement.kind == "ExpressionStatement")
183
+ plan.terminal = planner.terminal(statement.expression, `${statementPath}/${field}`, bindings, steps);
184
+ else if (expression)
185
+ plan.value = planner.plan(expression, `${statementPath}/${field}`, bindings, steps);
186
+ plans.set(statementPath, plan);
165
187
  if (statement.kind == "LocalDeclaration")
166
188
  bindings.set(statement.name, scalarName(statement.type, language, statement.location));
167
189
  if (statement.kind == "IfStatement") {
@@ -188,4 +210,17 @@ function scalarName(type, language, location) {
188
210
  }
189
211
  return type.name;
190
212
  }
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJlZC1leHByZXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9vcmRlcmVkLWV4cHJlc3Npb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELHNFQUFzRTtBQUN0RSx3RUFBd0U7QUFDeEUsa0dBQWtHO0FBQ2xHLDBHQUEwRztBQUMxRyx3RUFBd0U7QUFFeEUsc0ZBQXNGO0FBQ3RGLE1BQU0sT0FBTyx3QkFBd0I7SUFDbkM7Ozs7T0FJRztJQUNILFlBQVksTUFBTSxFQUFFLFFBQVEsR0FBRyxHQUFHO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQzdELFdBQVcsQ0FBQyxJQUFJO1lBQ2hCLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDO1NBQ25FLENBQUMsQ0FBQyxDQUFBO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRO1FBQ3ZCLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxnQkFBZ0I7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUN6RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFDekQsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGVBQWU7WUFBRSxPQUFPLFFBQVEsQ0FBQTtRQUN2RCxJQUFJ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T0FBTyxFQUNqRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2xJLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDNUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRO0lBQzFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN4RCxPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSx3REFBd0QsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM1RyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHt1bnN1cHBvcnRlZENhcGFiaWxpdHl9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBFeHByZXNzaW9uICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IFNjYWxhciAqL1xuLyoqIEB0eXBlZGVmIHt7ZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgcGF0aDogc3RyaW5nLCB0eXBlOiBTY2FsYXIsIG5hbWU/OiBzdHJpbmd9fSBQbGFubmVkVmFsdWUgKi9cbi8qKiBAdHlwZWRlZiB7e3Jlc3VsdDogUGxhbm5lZFZhbHVlLCBvcGVyYW5kczogUGxhbm5lZFZhbHVlW10sIHJpZ2h0U3RlcHM/OiBQbGFubmVkU3RlcFtdfX0gUGxhbm5lZFN0ZXAgKi9cbi8qKiBAdHlwZWRlZiB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IFNpZ25hdHVyZT59IFNpZ25hdHVyZSAqL1xuXG4vKiogUHJpdmF0ZSBvY2N1cnJlbmNlLWJhc2VkIG5hdGl2ZSBleHByZXNzaW9uIHNlcXVlbmNlcjsgaXQgbmV2ZXIgcmV3cml0ZXMgdGhlIElSLiAqL1xuZXhwb3J0IGNsYXNzIE9yZGVyZWRFeHByZXNzaW9uUGxhbm5lciB7XG4gIC8qKlxuICAgKiBJbmRleGVzIGFscmVhZHkgdmFsaWRhdGVkIGNhbGxhYmxlIHJldHVybiB0eXBlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIG1vZHVsZS5cbiAgICogQHBhcmFtIHtcImNcIiB8IFwiY3BwXCJ9IFtsYW5ndWFnZV0gLSBPd25pbmcgYmFja2VuZCBkaWFnbm9zdGljIGxhbmd1YWdlLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kdWxlLCBsYW5ndWFnZSA9IFwiY1wiKSB7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlXG4gICAgdGhpcy5mdW5jdGlvbnMgPSBuZXcgTWFwKG1vZHVsZS5mdW5jdGlvbnMubWFwKChkZWNsYXJhdGlvbikgPT4gW1xuICAgICAgZGVjbGFyYXRpb24ubmFtZSxcbiAgICAgIHNjYWxhck5hbWUoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgbGFuZ3VhZ2UsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIF0pKVxuICAgIHRoaXMubmV4dFRlbXBvcmFyeSA9IDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBleHByZXNzaW9uIHR5cGUgZnJvbSB0aGUgdmFsaWRhdGVkIGxleGljYWwgZW52aXJvbm1lbnQuXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFNlbWFudGljIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBMZXhpY2FsIHNjYWxhciB0eXBlcy5cbiAgICogQHJldHVybnMge1NjYWxhcn0gRXhhY3Qgc2VtYW50aWMgcmVzdWx0IHR5cGUuXG4gICAqL1xuICB0eXBlKGV4cHJlc3Npb24sIGJpbmRpbmdzKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIpIHJldHVybiBcImludGVnZXJcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gXCJib29sZWFuXCJcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gXCJzdHJpbmdcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uLnR5cGVcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBleHByZXNzaW9uLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KHRoaXMubGFuZ3VhZ2UsIFwiY29sbGVjdGlvbiBleHByZXNzaW9uIHJlYWNoZWQgbmF0aXZlIHNjYWxhciBwbGFubmluZ1wiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCB0eXBlID0gZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIiA/IHRoaXMuZnVuY3Rpb25zLmdldChleHByZXNzaW9uLmNhbGxlZSkgOiBiaW5kaW5ncy5nZXQoZXhwcmVzc2lvbi5uYW1lKVxuXG4gICAgaWYgKCF0eXBlKSByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KHRoaXMubGFuZ3VhZ2UsIFwidW5yZXNvbHZlZCBleHByZXNzaW9uIHR5cGVcIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICByZXR1cm4gdHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYW5zIG9uZSBleHByZXNzaW9uIGluIHNlbWFudGljIG9yZGVyLCBrZWVwaW5nIHRoZSBzaG9ydC1jaXJjdWl0IFJIUyBjb25kaXRpb25hbC5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gT3JpZ2luYWwgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBMZXhpY2FsIHR5cGVzLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRTdGVwW119IHN0ZXBzIC0gRW5jbG9zaW5nIG9yZGVyZWQgcHJlbHVkZS5cbiAgICogQHJldHVybnMge1BsYW5uZWRWYWx1ZX0gUHVyZSBmaW5hbCB2YWx1ZS5cbiAgICovXG4gIHBsYW4oZXhwcmVzc2lvbiwgcGF0aCwgYmluZGluZ3MsIHN0ZXBzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge2V4cHJlc3Npb24sIHBhdGgsIHR5cGU6IHRoaXMudHlwZShleHByZXNzaW9uLCBiaW5kaW5ncyl9XG5cbiAgICBpZiAoIVtcIkNhbGxFeHByZXNzaW9uXCIsIFwiVW5hcnlFeHByZXNzaW9uXCIsIFwiQmluYXJ5RXhwcmVzc2lvblwiXS5pbmNsdWRlcyhleHByZXNzaW9uLmtpbmQpKSByZXR1cm4gcmVzdWx0XG4gICAgY29uc3Qgb3BlcmFuZHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UGxhbm5lZFN0ZXBbXSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgcmlnaHRTdGVwc1xuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihhcmd1bWVudCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgYmluZGluZ3MsIHN0ZXBzKSlcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLm9wZXJhbmQsIGAke3BhdGh9L29wZXJhbmRgLCBiaW5kaW5ncywgc3RlcHMpKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oZXhwcmVzc2lvbi5sZWZ0LCBgJHtwYXRofS9sZWZ0YCwgYmluZGluZ3MsIHN0ZXBzKSlcbiAgICAgIGlmIChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5BbmRcIiB8fCBleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5PclwiKSB7XG4gICAgICAgIGNvbnN0IHBsYW5uZWQgPSB7Li4ucmVzdWx0LCBuYW1lOiB0aGlzLmFsbG9jYXRlKGV4cHJlc3Npb24pfVxuXG4gICAgICAgIHJpZ2h0U3RlcHMgPSBbXVxuICAgICAgICBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGJpbmRpbmdzLCByaWdodFN0ZXBzKSlcbiAgICAgICAgc3RlcHMucHVzaCh7b3BlcmFuZHMsIHJlc3VsdDogcGxhbm5lZCwgcmlnaHRTdGVwc30pXG4gICAgICAgIHJldHVybiBwbGFubmVkXG4gICAgICB9XG4gICAgICBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGJpbmRpbmdzLCBzdGVwcykpXG4gICAgfVxuICAgIGNvbnN0IHBsYW5uZWQgPSB7Li4ucmVzdWx0LCBuYW1lOiB0aGlzLmFsbG9jYXRlKGV4cHJlc3Npb24pfVxuXG4gICAgc3RlcHMucHVzaCh7b3BlcmFuZHMsIHJlc3VsdDogcGxhbm5lZH0pXG4gICAgcmV0dXJuIHBsYW5uZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvY2F0ZXMgb25lIGJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBvY2N1cnJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFJlbGF0ZWQgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVzZXJ2ZWQgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBhbGxvY2F0ZShleHByZXNzaW9uKSB7XG4gICAgaWYgKHRoaXMubmV4dFRlbXBvcmFyeSA+IDk5OTk5OSkgcmV0dXJuIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eSh0aGlzLmxhbmd1YWdlLCBcIm9yZGVyZWQtZXhwcmVzc2lvbiBvY2N1cnJlbmNlIGxpbWl0XCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgcmV0dXJuIGBzZW1hbnRpZm9sZF9vcmRlcmVkXyR7U3RyaW5nKHRoaXMubmV4dFRlbXBvcmFyeSsrKS5wYWRTdGFydCg2LCBcIjBcIil9YFxuICB9XG59XG5cbi8qKlxuICogQmluZHMgYSByZWdpb24gbWFya2VyIHRvIGl0cyBzZW1hbnRpYyBjb25zdW1lciBhbmQgZXhwcmVzc2lvbiwgaW5kZXBlbmRlbnRseSBvZiBsb2NhdGlvbnMuXG4gKiBUaGUgZGlnZXN0IGRldGVjdHMgZWRpdHM7IHN0cnVjdHVyYWwgQ1NUIHZhbGlkYXRpb24gcmVtYWlucyBtYW5kYXRvcnkgYW5kIGF1dGhvcml0YXRpdmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gc3RhdGVtZW50IC0gUmVjb25zdHJ1Y3RlZCBvciBvcmlnaW5hbCBzdGF0ZW1lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgU0hBLTI1NiBwcm9maWxlIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlbWVudFNpZ25hdHVyZShzdGF0ZW1lbnQpIHtcbiAgY29uc3QgY29uc3VtZXIgPSBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IFtzdGF0ZW1lbnQua2luZCwgc3RhdGVtZW50Lm5hbWUsXG4gICAgc2NhbGFyTmFtZShzdGF0ZW1lbnQudHlwZSwgXCJjXCIsIHN0YXRlbWVudC5sb2NhdGlvbiksIHN0YXRlbWVudC5tdXRhYmxlXSA6XG4gICAgc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIgPyBbc3RhdGVtZW50LmtpbmQsIHN0YXRlbWVudC50YXJnZXQubmFtZV0gOiBbc3RhdGVtZW50LmtpbmRdXG4gIGNvbnN0IGV4cHJlc3Npb24gPSBzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuY29uZGl0aW9uIDpcbiAgICBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IHN0YXRlbWVudC5pbml0aWFsaXplciA6XG4gICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6XG4gICAgICAgIHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuXG4gIGlmICghZXhwcmVzc2lvbikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkJhcmUgcmV0dXJuIHJlYWNoZWQgbmF0aXZlIHN0YXRlbWVudCBzaWduYXR1cmUgcGxhbm5pbmcuXCIpXG5cbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKEpTT04uc3RyaW5naWZ5KFtjb25zdW1lciwgZXhwcmVzc2lvblNpZ25hdHVyZShleHByZXNzaW9uKV0pKS5kaWdlc3QoXCJoZXhcIilcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIG9ubHkgdGhlIGNsb3NlZCBzZW1hbnRpYyBleHByZXNzaW9uIGZpZWxkcy5cbiAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gb2NjdXJyZW5jZS5cbiAqIEByZXR1cm5zIHtTaWduYXR1cmV9IFNpZ25hdHVyZSBkYXRhLlxuICovXG5mdW5jdGlvbiBleHByZXNzaW9uU2lnbmF0dXJlKGV4cHJlc3Npb24pIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLm5hbWVdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJbnRlZ2VyTGl0ZXJhbFwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gW2V4cHJlc3Npb24ua2luZCwgZXhwcmVzc2lvbi52YWx1ZV1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLmNhbGxlZSwgLi4uZXhwcmVzc2lvbi5hcmd1bWVudHMubWFwKGV4cHJlc3Npb25TaWduYXR1cmUpXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLm9wZXJhdGlvbiwgZXhwcmVzc2lvbi50eXBlLCBleHByZXNzaW9uU2lnbmF0dXJlKGV4cHJlc3Npb24ub3BlcmFuZCldXG4gIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5raW5kXVxuXG4gIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLm9wZXJhdGlvbiwgZXhwcmVzc2lvbi50eXBlLCBleHByZXNzaW9uU2lnbmF0dXJlKGV4cHJlc3Npb24ubGVmdCksIGV4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbi5yaWdodCldXG59XG5cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIHN0ZXBzOiBQbGFubmVkU3RlcFtdLCB2YWx1ZTogUGxhbm5lZFZhbHVlfX0gU3RhdGVtZW50UGxhbiAqL1xuLyoqXG4gKiBQbGFucyBldmVyeSBvY2N1cnJlbmNlIGJlZm9yZSBjb25zdHJ1Y3RpbmcgYSB3cml0ZXIgb3IgZXhwb3NpbmcgZWl0aGVyIGFydGlmYWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7XCJjXCIgfCBcImNwcFwifSBbbGFuZ3VhZ2VdIC0gTmF0aXZlIGRpYWdub3N0aWMgb3duZXIuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgU3RhdGVtZW50UGxhbj59IFBsYW5zIGluZGV4ZWQgYnkgc2VtYW50aWMgb2NjdXJyZW5jZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhbk5hdGl2ZU1vZHVsZShtb2R1bGUsIGxhbmd1YWdlID0gXCJjXCIpIHtcbiAgY29uc3QgcGxhbm5lciA9IG5ldyBPcmRlcmVkRXhwcmVzc2lvblBsYW5uZXIobW9kdWxlLCBsYW5ndWFnZSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTdGF0ZW1lbnRQbGFuPn0gKi9cbiAgY29uc3QgcGxhbnMgPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogUGxhbnMgb25lIGxleGljYWwgYmxvY2sgd2l0aCBpbmRlcGVuZGVudCBicmFuY2ggZW52aXJvbm1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSB0eXBlcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChibG9jaywgcGF0aCwgaW5oZXJpdGVkKSB7XG4gICAgY29uc3QgYmluZGluZ3MgPSBuZXcgTWFwKGluaGVyaXRlZClcblxuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVtZW50UGF0aCA9IGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gXG4gICAgICBjb25zdCBmaWVsZCA9IHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIiA/IFwiY29uZGl0aW9uXCIgOiBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IFwiaW5pdGlhbGl6ZXJcIiA6IFwiZXhwcmVzc2lvblwiXG4gICAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiID8gc3RhdGVtZW50LmNvbmRpdGlvbiA6XG4gICAgICAgIHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiID8gc3RhdGVtZW50LmluaXRpYWxpemVyIDpcbiAgICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6XG4gICAgICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOiB1bmRlZmluZWRcbiAgICAgIC8qKiBAdHlwZSB7UGxhbm5lZFN0ZXBbXX0gKi9cbiAgICAgIGNvbnN0IHN0ZXBzID0gW11cblxuICAgICAgaWYgKCFleHByZXNzaW9uKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQmFyZSByZXR1cm4gcmVhY2hlZCBuYXRpdmUgZXhwcmVzc2lvbiBwbGFubmluZy5cIilcbiAgICAgIGNvbnN0IHZhbHVlID0gcGxhbm5lci5wbGFuKGV4cHJlc3Npb24sIGAke3N0YXRlbWVudFBhdGh9LyR7ZmllbGR9YCwgYmluZGluZ3MsIHN0ZXBzKVxuXG4gICAgICBpZiAocGxhbnMuc2l6ZSA+PSA5OTk5OTkpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJvcmRlcmVkIHN0YXRlbWVudCBsaW1pdFwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICBwbGFucy5zZXQoc3RhdGVtZW50UGF0aCwge2lkOiBTdHJpbmcocGxhbnMuc2l6ZSArIDEpLnBhZFN0YXJ0KDYsIFwiMFwiKSwgc3RlcHMsIHZhbHVlfSlcbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgYmluZGluZ3Muc2V0KHN0YXRlbWVudC5uYW1lLCBzY2FsYXJOYW1lKHN0YXRlbWVudC50eXBlLCBsYW5ndWFnZSwgc3RhdGVtZW50LmxvY2F0aW9uKSlcbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke3N0YXRlbWVudFBhdGh9L2NvbnNlcXVlbnRgLCBiaW5kaW5ncylcbiAgICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHZpc2l0KHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke3N0YXRlbWVudFBhdGh9L2FsdGVybmF0ZWAsIGJpbmRpbmdzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4gdmlzaXQoZGVjbGFyYXRpb24uYm9keSwgYC9mdW5jdGlvbnMvJHtpbmRleH0vYm9keWAsXG4gICAgbmV3IE1hcChkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHNjYWxhck5hbWUocGFyYW1ldGVyLnR5cGUsIGxhbmd1YWdlLCBwYXJhbWV0ZXIubG9jYXRpb24pXSkpKSlcbiAgdmlzaXQobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCIvZW50cnlQb2ludC9ib2R5XCIsIG5ldyBNYXAoKSlcbiAgcmV0dXJuIHBsYW5zXG59XG5cbi8qKlxuICogTmFycm93cyBhIHR5cGUgYWZ0ZXIgbm9uLWNvaG9ydCBjb2xsZWN0aW9uIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtcImNcIiB8IFwiY3BwXCJ9IGxhbmd1YWdlIC0gRGlhZ25vc3RpYyBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIGxvY2F0aW9uLlxuICogQHJldHVybnMge1NjYWxhcn0gU2NhbGFyIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNjYWxhck5hbWUodHlwZSwgbGFuZ3VhZ2UsIGxvY2F0aW9uKSB7XG4gIGlmICh0eXBlLmtpbmQgIT0gXCJUeXBlUmVmZXJlbmNlXCIgfHwgdHlwZS5uYW1lID09IFwidm9pZFwiKSB7XG4gICAgcmV0dXJuIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJjb2xsZWN0aW9uIG9yIHZvaWQgdHlwZSByZWFjaGVkIG5hdGl2ZSBzY2FsYXIgcGxhbm5pbmdcIiwgbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4gdHlwZS5uYW1lXG59XG4iXX0=
213
+ /**
214
+ * Narrows a validated function return, admitting the non-value `void` result.
215
+ * @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
216
+ * @param {"c" | "cpp"} language - Diagnostic language.
217
+ * @param {import("../semantic/types.js").SourceLocation} location - Owning location.
218
+ * @returns {PlannedType} Scalar or void name.
219
+ */
220
+ function returnName(type, language, location) {
221
+ if (type.kind != "TypeReference") {
222
+ return unsupportedCapability(language, "collection type reached native scalar planning", location);
223
+ }
224
+ return type.name;
225
+ }
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJlZC1leHByZXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9vcmRlcmVkLWV4cHJlc3Npb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELHNFQUFzRTtBQUN0RSx3RUFBd0U7QUFDeEUsNkNBQTZDO0FBQzdDLHVHQUF1RztBQUN2RywwR0FBMEc7QUFDMUcsd0VBQXdFO0FBRXhFLHNGQUFzRjtBQUN0RixNQUFNLE9BQU8sd0JBQXdCO0lBQ25DOzs7O09BSUc7SUFDSCxZQUFZLE1BQU0sRUFBRSxRQUFRLEdBQUcsR0FBRztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM3RCxXQUFXLENBQUMsSUFBSTtZQUNoQixVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQztTQUNuRSxDQUFDLENBQUMsQ0FBQTtRQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUTtRQUN2QixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFDekQsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQjtZQUFFLE9BQU8sU0FBUyxDQUFBO1FBQ3pELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxlQUFlO1lBQUUsT0FBTyxRQUFRLENB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QUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEksS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUM1RCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVE7SUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3hELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLHdEQUF3RCxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzVHLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTtJQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDakMsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsZ0RBQWdELEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gRXhwcmVzc2lvbiAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSBTY2FsYXIgKi9cbi8qKiBAdHlwZWRlZiB7U2NhbGFyIHwgXCJ2b2lkXCJ9IFBsYW5uZWRUeXBlICovXG4vKiogQHR5cGVkZWYge3tleHByZXNzaW9uOiBFeHByZXNzaW9uLCBwYXRoOiBzdHJpbmcsIHR5cGU6IFBsYW5uZWRUeXBlLCBuYW1lPzogc3RyaW5nfX0gUGxhbm5lZFZhbHVlICovXG4vKiogQHR5cGVkZWYge3tyZXN1bHQ6IFBsYW5uZWRWYWx1ZSwgb3BlcmFuZHM6IFBsYW5uZWRWYWx1ZVtdLCByaWdodFN0ZXBzPzogUGxhbm5lZFN0ZXBbXX19IFBsYW5uZWRTdGVwICovXG4vKiogQHR5cGVkZWYge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBTaWduYXR1cmU+fSBTaWduYXR1cmUgKi9cblxuLyoqIFByaXZhdGUgb2NjdXJyZW5jZS1iYXNlZCBuYXRpdmUgZXhwcmVzc2lvbiBzZXF1ZW5jZXI7IGl0IG5ldmVyIHJld3JpdGVzIHRoZSBJUi4gKi9cbmV4cG9ydCBjbGFzcyBPcmRlcmVkRXhwcmVzc2lvblBsYW5uZXIge1xuICAvKipcbiAgICogSW5kZXhlcyBhbHJlYWR5IHZhbGlkYXRlZCBjYWxsYWJsZSByZXR1cm4gdHlwZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFZhbGlkYXRlZCBtb2R1bGUuXG4gICAqIEBwYXJhbSB7XCJjXCIgfCBcImNwcFwifSBbbGFuZ3VhZ2VdIC0gT3duaW5nIGJhY2tlbmQgZGlhZ25vc3RpYyBsYW5ndWFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZHVsZSwgbGFuZ3VhZ2UgPSBcImNcIikge1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuZnVuY3Rpb25zID0gbmV3IE1hcChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFtcbiAgICAgIGRlY2xhcmF0aW9uLm5hbWUsXG4gICAgICByZXR1cm5OYW1lKGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGxhbmd1YWdlLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICBdKSlcbiAgICB0aGlzLm5leHRUZW1wb3JhcnkgPSAxXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gZXhwcmVzc2lvbiB0eXBlIGZyb20gdGhlIHZhbGlkYXRlZCBsZXhpY2FsIGVudmlyb25tZW50LlxuICAgKiBAcGFyYW0ge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBTZW1hbnRpYyBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNjYWxhcj59IGJpbmRpbmdzIC0gTGV4aWNhbCBzY2FsYXIgdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQbGFubmVkVHlwZX0gRXhhY3Qgc2VtYW50aWMgcmVzdWx0IHR5cGUuXG4gICAqL1xuICB0eXBlKGV4cHJlc3Npb24sIGJpbmRpbmdzKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIpIHJldHVybiBcImludGVnZXJcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gXCJib29sZWFuXCJcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gXCJzdHJpbmdcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uLnR5cGVcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBleHByZXNzaW9uLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KHRoaXMubGFuZ3VhZ2UsIFwiY29sbGVjdGlvbiBleHByZXNzaW9uIHJlYWNoZWQgbmF0aXZlIHNjYWxhciBwbGFubmluZ1wiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCB0eXBlID0gZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIiA/IHRoaXMuZnVuY3Rpb25zLmdldChleHByZXNzaW9uLmNhbGxlZSkgOiBiaW5kaW5ncy5nZXQoZXhwcmVzc2lvbi5uYW1lKVxuXG4gICAgaWYgKCF0eXBlKSByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KHRoaXMubGFuZ3VhZ2UsIFwidW5yZXNvbHZlZCBleHByZXNzaW9uIHR5cGVcIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICByZXR1cm4gdHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYW5zIG9uZSBleHByZXNzaW9uIGluIHNlbWFudGljIG9yZGVyLCBrZWVwaW5nIHRoZSBzaG9ydC1jaXJjdWl0IFJIUyBjb25kaXRpb25hbC5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gT3JpZ2luYWwgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBMZXhpY2FsIHR5cGVzLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRTdGVwW119IHN0ZXBzIC0gRW5jbG9zaW5nIG9yZGVyZWQgcHJlbHVkZS5cbiAgICogQHJldHVybnMge1BsYW5uZWRWYWx1ZX0gUHVyZSBmaW5hbCB2YWx1ZS5cbiAgICovXG4gIHBsYW4oZXhwcmVzc2lvbiwgcGF0aCwgYmluZGluZ3MsIHN0ZXBzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge2V4cHJlc3Npb24sIHBhdGgsIHR5cGU6IHRoaXMudHlwZShleHByZXNzaW9uLCBiaW5kaW5ncyl9XG5cbiAgICBpZiAoIVtcIkNhbGxFeHByZXNzaW9uXCIsIFwiVW5hcnlFeHByZXNzaW9uXCIsIFwiQmluYXJ5RXhwcmVzc2lvblwiXS5pbmNsdWRlcyhleHByZXNzaW9uLmtpbmQpKSByZXR1cm4gcmVzdWx0XG4gICAgY29uc3Qgb3BlcmFuZHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UGxhbm5lZFN0ZXBbXSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgcmlnaHRTdGVwc1xuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihhcmd1bWVudCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgYmluZGluZ3MsIHN0ZXBzKSlcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLm9wZXJhbmQsIGAke3BhdGh9L29wZXJhbmRgLCBiaW5kaW5ncywgc3RlcHMpKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oZXhwcmVzc2lvbi5sZWZ0LCBgJHtwYXRofS9sZWZ0YCwgYmluZGluZ3MsIHN0ZXBzKSlcbiAgICAgIGlmIChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5BbmRcIiB8fCBleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5PclwiKSB7XG4gICAgICAgIGNvbnN0IHBsYW5uZWQgPSB7Li4ucmVzdWx0LCBuYW1lOiB0aGlzLmFsbG9jYXRlKGV4cHJlc3Npb24pfVxuXG4gICAgICAgIHJpZ2h0U3RlcHMgPSBbXVxuICAgICAgICBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGJpbmRpbmdzLCByaWdodFN0ZXBzKSlcbiAgICAgICAgc3RlcHMucHVzaCh7b3BlcmFuZHMsIHJlc3VsdDogcGxhbm5lZCwgcmlnaHRTdGVwc30pXG4gICAgICAgIHJldHVybiBwbGFubmVkXG4gICAgICB9XG4gICAgICBvcGVyYW5kcy5wdXNoKHRoaXMucGxhbihleHByZXNzaW9uLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGJpbmRpbmdzLCBzdGVwcykpXG4gICAgfVxuICAgIGlmIChyZXN1bHQudHlwZSA9PSBcInZvaWRcIikgdGhyb3cgbmV3IEVycm9yKFwiVm9pZCBjYWxsIHJlYWNoZWQgbmF0aXZlIHZhbHVlIHBsYW5uaW5nLlwiKVxuICAgIGNvbnN0IHBsYW5uZWQgPSB7Li4ucmVzdWx0LCBuYW1lOiB0aGlzLmFsbG9jYXRlKGV4cHJlc3Npb24pfVxuXG4gICAgc3RlcHMucHVzaCh7b3BlcmFuZHMsIHJlc3VsdDogcGxhbm5lZH0pXG4gICAgcmV0dXJuIHBsYW5uZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGFucyB0aGUgYXJndW1lbnRzIG9mIG9uZSB0ZXJtaW5hbCB2b2lkIGNhbGwgd2l0aG91dCBpbnZlbnRpbmcgYSB2b2lkIHRlbXBvcmFyeS5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gVGVybWluYWwgZXhwcmVzc2lvbiBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTY2FsYXI+fSBiaW5kaW5ncyAtIFZpc2libGUgc2NhbGFyIGJpbmRpbmdzLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRTdGVwW119IHN0ZXBzIC0gT3JkZXJlZCBlbmNsb3NpbmcgcHJlbHVkZS5cbiAgICogQHJldHVybnMge1BsYW5uZWRTdGVwfSBUZXJtaW5hbCBkaXJlY3QtY2FsbCBzdGVwLlxuICAgKi9cbiAgdGVybWluYWwoZXhwcmVzc2lvbiwgcGF0aCwgYmluZGluZ3MsIHN0ZXBzKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgdGhpcy50eXBlKGV4cHJlc3Npb24sIGJpbmRpbmdzKSAhPSBcInZvaWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLXZvaWQgZXhwcmVzc2lvbiByZWFjaGVkIG5hdGl2ZSB0ZXJtaW5hbC1jYWxsIHBsYW5uaW5nLlwiKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB7ZXhwcmVzc2lvbiwgcGF0aCwgdHlwZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidm9pZFwiKX1cbiAgICBjb25zdCBvcGVyYW5kcyA9IGV4cHJlc3Npb24uYXJndW1lbnRzLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB0aGlzLnBsYW4oYXJndW1lbnQsIGAke3BhdGh9L2FyZ3VtZW50cy8ke2luZGV4fWAsIGJpbmRpbmdzLCBzdGVwcykpXG5cbiAgICByZXR1cm4ge29wZXJhbmRzLCByZXN1bHR9XG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIG9uZSBib3VuZGVkIGRldGVybWluaXN0aWMgb2NjdXJyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBSZWxhdGVkIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlc2VydmVkIHRlbXBvcmFyeSBuYW1lLlxuICAgKi9cbiAgYWxsb2NhdGUoZXhwcmVzc2lvbikge1xuICAgIGlmICh0aGlzLm5leHRUZW1wb3JhcnkgPiA5OTk5OTkpIHJldHVybiB1bnN1cHBvcnRlZENhcGFiaWxpdHkodGhpcy5sYW5ndWFnZSwgXCJvcmRlcmVkLWV4cHJlc3Npb24gb2NjdXJyZW5jZSBsaW1pdFwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiBgc2VtYW50aWZvbGRfb3JkZXJlZF8ke1N0cmluZyh0aGlzLm5leHRUZW1wb3JhcnkrKykucGFkU3RhcnQoNiwgXCIwXCIpfWBcbiAgfVxufVxuXG4vKipcbiAqIEJpbmRzIGEgcmVnaW9uIG1hcmtlciB0byBpdHMgc2VtYW50aWMgY29uc3VtZXIgYW5kIGV4cHJlc3Npb24sIGluZGVwZW5kZW50bHkgb2YgbG9jYXRpb25zLlxuICogVGhlIGRpZ2VzdCBkZXRlY3RzIGVkaXRzOyBzdHJ1Y3R1cmFsIENTVCB2YWxpZGF0aW9uIHJlbWFpbnMgbWFuZGF0b3J5IGFuZCBhdXRob3JpdGF0aXZlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFJlY29uc3RydWN0ZWQgb3Igb3JpZ2luYWwgc3RhdGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ30gU3RhYmxlIFNIQS0yNTYgcHJvZmlsZSBzaWduYXR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZW1lbnRTaWduYXR1cmUoc3RhdGVtZW50KSB7XG4gIGNvbnN0IGNvbnN1bWVyID0gc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgPyBbc3RhdGVtZW50LmtpbmQsIHN0YXRlbWVudC5uYW1lLFxuICAgIHNjYWxhck5hbWUoc3RhdGVtZW50LnR5cGUsIFwiY1wiLCBzdGF0ZW1lbnQubG9jYXRpb24pLCBzdGF0ZW1lbnQubXV0YWJsZV0gOlxuICAgIHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiID8gW3N0YXRlbWVudC5raW5kLCBzdGF0ZW1lbnQudGFyZ2V0Lm5hbWVdIDogW3N0YXRlbWVudC5raW5kXVxuICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiID8gc3RhdGVtZW50LmNvbmRpdGlvbiA6XG4gICAgc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgPyBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIgOlxuICAgICAgc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOlxuICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOiB1bmRlZmluZWRcblxuICBpZiAoIWV4cHJlc3Npb24gJiYgc3RhdGVtZW50LmtpbmQgIT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkJhcmUgcmV0dXJuIHJlYWNoZWQgbmF0aXZlIHN0YXRlbWVudCBzaWduYXR1cmUgcGxhbm5pbmcuXCIpXG5cbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKEpTT04uc3RyaW5naWZ5KFtjb25zdW1lciwgZXhwcmVzc2lvbiA/IGV4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbikgOiBudWxsXSkpLmRpZ2VzdChcImhleFwiKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgb25seSB0aGUgY2xvc2VkIHNlbWFudGljIGV4cHJlc3Npb24gZmllbGRzLlxuICogQHBhcmFtIHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbiBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge1NpZ25hdHVyZX0gU2lnbmF0dXJlIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGV4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbikge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmtpbmQsIGV4cHJlc3Npb24ubmFtZV1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiQm9vbGVhbkxpdGVyYWxcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLnZhbHVlXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmtpbmQsIGV4cHJlc3Npb24uY2FsbGVlLCAuLi5leHByZXNzaW9uLmFyZ3VtZW50cy5tYXAoZXhwcmVzc2lvblNpZ25hdHVyZSldXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmtpbmQsIGV4cHJlc3Npb24ub3BlcmF0aW9uLCBleHByZXNzaW9uLnR5cGUsIGV4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbi5vcGVyYW5kKV1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmtpbmRdXG5cbiAgcmV0dXJuIFtleHByZXNzaW9uLmtpbmQsIGV4cHJlc3Npb24ub3BlcmF0aW9uLCBleHByZXNzaW9uLnR5cGUsIGV4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbi5sZWZ0KSwgZXhwcmVzc2lvblNpZ25hdHVyZShleHByZXNzaW9uLnJpZ2h0KV1cbn1cblxuLyoqIEB0eXBlZGVmIHt7aWQ6IHN0cmluZywgc3RlcHM6IFBsYW5uZWRTdGVwW10sIHZhbHVlPzogUGxhbm5lZFZhbHVlLCB0ZXJtaW5hbD86IFBsYW5uZWRTdGVwfX0gU3RhdGVtZW50UGxhbiAqL1xuLyoqXG4gKiBQbGFucyBldmVyeSBvY2N1cnJlbmNlIGJlZm9yZSBjb25zdHJ1Y3RpbmcgYSB3cml0ZXIgb3IgZXhwb3NpbmcgZWl0aGVyIGFydGlmYWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7XCJjXCIgfCBcImNwcFwifSBbbGFuZ3VhZ2VdIC0gTmF0aXZlIGRpYWdub3N0aWMgb3duZXIuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgU3RhdGVtZW50UGxhbj59IFBsYW5zIGluZGV4ZWQgYnkgc2VtYW50aWMgb2NjdXJyZW5jZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhbk5hdGl2ZU1vZHVsZShtb2R1bGUsIGxhbmd1YWdlID0gXCJjXCIpIHtcbiAgY29uc3QgcGxhbm5lciA9IG5ldyBPcmRlcmVkRXhwcmVzc2lvblBsYW5uZXIobW9kdWxlLCBsYW5ndWFnZSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTdGF0ZW1lbnRQbGFuPn0gKi9cbiAgY29uc3QgcGxhbnMgPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogUGxhbnMgb25lIGxleGljYWwgYmxvY2sgd2l0aCBpbmRlcGVuZGVudCBicmFuY2ggZW52aXJvbm1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSB0eXBlcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChibG9jaywgcGF0aCwgaW5oZXJpdGVkKSB7XG4gICAgY29uc3QgYmluZGluZ3MgPSBuZXcgTWFwKGluaGVyaXRlZClcblxuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVtZW50UGF0aCA9IGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gXG4gICAgICBjb25zdCBmaWVsZCA9IHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIiA/IFwiY29uZGl0aW9uXCIgOiBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IFwiaW5pdGlhbGl6ZXJcIiA6IFwiZXhwcmVzc2lvblwiXG4gICAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiID8gc3RhdGVtZW50LmNvbmRpdGlvbiA6XG4gICAgICAgIHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiID8gc3RhdGVtZW50LmluaXRpYWxpemVyIDpcbiAgICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6XG4gICAgICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOiB1bmRlZmluZWRcbiAgICAgIC8qKiBAdHlwZSB7UGxhbm5lZFN0ZXBbXX0gKi9cbiAgICAgIGNvbnN0IHN0ZXBzID0gW11cbiAgICAgIC8qKiBAdHlwZSB7U3RhdGVtZW50UGxhbn0gKi9cbiAgICAgIGNvbnN0IHBsYW4gPSB7aWQ6IFN0cmluZyhwbGFucy5zaXplICsgMSkucGFkU3RhcnQoNiwgXCIwXCIpLCBzdGVwc31cblxuICAgICAgaWYgKHBsYW5zLnNpemUgPj0gOTk5OTk5KSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwib3JkZXJlZCBzdGF0ZW1lbnQgbGltaXRcIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSBwbGFuLnRlcm1pbmFsID0gcGxhbm5lci50ZXJtaW5hbChzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vJHtmaWVsZH1gLCBiaW5kaW5ncywgc3RlcHMpXG4gICAgICBlbHNlIGlmIChleHByZXNzaW9uKSBwbGFuLnZhbHVlID0gcGxhbm5lci5wbGFuKGV4cHJlc3Npb24sIGAke3N0YXRlbWVudFBhdGh9LyR7ZmllbGR9YCwgYmluZGluZ3MsIHN0ZXBzKVxuICAgICAgcGxhbnMuc2V0KHN0YXRlbWVudFBhdGgsIHBsYW4pXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIGJpbmRpbmdzLnNldChzdGF0ZW1lbnQubmFtZSwgc2NhbGFyTmFtZShzdGF0ZW1lbnQudHlwZSwgbGFuZ3VhZ2UsIHN0YXRlbWVudC5sb2NhdGlvbikpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0KHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtzdGF0ZW1lbnRQYXRofS9jb25zZXF1ZW50YCwgYmluZGluZ3MpXG4gICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdChzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtzdGF0ZW1lbnRQYXRofS9hbHRlcm5hdGVgLCBiaW5kaW5ncylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgaW5kZXgpID0+IHZpc2l0KGRlY2xhcmF0aW9uLmJvZHksIGAvZnVuY3Rpb25zLyR7aW5kZXh9L2JvZHlgLFxuICAgIG5ldyBNYXAoZGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCBzY2FsYXJOYW1lKHBhcmFtZXRlci50eXBlLCBsYW5ndWFnZSwgcGFyYW1ldGVyLmxvY2F0aW9uKV0pKSkpXG4gIHZpc2l0KG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiL2VudHJ5UG9pbnQvYm9keVwiLCBuZXcgTWFwKCkpXG4gIHJldHVybiBwbGFuc1xufVxuXG4vKipcbiAqIE5hcnJvd3MgYSB0eXBlIGFmdGVyIG5vbi1jb2hvcnQgY29sbGVjdGlvbiByZWplY3Rpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7XCJjXCIgfCBcImNwcFwifSBsYW5ndWFnZSAtIERpYWdub3N0aWMgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE93bmluZyBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHtTY2FsYXJ9IFNjYWxhciBuYW1lLlxuICovXG5mdW5jdGlvbiBzY2FsYXJOYW1lKHR5cGUsIGxhbmd1YWdlLCBsb2NhdGlvbikge1xuICBpZiAodHlwZS5raW5kICE9IFwiVHlwZVJlZmVyZW5jZVwiIHx8IHR5cGUubmFtZSA9PSBcInZvaWRcIikge1xuICAgIHJldHVybiB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwiY29sbGVjdGlvbiBvciB2b2lkIHR5cGUgcmVhY2hlZCBuYXRpdmUgc2NhbGFyIHBsYW5uaW5nXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgcmV0dXJuIHR5cGUubmFtZVxufVxuXG4vKipcbiAqIE5hcnJvd3MgYSB2YWxpZGF0ZWQgZnVuY3Rpb24gcmV0dXJuLCBhZG1pdHRpbmcgdGhlIG5vbi12YWx1ZSBgdm9pZGAgcmVzdWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge1wiY1wiIHwgXCJjcHBcIn0gbGFuZ3VhZ2UgLSBEaWFnbm9zdGljIGxhbmd1YWdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7UGxhbm5lZFR5cGV9IFNjYWxhciBvciB2b2lkIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJldHVybk5hbWUodHlwZSwgbGFuZ3VhZ2UsIGxvY2F0aW9uKSB7XG4gIGlmICh0eXBlLmtpbmQgIT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImNvbGxlY3Rpb24gdHlwZSByZWFjaGVkIG5hdGl2ZSBzY2FsYXIgcGxhbm5pbmdcIiwgbG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4gdHlwZS5uYW1lXG59XG4iXX0=