@datagrok-libraries/utils 4.0.1 → 4.0.3

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/.eslintrc.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "env": {
3
3
  "browser": true,
4
- "es2021": true
4
+ "es2022": true
5
5
  },
6
6
  "extends": [
7
7
  "google"
package/package.json CHANGED
@@ -4,15 +4,12 @@
4
4
  "access": "public"
5
5
  },
6
6
  "fullName": "Utils",
7
- "version": "4.0.1",
7
+ "version": "4.0.3",
8
8
  "description": "Common utilities",
9
9
  "dependencies": {
10
10
  "cash-dom": "^8.1.1",
11
11
  "datagrok-api": "^1.8.1",
12
- "exceljs": "^4.3.0",
13
12
  "fast-sha256": "^1.3.0",
14
- "html2canvas": "^1.4.1",
15
- "jszip": "^3.10.1",
16
13
  "rxjs": "^6.5.5",
17
14
  "wu": "latest"
18
15
  },
@@ -32,10 +29,7 @@
32
29
  "link-all": "npm link datagrok-api",
33
30
  "build": "tsc",
34
31
  "lint": "eslint \"./src/**/*.ts\"",
35
- "lint-fix": "eslint \"./src/**/*.ts\" --fix"
36
- },
37
- "sources": [
38
- "common/html2canvas.min.js",
39
- "common/exceljs.min.js"
40
- ]
32
+ "lint-fix": "eslint \"./src/**/*.ts\" --fix",
33
+ "build-all": "npm --prefix ./../../js-api run build && npm run build"
34
+ }
41
35
  }
package/src/test.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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"}
package/src/test.js CHANGED
@@ -198,10 +198,19 @@ export function initAutoTests(packageId, module) {
198
198
  if (skipReasons && (skipReasons === null || skipReasons === void 0 ? void 0 : skipReasons.length) > 1)
199
199
  skipReason = skipReasons[1];
200
200
  moduleAutoTests.push(new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {
201
- const res = yield grok.functions.eval(addNamespace(tests[i], f));
202
- // eslint-disable-next-line no-throw-literal
203
- if (res !== true)
204
- throw `Failed: ${tests[i]}`;
201
+ try {
202
+ const res = yield grok.functions.eval(addNamespace(tests[i], f));
203
+ yield delay(100);
204
+ // eslint-disable-next-line no-throw-literal
205
+ if (typeof res === 'boolean' && !res)
206
+ throw `Failed: ${tests[i]}, expected true, got ${res}`;
207
+ }
208
+ catch (e) {
209
+ throw e;
210
+ }
211
+ finally {
212
+ grok.shell.closeAll();
213
+ }
205
214
  }), { skipReason: skipReason }));
206
215
  }
207
216
  }
@@ -302,6 +311,8 @@ function execTest(t, predicate) {
302
311
  r = { success: false, result: x.toString(), ms: 0, skipped: false };
303
312
  }
304
313
  const stop = new Date();
314
+ // grok.shell.closeAll();
315
+ // DG.Balloon.closeAll();
305
316
  // @ts-ignore
306
317
  r.ms = stop - start;
307
318
  if (!skip)
@@ -383,4 +394,4 @@ export function testViewer(v, df, detectSemanticTypes = false) {
383
394
  }
384
395
  });
385
396
  }
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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QUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5pbXBvcnQge0RhdGFGcmFtZX0gZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuZXhwb3J0IGNvbnN0IHRlc3RzOiB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICB0ZXN0cz86IFRlc3RbXSwgYmVmb3JlPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYWZ0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGJlZm9yZVN0YXR1cz86IHN0cmluZywgYWZ0ZXJTdGF0dXM/OiBzdHJpbmdcbiAgfVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3Qgd2FzUmVnaXN0ZXJlZDoge1trZXk6IHN0cmluZ106IGJvb2xlYW59ID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTogc3RyaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIGFzc3VyZSB7XG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkgPSB0cnVlLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXJyb3IpXG4gICAgZXJyb3IgPSBgJHtlcnJvcn0sIGA7XG4gIGVsc2UgZXJyb3IgPSAnJztcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfUV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKChhY3R1YWwgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB8fFxuICAgICAgKGFjdHVhbCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTmFOICYmIGV4cGVjdGVkID09PSBOdW1iZXIuTmFOKSB8fCAoaXNOYU4oYWN0dWFsKSAmJiBpc05hTihleHBlY3RlZCkpKVxuICAgIHJldHVybjtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGV4cGVjdChhcmVFcXVhbCwgdHJ1ZSwgYCR7ZXJyb3IgPz8gJyd9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0VGFibGUoYWN0dWFsOiBEYXRhRnJhbWUsIGV4cGVjdGVkOiBEYXRhRnJhbWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGV4cGVjdGVkUm93Q291bnQgPSBleHBlY3RlZC5yb3dDb3VudDtcbiAgY29uc3QgYWN0dWFsUm93Q291bnQgPSBhY3R1YWwucm93Q291bnQ7XG4gIGV4cGVjdChhY3R1YWxSb3dDb3VudCwgZXhwZWN0ZWRSb3dDb3VudCwgYCR7ZXJyb3IgPz8gJyd9LCByb3cgY291bnRgKTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBleHBlY3RlZC5jb2x1bW5zKSB7XG4gICAgY29uc3QgYWN0dWFsQ29sdW1uID0gYWN0dWFsLmNvbHVtbnMuYnlOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoYWN0dWFsQ29sdW1uLnR5cGUgIT0gY29sdW1uLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbi5uYW1lfSB0eXBlIGV4cGVjdGVkICR7Y29sdW1uLnR5cGV9IGdvdCAke2FjdHVhbENvbHVtbi50eXBlfWApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWRSb3dDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbi5nZXQoaSk7XG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbENvbHVtbi5nZXQoaSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5GTE9BVClcbiAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIHZhbHVlLCAwLjAwMDEsIGVycm9yKTtcbiAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuREFURV9USU1FKVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUuaXNTYW1lKHZhbHVlKSwgdHJ1ZSwgZXJyb3IpO1xuICAgICAgZWxzZVxuICAgICAgICBleHBlY3QoYWN0dWFsVmFsdWUsIHZhbHVlLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RPYmplY3QoYWN0dWFsOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBleHBlY3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkoZXhwZWN0ZWRLZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwcm9wZXJ0eSBcIiR7ZXhwZWN0ZWRLZXl9XCIgbm90IGZvdW5kYCk7XG5cbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgIGVsc2UgaWYgKGFjdHVhbFZhbHVlICE9IGV4cGVjdGVkVmFsdWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICgke2V4cGVjdGVkVmFsdWV9KSBmb3Iga2V5ICcke2V4cGVjdGVkS2V5fScsIGdvdCAoJHthY3R1YWxWYWx1ZX0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5KGFjdHVhbDogQXJyYXlMaWtlPGFueT4sIGV4cGVjdGVkOiBBcnJheUxpa2U8YW55Pikge1xuICBjb25zdCBhY3R1YWxMZW5ndGggPSBhY3R1YWwubGVuZ3RoO1xuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcblxuICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBcnJheXMgYXJlIG9mIGRpZmZlcmVudCBsZW5ndGg6IGFjdHVhbCBhcnJheSBsZW5ndGggaXMgJHthY3R1YWxMZW5ndGh9IGAgK1xuICAgICAgYGFuZCBleHBlY3RlZCBhcnJheSBsZW5ndGggaXMgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0czogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHMoKTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmJlZm9yZSA9IGJlZm9yZTtcbn1cblxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihhZnRlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmFmdGVyID0gYWZ0ZXI7XG59XG5cbmZ1bmN0aW9uIGFkZE5hbWVzcGFjZShzOiBzdHJpbmcsIGY6IERHLkZ1bmMpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKG5ldyBSZWdFeHAoZi5uYW1lLCAnZ2knKSwgZi5ucU5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEF1dG9UZXN0cyhwYWNrYWdlSWQ6IHN0cmluZywgbW9kdWxlPzogYW55KSB7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBtb2R1bGVBdXRvVGVzdHMgPSBbXTtcbiAgY29uc3QgcGFja0Z1bmN0aW9ucyA9IGF3YWl0IGdyb2suZGFwaS5mdW5jdGlvbnMuZmlsdGVyKGBwYWNrYWdlLmlkID0gXCIke3BhY2thZ2VJZH1cImApLmxpc3QoKTtcbiAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cCgvLipcXC9cXC9cXHMqc2tpcFs6XFxzXSooLiopJC8pO1xuICBmb3IgKGNvbnN0IGYgb2YgcGFja0Z1bmN0aW9ucykge1xuICAgIGNvbnN0IHRlc3RzID0gZi5vcHRpb25zWyd0ZXN0J107XG4gICAgaWYgKCEodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkgY29udGludWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2tpcFJlYXNvbnMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaChyZWcpO1xuICAgICAgbGV0IHNraXBSZWFzb247XG4gICAgICBpZiAoc2tpcFJlYXNvbnMgJiYgc2tpcFJlYXNvbnM/Lmxlbmd0aCA+IDEpIHNraXBSZWFzb24gPSBza2lwUmVhc29uc1sxXTtcbiAgICAgIG1vZHVsZUF1dG9UZXN0cy5wdXNoKG5ldyBUZXN0KGF1dG9UZXN0c0NhdE5hbWUsIHRlc3RzLmxlbmd0aCA9PT0gMSA/IGYubmFtZSA6IGAke2YubmFtZX0gJHtpICsgMX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdyb2suZnVuY3Rpb25zLmV2YWwoYWRkTmFtZXNwYWNlKHRlc3RzW2ldLCBmKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gICAgICAgIGlmIChyZXMgIT09IHRydWUpIHRocm93IGBGYWlsZWQ6ICR7dGVzdHNbaV19YDtcbiAgICAgIH0sIHtza2lwUmVhc29uOiBza2lwUmVhc29ufSkpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAoIW1vZHVsZUF1dG9UZXN0cy5sZW5ndGgpIHJldHVybjtcbiAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7dGVzdHM6IG1vZHVsZUF1dG9UZXN0c307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzoge2NhdGVnb3J5Pzogc3RyaW5nLCB0ZXN0Pzogc3RyaW5nLCB0ZXN0Q29udGV4dD86IFRlc3RDb250ZXh0fSkge1xuICBjb25zdCBwYWNrYWdlXyA9IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCk/LmZ1bmM/LnBhY2thZ2U7XG4gIGF3YWl0IGluaXRBdXRvVGVzdHMocGFja2FnZV8uaWQpO1xuICBjb25zdCByZXN1bHRzOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH1bXSA9IFtdO1xuICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICBvcHRpb25zID8/PSB7fTtcbiAgb3B0aW9ucyEudGVzdENvbnRleHQgPz89IG5ldyBUZXN0Q29udGV4dCgpO1xuICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0cykpIHtcbiAgICBpZiAob3B0aW9ucz8uY2F0ZWdvcnkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB2YWx1ZS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspXG4gICAgICByZXMucHVzaChhd2FpdCBleGVjVGVzdCh0W2ldLCBvcHRpb25zPy50ZXN0KSk7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlX1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogc2tpcFJlYXNvbiEsIG1zOiAwLCBza2lwcGVkOiB0cnVlfTtcbiAgICBlbHNlXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdC50ZXN0KCkgPz8gJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiB4LnRvU3RyaW5nKCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gIC8vIEB0cy1pZ25vcmVcbiAgci5tcyA9IHN0b3AgLSBzdGFydDtcbiAgaWYgKCFza2lwKVxuICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfSBmb3IgJHtyLm1zfSBtc2ApO1xuICByLmNhdGVnb3J5ID0gdC5jYXRlZ29yeTtcbiAgci5uYW1lID0gdC5uYW1lO1xuICByZXR1cm4gcjtcbn1cblxuLyogV2FpdHMgW21zXSBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdENoZWNrKGNoZWNrSGFuZGxlcjogKCkgPT4gYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyA9ICdUaW1lb3V0IGV4Y2VlZGVkJywgd2FpdDogbnVtYmVyID0gNTAwLCBpbnRlcnZhbDogbnVtYmVyID0gNTApOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsSWQ6IFRpbWVvdXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tIYW5kbGVyKCkpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0sIGludGVydmFsKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RpYWxvZ1ByZXNlbnQoZGlhbG9nVGl0bGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkaWFsb2dzID0gREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlhbG9ncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkaWFsb2dzW2ldLnRpdGxlID09IGRpYWxvZ1RpdGxlKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFZpZXdlcih2OiBzdHJpbmcsIGRmOiBERy5EYXRhRnJhbWUsIGRldGVjdFNlbWFudGljVHlwZXM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGV0ZWN0U2VtYW50aWNUeXBlcykgYXdhaXQgZ3Jvay5kYXRhLmRldGVjdFNlbWFudGljVHlwZXMoZGYpO1xuICBjb25zdCB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGRmKTtcbiAgY29uc3Qgdmlld2VyTmFtZSA9IGBbbmFtZT12aWV3ZXItJHt2LnJlcGxhY2UoL1xccysvZywgJy0nKX0gaV1gO1xuICBjb25zdCBzZWxlY3RvciA9IGAke3ZpZXdlck5hbWV9IGNhbnZhcywke3ZpZXdlck5hbWV9IHN2Zywke3ZpZXdlck5hbWV9IGltZyxcbiAgICAke3ZpZXdlck5hbWV9IGlucHV0LCR7dmlld2VyTmFtZX0gaDEsJHt2aWV3ZXJOYW1lfSBhYDtcbiAgY29uc3QgcmVzID0gW107XG4gIHRyeSB7XG4gICAgbGV0IHZpZXdlciA9IHR2LmFkZFZpZXdlcih2KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlcicsIDMwMDApO1xuICAgIHJlcy5wdXNoKEFycmF5LmZyb20odHYudmlld2VycykubGVuZ3RoKTtcbiAgICBBcnJheS5mcm9tKGRmLnJvdygwKS5jZWxscykuZm9yRWFjaCgoYykgPT4gYy52YWx1ZSA9IG51bGwpO1xuICAgIGRmLnJvd3Muc2VsZWN0KChyb3cpID0+IHJvdy5pZHggPiAxICYmIHJvdy5pZHggPCA3KTtcbiAgICBmb3IgKGxldCBpID0gNzsgaSA8IDEyOyBpKyspIGRmLmZpbHRlci5zZXQoaSwgZmFsc2UpO1xuICAgIGRmLmN1cnJlbnRSb3dJZHggPSAxO1xuICAgIGNvbnN0IHByb3BzID0gdmlld2VyLmdldE9wdGlvbnModHJ1ZSkubG9vaztcbiAgICBjb25zdCBuZXdQcm9wczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgICBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKChrKSA9PiB0eXBlb2YgcHJvcHNba10gPT09ICdib29sZWFuJykuZm9yRWFjaCgoaykgPT4gbmV3UHJvcHNba10gPSAhcHJvcHNba10pO1xuICAgIHZpZXdlci5zZXRPcHRpb25zKG5ld1Byb3BzKTtcbiAgICBhd2FpdCBkZWxheSgyNTApO1xuICAgIGNvbnN0IGxheW91dCA9IHR2LnNhdmVMYXlvdXQoKTtcbiAgICBjb25zdCBvbGRQcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKCkubG9vaztcbiAgICB0di5yZXNldExheW91dCgpO1xuICAgIHJlcy5wdXNoKEFycmF5LmZyb20odHYudmlld2VycykubGVuZ3RoKTtcbiAgICB0di5sb2FkTGF5b3V0KGxheW91dCk7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICdjYW5ub3QgbG9hZCB2aWV3ZXIgZnJvbSBsYXlvdXQnLCAzMDAwKTtcbiAgICBhd2FpdCBkZWxheSgyNTApO1xuICAgIHJlcy5wdXNoKEFycmF5LmZyb20odHYudmlld2VycykubGVuZ3RoKTtcbiAgICB2aWV3ZXIgPSBBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmZpbmQoKHYpID0+IHYudHlwZSAhPT0gJ0dyaWQnKSE7XG4gICAgZXhwZWN0QXJyYXkocmVzLCBbMiwgMSwgMl0pO1xuICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeSh2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2spLCBKU09OLnN0cmluZ2lmeShvbGRQcm9wcykpO1xuICB9IGZpbmFsbHkge1xuICAgIHR2LmNsb3NlKCk7XG4gICAgZ3Jvay5zaGVsbC5jbG9zZVRhYmxlKGRmKTtcbiAgfVxufVxuIl19
397
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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USxDQUFDLEtBQUssSUFBSSxFQUM5RCxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFFLENBQUM7WUFDaEUsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzVFO2dCQUFTO1lBQ1IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgVGltZW91dCA9IE5vZGVKUy5UaW1lb3V0O1xuaW1wb3J0IHtEYXRhRnJhbWV9IGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuY29uc3QgYXV0b1Rlc3RzQ2F0TmFtZSA9ICdBdXRvIFRlc3RzJztcbmNvbnN0IHdhc1JlZ2lzdGVyZWQ6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuICBleHBvcnQgZnVuY3Rpb24gbm90TnVsbCh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIHNraXBSZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0Q29udGV4dCB7XG4gIGNhdGNoVW5oYW5kbGVkID0gdHJ1ZTtcbiAgcmVwb3J0ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoY2F0Y2hVbmhhbmRsZWQ/OiBib29sZWFuLCByZXBvcnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKGNhdGNoVW5oYW5kbGVkICE9PSB1bmRlZmluZWQpIHRoaXMuY2F0Y2hVbmhhbmRsZWQgPSBjYXRjaFVuaGFuZGxlZDtcbiAgICBpZiAocmVwb3J0ICE9PSB1bmRlZmluZWQpIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdCB7XG4gIHRlc3Q6ICgpID0+IFByb21pc2U8YW55PjtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBvcHRpb25zPzogVGVzdE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoY2F0ZWdvcnk6IHN0cmluZywgbmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykge1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIG9wdGlvbnMgPz89IHt9O1xuICAgIG9wdGlvbnMudGltZW91dCA/Pz0gMzAwMDA7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0ZXN0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0RXZlbnQ8VD4oZXZlbnQ6IE9ic2VydmFibGU8VD4sXG4gIGhhbmRsZXI6IChhcmdzOiBUKSA9PiB2b2lkLCB0cmlnZ2VyOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyID0gMCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBzdWI6IFN1YnNjcmlwdGlvbjtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzdWIgPSBldmVudC5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgcmVzb2x2ZSgnT0snKTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgIH0sIG1zKTtcbiAgICB0cmlnZ2VyKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdChuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzID0gW107XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMhLnB1c2gobmV3IFRlc3QoY3VycmVudENhdGVnb3J5LCBuYW1lLCB0ZXN0LCBvcHRpb25zKSk7XG59XG5cbi8qIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55ID0gdHJ1ZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVycm9yKVxuICAgIGVycm9yID0gYCR7ZXJyb3J9LCBgO1xuICBlbHNlIGVycm9yID0gJyc7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKVxuICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvcn1FeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICgoYWN0dWFsID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiYgZXhwZWN0ZWQgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgfHxcbiAgICAgIChhY3R1YWwgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSB8fFxuICAgICAgKGFjdHVhbCA9PT0gTnVtYmVyLk5hTiAmJiBleHBlY3RlZCA9PT0gTnVtYmVyLk5hTikgfHwgKGlzTmFOKGFjdHVhbCkgJiYgaXNOYU4oZXhwZWN0ZWQpKSlcbiAgICByZXR1cm47XG4gIGNvbnN0IGFyZUVxdWFsID0gTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgdG9sZXJhbmNlO1xuICBleHBlY3QoYXJlRXF1YWwsIHRydWUsIGAke2Vycm9yID8/ICcnfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xuICBpZiAoIWFyZUVxdWFsKVxuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH0gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdFRhYmxlKGFjdHVhbDogRGF0YUZyYW1lLCBleHBlY3RlZDogRGF0YUZyYW1lLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBleHBlY3RlZFJvd0NvdW50ID0gZXhwZWN0ZWQucm93Q291bnQ7XG4gIGNvbnN0IGFjdHVhbFJvd0NvdW50ID0gYWN0dWFsLnJvd0NvdW50O1xuICBleHBlY3QoYWN0dWFsUm93Q291bnQsIGV4cGVjdGVkUm93Q291bnQsIGAke2Vycm9yID8/ICcnfSwgcm93IGNvdW50YCk7XG5cbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgZXhwZWN0ZWQuY29sdW1ucykge1xuICAgIGNvbnN0IGFjdHVhbENvbHVtbiA9IGFjdHVhbC5jb2x1bW5zLmJ5TmFtZShjb2x1bW4ubmFtZSk7XG4gICAgaWYgKGFjdHVhbENvbHVtbiA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJHtjb2x1bW4ubmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKGFjdHVhbENvbHVtbi50eXBlICE9IGNvbHVtbi50eXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJHtjb2x1bW4ubmFtZX0gdHlwZSBleHBlY3RlZCAke2NvbHVtbi50eXBlfSBnb3QgJHthY3R1YWxDb2x1bW4udHlwZX1gKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkUm93Q291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2x1bW4uZ2V0KGkpO1xuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxDb2x1bW4uZ2V0KGkpO1xuICAgICAgaWYgKGNvbHVtbi50eXBlID09IERHLlRZUEUuRkxPQVQpXG4gICAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCB2YWx1ZSwgMC4wMDAxLCBlcnJvcik7XG4gICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkRBVEVfVElNRSlcbiAgICAgICAgZXhwZWN0KGFjdHVhbFZhbHVlLmlzU2FtZSh2YWx1ZSksIHRydWUsIGVycm9yKTtcbiAgICAgIGVsc2VcbiAgICAgICAgZXhwZWN0KGFjdHVhbFZhbHVlLCB2YWx1ZSwgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5mdW5jdGlvbiBhZGROYW1lc3BhY2Uoczogc3RyaW5nLCBmOiBERy5GdW5jKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMucmVwbGFjZShuZXcgUmVnRXhwKGYubmFtZSwgJ2dpJyksIGYubnFOYW1lKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRBdXRvVGVzdHMocGFja2FnZUlkOiBzdHJpbmcsIG1vZHVsZT86IGFueSkge1xuICBpZiAod2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVRlc3RzID0gbW9kdWxlID8gbW9kdWxlLnRlc3RzIDogdGVzdHM7XG4gIGlmIChtb2R1bGVUZXN0c1thdXRvVGVzdHNDYXROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoLy4qXFwvXFwvXFxzKnNraXBbOlxcc10qKC4qKSQvKTtcbiAgZm9yIChjb25zdCBmIG9mIHBhY2tGdW5jdGlvbnMpIHtcbiAgICBjb25zdCB0ZXN0cyA9IGYub3B0aW9uc1sndGVzdCddO1xuICAgIGlmICghKHRlc3RzICYmIEFycmF5LmlzQXJyYXkodGVzdHMpICYmIHRlc3RzLmxlbmd0aCkpIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHNraXBSZWFzb25zID0gKHRlc3RzW2ldIGFzIHN0cmluZykubWF0Y2gocmVnKTtcbiAgICAgIGxldCBza2lwUmVhc29uO1xuICAgICAgaWYgKHNraXBSZWFzb25zICYmIHNraXBSZWFzb25zPy5sZW5ndGggPiAxKSBza2lwUmVhc29uID0gc2tpcFJlYXNvbnNbMV07XG4gICAgICBtb2R1bGVBdXRvVGVzdHMucHVzaChuZXcgVGVzdChhdXRvVGVzdHNDYXROYW1lLCB0ZXN0cy5sZW5ndGggPT09IDEgPyBmLm5hbWUgOiBgJHtmLm5hbWV9ICR7aSArIDF9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdyb2suZnVuY3Rpb25zLmV2YWwoYWRkTmFtZXNwYWNlKHRlc3RzW2ldLCBmKSk7XG4gICAgICAgICAgYXdhaXQgZGVsYXkoMTAwKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnYm9vbGVhbicgJiYgIXJlcykgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX0sIGV4cGVjdGVkIHRydWUsIGdvdCAke3Jlc31gO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtza2lwUmVhc29uOiBza2lwUmVhc29ufSkpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAoIW1vZHVsZUF1dG9UZXN0cy5sZW5ndGgpIHJldHVybjtcbiAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7dGVzdHM6IG1vZHVsZUF1dG9UZXN0c307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzoge2NhdGVnb3J5Pzogc3RyaW5nLCB0ZXN0Pzogc3RyaW5nLCB0ZXN0Q29udGV4dD86IFRlc3RDb250ZXh0fSkge1xuICBjb25zdCBwYWNrYWdlXyA9IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCk/LmZ1bmM/LnBhY2thZ2U7XG4gIGF3YWl0IGluaXRBdXRvVGVzdHMocGFja2FnZV8uaWQpO1xuICBjb25zdCByZXN1bHRzOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH1bXSA9IFtdO1xuICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICBvcHRpb25zID8/PSB7fTtcbiAgb3B0aW9ucyEudGVzdENvbnRleHQgPz89IG5ldyBUZXN0Q29udGV4dCgpO1xuICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0cykpIHtcbiAgICBpZiAob3B0aW9ucz8uY2F0ZWdvcnkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB2YWx1ZS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspXG4gICAgICByZXMucHVzaChhd2FpdCBleGVjVGVzdCh0W2ldLCBvcHRpb25zPy50ZXN0KSk7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlX1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogc2tpcFJlYXNvbiEsIG1zOiAwLCBza2lwcGVkOiB0cnVlfTtcbiAgICBlbHNlXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdC50ZXN0KCkgPz8gJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiB4LnRvU3RyaW5nKCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gIC8vIGdyb2suc2hlbGwuY2xvc2VBbGwoKTtcbiAgLy8gREcuQmFsbG9vbi5jbG9zZUFsbCgpO1xuICAvLyBAdHMtaWdub3JlXG4gIHIubXMgPSBzdG9wIC0gc3RhcnQ7XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgRmluaXNoZWQgJHt0LmNhdGVnb3J5fSAke3QubmFtZX0gZm9yICR7ci5tc30gbXNgKTtcbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCwgaW50ZXJ2YWw6IG51bWJlciA9IDUwKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpO1xuICAgIH0sIHdhaXQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbnRlcnZhbElkOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9LCBpbnRlcnZhbCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dQcmVzZW50KGRpYWxvZ1RpdGxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGlhbG9ncyA9IERHLkRpYWxvZy5nZXRPcGVuRGlhbG9ncygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpYWxvZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGlhbG9nc1tpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RWaWV3ZXIodjogc3RyaW5nLCBkZjogREcuRGF0YUZyYW1lLCBkZXRlY3RTZW1hbnRpY1R5cGVzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgY29uc3QgdHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhkZik7XG4gIGNvbnN0IHZpZXdlck5hbWUgPSBgW25hbWU9dmlld2VyLSR7di5yZXBsYWNlKC9cXHMrL2csICctJyl9IGldYDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHt2aWV3ZXJOYW1lfSBjYW52YXMsJHt2aWV3ZXJOYW1lfSBzdmcsJHt2aWV3ZXJOYW1lfSBpbWcsXG4gICAgJHt2aWV3ZXJOYW1lfSBpbnB1dCwke3ZpZXdlck5hbWV9IGgxLCR7dmlld2VyTmFtZX0gYWA7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICB0cnkge1xuICAgIGxldCB2aWV3ZXIgPSB0di5hZGRWaWV3ZXIodik7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICdjYW5ub3QgbG9hZCB2aWV3ZXInLCAzMDAwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgQXJyYXkuZnJvbShkZi5yb3coMCkuY2VsbHMpLmZvckVhY2goKGMpID0+IGMudmFsdWUgPSBudWxsKTtcbiAgICBkZi5yb3dzLnNlbGVjdCgocm93KSA9PiByb3cuaWR4ID4gMSAmJiByb3cuaWR4IDwgNyk7XG4gICAgZm9yIChsZXQgaSA9IDc7IGkgPCAxMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICBkZi5jdXJyZW50Um93SWR4ID0gMTtcbiAgICBjb25zdCBwcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgY29uc3QgbmV3UHJvcHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoaykgPT4gdHlwZW9mIHByb3BzW2tdID09PSAnYm9vbGVhbicpLmZvckVhY2goKGspID0+IG5ld1Byb3BzW2tdID0gIXByb3BzW2tdKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdmlld2VyID0gQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5maW5kKCh2KSA9PiB2LnR5cGUgIT09ICdHcmlkJykhO1xuICAgIGV4cGVjdEFycmF5KHJlcywgWzIsIDEsIDJdKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0di5jbG9zZSgpO1xuICAgIGdyb2suc2hlbGwuY2xvc2VUYWJsZShkZik7XG4gIH1cbn1cbiJdfQ==