@jigx/core-sdk 1.2.0-next.2 → 1.2.0-next.4

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.
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "version": "2.0.0",
3
- "sourceHash": "ffdacae446d9594adc9f60a9c8e68368",
4
- "timestamp": 1787038065610,
3
+ "sourceHash": "d4e1d2b256b3484699539f4a70ede121",
4
+ "timestamp": 1789125988357,
5
5
  "stats": {
6
- "inputFiles": 426,
7
- "extractionTimeMs": 272
6
+ "inputFiles": 427,
7
+ "extractionTimeMs": 284
8
8
  }
9
9
  }
@@ -95,15 +95,26 @@ export declare abstract class JsonataBuilderBase<TValue extends JsonataVariableV
95
95
  protected validateDeclaredVariables(contextPath: string): JsonataBuilderValidationIssue[];
96
96
  private validateDeclaredVariablesWithAst;
97
97
  /**
98
- * Validate JSONata syntax of expression body.
98
+ * Validate JSONata syntax of the full built expression, bindings included.
99
+ *
100
+ * Parses the same string {@link JsonataBuilderBase._build} emits, so a malformed
101
+ * `$name := <value>;` declaration is caught here rather than at runtime on device.
102
+ *
103
+ * @param contextPath - Context path reported on any issue.
104
+ * @param ctx - Build-time consumption context used to resolve {@link ResolvableBinding} values.
99
105
  */
100
- protected validateSyntax(contextPath: string): JsonataBuilderValidationIssue[];
106
+ protected validateSyntax(contextPath: string, ctx?: JsonataResolutionContext): JsonataBuilderValidationIssue[];
101
107
  /**
102
- * Run base validation (syntax + declared variables).
108
+ * Run base validation (syntax of the full built expression + declared variables).
103
109
  * Subclasses should call this and then append domain-specific checks.
110
+ *
111
+ * @param options.contextPath - Context path reported on any issue.
112
+ * @param options.ctx - Build-time consumption context, passed through to `_build` so bindings
113
+ * are validated exactly as they will be emitted.
104
114
  */
105
115
  protected _validateBase(options?: {
106
116
  contextPath?: string;
117
+ ctx?: JsonataResolutionContext;
107
118
  }): JsonataBuilderValidationResult;
108
119
  /**
109
120
  * Build final expression string.
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/jsonata/builder.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG,OAAO,mBAAmB,CAAA;AAEhG;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAAA;CACtD;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB,CAAA;AASvF;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAC1D;AAED;;;;;;;;;GASG;AACH,8BAAsB,kBAAkB,CACtC,MAAM,SAAS,oBAAoB,GAAG,oBAAoB;IAE1D,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAEzC;;;OAGG;IACH,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EA+BrE;IAED;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;IAED;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,6BAA6B,EAAE,CAExF;IAED,OAAO,CAAC,gCAAgC;IAmExC;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,6BAA6B,EAAE,CAqB7E;IAED;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,8BAA8B,CAY1F;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,EAAE;QAAE,yBAAyB,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,wBAAwB,CAAA;KAAE,GAAG,MAAM,CAa9F;CACF"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/jsonata/builder.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG,OAAO,mBAAmB,CAAA;AAEhG;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAAA;CACtD;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB,CAAA;AA8GvF;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAC1D;AAED;;;;;;;;;GASG;AACH,8BAAsB,kBAAkB,CACtC,MAAM,SAAS,oBAAoB,GAAG,oBAAoB;IAE1D,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAEzC;;;OAGG;IACH,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAwDrE;IAED;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;IAED;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,6BAA6B,EAAE,CAExF;IAED,OAAO,CAAC,gCAAgC;IAmExC;;;;;;;;OAQG;IACH,SAAS,CAAC,cAAc,CACtB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,wBAAwB,GAC7B,6BAA6B,EAAE,CAejC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAChC,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,GAAG,CAAC,EAAE,wBAAwB,CAAA;KAC/B,GAAG,8BAA8B,CAYjC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,EAAE;QAAE,yBAAyB,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,wBAAwB,CAAA;KAAE,GAAG,MAAM,CAe9F;CACF"}
@@ -16,6 +16,94 @@ export const RECORD_DATA_CONTEXT = 'RECORD_DATA_CONTEXT';
16
16
  function isResolvableBinding(value) {
17
17
  return value !== null && typeof value === 'object' && typeof value.resolveBinding === 'function';
18
18
  }
19
+ /** A JSONata variable name: a letter or underscore, then letters, digits, or underscores. */
20
+ const VARIABLE_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
21
+ /**
22
+ * Does a `@`/`$`-prefixed string denote a JSONata reference rather than literal text?
23
+ *
24
+ * Parsing alone is too weak a test — `"$a := 1"` and `"$"` are both valid JSONata, but as a binding
25
+ * value they inject an assignment and the whole input context respectively. A reference is a `path`
26
+ * (`"@ctx.a.b"`), a `function` call (`"$now()"`), or a plain named `variable` (`"$someVar"`).
27
+ *
28
+ * Excluded, and therefore treated as literal text:
29
+ * - any `bind`, at the top level or nested — every binding shares one `(...)` block scope, so a
30
+ * `:=` anywhere inside a value would reassign a sibling binding.
31
+ * - a variable whose name is not a plain identifier. The parser is permissive here: `"$"` and
32
+ * `"$$"` yield an empty or `$` name, `"$5"` a digit, and `"$\"x\""` a name of `"x"` with the
33
+ * quotes kept — each parses and evaluates to `undefined` or the whole input context. Matching
34
+ * {@link VARIABLE_NAME_PATTERN} admits only real identifiers, so the rest stay literal text.
35
+ * - a variable carrying a predicate, such as `"$x[0]"`.
36
+ */
37
+ function isReferenceFragment(trimmed) {
38
+ const ast = parseJsonataAst(trimmed);
39
+ if (ast === null || containsBind(ast)) {
40
+ return false;
41
+ }
42
+ const astType = getAstType(ast);
43
+ if (astType === 'path' || astType === 'function') {
44
+ return true;
45
+ }
46
+ if (astType !== 'variable') {
47
+ return false;
48
+ }
49
+ const name = getAstString(ast, 'value');
50
+ return name !== undefined && VARIABLE_NAME_PATTERN.test(name) && ast.predicate === undefined;
51
+ }
52
+ /**
53
+ * Does an AST assign to a variable anywhere within it?
54
+ *
55
+ * A `:=` nested inside an otherwise-valid reference — `"$trim($a := 1)"`, or a path predicate such
56
+ * as `"@ctx.items[$a := 1].name"` — reassigns whatever sibling binding shares that name, since
57
+ * {@link JsonataBuilderBase._build} splices every binding into one block scope.
58
+ */
59
+ function containsBind(ast) {
60
+ let found = false;
61
+ visitAst(ast, (node) => {
62
+ if (getAstType(node) === 'bind') {
63
+ found = true;
64
+ }
65
+ });
66
+ return found;
67
+ }
68
+ /**
69
+ * Is a quote-wrapped string a single string literal, rather than an expression that merely starts
70
+ * and ends with a quote? `'"AB-12"'` is; `'"a" & "b"'` parses as a concatenation and is not.
71
+ */
72
+ function isSingleStringLiteral(trimmed) {
73
+ const ast = parseJsonataAst(trimmed);
74
+ return ast !== null && getAstType(ast) === 'string';
75
+ }
76
+ /**
77
+ * Emit a string binding value as JSONata source.
78
+ *
79
+ * A string is emitted verbatim only when it is genuinely JSONata source: a `@`/`$`-prefixed
80
+ * reference that parses, or a single quoted literal. Anything else — prose, an empty string, a
81
+ * price like `"$5"`, a handle like `"@jigx"` — is literal text and is JSON-quoted, so it can
82
+ * neither produce an unparseable `$name := <value>;` declaration nor silently evaluate to
83
+ * something other than itself.
84
+ *
85
+ * Classification never guesses about an unprefixed, unquoted string: a bare word such as
86
+ * `Manufacturer` parses as a path lookup, so parsing cannot tell it apart from literal text. Those
87
+ * are always quoted.
88
+ */
89
+ function emitStringBinding(value) {
90
+ const trimmed = value.trim();
91
+ const isQuoteWrapped = trimmed.length >= 2 &&
92
+ ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
93
+ (trimmed.startsWith("'") && trimmed.endsWith("'")));
94
+ // Raw branches emit `trimmed`, never `value`: classification parses `trimmed`, and
95
+ // `String.prototype.trim()` strips the whole Unicode `White_Space` set while JSONata's lexer
96
+ // skips only ASCII whitespace. Emitting `value` would splice a padding NBSP back in and turn
97
+ // `"hello"` into the field lookup ` "hello" `, which evaluates to `undefined` and still parses,
98
+ // so validation cannot see it.
99
+ if (isQuoteWrapped) {
100
+ return isSingleStringLiteral(trimmed) ? trimmed : JSON.stringify(value);
101
+ }
102
+ if (trimmed.startsWith('@') || trimmed.startsWith('$')) {
103
+ return isReferenceFragment(trimmed) ? trimmed : JSON.stringify(value);
104
+ }
105
+ return JSON.stringify(value);
106
+ }
19
107
  /**
20
108
  * Reusable JSONata builder base for variable-ized expressions.
21
109
  *
@@ -39,9 +127,8 @@ export class JsonataBuilderBase {
39
127
  `The "=" prefix is handled internally by the builder.`);
40
128
  }
41
129
  this.variables = new Map();
42
- const variableNamePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
43
130
  for (const [name, value] of Object.entries(variables ?? {})) {
44
- if (!variableNamePattern.test(name)) {
131
+ if (!VARIABLE_NAME_PATTERN.test(name)) {
45
132
  throw new Error(`Invalid variable name: "${name}". ` +
46
133
  `Variable names must start with a letter or underscore, ` +
47
134
  `followed by letters, digits, or underscores.`);
@@ -50,6 +137,24 @@ export class JsonataBuilderBase {
50
137
  throw new Error(`Invalid variable value for "${name}": "${value}". ` +
51
138
  `String values must not start with "=".`);
52
139
  }
140
+ // Without these, an object with no `resolveBinding` reaches `String(value)` in `_build` and
141
+ // emits the unparseable `$name := [object Object];`.
142
+ if (value instanceof JsonataBuilderBase) {
143
+ throw new Error(`Invalid variable value for "${name}": a builder cannot be nested inside another ` +
144
+ `builder's variables. Inline its body and merge its variables, or pass a field ` +
145
+ `reference such as \`field.valueRef()\`.`);
146
+ }
147
+ if (typeof value === 'object' && value !== null && !isResolvableBinding(value)) {
148
+ throw new Error(`Invalid variable value for "${name}": expected a string, number, boolean, null, or a ` +
149
+ `ResolvableBinding (e.g. a field reference), but received an object.`);
150
+ }
151
+ // `TValue` excludes these, but an `any`-typed or deserialized map reaches here anyway, and
152
+ // `String(value)` would emit `$name := undefined;` — valid JSONata that evaluates to nothing.
153
+ const valueType = typeof value;
154
+ if (valueType === 'undefined' || valueType === 'function' || valueType === 'symbol') {
155
+ throw new Error(`Invalid variable value for "${name}": expected a string, number, boolean, null, or a ` +
156
+ `ResolvableBinding (e.g. a field reference), but received ${valueType}.`);
157
+ }
53
158
  this.variables.set(name, value);
54
159
  }
55
160
  this.expressionBody = body;
@@ -124,16 +229,17 @@ export class JsonataBuilderBase {
124
229
  }));
125
230
  }
126
231
  /**
127
- * Validate JSONata syntax of expression body.
232
+ * Validate JSONata syntax of the full built expression, bindings included.
233
+ *
234
+ * Parses the same string {@link JsonataBuilderBase._build} emits, so a malformed
235
+ * `$name := <value>;` declaration is caught here rather than at runtime on device.
236
+ *
237
+ * @param contextPath - Context path reported on any issue.
238
+ * @param ctx - Build-time consumption context used to resolve {@link ResolvableBinding} values.
128
239
  */
129
- validateSyntax(contextPath) {
130
- const transformed = transformForValidation(this.expressionBody);
131
- let syntaxValidation = validateSyntax(transformed);
132
- // Multi-statement JSONata often requires explicit block wrapping.
133
- if (!syntaxValidation.isValid) {
134
- const wrapped = transformForValidation(`(${this.expressionBody})`);
135
- syntaxValidation = validateSyntax(wrapped);
136
- }
240
+ validateSyntax(contextPath, ctx) {
241
+ const built = this._build({ shouldReturnRawExpression: true, ctx });
242
+ const syntaxValidation = validateSyntax(transformForValidation(built));
137
243
  if (!syntaxValidation.isValid && syntaxValidation.error) {
138
244
  return [
139
245
  {
@@ -147,8 +253,12 @@ export class JsonataBuilderBase {
147
253
  return [];
148
254
  }
149
255
  /**
150
- * Run base validation (syntax + declared variables).
256
+ * Run base validation (syntax of the full built expression + declared variables).
151
257
  * Subclasses should call this and then append domain-specific checks.
258
+ *
259
+ * @param options.contextPath - Context path reported on any issue.
260
+ * @param options.ctx - Build-time consumption context, passed through to `_build` so bindings
261
+ * are validated exactly as they will be emitted.
152
262
  */
153
263
  _validateBase(options) {
154
264
  const contextPath = options?.contextPath ?? '';
@@ -156,7 +266,7 @@ export class JsonataBuilderBase {
156
266
  if (!this.expressionBody) {
157
267
  return { isValid: true, issues: [] };
158
268
  }
159
- issues.push(...this.validateSyntax(contextPath));
269
+ issues.push(...this.validateSyntax(contextPath, options?.ctx));
160
270
  issues.push(...this.validateDeclaredVariables(contextPath));
161
271
  return { isValid: issues.length === 0, issues };
162
272
  }
@@ -176,11 +286,13 @@ export class JsonataBuilderBase {
176
286
  for (const [name, value] of this.variables) {
177
287
  const emitted = isResolvableBinding(value)
178
288
  ? value.resolveBinding(ctx ?? RECORD_DATA_CONTEXT)
179
- : String(value);
289
+ : typeof value === 'string'
290
+ ? emitStringBinding(value)
291
+ : String(value);
180
292
  jsonata += `$${name} := ${emitted};\n`;
181
293
  }
182
294
  jsonata += this.expressionBody;
183
295
  return shouldReturnRawExpression ? `(${jsonata})` : `=(${jsonata})`;
184
296
  }
185
297
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uYXRhL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixJQUFJLCtCQUErQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQTtBQWdEeEQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQTJCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FBQTtBQUNsRyxDQUFDO0FBc0JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBZ0Isa0JBQWtCO0lBR25CLFNBQVMsQ0FBcUI7SUFDOUIsY0FBYyxDQUFRO0lBRXpDOzs7T0FHRztJQUNILFlBQXNCLElBQVksRUFBRSxTQUFrQztRQUNwRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUNiLG1EQUFtRDtnQkFDakQsc0RBQXNELENBQ3pELENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQzFCLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUE7UUFFdEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJ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QUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUUzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsT0FBK0U7UUFDcEYsTUFBTSxFQUFFLHlCQUF5QixFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUNsRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFaEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNqQixPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLENBQUE7UUFDeEMsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQzlCLE9BQU8seUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxHQUFHLENBQUE7SUFDckUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0cmFjdFNjb3BlUmVmZXJlbmNlcyBhcyBleHRyYWN0Q2Fub25pY2FsU2NvcGVSZWZlcmVuY2VzIH0gZnJvbSAnLi9leHByZXNzaW9uLmpzJ1xuaW1wb3J0IHsgcGFyc2VKc29uYXRhQXN0LCB0cmFuc2Zvcm1Gb3JWYWxpZGF0aW9uLCB2YWxpZGF0ZVN5bnRheCB9IGZyb20gJy4vZXhwcmVzc2lvbi5qcydcbmltcG9ydCB7IGdldEFzdFN0cmluZywgZ2V0QXN0VHlwZSwgaXNBc3ROb2RlLCB2aXNpdEFzdCB9IGZyb20gJy4vYXN0LmpzJ1xuXG4vKipcbiAqIFNlbnRpbmVsIGNvbnRleHQgbWVhbmluZyBcIm5vIGNvbnN1bXB0aW9uIHNpdGUg4oCUIHJlc29sdmUgYWdhaW5zdCBzYXZlZCByZWNvcmQgZGF0YS5cIlxuICpcbiAqIFBhc3NlZCBpbnN0ZWFkIG9mIGEge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGV9IHdoZW4gYSBiaW5kaW5nIGlzIGJ1aWx0IG91dHNpZGUgYW55XG4gKiBsaXZlIGNvbXBvbmVudCBzY29wZSAoZS5nLiBleHBlcnQtc2RrIHN0ZXAtbGV2ZWwgdGl0bGUvbmV4dC9pc1JlcXVpcmVkIHNsb3RzLCBkcm9wZG93biBsaXN0XG4gKiBkYXRhKS4gQSB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHRyZWF0cyBpdCBhcyB0aGUgZXhwbGljaXQgY3Jvc3Mtc3RlcC9wZXJzaXN0ZWQtZGF0YSBicmFuY2hcbiAqIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGZyb20gYW4gZW1wdHkgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgUkVDT1JEX0RBVEFfQ09OVEVYVCA9ICdSRUNPUkRfREFUQV9DT05URVhUJ1xuXG4vKipcbiAqIFNpdGUgaGFsZiBvZiBhIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHR9OiB0aGUgbGl2ZSBjb25zdW1wdGlvbiBzaXRlJ3Mgc3RlcC9hcnJheSBzY29wZS5cbiAqXG4gKiBPcGFxdWUgdG8gY29yZS1zZGs6IGRvbWFpbiBTREtzIChlLmcuIGV4cGVydC1zZGspIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyBhbmQgYVxuICoge0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSBpbnRlcnByZXRzIHRoZW0gdG8gcGljayB0aGUgY29ycmVjdCBzY29wZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZSB7XG4gIC8qKiBPd25pbmcgc3RlcCBpZCBvZiB0aGUgY29uc3VtcHRpb24gc2l0ZSwgd2hlbiBrbm93bi4gKi9cbiAgcmVhZG9ubHkgc3RlcElkPzogc3RyaW5nXG4gIC8qKiBBcnJheSBuYW1lIG9mIHRoZSBjb25zdW1wdGlvbiBzaXRlLCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGJ1aWx0IGluc2lkZSBhbiBhcnJheS4gKi9cbiAgcmVhZG9ubHkgYXJyYXlOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIHNpdGUgY29uc3VtZXMgdGhlIGxpdmUgY3VycmVudCBpdGVtIG9mIGEgbGlzdC9hcnJheSBjb21wb25lbnQg4oCUIGl0c1xuICAgKiBwZXItaXRlbSB0aXRsZS9zdWJ0aXRsZS9kZXNjcmlwdGlvbiBkaXNwbGF5IHNsb3RzLiBTYW1lLWFycmF5IHJlZnMgaGVyZSByZXNvbHZlIHRvXG4gICAqIGBAY3R4LmN1cnJlbnQuaXRlbS4qYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ3VycmVudEl0ZW1TY29wZT86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBCdWlsZC10aW1lIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSBhIEpTT05hdGEgZXhwcmVzc2lvbiBpcyBiZWluZyBjb25zdW1lZDogZWl0aGVyIGEgbGl2ZVxuICoge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGV9IChzdGVwL2FycmF5IHNjb3BlKSBvciB0aGUge0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9XG4gKiBzZW50aW5lbCBmb3IgYmluZGluZ3MgYnVpbHQgb3V0c2lkZSBhbnkgY29tcG9uZW50IHNjb3BlLlxuICovXG5leHBvcnQgdHlwZSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQgPSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlIHwgdHlwZW9mIFJFQ09SRF9EQVRBX0NPTlRFWFRcblxuLyoqXG4gKiBBIGJpbmRpbmcgdmFsdWUgdGhhdCByZXNvbHZlcyB0byBhIEpTT05hdGEtZW1iZWRkYWJsZSBzdHJpbmcgYXQgYnVpbGQgdGltZS5cbiAqXG4gKiBMZXRzIGEgZG9tYWluIFNESyBkZWZlciBhIGJpbmRpbmcncyBmaW5hbCBzY29wZSBzdHJpbmcgdW50aWwge0BsaW5rIEpzb25hdGFCdWlsZGVyQmFzZS5fYnVpbGR9LFxuICogd2hlbiB0aGUgY29uc3VtcHRpb24tc2l0ZSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0fSBpcyBrbm93biwgd2l0aG91dCBjb3VwbGluZyBjb3JlLXNka1xuICogdG8gdGhlIGRvbWFpbiB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZhYmxlQmluZGluZyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHRvIHRoZSBmaW5hbCBzY29wZSBzdHJpbmcgZ2l2ZW4gdGhlIGJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIGN0eCAtIEJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dDogYSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0sIG9yXG4gICAqICAge0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9IHdoZW4gdGhlIGJpbmRpbmcgaXMgYnVpbHQgb3V0c2lkZSBhbnkgbGl2ZSBjb21wb25lbnQgc2NvcGUuXG4gICAqIEByZXR1cm5zIEEgSlNPTmF0YS1lbWJlZGRhYmxlIHN0cmluZyAobXVzdCBub3Qgc3RhcnQgd2l0aCBgPWApLlxuICAgKi9cbiAgcmVzb2x2ZUJpbmRpbmcoY3R4OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQpOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSnNvbmF0YVZhcmlhYmxlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IFJlc29sdmFibGVCaW5kaW5nXG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3Ige0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSB2YWx1ZXMgaW5zaWRlIGEgYmluZGluZyBtYXAuXG4gKi9cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZUJpbmRpbmcodmFsdWU6IEpzb25hdGFWYXJpYWJsZVZhbHVlKTogdmFsdWUgaXMgUmVzb2x2YWJsZUJpbmRpbmcge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUucmVzb2x2ZUJpbmRpbmcgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBNaW5pbWFsLCBjb3JlLWxldmVsIEpTT05hdGEgdmFsaWRhdGlvbiBpc3N1ZSBlbWl0dGVkIGJ5IHtAbGluayBKc29uYXRhQnVpbGRlckJhc2V9LlxuICpcbiAqIERvbWFpbiBTREtzIGNhbiBtYXAgdGhpcyB0byByaWNoZXIgaXNzdWUgbW9kZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlIHtcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZ1xuICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJ1xuICByZWFkb25seSBjb250ZXh0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xufVxuXG4vKipcbiAqIEJhc2UgdmFsaWRhdGlvbiByZXN1bHQgZnJvbSB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICByZWFkb25seSBpc1ZhbGlkOiBib29sZWFuXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXVxufVxuXG4vKipcbiAqIFJldXNhYmxlIEpTT05hdGEgYnVpbGRlciBiYXNlIGZvciB2YXJpYWJsZS1pemVkIGV4cHJlc3Npb25zLlxuICpcbiAqIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQ6XG4gKiAtIGEgc3RhYmxlIGNvbnN0cnVjdG9yIGZvciBKU09OYXRhIGJvZHkgKyB2YXJpYWJsZXMsXG4gKiAtIHN5bnRheCArIHVuZGVjbGFyZWQgdmFyaWFibGUgY2hlY2tzLFxuICogLSBjb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIChgPS4uLmAgb3IgcmF3KS5cbiAqXG4gKiBFeHRlbmQgdGhpcyBpbiBkb21haW4gcGFja2FnZXMgKGUuZy4gZXhwZXJ0LXNkaykgdG8gYWRkIGRvbWFpbiBwb2xpY3kgY2hlY2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSnNvbmF0YUJ1aWxkZXJCYXNlPFxuICBUVmFsdWUgZXh0ZW5kcyBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IEpzb25hdGFWYXJpYWJsZVZhbHVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIFRWYWx1ZT5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cHJlc3Npb25Cb2R5OiBzdHJpbmdcblxuICAvKipcbiAgICogQHBhcmFtIGJvZHkgSlNPTmF0YSBib2R5IGV4cHJlc3Npb24uIE11c3Qgbm90IHN0YXJ0IHdpdGggYD1gLlxuICAgKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluc2lkZSB0aGUgYm9keSBhcyBgJG5hbWVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZywgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVFZhbHVlPikge1xuICAgIGlmIChib2R5LnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSlNPTmF0YSBleHByZXNzaW9uIGJvZHkgbXVzdCBub3Qgc3RhcnQgd2l0aCBcIj1cIi4gYCArXG4gICAgICAgICAgYFRoZSBcIj1cIiBwcmVmaXggaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidWlsZGVyLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2YXJpYWJsZU5hbWVQYXR0ZXJuID0gL15bYS16QS1aX11bYS16QS1aMC05X10qJC9cblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgbmFtZTogXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgYFZhcmlhYmxlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlLCBgICtcbiAgICAgICAgICAgIGBmb2xsb3dlZCBieSBsZXR0ZXJzLCBkaWdpdHMsIG9yIHVuZGVyc2NvcmVzLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB2YXJpYWJsZSB2YWx1ZSBmb3IgXCIke25hbWV9XCI6IFwiJHt2YWx1ZX1cIi4gYCArXG4gICAgICAgICAgICBgU3RyaW5nIHZhbHVlcyBtdXN0IG5vdCBzdGFydCB3aXRoIFwiPVwiLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdGhpcy52YXJpYWJsZXMuc2V0KG5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMuZXhwcmVzc2lvbkJvZHkgPSBib2R5XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBjYW5vbmljYWwgYGN0eC4qYCBzY29wZSByZWZlcmVuY2VzIGZyb20gYXJiaXRyYXJ5IEpTT05hdGEtbGlrZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIGV4dHJhY3RTY29wZVJlZmVyZW5jZXModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBleHRyYWN0Q2Fub25pY2FsU2NvcGVSZWZlcmVuY2VzKHRleHQpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYCR2YXJgIHJlZmVyZW5jZXMgaW4gZXhwcmVzc2lvbiBib2R5IGFyZSBkZWNsYXJlZCwgbGFtYmRhIHBhcmFtcywgb3IgbG9jYWwgYXNzaWdubWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVEZWNsYXJlZFZhcmlhYmxlcyhjb250ZXh0UGF0aDogc3RyaW5nKTogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVEZWNsYXJlZFZhcmlhYmxlc1dpdGhBc3QoY29udGV4dFBhdGgpXG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXNXaXRoQXN0KGNvbnRleHRQYXRoOiBzdHJpbmcpOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25Jc3N1ZVtdIHtcbiAgICBjb25zdCBhc3QgPSBwYXJzZUpzb25hdGFBc3QodGhpcy5leHByZXNzaW9uQm9keSlcbiAgICBpZiAoYXN0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IHRoaXMuZXhwcmVzc2lvbkJvZHksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgY29udGV4dFBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byBwYXJzZSBKU09OYXRhIGV4cHJlc3Npb24gZm9yIHZhcmlhYmxlIHZhbGlkYXRpb24nLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmVkID0gbmV3IFNldDxzdHJpbmc+KHRoaXMudmFyaWFibGVzLmtleXMoKSlcbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICB2aXNpdEFzdChhc3QsIChub2RlLCBwYXJlbnQsIGtleUluUGFyZW50KSA9PiB7XG4gICAgICBjb25zdCBub2RlVHlwZSA9IGdldEFzdFR5cGUobm9kZSlcblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAnbGFtYmRhJyAmJiBBcnJheS5pc0FycmF5KG5vZGUuYXJndW1lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBub2RlLmFyZ3VtZW50cykge1xuICAgICAgICAgIGlmIChpc0FzdE5vZGUoYXJnKSAmJiBnZXRBc3RUeXBlKGFyZykgPT09ICd2YXJpYWJsZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhck5hbWUgPSBnZXRBc3RTdHJpbmcoYXJnLCAndmFsdWUnKVxuICAgICAgICAgICAgaWYgKHZhck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBkZWNsYXJlZC5hZGQodmFyTmFtZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAnYmluZCcgJiYgaXNBc3ROb2RlKG5vZGUubGhzKSAmJiBnZXRBc3RUeXBlKG5vZGUubGhzKSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICBjb25zdCBsaHNWYXIgPSBnZXRBc3RTdHJpbmcobm9kZS5saHMsICd2YWx1ZScpXG4gICAgICAgIGlmIChsaHNWYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2xhcmVkLmFkZChsaHNWYXIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IGdldEFzdFN0cmluZyhub2RlLCAndmFsdWUnKVxuICAgICAgICBpZiAodmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IGlzQ29udGV4dFJvb3QgPSB2YXJpYWJsZU5hbWUgPT09ICcnIHx8IHZhcmlhYmxlTmFtZSA9PT0gJyQnXG4gICAgICAgIGNvbnN0IGlzRnVuY3Rpb25Qcm9jZWR1cmUgPVxuICAgICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiBnZXRBc3RUeXBlKHBhcmVudCkgPT09ICdmdW5jdGlvbicgJiYga2V5SW5QYXJlbnQgPT09ICdwcm9jZWR1cmUnXG4gICAgICAgIGlmICghaXNDb250ZXh0Um9vdCAmJiAhaXNGdW5jdGlvblByb2NlZHVyZSkge1xuICAgICAgICAgIHJlZmVyZW5jZWQuYWRkKHZhcmlhYmxlTmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB1bmRlY2xhcmVkID0gQXJyYXkuZnJvbShyZWZlcmVuY2VkKS5maWx0ZXIoKG5hbWUpID0+ICFkZWNsYXJlZC5oYXMobmFtZSkpXG4gICAgaWYgKHVuZGVjbGFyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUxpc3QgPSB1bmRlY2xhcmVkLmpvaW4oJywgJylcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGBKU09OYXRhIGV4cHJlc3Npb24gcmVmZXJlbmNlcyB1bmRlY2xhcmVkIHZhcmlhYmxlczogJHt2YXJpYWJsZUxpc3R9LiBgICtcbiAgICAgIGBEZWNsYXJlIHRoZW0gaW4gdGhlIHZhcmlhYmxlcyBtYXAgcGFzc2VkIHRvIHRoZSBidWlsZGVyIGNvbnN0cnVjdG9yLmBcblxuICAgIHJldHVybiB1bmRlY2xhcmVkLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIHNjb3BlOiBgJCR7bmFtZX1gLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicgYXMgY29uc3QsXG4gICAgICBjb250ZXh0UGF0aCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgSlNPTmF0YSBzeW50YXggb2YgZXhwcmVzc2lvbiBib2R5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlU3ludGF4KGNvbnRleHRQYXRoOiBzdHJpbmcpOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25Jc3N1ZVtdIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHRyYW5zZm9ybUZvclZhbGlkYXRpb24odGhpcy5leHByZXNzaW9uQm9keSlcbiAgICBsZXQgc3ludGF4VmFsaWRhdGlvbiA9IHZhbGlkYXRlU3ludGF4KHRyYW5zZm9ybWVkKVxuXG4gICAgLy8gTXVsdGktc3RhdGVtZW50IEpTT05hdGEgb2Z0ZW4gcmVxdWlyZXMgZXhwbGljaXQgYmxvY2sgd3JhcHBpbmcuXG4gICAgaWYgKCFzeW50YXhWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWQgPSB0cmFuc2Zvcm1Gb3JWYWxpZGF0aW9uKGAoJHt0aGlzLmV4cHJlc3Npb25Cb2R5fSlgKVxuICAgICAgc3ludGF4VmFsaWRhdGlvbiA9IHZhbGlkYXRlU3ludGF4KHdyYXBwZWQpXG4gICAgfVxuXG4gICAgaWYgKCFzeW50YXhWYWxpZGF0aW9uLmlzVmFsaWQgJiYgc3ludGF4VmFsaWRhdGlvbi5lcnJvcikge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiB0aGlzLmV4cHJlc3Npb25Cb2R5LFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICAgIG1lc3NhZ2U6IHN5bnRheFZhbGlkYXRpb24uZXJyb3IsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBiYXNlIHZhbGlkYXRpb24gKHN5bnRheCArIGRlY2xhcmVkIHZhcmlhYmxlcykuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBhbmQgdGhlbiBhcHBlbmQgZG9tYWluLXNwZWNpZmljIGNoZWNrcy5cbiAgICovXG4gIHByb3RlY3RlZCBfdmFsaWRhdGVCYXNlKG9wdGlvbnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nIH0pOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbnRleHRQYXRoID0gb3B0aW9ucz8uY29udGV4dFBhdGggPz8gJydcbiAgICBjb25zdCBpc3N1ZXM6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10gPSBbXVxuXG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25Cb2R5KSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc3N1ZXM6IFtdIH1cbiAgICB9XG5cbiAgICBpc3N1ZXMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ludGF4KGNvbnRleHRQYXRoKSlcbiAgICBpc3N1ZXMucHVzaCguLi50aGlzLnZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXMoY29udGV4dFBhdGgpKVxuXG4gICAgcmV0dXJuIHsgaXNWYWxpZDogaXNzdWVzLmxlbmd0aCA9PT0gMCwgaXNzdWVzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBmaW5hbCBleHByZXNzaW9uIHN0cmluZy5cbiAgICpcbiAgICogUmVzb2x2YWJsZSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCBgY3R4YCAob3Ige0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9IHdoZW4gb21pdHRlZCk7XG4gICAqIGBudWxsYCBhbmQgc2NhbGFyIGJpbmRpbmdzIGFyZSBlbWl0dGVkIHZlcmJhdGltLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uIC0gUmV0dXJuIGAoJHtib2R5fSlgIGluc3RlYWQgb2YgYD0oJHtib2R5fSlgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdHggLSBCdWlsZC10aW1lIGNvbnN1bXB0aW9uIGNvbnRleHQgdXNlZCB0byByZXNvbHZlIHtAbGluayBSZXNvbHZhYmxlQmluZGluZ30gdmFsdWVzLlxuICAgKiBAcmV0dXJucyBgPSgke2JvZHl9KWAgYnkgZGVmYXVsdCwgb3IgYCgke2JvZHl9KWAgd2hlbiBgc2hvdWxkUmV0dXJuUmF3RXhwcmVzc2lvbmAgaXMgdHJ1ZS5cbiAgICovXG4gIF9idWlsZChvcHRpb25zOiB7IHNob3VsZFJldHVyblJhd0V4cHJlc3Npb246IGJvb2xlYW47IGN0eD86IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCB9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24sIGN0eCB9ID0gb3B0aW9uc1xuICAgIGxldCBqc29uYXRhID0gJydcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgZW1pdHRlZCA9IGlzUmVzb2x2YWJsZUJpbmRpbmcodmFsdWUpXG4gICAgICAgID8gdmFsdWUucmVzb2x2ZUJpbmRpbmcoY3R4ID8/IFJFQ09SRF9EQVRBX0NPTlRFWFQpXG4gICAgICAgIDogU3RyaW5nKHZhbHVlKVxuICAgICAganNvbmF0YSArPSBgJCR7bmFtZX0gOj0gJHtlbWl0dGVkfTtcXG5gXG4gICAgfVxuXG4gICAganNvbmF0YSArPSB0aGlzLmV4cHJlc3Npb25Cb2R5XG4gICAgcmV0dXJuIHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24gPyBgKCR7anNvbmF0YX0pYCA6IGA9KCR7anNvbmF0YX0pYFxuICB9XG59XG4iXX0=
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uYXRhL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixJQUFJLCtCQUErQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQTtBQWdEeEQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQTJCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FBQTtBQUNsRyxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLE1BQU0scUJBQXFCLEdBQUcsMEJBQTBCLENBQUE7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxPQUFlO0lBQzFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9CLElBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUss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SyxDQUFDO29CQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ25CLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxPQUFPLEtBQUssQ0FBQTtRQUN4QyxDQUFDO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUE7UUFDOUIsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEdBQUcsQ0FBQTtJQUNyRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0U2NvcGVSZWZlcmVuY2VzIGFzIGV4dHJhY3RDYW5vbmljYWxTY29wZVJlZmVyZW5jZXMgfSBmcm9tICcuL2V4cHJlc3Npb24uanMnXG5pbXBvcnQgeyBwYXJzZUpzb25hdGFBc3QsIHRyYW5zZm9ybUZvclZhbGlkYXRpb24sIHZhbGlkYXRlU3ludGF4IH0gZnJvbSAnLi9leHByZXNzaW9uLmpzJ1xuaW1wb3J0IHsgZ2V0QXN0U3RyaW5nLCBnZXRBc3RUeXBlLCBpc0FzdE5vZGUsIHZpc2l0QXN0IH0gZnJvbSAnLi9hc3QuanMnXG5cbi8qKlxuICogU2VudGluZWwgY29udGV4dCBtZWFuaW5nIFwibm8gY29uc3VtcHRpb24gc2l0ZSDigJQgcmVzb2x2ZSBhZ2FpbnN0IHNhdmVkIHJlY29yZCBkYXRhLlwiXG4gKlxuICogUGFzc2VkIGluc3RlYWQgb2YgYSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0gd2hlbiBhIGJpbmRpbmcgaXMgYnVpbHQgb3V0c2lkZSBhbnlcbiAqIGxpdmUgY29tcG9uZW50IHNjb3BlIChlLmcuIGV4cGVydC1zZGsgc3RlcC1sZXZlbCB0aXRsZS9uZXh0L2lzUmVxdWlyZWQgc2xvdHMsIGRyb3Bkb3duIGxpc3RcbiAqIGRhdGEpLiBBIHtAbGluayBSZXNvbHZhYmxlQmluZGluZ30gdHJlYXRzIGl0IGFzIHRoZSBleHBsaWNpdCBjcm9zcy1zdGVwL3BlcnNpc3RlZC1kYXRhIGJyYW5jaFxuICogcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUNPUkRfREFUQV9DT05URVhUID0gJ1JFQ09SRF9EQVRBX0NPTlRFWFQnXG5cbi8qKlxuICogU2l0ZSBoYWxmIG9mIGEge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dH06IHRoZSBsaXZlIGNvbnN1bXB0aW9uIHNpdGUncyBzdGVwL2FycmF5IHNjb3BlLlxuICpcbiAqIE9wYXF1ZSB0byBjb3JlLXNkazogZG9tYWluIFNES3MgKGUuZy4gZXhwZXJ0LXNkaykgcG9wdWxhdGUgdGhlc2UgZmllbGRzIGFuZCBhXG4gKiB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IGludGVycHJldHMgdGhlbSB0byBwaWNrIHRoZSBjb3JyZWN0IHNjb3BlIHN0cmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlIHtcbiAgLyoqIE93bmluZyBzdGVwIGlkIG9mIHRoZSBjb25zdW1wdGlvbiBzaXRlLCB3aGVuIGtub3duLiAqL1xuICByZWFkb25seSBzdGVwSWQ/OiBzdHJpbmdcbiAgLyoqIEFycmF5IG5hbWUgb2YgdGhlIGNvbnN1bXB0aW9uIHNpdGUsIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgYnVpbHQgaW5zaWRlIGFuIGFycmF5LiAqL1xuICByZWFkb25seSBhcnJheU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgc2l0ZSBjb25zdW1lcyB0aGUgbGl2ZSBjdXJyZW50IGl0ZW0gb2YgYSBsaXN0L2FycmF5IGNvbXBvbmVudCDigJQgaXRzXG4gICAqIHBlci1pdGVtIHRpdGxlL3N1YnRpdGxlL2Rlc2NyaXB0aW9uIGRpc3BsYXkgc2xvdHMuIFNhbWUtYXJyYXkgcmVmcyBoZXJlIHJlc29sdmUgdG9cbiAgICogYEBjdHguY3VycmVudC5pdGVtLipgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDdXJyZW50SXRlbVNjb3BlPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEJ1aWxkLXRpbWUgY29udGV4dCBkZXNjcmliaW5nIHdoZXJlIGEgSlNPTmF0YSBleHByZXNzaW9uIGlzIGJlaW5nIGNvbnN1bWVkOiBlaXRoZXIgYSBsaXZlXG4gKiB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0gKHN0ZXAvYXJyYXkgc2NvcGUpIG9yIHRoZSB7QGxpbmsgUkVDT1JEX0RBVEFfQ09OVEVYVH1cbiAqIHNlbnRpbmVsIGZvciBiaW5kaW5ncyBidWlsdCBvdXRzaWRlIGFueSBjb21wb25lbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCB0eXBlIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCA9IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGUgfCB0eXBlb2YgUkVDT1JEX0RBVEFfQ09OVEVYVFxuXG4vKipcbiAqIEEgYmluZGluZyB2YWx1ZSB0aGF0IHJlc29sdmVzIHRvIGEgSlNPTmF0YS1lbWJlZGRhYmxlIHN0cmluZyBhdCBidWlsZCB0aW1lLlxuICpcbiAqIExldHMgYSBkb21haW4gU0RLIGRlZmVyIGEgYmluZGluZydzIGZpbmFsIHNjb3BlIHN0cmluZyB1bnRpbCB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlLl9idWlsZH0sXG4gKiB3aGVuIHRoZSBjb25zdW1wdGlvbi1zaXRlIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHR9IGlzIGtub3duLCB3aXRob3V0IGNvdXBsaW5nIGNvcmUtc2RrXG4gKiB0byB0aGUgZG9tYWluIHR5cGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmFibGVCaW5kaW5nIHtcbiAgLyoqXG4gICAqIFJlc29sdmUgdG8gdGhlIGZpbmFsIHNjb3BlIHN0cmluZyBnaXZlbiB0aGUgYnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0OiBhIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlfSwgb3JcbiAgICogICB7QGxpbmsgUkVDT1JEX0RBVEFfQ09OVEVYVH0gd2hlbiB0aGUgYmluZGluZyBpcyBidWlsdCBvdXRzaWRlIGFueSBsaXZlIGNvbXBvbmVudCBzY29wZS5cbiAgICogQHJldHVybnMgQSBKU09OYXRhLWVtYmVkZGFibGUgc3RyaW5nIChtdXN0IG5vdCBzdGFydCB3aXRoIGA9YCkuXG4gICAqL1xuICByZXNvbHZlQmluZGluZyhjdHg6IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCk6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgUmVzb2x2YWJsZUJpbmRpbmdcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHZhbHVlcyBpbnNpZGUgYSBiaW5kaW5nIG1hcC5cbiAqL1xuZnVuY3Rpb24gaXNSZXNvbHZhYmxlQmluZGluZyh2YWx1ZTogSnNvbmF0YVZhcmlhYmxlVmFsdWUpOiB2YWx1ZSBpcyBSZXNvbHZhYmxlQmluZGluZyB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5yZXNvbHZlQmluZGluZyA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vKiogQSBKU09OYXRhIHZhcmlhYmxlIG5hbWU6IGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUsIHRoZW4gbGV0dGVycywgZGlnaXRzLCBvciB1bmRlcnNjb3Jlcy4gKi9cbmNvbnN0IFZBUklBQkxFX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvXG5cbi8qKlxuICogRG9lcyBhIGBAYC9gJGAtcHJlZml4ZWQgc3RyaW5nIGRlbm90ZSBhIEpTT05hdGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGxpdGVyYWwgdGV4dD9cbiAqXG4gKiBQYXJzaW5nIGFsb25lIGlzIHRvbyB3ZWFrIGEgdGVzdCDigJQgYFwiJGEgOj0gMVwiYCBhbmQgYFwiJFwiYCBhcmUgYm90aCB2YWxpZCBKU09OYXRhLCBidXQgYXMgYSBiaW5kaW5nXG4gKiB2YWx1ZSB0aGV5IGluamVjdCBhbiBhc3NpZ25tZW50IGFuZCB0aGUgd2hvbGUgaW5wdXQgY29udGV4dCByZXNwZWN0aXZlbHkuIEEgcmVmZXJlbmNlIGlzIGEgYHBhdGhgXG4gKiAoYFwiQGN0eC5hLmJcImApLCBhIGBmdW5jdGlvbmAgY2FsbCAoYFwiJG5vdygpXCJgKSwgb3IgYSBwbGFpbiBuYW1lZCBgdmFyaWFibGVgIChgXCIkc29tZVZhclwiYCkuXG4gKlxuICogRXhjbHVkZWQsIGFuZCB0aGVyZWZvcmUgdHJlYXRlZCBhcyBsaXRlcmFsIHRleHQ6XG4gKiAtIGFueSBgYmluZGAsIGF0IHRoZSB0b3AgbGV2ZWwgb3IgbmVzdGVkIOKAlCBldmVyeSBiaW5kaW5nIHNoYXJlcyBvbmUgYCguLi4pYCBibG9jayBzY29wZSwgc28gYVxuICogICBgOj1gIGFueXdoZXJlIGluc2lkZSBhIHZhbHVlIHdvdWxkIHJlYXNzaWduIGEgc2libGluZyBiaW5kaW5nLlxuICogLSBhIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgbm90IGEgcGxhaW4gaWRlbnRpZmllci4gVGhlIHBhcnNlciBpcyBwZXJtaXNzaXZlIGhlcmU6IGBcIiRcImAgYW5kXG4gKiAgIGBcIiQkXCJgIHlpZWxkIGFuIGVtcHR5IG9yIGAkYCBuYW1lLCBgXCIkNVwiYCBhIGRpZ2l0LCBhbmQgYFwiJFxcXCJ4XFxcIlwiYCBhIG5hbWUgb2YgYFwieFwiYCB3aXRoIHRoZVxuICogICBxdW90ZXMga2VwdCDigJQgZWFjaCBwYXJzZXMgYW5kIGV2YWx1YXRlcyB0byBgdW5kZWZpbmVkYCBvciB0aGUgd2hvbGUgaW5wdXQgY29udGV4dC4gTWF0Y2hpbmdcbiAqICAge0BsaW5rIFZBUklBQkxFX05BTUVfUEFUVEVSTn0gYWRtaXRzIG9ubHkgcmVhbCBpZGVudGlmaWVycywgc28gdGhlIHJlc3Qgc3RheSBsaXRlcmFsIHRleHQuXG4gKiAtIGEgdmFyaWFibGUgY2FycnlpbmcgYSBwcmVkaWNhdGUsIHN1Y2ggYXMgYFwiJHhbMF1cImAuXG4gKi9cbmZ1bmN0aW9uIGlzUmVmZXJlbmNlRnJhZ21lbnQodHJpbW1lZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFzdCA9IHBhcnNlSnNvbmF0YUFzdCh0cmltbWVkKVxuICBpZiAoYXN0ID09PSBudWxsIHx8IGNvbnRhaW5zQmluZChhc3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBhc3RUeXBlID0gZ2V0QXN0VHlwZShhc3QpXG4gIGlmIChhc3RUeXBlID09PSAncGF0aCcgfHwgYXN0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoYXN0VHlwZSAhPT0gJ3ZhcmlhYmxlJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgbmFtZSA9IGdldEFzdFN0cmluZyhhc3QsICd2YWx1ZScpXG4gIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgJiYgVkFSSUFCTEVfTkFNRV9QQVRURVJOLnRlc3QobmFtZSkgJiYgYXN0LnByZWRpY2F0ZSA9PT0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRG9lcyBhbiBBU1QgYXNzaWduIHRvIGEgdmFyaWFibGUgYW55d2hlcmUgd2l0aGluIGl0P1xuICpcbiAqIEEgYDo9YCBuZXN0ZWQgaW5zaWRlIGFuIG90aGVyd2lzZS12YWxpZCByZWZlcmVuY2Ug4oCUIGBcIiR0cmltKCRhIDo9IDEpXCJgLCBvciBhIHBhdGggcHJlZGljYXRlIHN1Y2hcbiAqIGFzIGBcIkBjdHguaXRlbXNbJGEgOj0gMV0ubmFtZVwiYCDigJQgcmVhc3NpZ25zIHdoYXRldmVyIHNpYmxpbmcgYmluZGluZyBzaGFyZXMgdGhhdCBuYW1lLCBzaW5jZVxuICoge0BsaW5rIEpzb25hdGFCdWlsZGVyQmFzZS5fYnVpbGR9IHNwbGljZXMgZXZlcnkgYmluZGluZyBpbnRvIG9uZSBibG9jayBzY29wZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNCaW5kKGFzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgbGV0IGZvdW5kID0gZmFsc2VcbiAgdmlzaXRBc3QoYXN0LCAobm9kZSkgPT4ge1xuICAgIGlmIChnZXRBc3RUeXBlKG5vZGUpID09PSAnYmluZCcpIHtcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGZvdW5kXG59XG5cbi8qKlxuICogSXMgYSBxdW90ZS13cmFwcGVkIHN0cmluZyBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCwgcmF0aGVyIHRoYW4gYW4gZXhwcmVzc2lvbiB0aGF0IG1lcmVseSBzdGFydHNcbiAqIGFuZCBlbmRzIHdpdGggYSBxdW90ZT8gYCdcIkFCLTEyXCInYCBpczsgYCdcImFcIiAmIFwiYlwiJ2AgcGFyc2VzIGFzIGEgY29uY2F0ZW5hdGlvbiBhbmQgaXMgbm90LlxuICovXG5mdW5jdGlvbiBpc1NpbmdsZVN0cmluZ0xpdGVyYWwodHJpbW1lZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFzdCA9IHBhcnNlSnNvbmF0YUFzdCh0cmltbWVkKVxuICByZXR1cm4gYXN0ICE9PSBudWxsICYmIGdldEFzdFR5cGUoYXN0KSA9PT0gJ3N0cmluZydcbn1cblxuLyoqXG4gKiBFbWl0IGEgc3RyaW5nIGJpbmRpbmcgdmFsdWUgYXMgSlNPTmF0YSBzb3VyY2UuXG4gKlxuICogQSBzdHJpbmcgaXMgZW1pdHRlZCB2ZXJiYXRpbSBvbmx5IHdoZW4gaXQgaXMgZ2VudWluZWx5IEpTT05hdGEgc291cmNlOiBhIGBAYC9gJGAtcHJlZml4ZWRcbiAqIHJlZmVyZW5jZSB0aGF0IHBhcnNlcywgb3IgYSBzaW5nbGUgcXVvdGVkIGxpdGVyYWwuIEFueXRoaW5nIGVsc2Ug4oCUIHByb3NlLCBhbiBlbXB0eSBzdHJpbmcsIGFcbiAqIHByaWNlIGxpa2UgYFwiJDVcImAsIGEgaGFuZGxlIGxpa2UgYFwiQGppZ3hcImAg4oCUIGlzIGxpdGVyYWwgdGV4dCBhbmQgaXMgSlNPTi1xdW90ZWQsIHNvIGl0IGNhblxuICogbmVpdGhlciBwcm9kdWNlIGFuIHVucGFyc2VhYmxlIGAkbmFtZSA6PSA8dmFsdWU+O2AgZGVjbGFyYXRpb24gbm9yIHNpbGVudGx5IGV2YWx1YXRlIHRvXG4gKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHNlbGYuXG4gKlxuICogQ2xhc3NpZmljYXRpb24gbmV2ZXIgZ3Vlc3NlcyBhYm91dCBhbiB1bnByZWZpeGVkLCB1bnF1b3RlZCBzdHJpbmc6IGEgYmFyZSB3b3JkIHN1Y2ggYXNcbiAqIGBNYW51ZmFjdHVyZXJgIHBhcnNlcyBhcyBhIHBhdGggbG9va3VwLCBzbyBwYXJzaW5nIGNhbm5vdCB0ZWxsIGl0IGFwYXJ0IGZyb20gbGl0ZXJhbCB0ZXh0LiBUaG9zZVxuICogYXJlIGFsd2F5cyBxdW90ZWQuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdHJpbmdCaW5kaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG5cbiAgY29uc3QgaXNRdW90ZVdyYXBwZWQgPVxuICAgIHRyaW1tZWQubGVuZ3RoID49IDIgJiZcbiAgICAoKHRyaW1tZWQuc3RhcnRzV2l0aCgnXCInKSAmJiB0cmltbWVkLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIidcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIidcIikpKVxuXG4gIC8vIFJhdyBicmFuY2hlcyBlbWl0IGB0cmltbWVkYCwgbmV2ZXIgYHZhbHVlYDogY2xhc3NpZmljYXRpb24gcGFyc2VzIGB0cmltbWVkYCwgYW5kXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW0oKWAgc3RyaXBzIHRoZSB3aG9sZSBVbmljb2RlIGBXaGl0ZV9TcGFjZWAgc2V0IHdoaWxlIEpTT05hdGEncyBsZXhlclxuICAvLyBza2lwcyBvbmx5IEFTQ0lJIHdoaXRlc3BhY2UuIEVtaXR0aW5nIGB2YWx1ZWAgd291bGQgc3BsaWNlIGEgcGFkZGluZyBOQlNQIGJhY2sgaW4gYW5kIHR1cm5cbiAgLy8gYFwiaGVsbG9cImAgaW50byB0aGUgZmllbGQgbG9va3VwIGAgXCJoZWxsb1wiIGAsIHdoaWNoIGV2YWx1YXRlcyB0byBgdW5kZWZpbmVkYCBhbmQgc3RpbGwgcGFyc2VzLFxuICAvLyBzbyB2YWxpZGF0aW9uIGNhbm5vdCBzZWUgaXQuXG4gIGlmIChpc1F1b3RlV3JhcHBlZCkge1xuICAgIHJldHVybiBpc1NpbmdsZVN0cmluZ0xpdGVyYWwodHJpbW1lZCkgPyB0cmltbWVkIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdAJykgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCckJykpIHtcbiAgICByZXR1cm4gaXNSZWZlcmVuY2VGcmFnbWVudCh0cmltbWVkKSA/IHRyaW1tZWQgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBNaW5pbWFsLCBjb3JlLWxldmVsIEpTT05hdGEgdmFsaWRhdGlvbiBpc3N1ZSBlbWl0dGVkIGJ5IHtAbGluayBKc29uYXRhQnVpbGRlckJhc2V9LlxuICpcbiAqIERvbWFpbiBTREtzIGNhbiBtYXAgdGhpcyB0byByaWNoZXIgaXNzdWUgbW9kZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlIHtcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZ1xuICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJ1xuICByZWFkb25seSBjb250ZXh0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xufVxuXG4vKipcbiAqIEJhc2UgdmFsaWRhdGlvbiByZXN1bHQgZnJvbSB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICByZWFkb25seSBpc1ZhbGlkOiBib29sZWFuXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXVxufVxuXG4vKipcbiAqIFJldXNhYmxlIEpTT05hdGEgYnVpbGRlciBiYXNlIGZvciB2YXJpYWJsZS1pemVkIGV4cHJlc3Npb25zLlxuICpcbiAqIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQ6XG4gKiAtIGEgc3RhYmxlIGNvbnN0cnVjdG9yIGZvciBKU09OYXRhIGJvZHkgKyB2YXJpYWJsZXMsXG4gKiAtIHN5bnRheCArIHVuZGVjbGFyZWQgdmFyaWFibGUgY2hlY2tzLFxuICogLSBjb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIChgPS4uLmAgb3IgcmF3KS5cbiAqXG4gKiBFeHRlbmQgdGhpcyBpbiBkb21haW4gcGFja2FnZXMgKGUuZy4gZXhwZXJ0LXNkaykgdG8gYWRkIGRvbWFpbiBwb2xpY3kgY2hlY2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSnNvbmF0YUJ1aWxkZXJCYXNlPFxuICBUVmFsdWUgZXh0ZW5kcyBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IEpzb25hdGFWYXJpYWJsZVZhbHVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIFRWYWx1ZT5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cHJlc3Npb25Cb2R5OiBzdHJpbmdcblxuICAvKipcbiAgICogQHBhcmFtIGJvZHkgSlNPTmF0YSBib2R5IGV4cHJlc3Npb24uIE11c3Qgbm90IHN0YXJ0IHdpdGggYD1gLlxuICAgKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluc2lkZSB0aGUgYm9keSBhcyBgJG5hbWVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZywgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVFZhbHVlPikge1xuICAgIGlmIChib2R5LnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSlNPTmF0YSBleHByZXNzaW9uIGJvZHkgbXVzdCBub3Qgc3RhcnQgd2l0aCBcIj1cIi4gYCArXG4gICAgICAgICAgYFRoZSBcIj1cIiBwcmVmaXggaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidWlsZGVyLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgTWFwKClcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzID8/IHt9KSkge1xuICAgICAgaWYgKCFWQVJJQUJMRV9OQU1FX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgbmFtZTogXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgYFZhcmlhYmxlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlLCBgICtcbiAgICAgICAgICAgIGBmb2xsb3dlZCBieSBsZXR0ZXJzLCBkaWdpdHMsIG9yIHVuZGVyc2NvcmVzLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB2YXJpYWJsZSB2YWx1ZSBmb3IgXCIke25hbWV9XCI6IFwiJHt2YWx1ZX1cIi4gYCArXG4gICAgICAgICAgICBgU3RyaW5nIHZhbHVlcyBtdXN0IG5vdCBzdGFydCB3aXRoIFwiPVwiLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gV2l0aG91dCB0aGVzZSwgYW4gb2JqZWN0IHdpdGggbm8gYHJlc29sdmVCaW5kaW5nYCByZWFjaGVzIGBTdHJpbmcodmFsdWUpYCBpbiBgX2J1aWxkYCBhbmRcbiAgICAgIC8vIGVtaXRzIHRoZSB1bnBhcnNlYWJsZSBgJG5hbWUgOj0gW29iamVjdCBPYmplY3RdO2AuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBKc29uYXRhQnVpbGRlckJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHZhcmlhYmxlIHZhbHVlIGZvciBcIiR7bmFtZX1cIjogYSBidWlsZGVyIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgYCArXG4gICAgICAgICAgICBgYnVpbGRlcidzIHZhcmlhYmxlcy4gSW5saW5lIGl0cyBib2R5IGFuZCBtZXJnZSBpdHMgdmFyaWFibGVzLCBvciBwYXNzIGEgZmllbGQgYCArXG4gICAgICAgICAgICBgcmVmZXJlbmNlIHN1Y2ggYXMgXFxgZmllbGQudmFsdWVSZWYoKVxcYC5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFpc1Jlc29sdmFibGVCaW5kaW5nKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgdmFsdWUgZm9yIFwiJHtuYW1lfVwiOiBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCBvciBhIGAgK1xuICAgICAgICAgICAgYFJlc29sdmFibGVCaW5kaW5nIChlLmcuIGEgZmllbGQgcmVmZXJlbmNlKSwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdC5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIGBUVmFsdWVgIGV4Y2x1ZGVzIHRoZXNlLCBidXQgYW4gYGFueWAtdHlwZWQgb3IgZGVzZXJpYWxpemVkIG1hcCByZWFjaGVzIGhlcmUgYW55d2F5LCBhbmRcbiAgICAgIC8vIGBTdHJpbmcodmFsdWUpYCB3b3VsZCBlbWl0IGAkbmFtZSA6PSB1bmRlZmluZWQ7YCDigJQgdmFsaWQgSlNPTmF0YSB0aGF0IGV2YWx1YXRlcyB0byBub3RoaW5nLlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG4gICAgICBpZiAodmFsdWVUeXBlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZVR5cGUgPT09ICdmdW5jdGlvbicgfHwgdmFsdWVUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgdmFsdWUgZm9yIFwiJHtuYW1lfVwiOiBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCBvciBhIGAgK1xuICAgICAgICAgICAgYFJlc29sdmFibGVCaW5kaW5nIChlLmcuIGEgZmllbGQgcmVmZXJlbmNlKSwgYnV0IHJlY2VpdmVkICR7dmFsdWVUeXBlfS5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFyaWFibGVzLnNldChuYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25Cb2R5ID0gYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgY2Fub25pY2FsIGBjdHguKmAgc2NvcGUgcmVmZXJlbmNlcyBmcm9tIGFyYml0cmFyeSBKU09OYXRhLWxpa2UgdGV4dC5cbiAgICovXG4gIHN0YXRpYyBleHRyYWN0U2NvcGVSZWZlcmVuY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZXh0cmFjdENhbm9uaWNhbFNjb3BlUmVmZXJlbmNlcyh0ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGAkdmFyYCByZWZlcmVuY2VzIGluIGV4cHJlc3Npb24gYm9keSBhcmUgZGVjbGFyZWQsIGxhbWJkYSBwYXJhbXMsIG9yIGxvY2FsIGFzc2lnbm1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXMoY29udGV4dFBhdGg6IHN0cmluZyk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXNXaXRoQXN0KGNvbnRleHRQYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZURlY2xhcmVkVmFyaWFibGVzV2l0aEFzdChjb250ZXh0UGF0aDogc3RyaW5nKTogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSB7XG4gICAgY29uc3QgYXN0ID0gcGFyc2VKc29uYXRhQXN0KHRoaXMuZXhwcmVzc2lvbkJvZHkpXG4gICAgaWYgKGFzdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiB0aGlzLmV4cHJlc3Npb25Cb2R5LFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gcGFyc2UgSlNPTmF0YSBleHByZXNzaW9uIGZvciB2YXJpYWJsZSB2YWxpZGF0aW9uJyxcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzLnZhcmlhYmxlcy5rZXlzKCkpXG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgdmlzaXRBc3QoYXN0LCAobm9kZSwgcGFyZW50LCBrZXlJblBhcmVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPSBnZXRBc3RUeXBlKG5vZGUpXG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ2xhbWJkYScgJiYgQXJyYXkuaXNBcnJheShub2RlLmFyZ3VtZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygbm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICBpZiAoaXNBc3ROb2RlKGFyZykgJiYgZ2V0QXN0VHlwZShhcmcpID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJOYW1lID0gZ2V0QXN0U3RyaW5nKGFyZywgJ3ZhbHVlJylcbiAgICAgICAgICAgIGlmICh2YXJOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZGVjbGFyZWQuYWRkKHZhck5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ2JpbmQnICYmIGlzQXN0Tm9kZShub2RlLmxocykgJiYgZ2V0QXN0VHlwZShub2RlLmxocykgPT09ICd2YXJpYWJsZScpIHtcbiAgICAgICAgY29uc3QgbGhzVmFyID0gZ2V0QXN0U3RyaW5nKG5vZGUubGhzLCAndmFsdWUnKVxuICAgICAgICBpZiAobGhzVmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWNsYXJlZC5hZGQobGhzVmFyKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBnZXRBc3RTdHJpbmcobm9kZSwgJ3ZhbHVlJylcbiAgICAgICAgaWYgKHZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgICBjb25zdCBpc0NvbnRleHRSb290ID0gdmFyaWFibGVOYW1lID09PSAnJyB8fCB2YXJpYWJsZU5hbWUgPT09ICckJ1xuICAgICAgICBjb25zdCBpc0Z1bmN0aW9uUHJvY2VkdXJlID1cbiAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYgZ2V0QXN0VHlwZShwYXJlbnQpID09PSAnZnVuY3Rpb24nICYmIGtleUluUGFyZW50ID09PSAncHJvY2VkdXJlJ1xuICAgICAgICBpZiAoIWlzQ29udGV4dFJvb3QgJiYgIWlzRnVuY3Rpb25Qcm9jZWR1cmUpIHtcbiAgICAgICAgICByZWZlcmVuY2VkLmFkZCh2YXJpYWJsZU5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgdW5kZWNsYXJlZCA9IEFycmF5LmZyb20ocmVmZXJlbmNlZCkuZmlsdGVyKChuYW1lKSA9PiAhZGVjbGFyZWQuaGFzKG5hbWUpKVxuICAgIGlmICh1bmRlY2xhcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVMaXN0ID0gdW5kZWNsYXJlZC5qb2luKCcsICcpXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBgSlNPTmF0YSBleHByZXNzaW9uIHJlZmVyZW5jZXMgdW5kZWNsYXJlZCB2YXJpYWJsZXM6ICR7dmFyaWFibGVMaXN0fS4gYCArXG4gICAgICBgRGVjbGFyZSB0aGVtIGluIHRoZSB2YXJpYWJsZXMgbWFwIHBhc3NlZCB0byB0aGUgYnVpbGRlciBjb25zdHJ1Y3Rvci5gXG5cbiAgICByZXR1cm4gdW5kZWNsYXJlZC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBzY29wZTogYCQke25hbWV9YCxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InIGFzIGNvbnN0LFxuICAgICAgY29udGV4dFBhdGgsXG4gICAgICBtZXNzYWdlLFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIEpTT05hdGEgc3ludGF4IG9mIHRoZSBmdWxsIGJ1aWx0IGV4cHJlc3Npb24sIGJpbmRpbmdzIGluY2x1ZGVkLlxuICAgKlxuICAgKiBQYXJzZXMgdGhlIHNhbWUgc3RyaW5nIHtAbGluayBKc29uYXRhQnVpbGRlckJhc2UuX2J1aWxkfSBlbWl0cywgc28gYSBtYWxmb3JtZWRcbiAgICogYCRuYW1lIDo9IDx2YWx1ZT47YCBkZWNsYXJhdGlvbiBpcyBjYXVnaHQgaGVyZSByYXRoZXIgdGhhbiBhdCBydW50aW1lIG9uIGRldmljZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHRQYXRoIC0gQ29udGV4dCBwYXRoIHJlcG9ydGVkIG9uIGFueSBpc3N1ZS5cbiAgICogQHBhcmFtIGN0eCAtIEJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dCB1c2VkIHRvIHJlc29sdmUge0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSB2YWx1ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVTeW50YXgoXG4gICAgY29udGV4dFBhdGg6IHN0cmluZyxcbiAgICBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQsXG4gICk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10ge1xuICAgIGNvbnN0IGJ1aWx0ID0gdGhpcy5fYnVpbGQoeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uOiB0cnVlLCBjdHggfSlcbiAgICBjb25zdCBzeW50YXhWYWxpZGF0aW9uID0gdmFsaWRhdGVTeW50YXgodHJhbnNmb3JtRm9yVmFsaWRhdGlvbihidWlsdCkpXG5cbiAgICBpZiAoIXN5bnRheFZhbGlkYXRpb24uaXNWYWxpZCAmJiBzeW50YXhWYWxpZGF0aW9uLmVycm9yKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IHRoaXMuZXhwcmVzc2lvbkJvZHksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgY29udGV4dFBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogc3ludGF4VmFsaWRhdGlvbi5lcnJvcixcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvKipcbiAgICogUnVuIGJhc2UgdmFsaWRhdGlvbiAoc3ludGF4IG9mIHRoZSBmdWxsIGJ1aWx0IGV4cHJlc3Npb24gKyBkZWNsYXJlZCB2YXJpYWJsZXMpLlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgYW5kIHRoZW4gYXBwZW5kIGRvbWFpbi1zcGVjaWZpYyBjaGVja3MuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbnRleHRQYXRoIC0gQ29udGV4dCBwYXRoIHJlcG9ydGVkIG9uIGFueSBpc3N1ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMuY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0LCBwYXNzZWQgdGhyb3VnaCB0byBgX2J1aWxkYCBzbyBiaW5kaW5nc1xuICAgKiAgIGFyZSB2YWxpZGF0ZWQgZXhhY3RseSBhcyB0aGV5IHdpbGwgYmUgZW1pdHRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfdmFsaWRhdGVCYXNlKG9wdGlvbnM/OiB7XG4gICAgY29udGV4dFBhdGg/OiBzdHJpbmdcbiAgICBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRcbiAgfSk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgY29udGV4dFBhdGggPSBvcHRpb25zPy5jb250ZXh0UGF0aCA/PyAnJ1xuICAgIGNvbnN0IGlzc3VlczogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSA9IFtdXG5cbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbkJvZHkpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGlzc3VlczogW10gfVxuICAgIH1cblxuICAgIGlzc3Vlcy5wdXNoKC4uLnRoaXMudmFsaWRhdGVTeW50YXgoY29udGV4dFBhdGgsIG9wdGlvbnM/LmN0eCkpXG4gICAgaXNzdWVzLnB1c2goLi4udGhpcy52YWxpZGF0ZURlY2xhcmVkVmFyaWFibGVzKGNvbnRleHRQYXRoKSlcblxuICAgIHJldHVybiB7IGlzVmFsaWQ6IGlzc3Vlcy5sZW5ndGggPT09IDAsIGlzc3VlcyB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgZmluYWwgZXhwcmVzc2lvbiBzdHJpbmcuXG4gICAqXG4gICAqIFJlc29sdmFibGUgYmluZGluZ3MgYXJlIHJlc29sdmVkIGFnYWluc3QgYGN0eGAgKG9yIHtAbGluayBSRUNPUkRfREFUQV9DT05URVhUfSB3aGVuIG9taXR0ZWQpO1xuICAgKiBgbnVsbGAgYW5kIHNjYWxhciBiaW5kaW5ncyBhcmUgZW1pdHRlZCB2ZXJiYXRpbS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdWxkUmV0dXJuUmF3RXhwcmVzc2lvbiAtIFJldHVybiBgKCR7Ym9keX0pYCBpbnN0ZWFkIG9mIGA9KCR7Ym9keX0pYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0IHVzZWQgdG8gcmVzb2x2ZSB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHZhbHVlcy5cbiAgICogQHJldHVybnMgYD0oJHtib2R5fSlgIGJ5IGRlZmF1bHQsIG9yIGAoJHtib2R5fSlgIHdoZW4gYHNob3VsZFJldHVyblJhd0V4cHJlc3Npb25gIGlzIHRydWUuXG4gICAqL1xuICBfYnVpbGQob3B0aW9uczogeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uOiBib29sZWFuOyBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uLCBjdHggfSA9IG9wdGlvbnNcbiAgICBsZXQganNvbmF0YSA9ICcnXG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpcy52YXJpYWJsZXMpIHtcbiAgICAgIGNvbnN0IGVtaXR0ZWQgPSBpc1Jlc29sdmFibGVCaW5kaW5nKHZhbHVlKVxuICAgICAgICA/IHZhbHVlLnJlc29sdmVCaW5kaW5nKGN0eCA/PyBSRUNPUkRfREFUQV9DT05URVhUKVxuICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGVtaXRTdHJpbmdCaW5kaW5nKHZhbHVlKVxuICAgICAgICAgIDogU3RyaW5nKHZhbHVlKVxuICAgICAganNvbmF0YSArPSBgJCR7bmFtZX0gOj0gJHtlbWl0dGVkfTtcXG5gXG4gICAgfVxuXG4gICAganNvbmF0YSArPSB0aGlzLmV4cHJlc3Npb25Cb2R5XG4gICAgcmV0dXJuIHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24gPyBgKCR7anNvbmF0YX0pYCA6IGA9KCR7anNvbmF0YX0pYFxuICB9XG59XG4iXX0=
@@ -33,7 +33,7 @@ npx tsx workspace/build.ts workspace/acumatica-apps/create-customer
33
33
  npx tsx workspace/build-yaml.ts workspace/acumatica-apps/create-customer
34
34
 
35
35
  # Deploy (env vars or .env)
36
- STAMP=PROD ORGANIZATION_ID="..." JIGX_API_KEY="..." \
36
+ STAMP=CLF-PROD ORGANIZATION_ID="..." JIGX_API_KEY="..." \
37
37
  ./workspace/acumatica-apps/create-customer/build-publish.sh
38
38
  ```
39
39
 
@@ -87,5 +87,5 @@ All calls use `Authorization: Bearer {JIGX_API_KEY}`.
87
87
  Inline env vars override `.env` defaults — pass credentials on the command line to avoid storing prod keys:
88
88
 
89
89
  ```bash
90
- STAMP=PROD ORGANIZATION_ID="..." JIGX_API_KEY="..." ./workspace/acumatica-apps/create-customer/build-publish.sh
90
+ STAMP=CLF-PROD ORGANIZATION_ID="..." JIGX_API_KEY="..." ./workspace/acumatica-apps/create-customer/build-publish.sh
91
91
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jigx/core-sdk",
3
- "version": "1.2.0-next.2",
3
+ "version": "1.2.0-next.4",
4
4
  "description": "Jigx Software Development Kit - SDK for building Jigx applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",