@fgv/ts-utils 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "1.6.0",
3
+ "version": "1.6.2",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,23 +1,34 @@
1
1
  import { Result } from './result';
2
+ /**
3
+ * Represents a single record in a JAR file
4
+ * @public
5
+ */
6
+ export type JarRecord = Record<string, string | string[]>;
7
+ export type JarFieldPicker<T extends JarRecord = JarRecord> = (record: T) => (keyof T)[];
8
+ /**
9
+ * Options for a JAR record parser.
10
+ * @public
11
+ */
12
+ export interface JarRecordParserOptions {
13
+ readonly arrayFields?: string[] | JarFieldPicker;
14
+ readonly fixedContinuationSize?: number;
15
+ }
2
16
  /**
3
17
  * Reads a record-jar from an array of strings, each of which represents one
4
18
  * line in the source file.
5
19
  * @param lines - the array of strings to be parsed
20
+ * @param options - Optional parser configuration
6
21
  * @returns a corresponding array of `Record<string, string>`
7
22
  * @public
8
23
  */
9
- export declare function parseRecordJarLines(lines: string[]): Result<Record<string, string>[]>;
10
- /**
11
- * A {@link Converter} to an array of `Record<string, string>` from an array of strings.
12
- * @public
13
- */
14
- export declare const recordJar: import("./converter").Converter<Record<string, string>[], unknown>;
24
+ export declare function parseRecordJarLines(lines: string[], options?: JarRecordParserOptions): Result<JarRecord[]>;
15
25
  /**
16
26
  * Reads a record-jar file from a supplied path.
17
27
  * @param srcPath - Source path from which the file is read.
28
+ * @param options - Optional parser configuration
18
29
  * @returns The contents of the file as an array of `Record<string, string>`
19
30
  * @see https://datatracker.ietf.org/doc/html/draft-phillips-record-jar-01
20
31
  * @public
21
32
  */
22
- export declare function readRecordJarFileSync(srcPath: string): Result<Record<string, string>[]>;
33
+ export declare function readRecordJarFileSync(srcPath: string, options?: JarRecordParserOptions): Result<JarRecord[]>;
23
34
  //# sourceMappingURL=recordJarHelpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,MAAM,EAAgC,MAAM,UAAU,CAAC;AAuJhE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAErF;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,oEAAuF,CAAC;AAE9G;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAOvF"}
1
+ {"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAgC,MAAM,UAAU,CAAC;AAQhE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IACjD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAuMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAE1G;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAO5G"}
@@ -44,25 +44,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
44
44
  return result;
45
45
  };
46
46
  Object.defineProperty(exports, "__esModule", { value: true });
47
- exports.readRecordJarFileSync = exports.recordJar = exports.parseRecordJarLines = void 0;
48
- const Converters = __importStar(require("./converters"));
47
+ exports.readRecordJarFileSync = exports.parseRecordJarLines = void 0;
49
48
  const fs = __importStar(require("fs"));
50
49
  const path = __importStar(require("path"));
51
50
  const result_1 = require("./result");
52
- const validation_1 = require("./validation");
51
+ const utils_1 = require("./utils");
53
52
  class RecordParser {
54
53
  // eslint-disable-next-line @typescript-eslint/no-empty-function
55
- constructor() {
54
+ constructor(options) {
56
55
  this.records = [];
57
- this._fields = [];
56
+ this._fields = {};
58
57
  this._name = undefined;
59
58
  this._body = undefined;
59
+ this.options = options !== null && options !== void 0 ? options : {};
60
60
  }
61
- static parse(lines) {
62
- return new RecordParser()._parse(lines);
61
+ static parse(lines, options) {
62
+ return new RecordParser(options)._parse(lines);
63
63
  }
64
- static _parseRecordBody(from, oldBody) {
65
- let body = `${oldBody !== null && oldBody !== void 0 ? oldBody : ''}${from.trim()}`;
64
+ static _parseRecordBody(body) {
66
65
  const isContinuation = body.endsWith('\\');
67
66
  if (isContinuation) {
68
67
  body = body.slice(0, body.length - 1);
@@ -102,6 +101,21 @@ class RecordParser {
102
101
  }
103
102
  return (0, result_1.succeed)(escaped);
104
103
  }
104
+ static _applyOptions(record, options) {
105
+ if (options.arrayFields) {
106
+ record = { ...record }; // don't edit incoming values
107
+ const arrayFields = Array.isArray(options.arrayFields)
108
+ ? options.arrayFields
109
+ : options.arrayFields(record);
110
+ for (const field of arrayFields) {
111
+ if ((0, utils_1.isKeyOf)(field, record) && typeof record[field] === 'string') {
112
+ const current = record[field];
113
+ record[field] = [current];
114
+ }
115
+ }
116
+ }
117
+ return record;
118
+ }
105
119
  _parse(lines) {
106
120
  var _a, _b;
107
121
  for (let n = 0; n < lines.length; n++) {
@@ -124,7 +138,7 @@ class RecordParser {
124
138
  if (this._body === undefined) {
125
139
  return (0, result_1.fail)(`${n}: continuation ("${line}") without prior value.`);
126
140
  }
127
- const result = RecordParser._parseRecordBody(line, this._body.body);
141
+ const result = this._parseContinuation(line);
128
142
  if (result.isFailure()) {
129
143
  return (0, result_1.fail)(`${n}: ${result.message}`);
130
144
  }
@@ -154,18 +168,42 @@ class RecordParser {
154
168
  ];
155
169
  return this._writePendingField().onSuccess(() => {
156
170
  this._name = parts[0].trimEnd();
157
- return RecordParser._parseRecordBody(parts[1]).onSuccess((body) => {
171
+ return RecordParser._parseRecordBody(parts[1].trim()).onSuccess((body) => {
158
172
  this._body = body;
159
173
  return (0, result_1.succeed)(true);
160
174
  });
161
175
  });
162
176
  }
177
+ _parseContinuation(line) {
178
+ var _a, _b;
179
+ let trimmed = line.trim();
180
+ if (!this._body.isContinuation) {
181
+ // istanbul ignore next
182
+ const fixedSize = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.fixedContinuationSize) !== null && _b !== void 0 ? _b : 0;
183
+ if (fixedSize > 0) {
184
+ if (trimmed.length < line.length - fixedSize) {
185
+ // oops, took too much
186
+ trimmed = line.slice(fixedSize);
187
+ }
188
+ }
189
+ }
190
+ return RecordParser._parseRecordBody(trimmed).onSuccess((newBody) => {
191
+ return (0, result_1.succeed)({
192
+ body: `${this._body.body}${newBody.body}`,
193
+ isContinuation: newBody.isContinuation,
194
+ });
195
+ });
196
+ }
197
+ _havePendingRecord() {
198
+ return Object.keys(this._fields).length > 0;
199
+ }
163
200
  _writePendingRecord() {
164
201
  return this._writePendingField().onSuccess(() => {
165
- const record = this._fields.length > 0 ? Object.fromEntries(this._fields) : undefined;
202
+ let record = this._havePendingRecord() ? this._fields : undefined;
166
203
  if (record !== undefined) {
204
+ record = RecordParser._applyOptions(record, this.options);
167
205
  this.records.push(record);
168
- this._fields = [];
206
+ this._fields = {};
169
207
  }
170
208
  return (0, result_1.succeed)(undefined);
171
209
  });
@@ -175,7 +213,17 @@ class RecordParser {
175
213
  if (this._body.body.length < 1) {
176
214
  return (0, result_1.fail)('empty body value not allowed');
177
215
  }
178
- this._fields.push([this._name, this._body.body]);
216
+ if (!(0, utils_1.isKeyOf)(this._name, this._fields)) {
217
+ this._fields[this._name] = this._body.body;
218
+ }
219
+ else if (typeof this._fields[this._name] === 'string') {
220
+ const current = this._fields[this._name];
221
+ this._fields[this._name] = [current, this._body.body];
222
+ }
223
+ else {
224
+ const current = this._fields[this._name];
225
+ current.push(this._body.body);
226
+ }
179
227
  this._name = undefined;
180
228
  this._body = undefined;
181
229
  }
@@ -186,32 +234,29 @@ class RecordParser {
186
234
  * Reads a record-jar from an array of strings, each of which represents one
187
235
  * line in the source file.
188
236
  * @param lines - the array of strings to be parsed
237
+ * @param options - Optional parser configuration
189
238
  * @returns a corresponding array of `Record<string, string>`
190
239
  * @public
191
240
  */
192
- function parseRecordJarLines(lines) {
193
- return RecordParser.parse(lines);
241
+ function parseRecordJarLines(lines, options) {
242
+ return RecordParser.parse(lines, options);
194
243
  }
195
244
  exports.parseRecordJarLines = parseRecordJarLines;
196
- /**
197
- * A {@link Converter} to an array of `Record<string, string>` from an array of strings.
198
- * @public
199
- */
200
- exports.recordJar = Converters.validated(validation_1.Validators.arrayOf(validation_1.Validators.string)).map(parseRecordJarLines);
201
245
  /**
202
246
  * Reads a record-jar file from a supplied path.
203
247
  * @param srcPath - Source path from which the file is read.
248
+ * @param options - Optional parser configuration
204
249
  * @returns The contents of the file as an array of `Record<string, string>`
205
250
  * @see https://datatracker.ietf.org/doc/html/draft-phillips-record-jar-01
206
251
  * @public
207
252
  */
208
- function readRecordJarFileSync(srcPath) {
253
+ function readRecordJarFileSync(srcPath, options) {
209
254
  return (0, result_1.captureResult)(() => {
210
255
  const fullPath = path.resolve(srcPath);
211
256
  return fs.readFileSync(fullPath, 'utf8').toString().split(/\r?\n/);
212
257
  }).onSuccess((lines) => {
213
- return parseRecordJarLines(lines);
258
+ return parseRecordJarLines(lines, options);
214
259
  });
215
260
  }
216
261
  exports.readRecordJarFileSync = readRecordJarFileSync;
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgseURBQTJDO0FBQzNDLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IscUNBQWdFO0FBQ2hFLDZDQUEwQztBQU8xQyxNQUFNLFlBQVk7SUFPZCxnRUFBZ0U7SUFDaEU7UUFQZ0IsWUFBTyxHQUE2QixFQUFFLENBQUM7UUFFN0MsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFDakMsVUFBSyxHQUF1QixTQUFTLENBQUM7UUFDdEMsVUFBSyxHQUEyQixTQUFTLENBQUM7SUFHN0IsQ0FBQztJQUVqQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWU7UUFDL0IsT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVksRUFBRSxPQUFnQjtRQUM1RCxJQUFJLElBQUksR0FBRyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFD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Q0FBQztRQUN2QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVBELHNEQU9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMiBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCAqIGFzIENvbnZlcnRlcnMgZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG5pbnRlcmZhY2UgUmVjb3JkQm9keSB7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIGlzQ29udGludWF0aW9uOiBib29sZWFuO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcblxuICAgIHByb3RlY3RlZCBfZmllbGRzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX25hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2JvZHk6IFJlY29yZEJvZHkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRQYXJzZXIoKS5fcGFyc2UobGluZXMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlUmVjb3JkQm9keShmcm9tOiBzdHJpbmcsIG9sZEJvZHk/OiBzdHJpbmcpOiBSZXN1bHQ8UmVjb3JkQm9keT4ge1xuICAgICAgICBsZXQgYm9keSA9IGAke29sZEJvZHkgPz8gJyd9JHtmcm9tLnRyaW0oKX1gO1xuICAgICAgICBjb25zdCBpc0NvbnRpbnVhdGlvbiA9IGJvZHkuZW5kc1dpdGgoJ1xcXFwnKTtcbiAgICAgICAgaWYgKGlzQ29udGludWF0aW9uKSB7XG4gICAgICAgICAgICBib2R5ID0gYm9keS5zbGljZSgwLCBib2R5Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9oYXNFc2NhcGVzKGJvZHkpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9yZXBsYWNlRXNjYXBlcyhib2R5KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib2R5ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHsgYm9keSwgaXNDb250aW51YXRpb24gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfaGFzRXNjYXBlcyhmcm9tOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZyb20uaW5jbHVkZXMoJ1xcXFwnKSB8fCBmcm9tLmluY2x1ZGVzKCcmJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcmVwbGFjZUVzY2FwZXMoYm9keTogc3RyaW5nKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbnZhbGlkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gYm9keS5yZXBsYWNlKC8oXFxcXC4pfCgmI3hbYS1mQS1GMC05XXsyLDZ9OykvZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXFxcXFwnOiByZXR1cm4gJ1xcXFwnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFwmJzogcmV0dXJuICcmJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxccic6IHJldHVybiAnXFxyJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcbic6IHJldHVybiAnXFxuJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcdCc6IHJldHVybiAnXFx0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5zdGFydHNXaXRoKCcmJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZXhDb2RlID0gYDB4JHttYXRjaC5zbGljZSgzLCBtYXRjaC5sZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gTnVtYmVyLnBhcnNlSW50KGhleENvZGUsIDE2KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnZhbGlkLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGB1bnJlY29nbml6ZWQgZXNjYXBlIFwiJHtpbnZhbGlkLmpvaW4oJywgJyl9XCIgaW4gcmVjb3JkLWphciBib2R5YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZXNjYXBlZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXJzZShsaW5lczogc3RyaW5nW10pOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPltdPiB7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGluZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tuXTtcbiAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyUlJykgJiYgIXRoaXMuX2JvZHk/LmlzQ29udGludWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fd3JpdGVQZW5kaW5nUmVjb3JkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgvXlxccyokLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJsYW5rIGxpbmVzIGJ1dCBjYW5jZWwgY29udGludWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYm9keS5pc0NvbnRpbnVhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2JvZHk/LmlzQ29udGludWF0aW9uIHx8IC9eXFxzKy8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiBvbiBwcmV2aW91cyBsaW5lIG9yIGltcGxpY2l0IHN0YXJ0cyB3aXRoIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke259OiBjb250aW51YXRpb24gKFwiJHtsaW5lfVwiKSB3aXRob3V0IHByaW9yIHZhbHVlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keShsaW5lLCB0aGlzLl9ib2R5LmJvZHkpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZUZpZWxkKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fd3JpdGVQZW5kaW5nUmVjb3JkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2xpbmVzLmxlbmd0aH06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodGhpcy5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlRmllbGQobGluZTogc3RyaW5nKTogUmVzdWx0PGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4IDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYG1hbGZvcm1lZCBsaW5lIChcIiR7bGluZX1cIikgaW4gcmVjb3JkLWphci5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgICAgIGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLFxuICAgICAgICAgICAgbGluZS5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gcGFydHNbMF0udHJpbUVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIFJlY29yZFBhcnNlci5fcGFyc2VSZWNvcmRCb2R5KHBhcnRzWzFdKS5vblN1Y2Nlc3MoKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVQZW5kaW5nRmllbGQoKS5vblN1Y2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fZmllbGRzLmxlbmd0aCA+IDAgPyBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fZmllbGRzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ0ZpZWxkKCk6IFJlc3VsdDxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5IS5ib2R5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgnZW1wdHkgYm9keSB2YWx1ZSBub3QgYWxsb3dlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goW3RoaXMuX25hbWUsIHRoaXMuX2JvZHkhLmJvZHldKTtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9ib2R5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhIHJlY29yZC1qYXIgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgb25lXG4gKiBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSBsaW5lcyAtIHRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWNvcmRKYXJMaW5lcyhsaW5lczogc3RyaW5nW10pOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPltdPiB7XG4gICAgcmV0dXJuIFJlY29yZFBhcnNlci5wYXJzZShsaW5lcyk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB0byBhbiBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjb3JkSmFyID0gQ29udmVydGVycy52YWxpZGF0ZWQoVmFsaWRhdG9ycy5hcnJheU9mKFZhbGlkYXRvcnMuc3RyaW5nKSkubWFwKHBhcnNlUmVjb3JkSmFyTGluZXMpO1xuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzKTtcbiAgICB9KTtcbn1cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUU3QixxQ0FBZ0U7QUFDaEUsbUNBQWtDO0FBd0JsQyxNQUFNLFlBQVk7SUFRZCxnRUFBZ0U7SUFDaEUsWUFBb0IsT0FBZ0M7UUFScEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUN0QyxVQUFLLEdBQTJCLFNBQVMsQ0FBQztRQUloRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsT0FBZ0M7UUFDakUsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLE1BQU0sQ0FBQyxTQUFT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QUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCxzREFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBSZWNvcmRCb2R5IHtcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgaXNDb250aW51YXRpb246IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSByZWNvcmQgaW4gYSBKQVIgZmlsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBKYXJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG5cbmV4cG9ydCB0eXBlIEphckZpZWxkUGlja2VyPFQgZXh0ZW5kcyBKYXJSZWNvcmQgPSBKYXJSZWNvcmQ+ID0gKHJlY29yZDogVCkgPT4gKGtleW9mIFQpW107XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBKQVIgcmVjb3JkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKYXJSZWNvcmRQYXJzZXJPcHRpb25zIHtcbiAgICByZWFkb25seSBhcnJheUZpZWxkcz86IHN0cmluZ1tdIHwgSmFyRmllbGRQaWNrZXI7XG4gICAgcmVhZG9ubHkgZml4ZWRDb250aW51YXRpb25TaXplPzogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBKYXJSZWNvcmRbXSA9IFtdO1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEphclJlY29yZCA9IHt9O1xuICAgIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYm9keTogUmVjb3JkQm9keSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShsaW5lczogc3RyaW5nW10sIG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKTogUmVzdWx0PEphclJlY29yZFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkUGFyc2VyKG9wdGlvbnMpLl9wYXJzZShsaW5lcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VSZWNvcmRCb2R5KGJvZHk6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGNvbnN0IGlzQ29udGludWF0aW9uID0gYm9keS5lbmRzV2l0aCgnXFxcXCcpO1xuICAgICAgICBpZiAoaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2R5LnNsaWNlKDAsIGJvZHkubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hhc0VzY2FwZXMoYm9keSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3JlcGxhY2VFc2NhcGVzKGJvZHkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoeyBib2R5LCBpc0NvbnRpbnVhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9oYXNFc2NhcGVzKGZyb206IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnJvbS5pbmNsdWRlcygnXFxcXCcpIHx8IGZyb20uaW5jbHVkZXMoJyYnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9yZXBsYWNlRXNjYXBlcyhib2R5OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBib2R5LnJlcGxhY2UoLyhcXFxcLil8KCYjeFthLWZBLUYwLTldezIsNn07KS9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcXFxcXCc6IHJldHVybiAnXFxcXCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXCYnOiByZXR1cm4gJyYnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzogcmV0dXJuICdcXHInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzogcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFx0JzogcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhleENvZGUgPSBgMHgke21hdGNoLnNsaWNlKDMsIG1hdGNoLmxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29kZSwgMTYpO1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFsaWQucHVzaChtYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwnO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYHVucmVjb2duaXplZCBlc2NhcGUgXCIke2ludmFsaWQuam9pbignLCAnKX1cIiBpbiByZWNvcmQtamFyIGJvZHlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChlc2NhcGVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9hcHBseU9wdGlvbnMocmVjb3JkOiBKYXJSZWNvcmQsIG9wdGlvbnM6IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBKYXJSZWNvcmQge1xuICAgICAgICBpZiAob3B0aW9ucy5hcnJheUZpZWxkcykge1xuICAgICAgICAgICAgcmVjb3JkID0geyAuLi5yZWNvcmQgfTsgLy8gZG9uJ3QgZWRpdCBpbmNvbWluZyB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFycmF5RmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFycmF5RmllbGRzKVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5hcnJheUZpZWxkc1xuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5hcnJheUZpZWxkcyhyZWNvcmQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFycmF5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzS2V5T2YoZmllbGQsIHJlY29yZCkgJiYgdHlwZW9mIHJlY29yZFtmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWNvcmRbZmllbGRdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFtjdXJyZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxpbmVzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbl07XG4gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCclJScpICYmICF0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3dyaXRlUGVuZGluZ1JlY29yZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL15cXHMqJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBibGFuayBsaW5lcyBidXQgY2FuY2VsIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkuaXNDb250aW51YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbiB8fCAvXlxccysvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gb24gcHJldmlvdXMgbGluZSBvciBpbXBsaWNpdCBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogY29udGludWF0aW9uIChcIiR7bGluZX1cIikgd2l0aG91dCBwcmlvciB2YWx1ZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VDb250aW51YXRpb24obGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYm9keSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlRmllbGQobGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl93cml0ZVBlbmRpbmdSZWNvcmQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bGluZXMubGVuZ3RofTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0aGlzLnJlY29yZHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGFyc2VGaWVsZChsaW5lOiBzdHJpbmcpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgbWFsZm9ybWVkIGxpbmUgKFwiJHtsaW5lfVwiKSBpbiByZWNvcmQtamFyLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICAgbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCksXG4gICAgICAgICAgICBsaW5lLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSksXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlUGVuZGluZ0ZpZWxkKCkub25TdWNjZXNzKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBwYXJ0c1swXS50cmltRW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gUmVjb3JkUGFyc2VyLl9wYXJzZVJlY29yZEJvZHkocGFydHNbMV0udHJpbSgpKS5vblN1Y2Nlc3MoKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlQ29udGludWF0aW9uKGxpbmU6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGxldCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmICghdGhpcy5fYm9keSEuaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBjb25zdCBmaXhlZFNpemUgPSB0aGlzLm9wdGlvbnM/LmZpeGVkQ29udGludWF0aW9uU2l6ZSA/PyAwO1xuICAgICAgICAgICAgaWYgKGZpeGVkU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPCBsaW5lLmxlbmd0aCAtIGZpeGVkU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvb3BzLCB0b29rIHRvbyBtdWNoXG4gICAgICAgICAgICAgICAgICAgIHRyaW1tZWQgPSBsaW5lLnNsaWNlKGZpeGVkU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keSh0cmltbWVkKS5vblN1Y2Nlc3MoKG5ld0JvZHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHtcbiAgICAgICAgICAgICAgICBib2R5OiBgJHt0aGlzLl9ib2R5IS5ib2R5fSR7bmV3Qm9keS5ib2R5fWAsXG4gICAgICAgICAgICAgICAgaXNDb250aW51YXRpb246IG5ld0JvZHkuaXNDb250aW51YXRpb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYXZlUGVuZGluZ1JlY29yZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8SmFyUmVjb3JkIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faGF2ZVBlbmRpbmdSZWNvcmQoKSA/IHRoaXMuX2ZpZWxkcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IFJlY29yZFBhcnNlci5fYXBwbHlPcHRpb25zKHJlY29yZCwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF93cml0ZVBlbmRpbmdGaWVsZCgpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSEuYm9keS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VtcHR5IGJvZHkgdmFsdWUgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNLZXlPZih0aGlzLl9uYW1lLCB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gdGhpcy5fYm9keSEuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9maWVsZHNbdGhpcy5fbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gW2N1cnJlbnQsIHRoaXMuX2JvZHkhLmJvZHldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godGhpcy5fYm9keSEuYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgYSByZWNvcmQtamFyIGZyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIG9uZVxuICogbGluZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gbGluZXMgLSB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyc2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVjb3JkSmFyTGluZXMobGluZXM6IHN0cmluZ1tdLCBvcHRpb25zPzogSmFyUmVjb3JkUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgIHJldHVybiBSZWNvcmRQYXJzZXIucGFyc2UobGluZXMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcnNlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZywgb3B0aW9ucz86IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8SmFyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbiJdfQ==