sliftutils 1.7.140 → 1.7.142

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/index.d.ts CHANGED
@@ -2191,6 +2191,10 @@ declare module "sliftutils/storage/IArchives" {
2191
2191
  export declare const MAX_LAST_MODIFIED_FUTURE: number;
2192
2192
  export declare const IMMUTABLE_CACHE_TIME: number;
2193
2193
  export declare function assertValidLastModified(lastModified: number): void;
2194
+ /** Every file-addressed operation checks this at its entry point, so an empty name fails right
2195
+ where it was passed - with the caller in the stack - instead of surfacing as a baffling backend
2196
+ rejection after the retry loops are done with it. */
2197
+ export declare function validateFileName(fileName: string, operation: string): void;
2194
2198
  export type RemoteConfig = {
2195
2199
  version?: number;
2196
2200
  sources: RemoteConfigBase[];
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -66,4 +66,4 @@ async function getOwnIPs() {
66
66
  }
67
67
  exports.getOwnIPs = getOwnIPs;
68
68
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3duSVBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3duSVBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQiwrREFBK0Q7QUFFL0QsaUdBQWlHO0FBQ2pHLDJGQUEyRjtBQUMzRix3REFBd0Q7QUFDeEQsRUFBRTtBQUNGLGtHQUFrRztBQUNsRywrRkFBK0Y7QUFDL0YsK0ZBQStGO0FBQy9GLHVDQUF1QztBQUN2QyxNQUFNLGtCQUFrQixHQUFHO0lBQ3ZCLFVBQVU7SUFDVixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLGFBQWE7SUFDYixNQUFNO0lBQ04sV0FBVztDQUNkLENBQUM7QUFFRixTQUFTLGtCQUFrQixDQUFDLElBQVk7SUFDcEMsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVEOzs7Ozs7Ozs7NkZBUzZGO0FBQ3RGLEtBQUssVUFBVSxTQUFTO0lBQzNCLElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2pFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxnREFBZ0QsQ0FBQyxDQUFDO1lBQzlFLFNBQVM7UUFDYixDQUFDO1FBQ0QsS0FBSyxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDN0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxNQUFNLElBQUEsMEJBQWEsR0FBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QseUZBQXlGO1FBQ3pGLGlEQUFpRDtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBeEJELDhCQXdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGdldEV4dGVybmFsSVAgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9uZXR3b3JraW5nXCI7XG5cbi8vIEludGVyZmFjZXMgYmVsb25naW5nIHRvIGNvbnRhaW5lcnMgYW5kIHZpcnR1YWwgbWFjaGluZXMsIGJ5IHRoZSBuYW1lcyB0aGUgcGxhdGZvcm1zIGdpdmUgdGhlbTpcbi8vIGRvY2tlciBicmlkZ2VzIGFuZCB0aGVpciB2ZXRoIHBhaXJzLCBsaWJ2aXJ0IGFuZCB2bXdhcmUgYW5kIHZpcnR1YWxib3ggc3dpdGNoZXMsIGFuZCB0aGVcbi8vIEh5cGVyLVYgc3dpdGNoZXMgV2luZG93cyBjcmVhdGVzIGZvciBXU0wgYW5kIGl0cyBWTXMuXG4vL1xuLy8gVGhlaXIgYWRkcmVzc2VzIGFyZSBza2lwcGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuIEFuIGFkZHJlc3Mgb24gb25lIG9mIHRoZXNlIGlzIGhvdyBzb21ldGhpbmcgd2Vcbi8vIGRlbGliZXJhdGVseSBzYW5kYm94ZWQgdGFsa3MgdG8gdXMsIHNvIHRydXN0aW5nIGEgbWFjaGluZSBmcm9tIGl0IHdvdWxkIGhhbmQgdGhlIHNhbmRib3ggdGhlXG4vLyBhY2Nlc3MgdGhlIHNhbmRib3ggZXhpc3RzIHRvIHdpdGhob2xkIC0gYW5kIG5vIG91dHNpZGUgbWFjaGluZSBjYW4gcmVhY2ggdXMgdGhlcmUgYW55d2F5LCBzb1xuLy8gbm90aGluZyBpcyBsb3N0IGJ5IGxlYXZpbmcgdGhlbSBvdXQuXG5jb25zdCBWSVJUVUFMX0lOVEVSRkFDRVMgPSBbXG4gICAgL15kb2NrZXIvaSxcbiAgICAvXmJyLS9pLFxuICAgIC9edmV0aC9pLFxuICAgIC9edmlyYnIvaSxcbiAgICAvXnZtbmV0L2ksXG4gICAgL152Ym94bmV0L2ksXG4gICAgL152RXRoZXJuZXQvaSxcbiAgICAvd3NsL2ksXG4gICAgL2h5cGVyLT92L2ksXG5dO1xuXG5mdW5jdGlvbiBpc1ZpcnR1YWxJbnRlcmZhY2UobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFZJUlRVQUxfSU5URVJGQUNFUy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KG5hbWUpKTtcbn1cblxuLyoqIEV2ZXJ5IGFkZHJlc3MgdGhpcyBtYWNoaW5lIGNhbiBiZSByZWFjaGVkIGF0LCBvciBzZWVuIGFzLlxuXG4gICAgQm90aCBoYWx2ZXMsIGJlY2F1c2Ugd2hpY2ggb25lIGFwcGxpZXMgZGVwZW5kcyBvbiB3aG8gaXMgZG9pbmcgdGhlIHNlZWluZzogc29tZXRoaW5nIG9uIHRoZVxuICAgIHNhbWUgbmV0d29yayBzZWVzIG9uZSBvZiBvdXIgaW50ZXJmYWNlIGFkZHJlc3NlcywgYW5kIGFueXRoaW5nIHBhc3QgYSBOQVQgc2VlcyB0aGUgYWRkcmVzcyB0aGVcbiAgICBOQVQgcHJlc2VudHMuIEEgbWFjaGluZSBjYW5ub3Qgd29yayB0aGUgc2Vjb25kIG9uZSBvdXQgYWxvbmUsIHdoaWNoIGlzIHdoeSBpdCBpcyBhc2tlZCBmb3IuXG5cbiAgICBMb29wYmFjayBhbmQgdGhlIG90aGVyIGludGVybmFsIGludGVyZmFjZXMgYXJlIGxlZnQgb3V0IC0gbm90aGluZyBvdXRzaWRlIHRoaXMgbWFjaGluZSBldmVyXG4gICAgc2VlcyB1cyBhcyB0aG9zZSAtIGFuZCBzbyBpcyBpcHY2LCBiZWNhdXNlIGV2ZXJ5dGhpbmcgY29uc3VtaW5nIHRoaXMgZGVhbHMgaW4gaXB2NC5cblxuICAgIEEgc2V0LCBiZWNhdXNlIGEgbWFjaGluZSB0aGF0IGlzIG5vdCBiZWhpbmQgYSBOQVQgc2VlcyBpdHMgb3duIGFkZHJlc3MgaW4gYm90aCBoYWx2ZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3duSVBzKCkge1xuICAgIGxldCBhZGRyZXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBbbmFtZSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMob3MubmV0d29ya0ludGVyZmFjZXMoKSkpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbEludGVyZmFjZShuYW1lKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nICR7bmFtZX0sIGl0IGJlbG9uZ3MgdG8gYSBjb250YWluZXIgb3IgdmlydHVhbCBtYWNoaW5lYCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIWVudHJ5LmludGVybmFsICYmIGVudHJ5LmZhbWlseSA9PT0gXCJJUHY0XCIpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzZXMuYWRkKGVudHJ5LmFkZHJlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGxldCBleHRlcm5hbCA9IChhd2FpdCBnZXRFeHRlcm5hbElQKCkpLnRyaW0oKTtcbiAgICAgICAgaWYgKGV4dGVybmFsKSB7XG4gICAgICAgICAgICBhZGRyZXNzZXMuYWRkKGV4dGVybmFsKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gT2ZmbGluZSwgb3IgZXZlcnkgc2VydmVyIHRoYXQgYW5zd2VycyB0aGlzIGlzIHVucmVhY2hhYmxlLiBUaGUgaW50ZXJmYWNlIGFkZHJlc3NlcyBhcmVcbiAgICAgICAgLy8gc3RpbGwgdHJ1ZSwgc28gdGhleSBhcmUgc3RpbGwgd29ydGggcmV0dXJuaW5nLlxuICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBmaW5kIG91dCB3aGF0IG91ciBleHRlcm5hbCBhZGRyZXNzIGlzLiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBbLi4uYWRkcmVzc2VzXTtcbn1cbiJdfQ==
69
- /* _JS_SOURCE_HASH = "b81102def8994d898381d50cdaf3795d7c6351e4e199cb3b828f22224950d741"; */
69
+ /* _JS_SOURCE_HASH = "ba75f7f45ccbde2a15b847218f8c3ce16bc887fd84db9db94c83b3b5c0629e79"; */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.140",
3
+ "version": "1.7.142",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.main = void 0;
7
6
  const promises_1 = __importDefault(require("fs/promises"));
8
7
  const os_1 = __importDefault(require("os"));
9
8
  const path_1 = __importDefault(require("path"));
@@ -610,6 +609,9 @@ async function main() {
610
609
  }
611
610
  await removeSource({ host, repoURL: await resolveRepoURL(rest[0]) });
612
611
  }
613
- exports.main = main;
614
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHNEQUF1RjtBQUN2RixxREFBNkU7QUFDN0UsdUNBQW9HO0FBQ3BHLGlEQUFrRjtBQUNsRix1Q0FBZ0Q7QUFDaEQseUNBQStDO0FBQy9DLHlDQUE2QztBQUM3Qyw0Q0FBOEM7QUFDOUMsNENBQWdEO0FBQ2hELG9EQUFtSjtBQUVuSixNQUFNLGNBQWMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUM1RSxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLGdCQUFnQjtBQUNoQixNQUFNLGNBQWMsR0FBRyw0Q0FBNEMsQ0FBQztBQUNwRSxNQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDO0FBQzFELE1BQU0sbUJBQW1CLEdBQUcsd0NBQXdDLENBQUM7QUFDckUsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztBQUN6RCxNQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDO0FBQzFELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQztBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELDRGQUE0RjtBQUM1RixrRUFBa0U7QUFDbEUsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Y0FPQSxDQUFDO0FBRWYsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxNQUFNLGtCQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLENB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QzdELHVCQUF1QixDQUM1QixDQUFDO0lBQ04sQ0FBQztBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSTtJQUN0QiwyRkFBMkY7SUFDM0YsOEZBQThGO0lBQzlGLHlFQUF5RTtJQUN6RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxS0FBcUs7SUFDckssSUFBSSxJQUFJLEtBQUssd0JBQVksRUFBRSxDQUFDO1FBQ3hCLFdBQVcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU87SUFDWCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLE9BQU87SUFDWCxDQUFDO0lBQ0QsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBdkJELG9CQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBwYXJzZVdlYmhvb2tGaWxlIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplS2V5cywgcmVhZFJlcG9LZXlzLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgZmluZFNvdXJjZUtleSwgS0VZU19ESVJfTkFNRSwgc291cmNlS2V5UGF0aCwgc291cmNlTmFtZSwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIFJFVk9LRV9LRVlfTEFCRUwsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IGxlZ2FjeVNvdXJjZUtleVBhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyByZXZva2VkS2V5c0luUmVwbyB9IGZyb20gXCIuL3VucmV2b2tlXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi9rZXlzUmVwb1wiO1xuaW1wb3J0IHsgZXhwYW5kSG9tZSB9IGZyb20gXCIuLi9oZWxwZXJzL3BhdGhzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCByZWFkUmVtb3RlRmlsZSwgcmVtb3RlQ29tbWFuZEV4aXN0cywgcnVuT3ZlclNTSCwgU1VET19QUkVBTUJMRSwgVEhJU19NQUNISU5FLCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcblxuY29uc3QgU0VSVklDRV9TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRhZW1vblwiLCBcInBvcnRzZWN1cmUuc2VydmljZVwiKTtcbi8vIFRoZSBkYWVtb24gcnVucyBmcm9tIGEgY2hlY2tvdXQgb2YgdGhpcyByZXBvIG9uIHRoZSBob3N0LCByYXRoZXIgdGhhbiBmcm9tIGEgY29weSB3ZSB1cGxvYWQsIHNvXG4vLyBhIGhvc3QgdXBkYXRlcyBpdHNlbGYgZnJvbSBnaXRodWIgdGhlIHNhbWUgd2F5IGFueXRoaW5nIGVsc2UgZG9lcy4gc2xpZnR1dGlscyBpcyBwdWJsaWMsIHNvIHRoaXNcbi8vIG5lZWRzIG5vIGtleS5cbmNvbnN0IFNMSUZUVVRJTFNfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3Qvc2xpZnR1dGlscy5naXRcIjtcbmNvbnN0IFJFTU9URV9DSEVDS09VVF9QQVRIID0gXCIvb3B0L3BvcnRzZWN1cmUvc2xpZnR1dGlsc1wiO1xuY29uc3QgUkVNT1RFX1NFUlZJQ0VfUEFUSCA9IFwiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9wb3J0c2VjdXJlLnNlcnZpY2VcIjtcbmNvbnN0IFJFTU9URV9DT05GSUdfUEFUSCA9IFwiL2V0Yy9wb3J0c2VjdXJlL2RhZW1vbi5qc29uXCI7XG5jb25zdCBST09UX0FVVEhPUklaRURfS0VZUyA9IFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIjtcbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IFwicG9ydHNlY3VyZVwiO1xuY29uc3QgTUFYX0VSUk9SX0JPRFlfTEVOR1RIID0gNTAwO1xuY29uc3QgVkVSQlMgPSBbXCJhZGRcIiwgXCJyZW1vdmVcIiwgXCJsaXN0XCIsIFwidXBkYXRlXCJdO1xuLy8gVGhlIGhvc3QgaXMgb3B0aW9uYWwsIGFuZCB3aXRob3V0IG9uZSBldmVyeXRoaW5nIGhhcHBlbnMgb24gdGhpcyBtYWNoaW5lLiBUaGUgcmVwbyB1cmwgaXNcbi8vIG9wdGlvbmFsIHRvbywgYW5kIGRlZmF1bHRzIHRvIHRoZSByZXBvIHRoZSBjb21tYW5kIGlzIHJ1biBmcm9tLlxuY29uc3QgVVNBR0UgPSBgVXNhZ2U6XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1cbiAgeWFybiBzZWN1cmVzc2ggW2hvc3RdIHJlbW92ZSBbcmVwby11cmxdXG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBsaXN0XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSB1cGRhdGVcblxuV2l0aCBubyBob3N0IGl0IGFjdHMgb24gdGhpcyBtYWNoaW5lLCBhbmQgc3RpbGwgaW5zdGFsbHMgZnJvbSBnaXRodWIgcmF0aGVyIHRoYW4gZnJvbSB3aGVyZXZlclxudGhpcyB3YXMgcnVuLmA7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9jYWwoY29uZmlnOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgY29tbWFuZCwgYXJncywgY3dkLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZCwgYXJncywgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2NvbW1hbmR9IHRvIHJ1biwgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDAgJiYgIWFsbG93RmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBIHByaXZhdGUga2V5IGNhbm5vdCBhdXRoZW50aWNhdGUgYW4gaHR0cHMgcmVtb3RlLCBzbyBnaXRodWIgdXJscyBhcmUgY29udmVydGVkIHRvIHRoZSBzc2ggZm9ybVxuICAgIHRoZSBrZXkgY2FuIGFjdHVhbGx5IGJlIHVzZWQgd2l0aC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9VUkwocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IGh0dHBzTWF0Y2ggPSByZXBvVVJMLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylcXC8oLis/KSg/OlxcLmdpdCk/XFwvPyQvKTtcbiAgICBpZiAoIWh0dHBzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9VUkw7XG4gICAgfVxuICAgIGxldCBbLCBob3N0LCByZXBvUGF0aF0gPSBodHRwc01hdGNoO1xuICAgIHJldHVybiBgZ2l0QCR7aG9zdH06JHtyZXBvUGF0aH0uZ2l0YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2l0V2l0aEtleShjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIC8vIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyBrZXkgc2VsZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAgbGV0IHNzaENvbW1hbmQgPSBgc3NoIC1pICR7a2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5hcmdzXSwgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQXNrcyBzc2ggd2hpY2gga2V5IGl0IGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQgd2l0aC4gVGhpcyBpcyB0aGUga2V5IHRoYXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIGRhZW1vbiB0YWtpbmcgb3ZlciBhdXRob3JpemVkX2tleXMsIG90aGVyd2lzZSBhIGRlcGxveSBsb2NrcyB1cyBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJzc2hcIixcbiAgICAgICAgYXJnczogW1wiLXZcIiwgXCItb1wiLCBcIkJhdGNoTW9kZT15ZXNcIiwgXCItb1wiLCBcIkNvbm5lY3RUaW1lb3V0PTEwXCIsIGhvc3QsIFwidHJ1ZVwiXSxcbiAgICB9KTtcbiAgICBsZXQgdmVyYm9zZU91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgXCJcIjtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIHNzaCBpbnRvICR7aG9zdH0sIGZhaWxlZC4gJHt2ZXJib3NlT3V0cHV0LnNsaWNlKC1NQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBsZXQgYWNjZXB0ZWRNYXRjaCA9IHZlcmJvc2VPdXRwdXQubWF0Y2goL1NlcnZlciBhY2NlcHRzIGtleTouKj8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICBpZiAoIWFjY2VwdGVkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gYWNjZXB0IGEgcHVibGljIGtleSwgYnV0IHRoZSBzZXNzaW9uIGRpZCBub3QgYXV0aGVudGljYXRlIHdpdGggb25lLmBcbiAgICAgICAgICAgICsgYCBwb3J0c2VjdXJlIGRpc2FibGVzIHBhc3N3b3JkIGxvZ2luLCBzbyBrZXkgYmFzZWQgYWNjZXNzIGhhcyB0byB3b3JrIGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2VwdGVkTWF0Y2hbMV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50S2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1rZXlzLVwiKSk7XG4gICAgbGV0IGtleXNQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJhdXRob3JpemVkX2tleXNcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGtleXNQYXRoLCBgJHtrZXlzLmpvaW4oXCJcXG5cIil9XFxuYCk7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJzc2gta2V5Z2VuXCIsIGFyZ3M6IFtcIi1sZlwiLCBrZXlzUGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBsZXQgZmluZ2VycHJpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBmaW5nZXJwcmludHMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbmdlcnByaW50cztcbn1cblxuLyoqIFdoZXJlIHRoZSBkYWVtb24gb24gdGhhdCBtYWNoaW5lIGtlZXBzIGl0cyBrZXlzOiB0aGUgaG9tZSBvZiB0aGUgdXNlciBpdCBydW5zIGFzLiBBc2tlZCBvZiB0aGVcbiAgICBtYWNoaW5lIGl0c2VsZiwgYmVjYXVzZSB0aGUgYW5zd2VyIGlzIG5vdCB0aGUgc2FtZSBldmVyeXdoZXJlIGFuZCBjZXJ0YWlubHkgbm90IHRoZSBzYW1lIGFzIHRoZVxuICAgIGhvbWUgb2Ygd2hvZXZlciBpcyBydW5uaW5nIHRoaXMuICovXG5hc3luYyBmdW5jdGlvbiBkYWVtb25LZXlzRGlyKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxcbiRTVURPIGdldGVudCBwYXNzd2Qgcm9vdCB8IGN1dCAtZDogLWY2YCxcbiAgICB9KTtcbiAgICBsZXQgaG9tZSA9IHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSBmb3Igcm9vdCwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aG9tZX0vJHtLRVlTX0RJUl9OQU1FfWA7XG59XG5cbi8qKiBUaGUgcHVibGljIGhhbGYgb2YgYSBwcml2YXRlIGtleSwgYXMgc3NoLWtleWdlbiBkZXJpdmVzIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVibGljS2V5T2YocHJpdmF0ZUtleVBhdGg6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwic3NoLWtleWdlblwiLCBhcmdzOiBbXCIteVwiLCBcIi1mXCIsIHByaXZhdGVLZXlQYXRoXSB9KTtcbiAgICByZXR1cm4gYCR7cmVzdWx0LnN0ZG91dC50cmltKCl9XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVSZXBvRm9ySW5zcGVjdGlvbihjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXBvLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJlcG9VUkwsIHJlcG9QYXRoXSB9KTtcbiAgICByZXR1cm4gcmVwb1BhdGg7XG59XG5cbi8qKiBXaXRoIG5vIHJlcG8gdXJsIGdpdmVuLCB0aGUga2V5cyByZXBvIHRoaXMgbWFjaGluZSByZXNvbHZlcyB0byBpcyB1c2VkIC0gdGhlIG9uZSB3ZSBhcmVcbiAgICBzdGFuZGluZyBpbiB3aGVuIHRoYXQgaG9sZHMga2V5cywgYW5kIHRoaXMgbWFjaGluZSdzIG93biBvdGhlcndpc2UuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1VSTChwYXNzZWRVUkw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwYXNzZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlcG9VUkwocGFzc2VkVVJMKTtcbiAgICB9XG4gICAgbGV0IHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9ID0gYXdhaXQgcmVzb2x2ZUtleXNSZXBvKCk7XG4gICAgbGV0IHJlcG9VUkwgPSBub3JtYWxpemVSZXBvVVJMKHNvdXJjZVVSTCk7XG4gICAgY29uc29sZS5sb2coYE5vIHJlcG8gdXJsIGdpdmVuLCB1c2luZyAke3JlcG9QYXRofTogJHtyZXBvVVJMfWApO1xuICAgIHJldHVybiByZXBvVVJMO1xufVxuXG4vKiogRXZlcnkgc291cmNlJ3MgcmV2b2tlIHJlcG8gaGFzIHRvIGV4aXN0IGFuZCBob2xkIGF0IGxlYXN0IG9uZSBjb21taXQsIG9yIHRoZSBob3N0cyB1c2luZyBpdFxuICAgIGNhbm5vdCByZWNvcmQgYSByZXZvY2F0aW9uLiBDaGVja2VkIHdpdGggdGhpcyBtYWNoaW5lJ3Mgb3duIGdpdCBjcmVkZW50aWFscywgc2luY2UgdXBkYXRlIGlzXG4gICAgbm90IGdpdmVuIGFueSBkZXBsb3kga2V5LCBhbmQgYW4gZW1wdHkgcmVwbyBpcyBpbml0aWFsaXNlZCByYXRoZXIgdGhhbiBtZXJlbHkgY29tcGxhaW5lZCBhYm91dC5cblxuICAgIEEgaG9zdCB0aGF0IGNhbm5vdCB3cml0ZSBhIHJldm9jYXRpb24gc2lsZW50bHkga2VlcHMgYWNjZXB0aW5nIGEga2V5IGl0IGp1c3Qgc2F3IGJlaW5nIG1pc3VzZWQsXG4gICAgd2hpY2ggaXMgdGhlIG9uZSBmYWlsdXJlIHRoaXMgd2hvbGUgdGhpbmcgZXhpc3RzIHRvIHByZXZlbnQsIHNvIGl0IGlzIGNoZWNrZWQgb24gZXZlcnkgZGVwbG95XG4gICAgYW5kIG5vdCBvbmx5IHdoZW4gYSBzb3VyY2UgaXMgZmlyc3QgYWRkZWQuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IHJlcG9VUkwgb2YgcmVwb1NvdXJjZXMpIHtcbiAgICAgICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgICAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgICAgICAvLyBPbiBhIG1hY2hpbmUgdGhhdCBpcyBhbHJlYWR5IGEgcG9ydHNlY3VyZSBob3N0LCB0aGUgc291cmNlJ3MgZGVwbG95IGtleSBpcyByaWdodCB0aGVyZSxcbiAgICAgICAgLy8gYW5kIHRoZSBrZXkgZGVyaXZlZCBmcm9tIGl0IGlzIHRoZSBvbmUgY3JlZGVudGlhbCB0aGF0IHJlcG8gaXMgZ3VhcmFudGVlZCB0byBhY2NlcHQuXG4gICAgICAgIC8vIEFueXdoZXJlIGVsc2UsIGEgcGVyc29uIGlzIHJ1bm5pbmcgdGhpcyBhbmQgaGFzIHRoZWlyIG93biBhY2Nlc3MuXG4gICAgICAgIGxldCBvd25LZXkgPSBcIlwiO1xuICAgICAgICBsZXQgbG9jYWxTb3VyY2VLZXkgPSBhd2FpdCBmaW5kU291cmNlS2V5KHJlcG9VUkwpO1xuICAgICAgICBpZiAobG9jYWxTb3VyY2VLZXkpIHtcbiAgICAgICAgICAgIGxldCBkZXJpdmVkID0gZGVyaXZlUmV2b2tlS2V5KGF3YWl0IGZzLnJlYWRGaWxlKGxvY2FsU291cmNlS2V5LCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgb3duS2V5ID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJrZXlcIik7XG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUob3duS2V5LCBkZXJpdmVkLnByaXZhdGVLZXlGaWxlLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbG9uZVJldm9rZSA9IGFzeW5jIChhbGxvd0ZhaWx1cmU6IGJvb2xlYW4pID0+IG93bktleVxuICAgICAgICAgICAgJiYgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSlcbiAgICAgICAgICAgIHx8IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSk7XG4gICAgICAgIGxldCBjbG9uZSA9IGF3YWl0IGNsb25lUmV2b2tlKHRydWUpO1xuICAgICAgICBpZiAoY2xvbmUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXZva2VVUkx9IHRvIGV4aXN0LCBpdCBkb2VzIG5vdCwgc28gJHtyZXBvVVJMfSBoYXMgbm93aGVyZSB0byByZWNvcmQgYWBcbiAgICAgICAgICAgICAgICArIGAgcmV2b2NhdGlvbi5cXG5DcmVhdGUgaXQsIHRoZW4gcnVuIFwieWFybiBzZWN1cmVzc2ggPGhvc3Q+IGFkZFwiIGZvciB0aGF0IHNvdXJjZSB0b2BcbiAgICAgICAgICAgICAgICArIGAgcmVnaXN0ZXIgaXRzIGRlcGxveSBrZXkuXFxuJHsoY2xvbmUuc3Rkb3V0ICsgY2xvbmUuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWFkID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoaGVhZC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVVSTH0gaXMgZW1wdHksIGdpdmluZyBpdCBhIGZpcnN0IGNvbW1pdGApO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjaGVja291dFBhdGgsIFwiUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICAgICArIGBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20sIGFuZCBpcyBubyBsb25nZXIgYWNjZXB0ZWQgYW55d2hlcmUuXFxuYCk7XG4gICAgICAgICAgICBmb3IgKGxldCBhcmdzIG9mIFtcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwiYWRkXCIsIFwiLUFcIl0sXG4gICAgICAgICAgICAgICAgW1wiLUNcIiwgY2hlY2tvdXRQYXRoLCBcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHB1c2ggPSBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl07XG4gICAgICAgICAgICBpZiAob3duS2V5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogcHVzaCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBwdXNoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHJlYWR5YCk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgYmUgd3JpdGFibGUgYmVmb3JlIGEgaG9zdCBpcyBzZXQgdXAsIGJlY2F1c2UgYSBob3N0IHRoYXRcbiAgICBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIGNhbm5vdCByZXZva2UgYSBrZXkgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiBUaGUga2V5IGZvciBpdCBpcyBkZXJpdmVkXG4gICAgZnJvbSB0aGUgc291cmNlJ3MsIHNpbmNlIGdpdGh1YiB3aWxsIG5vdCB0YWtlIG9uZSBwdWJsaWMga2V5IG9uIHR3byByZXBvcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG8oY29uZmlnOiB7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpKTtcblxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkZXJpdmVkS2V5UGF0aCwgZGVyaXZlZC5wcml2YXRlS2V5RmlsZSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuXG4gICAgbGV0IGV4cGxhaW4gPSAocHJvYmxlbTogc3RyaW5nKSA9PiBuZXcgRXJyb3IoXG4gICAgICAgIGAke3Byb2JsZW19XFxuYFxuICAgICAgICArIGBDcmVhdGUgJHtyZXZva2VVUkx9IGFuZCBhZGQgdGhpcyBhcyBhIGRlcGxveSBrZXkgV0lUSCBXUklURSBBQ0NFU1M6XFxuYFxuICAgICAgICArIGAgICR7ZGVyaXZlZC5wdWJsaWNLZXl9ICR7UkVWT0tFX0tFWV9MQUJFTH1cXG5gXG4gICAgICAgICsgYEl0IGhhcyB0byBiZSB0aGlzIGtleTogaXQgaXMgZGVyaXZlZCBmcm9tICR7a2V5UGF0aH0sIGFuZCBnaXRodWIgd2lsbCBub3QgYWNjZXB0IHRoZSBzYW1lYFxuICAgICAgICArIGAgcHVibGljIGtleSBvbiB0d28gcmVwb3NpdG9yaWVzLmBcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmV2b2tlVVJMfWApO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gYmUgcmVhZGFibGUgd2l0aCB0aGUgZGVyaXZlZCBrZXksIGl0IGlzIG5vdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbXB0eSByZXBvIGhhcyBubyBicmFuY2ggZm9yIHRoZSBkYWVtb24gdG8gY2xvbmUsIHNvIGl0IGdldHMgaXRzIGZpcnN0IGNvbW1pdCBoZXJlLiBUaGF0XG4gICAgLy8gZG91YmxlcyBhcyB0aGUgcHJvb2YgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gaXQuXG4gICAgbGV0IGhlYWQgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICBbXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgIFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJncywgY3dkOiBjaGVja291dFBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2ggPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IGNoZWNrb3V0UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIHRoZSBmaXJzdCBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRyeVJ1biA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIi0tZHJ5LXJ1blwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChkcnlSdW4uc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCB3cml0ZSBhY2Nlc3MgdG8gJHtyZXZva2VVUkx9LCBhIGRyeSBydW4gcHVzaCB3YXMgcmVmdXNlZC5cXG4keyhkcnlSdW4uc3Rkb3V0ICsgZHJ5UnVuLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHdyaXRhYmxlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVDb25maWcoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaG9zdExhYmVsOiBob3N0LCByZXBvU291cmNlczogW10gYXMgc3RyaW5nW10gfTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgcmV0dXJuIHsgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzOiBwYXJzZWQucmVwb1NvdXJjZXMgfHwgW10gfTtcbn1cblxuLyoqIFJlYWRzIHRoZSBrZXlzIGEgc291cmNlJ3MgY2hlY2tvdXQgY3VycmVudGx5IGhvbGRzIG9uIHRoZSBob3N0LCBzbyB0aGUgbWVyZ2VkIHJlc3VsdCBjYW4gYmVcbiAgICB3b3JrZWQgb3V0IHdpdGhvdXQgbmVlZGluZyB0aGF0IHNvdXJjZSdzIHByaXZhdGUga2V5IGxvY2FsbHkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUmVtb3RlU291cmNlS2V5cyhjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbmlmICRTVURPIHRlc3QgLWYgXCIke3JlcG9QYXRofS9hdXRob3JpemVkX2tleXNcIjsgdGhlblxuICAgICRTVURPIGNhdCBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiXG5lbGlmICRTVURPIHRlc3QgLWQgXCIke3JlcG9QYXRofVwiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH1cIi8qLnB1YiAyPi9kZXYvbnVsbCB8fCB0cnVlXG5maWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbm9ybWFsaXplS2V5cyhvdXRwdXQuc3Rkb3V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERhZW1vbihjb25maWc6IHsgaG9zdDogc3RyaW5nOyBob3N0TGFiZWw6IHN0cmluZzsgcmVwb1NvdXJjZXM6IHN0cmluZ1tdIH0pIHtcbiAgICBsZXQgeyBob3N0LCBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0gPSBjb25maWc7XG4gICAgZm9yIChsZXQgY29tbWFuZCBvZiBbXCJub2RlXCIsIFwiZ2l0XCIsIFwieWFyblwiXSkge1xuICAgICAgICBpZiAoIWF3YWl0IHJlbW90ZUNvbW1hbmRFeGlzdHMoeyBob3N0LCBjb21tYW5kIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gYmUgaW5zdGFsbGVkIG9uICR7aG9zdH0sIGl0IGlzIG5vdC4gSW5zdGFsbCBpdCBhbmQgcmVydW4uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY2hlY2tvdXQgaXMgYnJvdWdodCB0byB0aGUgbGF0ZXN0IGNvbW1pdCByYXRoZXIgdGhhbiBhIGNvcHkgYmVpbmcgcHVzaGVkLCBzbyB3aGF0IHJ1bnMgb25cbiAgICAvLyB0aGUgaG9zdCBpcyBleGFjdGx5IHdoYXQgaXMgb24gZ2l0aHViLlxuICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyAke1JFTU9URV9DSEVDS09VVF9QQVRIfSBvbiAke2Rlc2NyaWJlSG9zdChob3N0KX1gKTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBta2RpciAtcCBcIiR7cGF0aC5wb3NpeC5kaXJuYW1lKFJFTU9URV9DSEVDS09VVF9QQVRIKX1cIlxuaWYgJFNVRE8gdGVzdCAtZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9Ly5naXRcIjsgdGhlblxuICAgICMgU3Rhc2hlZCBmaXJzdCwgdGhlIHdheSBtYWNoaW5lLWFsd2F5c3VwIGRvZXMgaXQuIEFueXRoaW5nIHNpdHRpbmcgbW9kaWZpZWQgaW4gYSBob3N0J3NcbiAgICAjIGNoZWNrb3V0IGlzIGVpdGhlciBhbiBhY2NpZGVudCBvciBzb21lYm9keSBlZGl0aW5nIHRoZSBkYWVtb24gaW4gcGxhY2UsIGFuZCBlaXRoZXIgd2F5IGl0IGlzXG4gICAgIyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHkgZXJhc2luZy4gVGhlIGlkZW50aXR5IGlzIHBhc3NlZCBpbmxpbmUgYmVjYXVzZSBhIGhvc3QgaGFzXG4gICAgIyBubyBnaXQgY29uZmlnIG9mIGl0cyBvd24gYW5kIHN0YXNoIHdyaXRlcyBhIGNvbW1pdC5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGFkZCAtLWFsbFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgLWMgdXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdCAtYyB1c2VyLm5hbWU9cG9ydHNlY3VyZSBzdGFzaFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgZmV0Y2ggLS1wcnVuZSBvcmlnaW5cbiAgICAjIEEgc3Rhc2ggYW5kIGEgcHVsbCBjYW5ub3QgY3Jvc3MgYSBicmFuY2ggdGhhdCBoYXMgZGl2ZXJnZWQsIGFuZCBhIGRyaWZ0ZWQgY2hlY2tvdXQgbXVzdCBub3QgYmVcbiAgICAjIGFibGUgdG8gbGVhdmUgYSBob3N0IHJ1bm5pbmcgb2xkIGNvZGUsIHNvIGl0IGlzIHB1dCBvbiB0aGUgcmVtb3RlJ3Mgc3RhdGUgcmF0aGVyIHRoYW4gbWVyZ2VkXG4gICAgIyB3aXRoIGl0LiBzZXQtaGVhZCBzbyB0aGF0IGlzIHRoZSByZW1vdGUncyBkZWZhdWx0IGJyYW5jaCBub3csIG5vdCB0aGUgb25lIGl0IGhhZCBhdCBjbG9uZS5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIHJlbW90ZSBzZXQtaGVhZCBvcmlnaW4gLS1hdXRvXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiByZXNldCAtLWhhcmQgb3JpZ2luL0hFQURcbmVsc2VcbiAgICAkU1VETyBybSAtcmYgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiXG4gICAgJFNVRE8gZ2l0IGNsb25lIFwiJHtTTElGVFVUSUxTX1VSTH1cIiBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCJcbmZpXG4kU1VETyB5YXJuIC0tY3dkIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiBpbnN0YWxsIC0tcHJvZHVjdGlvbiAtLW5vbi1pbnRlcmFjdGl2ZVxuIyBUaGUgc2luZ2xlIGZpbGUgZGFlbW9uIHRoaXMgcmVwbGFjZWQsIGxlZnQgb3ZlciBvbiBhIGhvc3Qgc2V0IHVwIGJ5IGFuIG9sZGVyIHZlcnNpb24uXG4kU1VETyBybSAtZiAvb3B0L3BvcnRzZWN1cmUvcG9ydHNlY3VyZS1kYWVtb24uanNgLFxuICAgIH0pO1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEgsXG4gICAgICAgIC8vIE9ubHkgd2hhdCBkaWZmZXJzIGJldHdlZW4gbWFjaGluZXMuIEV2ZXJ5IHBhdGggdGhlIGRhZW1vbiB1c2VzIGlzIGRlcml2ZWQgaW4gdGhlIGRhZW1vblxuICAgICAgICAvLyBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byBkcmlmdCBvdXQgb2Ygc3luYy5cbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHsgaG9zdExhYmVsLCByZXBvU291cmNlcyB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIixcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IFJFTU9URV9TRVJWSUNFX1BBVEgsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBmcy5yZWFkRmlsZShTRVJWSUNFX1NPVVJDRSwgXCJ1dGY4XCIpLFxuICAgICAgICBmaWxlTW9kZTogXCI2NDRcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3NTVcIixcbiAgICB9KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZFxuJFNVRE8gc3lzdGVtY3RsIGVuYWJsZSAke1NFUlZJQ0VfTkFNRX1cbiRTVURPIHN5c3RlbWN0bCByZXN0YXJ0ICR7U0VSVklDRV9OQU1FfWAsXG4gICAgfSk7XG5cbiAgICBsZXQgc3RhdHVzID0gKGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICBob3N0LFxuICAgICAgICBzY3JpcHQ6IGBzeXN0ZW1jdGwgaXMtYWN0aXZlICR7U0VSVklDRV9OQU1FfSB8fCB0cnVlYCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChzdGF0dXMgIT09IFwiYWN0aXZlXCIpIHtcbiAgICAgICAgbGV0IGpvdXJuYWwgPSAoYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gam91cm5hbGN0bCAtdSAke1NFUlZJQ0VfTkFNRX0gLW4gNDAgLS1uby1wYWdlciB8fCB0cnVlYCxcbiAgICAgICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICAgICAgfSkpLnN0ZG91dDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke1NFUlZJQ0VfTkFNRX0gdG8gYmUgYWN0aXZlIG9uICR7aG9zdH0sIHdhcyAke3N0YXR1c30uXFxuJHtqb3VybmFsLnNsaWNlKC0yMDAwKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgc3RpbGxSZWFjaGFibGUgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBcImVjaG8gcmVhY2hhYmxlXCIsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAoc3RpbGxSZWFjaGFibGUuc3Rkb3V0LnRyaW0oKSAhPT0gXCJyZWFjaGFibGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBzdGlsbCBiZSByZWFjaGFibGUgYWZ0ZXIgdGhlIGRhZW1vbiBzdGFydGVkLCBpdCBpcyBub3QuYFxuICAgICAgICAgICAgKyBgIENoZWNrIGNvbnNvbGUgYWNjZXNzIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJlYWRSZW1vdGVGaWxlKHsgaG9zdCwgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSBEaXNjb3JkIHdlYmhvb2sgYXQgJHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfSBvbiAke2hvc3R9LCBubyBzdWNoIGZpbGUgZXhpc3RzLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdpbGwgbm90IHN0YXJ0IHdpdGhvdXQgb25lLlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCBmaXJzdDpcXG4gIHlhcm4gc2V0dXBub3RpZnkgJHtob3N0fSA8ZGlzY29yZC13ZWJob29rLXVybD5gLnJlcGxhY2UoXCIgPGRpc2NvcmRcIiwgaG9zdCAmJiBcIiA8ZGlzY29yZFwiIHx8IFwiPGRpc2NvcmRcIilcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50cywgc291cmNlTmFtZTogYCR7aG9zdH06JHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfWAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmc7IHJlcG9VUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgaG9zdCwga2V5UGF0aCwgcmVwb1VSTCB9ID0gY29uZmlnO1xuICAgIGlmICghYXdhaXQgcGF0aEV4aXN0cyhrZXlQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgcHJpdmF0ZSBrZXkgYXQgJHtrZXlQYXRofSwgbm8gc3VjaCBmaWxlIGV4aXN0c2ApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyAke3JlcG9VUkx9IGlzIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH1gKTtcbiAgICBsZXQgcmVhY2hhYmxlID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGgsIGFyZ3M6IFtcImxzLXJlbW90ZVwiLCByZXBvVVJMXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChyZWFjaGFibGUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGJlIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH0sIGdpdCBscy1yZW1vdGUgZmFpbGVkLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGZldGNoIGtleXMuXFxuYFxuICAgICAgICAgICAgKyBgJHsocmVhY2hhYmxlLnN0ZG91dCArIHJlYWNoYWJsZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAocmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmluY2x1ZGVzKHJlcG9VUkwpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gYWxyZWFkeSBoYXMgJHtyZXBvVVJMfSwgcmVmcmVzaGluZyBpdHMga2V5IGFuZCB0aGUgZGFlbW9uLmApO1xuICAgIH1cblxuICAgIC8vIENvcGllZCBpbnRvIHBsYWNlIGJlZm9yZSBhbnl0aGluZyBlbHNlIG5lZWRzIGl0LiBUaGUgY2hlY2tzIGJlbG93IGxvb2sgdGhpcyBzb3VyY2UncyBrZXkgdXBcbiAgICAvLyB3aGVyZSB0aGUgbWFjaGluZSBrZWVwcyBpdCwgbm90IGF0IHRoZSBwYXRoIGl0IHdhcyBoYW5kZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgc28gYSBrZXkgdGhhdFxuICAgIC8vIGlzIHN0aWxsIG9ubHkgc2l0dGluZyBpbiB0aGUgY2FsbGVyJ3MgZGlyZWN0b3J5IHJlYWRzIGFzIG5vIGtleSBhdCBhbGwuXG4gICAgLy9cbiAgICAvLyBJbnRvIHRoZSBob21lIG9mIHdob2V2ZXIgdGhlIGRhZW1vbiBydW5zIGFzLCB3aGljaCBpcyB3aGVyZSBpdCBsb29rcy4gQXNrZWQgb2YgdGhlIGhvc3RcbiAgICAvLyByYXRoZXIgdGhhbiB3b3JrZWQgb3V0IGhlcmU6IHRoaXMgbWF5IGJlIHJ1bm5pbmcgb24gYSBtYWNoaW5lIHdpdGggbm8gc3VjaCB1c2VyLCBhbmQgd2l0aCBhXG4gICAgLy8gaG9tZSBkaXJlY3RvcnkgaW4gYW4gZW50aXJlbHkgZGlmZmVyZW50IHNoYXBlLlxuICAgIGxldCBob3N0S2V5c0RpcmVjdG9yeSA9IGF3YWl0IGRhZW1vbktleXNEaXIoaG9zdCk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9YCxcbiAgICAgICAgY29udGVudHM6IGF3YWl0IGZzLnJlYWRGaWxlKGtleVBhdGgsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgLy8gVGhlIHB1YmxpYyBoYWxmIHRvbywgc28gdGhlIGRlcGxveSBrZXkgdGhhdCBhIHJlcG8gd2FzIGdpdmVuIGNhbiBiZSBsb29rZWQgdXAgb24gdGhlIG1hY2hpbmVcbiAgICAvLyB1c2luZyBpdCwgcmF0aGVyIHRoYW4gb25seSBpbiB3aGF0ZXZlciBnaXRodWIgc2hvd3MuXG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9LnB1YmAsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBwdWJsaWNLZXlPZihrZXlQYXRoKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjQ0XCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbWVyZ2VkIHJlc3VsdCBpcyB3aGF0IHJvb3QgZW5kcyB1cCB3aXRoLCBzbyBvdXIgb3duIGtleSBoYXMgdG8gYmUgc29tZXdoZXJlIGluIGl0LiBPblxuICAgIC8vIHRoaXMgbWFjaGluZSB0aGVyZSBpcyBubyBzc2ggc2Vzc2lvbiB0byBwcmVzZXJ2ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBjaGVjay5cbiAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBcIlwiO1xuICAgIGlmIChob3N0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBzdXJ2aXZlcyB0aGUgbWVyZ2VkIGtleXNgKTtcbiAgICAgICAgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICB9XG4gICAgbGV0IGluc3BlY3Rpb25QYXRoID0gYXdhaXQgY2xvbmVSZXBvRm9ySW5zcGVjdGlvbih7IHJlcG9VUkwsIGtleVBhdGggfSk7XG4gICAgbGV0IG5ld0tleXMgPSBhd2FpdCByZWFkUmVwb0tleXMoaW5zcGVjdGlvblBhdGgpO1xuICAgIC8vIFdoYXRldmVyIGlzIGFwcGxpZWQgb24gdGhlIGhvc3QgY2FtZSBmcm9tIHRoZSBleGlzdGluZyBzb3VyY2VzLCBzbyBpdCBzdGF5cyBpbiB0aGUgbWVyZ2UuXG4gICAgbGV0IGV4aXN0aW5nS2V5cyA9IG5vcm1hbGl6ZUtleXMoYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUk9PVF9BVVRIT1JJWkVEX0tFWVMgfSkgfHwgXCJcIik7XG4gICAgbGV0IG1lcmdlZEZpbmdlcnByaW50cyA9IGF3YWl0IGZpbmdlcnByaW50S2V5cyhbLi4uZXhpc3RpbmdLZXlzLCAuLi5uZXdLZXlzXSk7XG4gICAgaWYgKG91ckZpbmdlcnByaW50ICYmICFtZXJnZWRGaW5nZXJwcmludHMuaW5jbHVkZXMob3VyRmluZ2VycHJpbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBiZSBpbiB0aGUgbWVyZ2VkIGtleXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICArIGBPdXJzOiAgICR7b3VyRmluZ2VycHJpbnR9XFxuYFxuICAgICAgICAgICAgKyBgTWVyZ2VkOiAke21lcmdlZEZpbmdlcnByaW50cy5qb2luKFwiXFxuICAgICAgICBcIikgfHwgXCIobm9uZSlcIn1cXG5gXG4gICAgICAgICAgICArIGBUaGUgZGFlbW9uIHJlcGxhY2VzIHJvb3QncyBhdXRob3JpemVkX2tleXMgd2l0aCB0aGUgbWVyZ2VkIHNvdXJjZXMsIHNvIHRoaXMgd291bGRgXG4gICAgICAgICAgICArIGAgbG9jayB5b3Ugb3V0IG9mICR7aG9zdH0uIEFkZCB5b3VyIHB1YmxpYyBrZXkgdG8gJHtyZXBvVVJMfSBmaXJzdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChvdXJGaW5nZXJwcmludCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgT3VyIGtleSAke291ckZpbmdlcnByaW50fSBpcyBpbiB0aGUgbWVyZ2VkIGtleXMsIGFjY2VzcyB3aWxsIHN1cnZpdmUuYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlUmV2b2tlUmVwbyh7IGtleVBhdGgsIHJlcG9VUkwgfSk7XG5cbiAgICAvLyBEZXBsb3lpbmcgYSByZXBvIHRoYXQgc3RpbGwgaG9sZHMgYSByZXZva2VkIGtleSB3b3VsZCBoYW5kIGl0IGJhY2sgdG8gZXZlcnkgbWFjaGluZS5cbiAgICBsZXQgcmV2b2tlZCA9IGF3YWl0IHJldm9rZWRLZXlzSW5SZXBvKHsgcmVwb1BhdGg6IGluc3BlY3Rpb25QYXRoLCBzb3VyY2VVUkw6IHJlcG9VUkwgfSk7XG4gICAgaWYgKHJldm9rZWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGhvbGQgbm8gcmV2b2tlZCBrZXlzLCBpdCBob2xkcyAke3Jldm9rZWQubGVuZ3RofTpcXG5gXG4gICAgICAgICAgICArIHJldm9rZWQubWFwKGVudHJ5ID0+IGAgICR7ZW50cnkucmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieWBcbiAgICAgICAgICAgICAgICArIGAgJHtlbnRyeS5yZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gYWZ0ZXIgdXNlIGZyb20gJHtlbnRyeS5yZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiP1wifWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICsgYFxcbkRlbGV0ZSB0aGVtIGZyb20gdGhlIHJlcG8sIG9yIHJ1biBcInlhcm4gdW5yZXZva2VcIiB0aGVyZSB0byBhbGxvdyB0aGVtIGFnYWluLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2ViaG9va1VSTCA9IGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbm90aWZpZXMgJHt3ZWJob29rVVJMfWApO1xuXG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmZpbHRlcihzb3VyY2UgPT4gc291cmNlICE9PSByZXBvVVJMKTtcbiAgICByZXBvU291cmNlcy5wdXNoKHJlcG9VUkwpO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHJlbW90ZUNvbmZpZy5ob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IGFkZGVkIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfS4gJHtyZXBvU291cmNlcy5sZW5ndGh9IHNvdXJjZShzKSBub3cgbWVyZ2VkLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTb3VyY2UoY29uZmlnOiB7IGhvc3Q6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgYSBzb3VyY2Ugb24gJHtob3N0fSwgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYENvbmZpZ3VyZWQ6XFxuICAke3JlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5qb2luKFwiXFxuICBcIikgfHwgXCIobm9uZSlcIn1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG5cbiAgICAvLyBPbiB0aGlzIG1hY2hpbmUgdGhlcmUgaXMgbm8gc3NoIHNlc3Npb24gdG8gcHJlc2VydmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2suXG4gICAgaWYgKHJlcG9Tb3VyY2VzLmxlbmd0aCAmJiBob3N0KSB7XG4gICAgICAgIC8vIFRoZSBrZXlzIGxlZnQgb3ZlciBhcmUgd2hhdCByb290IGdldHMsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBhbW9uZyB0aGVtLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgb3VyIGFjY2VzcyB0byAke2Rlc2NyaWJlSG9zdChob3N0KX0gc3Vydml2ZXMgd2l0aG91dCAke3JlcG9VUkx9YCk7XG4gICAgICAgIGxldCBvdXJGaW5nZXJwcmludCA9IGF3YWl0IGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3QpO1xuICAgICAgICBsZXQgcmVtYWluaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgICAgICByZW1haW5pbmdLZXlzLnB1c2goLi4uYXdhaXQgcmVhZFJlbW90ZVNvdXJjZUtleXMoeyBob3N0LCByZXBvVVJMOiBzb3VyY2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1haW5pbmdGaW5nZXJwcmludHMgPSBhd2FpdCBmaW5nZXJwcmludEtleXMocmVtYWluaW5nS2V5cyk7XG4gICAgICAgIGlmICghcmVtYWluaW5nRmluZ2VycHJpbnRzLmluY2x1ZGVzKG91ckZpbmdlcnByaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBzdGlsbCBiZSBpbiB0aGUgcmVtYWluaW5nIHNvdXJjZXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICAgICAgKyBgT3VyczogICAgICAke291ckZpbmdlcnByaW50fVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1haW5pbmc6ICR7cmVtYWluaW5nRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1vdmluZyAke3JlcG9VUkx9IHdvdWxkIGxvY2sgeW91IG91dCBvZiAke2hvc3R9LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWVyZ2UsIHNvIHRoZSBkYWVtb24gbGVhdmVzIHJvb3QncyBhdXRob3JpemVkX2tleXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gaXMgdGhlIGxhc3Qgc291cmNlLCBzbyByb290J3MgYXV0aG9yaXplZF9rZXlzIHN0YXlzIGFzIGl0IGlzIG5vdy5gKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gcm0gLWYgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9XCIgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9LnB1YlwiIFwiJHtsZWdhY3lTb3VyY2VLZXlQYXRoKHJlcG9VUkwpfVwiXG4kU1VETyBybSAtcmYgXCIke3NvdXJjZVJlcG9QYXRoKHJlcG9VUkwpfVwiYCxcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSByZW1vdmVkIGZyb20gJHtkZXNjcmliZUhvc3QoaG9zdCl9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIGxlZnQuYCk7XG59XG5cbi8qKiBBbnN3ZXJzIFwid2hvIGNhbiBsb2cgaW50byB0aGlzIGJveCwgYW5kIHdoaWNoIHJlcG8gc2F5cyBzb1wiLiBUaGUgcGF0aHMgdGhlIGRhZW1vbiB1c2VzIGFyZVxuICAgIGxlZnQgb3V0IG9uIHB1cnBvc2UsIHRoZXkgYXJlIHBsdW1iaW5nIHJhdGhlciB0aGFuIHNvbWV0aGluZyB0byBhY3Qgb24uICovXG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhbHJlYWR5IGhhdmUgcG9ydHNlY3VyZSwgJHtSRU1PVEVfQ09ORklHX1BBVEh9IGRvZXMgbm90IGV4aXN0LlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCB3aXRoOlxcbiAgeWFybiBzZWN1cmVzc2ggJHtob3N0fSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB7IGhvc3RMYWJlbD86IHN0cmluZzsgcmVwb1NvdXJjZXM/OiBzdHJpbmdbXSB9O1xuICAgIGxldCByZXBvU291cmNlcyA9IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXTtcbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGBVcGRhdGVkIHRoZSBkYWVtb24gb24gJHtkZXNjcmliZUhvc3QoaG9zdCl9LCBhbmQgcmVzdGFydGVkIGl0LmApO1xuICAgIGNvbnNvbGUubG9nKGBJdHMgJHtyZXBvU291cmNlcy5sZW5ndGh9IGtleSBzb3VyY2Uocykgd2VyZSBsZWZ0IGFzIHRoZXkgYXJlLCBhbG9uZyB3aXRoIHRoZSBrZXlzIGFuZGApO1xuICAgIGNvbnNvbGUubG9nKGBzaWduZXJzIGl0IGhhcyBhbHJlYWR5IGFjY2VwdGVkLiBPbmx5IHRoZSBkYWVtb24gaXRzZWxmIGNoYW5nZWQ6YCk7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZXBvU291cmNlcykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke3JlcG9VUkx9YCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0U291cmNlcyhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAoIXJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBoYXMgbm8ga2V5IHNvdXJjZXMuIHJvb3QncyBhdXRob3JpemVkX2tleXMgaXMgbGVmdCBleGFjdGx5IGFzIGl0IGlzLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbGV0cyByb290IGxvZyBpbiB3aXRoIHRoZSBrZXlzIGZyb20gJHtyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RofSByZXBvKHMpOmApO1xuICAgIGxldCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcykge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTCB9KTtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtyZXBvVVJMfWApO1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyBubyBrZXlzIC0gdGhlIGNoZWNrb3V0IGlzIG1pc3Npbmcgb3IgZW1wdHlgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgZ3JhbnRzICR7a2V5cy5sZW5ndGh9IGtleShzKTpgKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAke3N1bW1hcml6ZUtleShrZXkpfWApO1xuICAgICAgICAgICAgbWVyZ2VkLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuJHttZXJnZWQuc2l6ZX0ga2V5KHMpIGluIHRvdGFsIG9uY2UgZHVwbGljYXRlcyBhcmUgbWVyZ2VkLmApO1xuICAgIH1cbn1cblxuLyoqIFRoZSB2ZXJiIGlzIGEgZml4ZWQgd29yZCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uLCBzbyBpdCBpcyBwdWxsZWQgb3V0IG9mIHRoZSBhcmd1bWVudHMgd2hlcmV2ZXJcbiAgICBpdCB3YXMgdHlwZWQgYW5kIGV2ZXJ5dGhpbmcgbGVmdCBvdmVyIGlzIHBvc2l0aW9uYWwuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgdmVyYnMgPSBhcmd2LmZpbHRlcihhcmcgPT4gVkVSQlMuaW5jbHVkZXMoYXJnKSk7XG4gICAgaWYgKCF2ZXJicy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9IHNvbWV3aGVyZSBpbiB0aGUgYXJndW1lbnRzLCB3YXMgJHthcmd2LmpvaW4oXCIgXCIpIHx8IFwiKG5vdGhpbmcpXCJ9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9LCB3YXMgJHt2ZXJicy5qb2luKFwiIGFuZCBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHZlcmIgPSB2ZXJic1swXTtcbiAgICBsZXQgcG9zaXRpb25hbCA9IGFyZ3YuZmlsdGVyKGFyZyA9PiBhcmcgIT09IHZlcmIpO1xuICAgIC8vIEEgaG9zdCwgd2hlbiB0aGVyZSBpcyBvbmUsIGNvbWVzIGZpcnN0IGFuZCBpcyBhIGJhcmUgbmFtZSBvciBhZGRyZXNzLiBFdmVyeXRoaW5nIGVsc2UgdGhhdFxuICAgIC8vIGNhbiBhcHBlYXIgaGVyZSBpcyBhIHBhdGggb3IgYSByZXBvIHVybCwgYW5kIHRob3NlIGFsbCBjYXJyeSBhIHNsYXNoLCB3aGljaCBpcyB3aGF0IHRlbGxzXG4gICAgLy8gdGhlbSBhcGFydC4gU28gbm8gaG9zdCBhdCBhbGwgbWVhbnMgdGhpcyBtYWNoaW5lLlxuICAgIGxldCBob3N0ID0gVEhJU19NQUNISU5FO1xuICAgIGlmIChwb3NpdGlvbmFsLmxlbmd0aCAmJiAhL1tcXC9+XFxcXF0vLnRlc3QocG9zaXRpb25hbFswXSkpIHtcbiAgICAgICAgaG9zdCA9IHBvc2l0aW9uYWxbMF07XG4gICAgICAgIHBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IGFyZ3VtZW50cyBlYWNoIHZlcmIgdGFrZXMsIGNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiB3aGVyZSB0aGUgdmVyYiBpcyBhY3RlZCBvbiwgc29cbiAgICAvLyB0aGF0IGEgY29tbWFuZCB3aGljaCB3YXMgdHlwZWQgd3Jvbmcgc2F5cyBzbyBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb21wbGFpbmVkIGFib3V0LlxuICAgIGlmICh2ZXJiID09PSBcImxpc3RcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdGhpbmcgYWZ0ZXIgbGlzdCwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIgJiYgcG9zaXRpb25hbC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3RoaW5nIGFmdGVyIHVwZGF0ZSwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwiYWRkXCIgJiYgKCFwb3NpdGlvbmFsLmxlbmd0aCB8fCBwb3NpdGlvbmFsLmxlbmd0aCA+IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhbmQgb3B0aW9uYWxseSBhIHJlcG8gdXJsLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJyZW1vdmVcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0IGEgcmVwbyB1cmwgdG8gcmVtb3ZlLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICByZXR1cm4geyB2ZXJiLCBob3N0LCByZXN0OiBwb3NpdGlvbmFsIH07XG59XG5cbi8qKiBFdmVyeXRoaW5nIGhlcmUgaXMgcm9vdCdzOiByb290J3MgYXV0aG9yaXplZF9rZXlzLCByb290J3Mga2V5cyBkaXJlY3RvcnksIHRoZSBzc2hkIGNvbmZpZywgdGhlXG4gICAgc3lzdGVtZCB1bml0LiBSdW4gYXMgYW55b25lIGVsc2UgaXQgcmVhZHMgYSBkaWZmZXJlbnQgaG9tZSBhbmQgd3JpdGVzIGZpbGVzIHRoZSBkYWVtb24gd2lsbFxuICAgIG5ldmVyIHNlZSwgYW5kIGl0IGdldHMgdGhlcmUgc2V2ZXJhbCBzdGVwcyBpbiByYXRoZXIgdGhhbiBmYWlsaW5nIGF0IHRoZSBzdGFydC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVSb290KCkge1xuICAgIGxldCB1aWQgPSBwcm9jZXNzLmdldHVpZD8uKCk7XG4gICAgaWYgKHVpZCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdG8gYmUgcnVubmluZyBhcyByb290LCBpcyB1aWQgJHt1aWQgPz8gXCJ1bmtub3duXCJ9LlxcbmBcbiAgICAgICAgICAgICsgYFJlcnVuIHRoaXMgd2l0aCBzdWRvLmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIC8vIFdoYXQgd2FzIHR5cGVkIGlzIGNoZWNrZWQgYmVmb3JlIGFueXRoaW5nIGFib3V0IHRoaXMgbWFjaGluZSBpcy4gQSBjb21tYW5kIHRoYXQgZG9lcyBub3RcbiAgICAvLyBtYWtlIHNlbnNlIGlzIHdvcnRoIHNheWluZyBzbyBhYm91dCB3aG9ldmVyIGlzIHJ1bm5pbmcgaXQsIGFuZCBiZWluZyB0b2xkIHRvIGZpbmQgc3VkbyBvbmx5XG4gICAgLy8gdG8gdGhlbiBiZSB0b2xkIHRoZSBhcmd1bWVudHMgd2VyZSB3cm9uZyBpcyB0d28gdHJpcHMgZm9yIG9uZSBtaXN0YWtlLlxuICAgIGxldCB7IHZlcmIsIGhvc3QsIHJlc3QgfSA9IHBhcnNlQXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuICAgIC8vIFdpdGggYSBob3N0LCBldmVyeXRoaW5nIHJvb3Qtb3duZWQgaGFwcGVucyBvbiB0aGF0IGhvc3QgdGhyb3VnaCAkU1VETyBvdmVyIHNzaCwgc28gYmVpbmcgcm9vdCBoZXJlIHByb3ZlcyBub3RoaW5nIGFuZCB3b3VsZCBibG9jayBydW5uaW5nIHRoaXMgZnJvbSBhIHdvcmtzdGF0aW9uLlxuICAgIGlmIChob3N0ID09PSBUSElTX01BQ0hJTkUpIHtcbiAgICAgICAgcmVxdWlyZVJvb3QoKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYiA9PT0gXCJsaXN0XCIpIHtcbiAgICAgICAgYXdhaXQgbGlzdFNvdXJjZXMoaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlRGFlbW9uKGhvc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2ZXJiID09PSBcImFkZFwiKSB7XG4gICAgICAgIGF3YWl0IGFkZFNvdXJjZSh7IGhvc3QsIGtleVBhdGg6IGV4cGFuZEhvbWUocmVzdFswXSksIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMV0pIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVNvdXJjZSh7IGhvc3QsIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMF0pIH0pO1xufVxuIl19
615
- /* _JS_SOURCE_HASH = "c0e9a0f32fba6a35cf6b2f90b3887a3cf5174cfaa9758d11e43b148ad66349c3"; */
612
+ main().catch(e => {
613
+ console.error(`${e}`);
614
+ process.exitCode = 1;
615
+ }).finally(() => process.exit());
616
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkRBQTZCO0FBQzdCLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsc0RBQXVGO0FBQ3ZGLHFEQUE2RTtBQUM3RSx1Q0FBb0c7QUFDcEcsaURBQWtGO0FBQ2xGLHVDQUFnRDtBQUNoRCx5Q0FBK0M7QUFDL0MseUNBQTZDO0FBQzdDLDRDQUE4QztBQUM5Qyw0Q0FBZ0Q7QUFDaEQsb0RBQW1KO0FBRW5KLE1BQU0sY0FBYyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQzVFLGtHQUFrRztBQUNsRyxtR0FBbUc7QUFDbkcsZ0JBQWdCO0FBQ2hCLE1BQU0sY0FBYyxHQUFHLDRDQUE0QyxDQUFDO0FBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsNEJBQTRCLENBQUM7QUFDMUQsTUFBTSxtQkFBbUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUNyRSxNQUFNLGtCQUFrQixHQUFHLDZCQUE2QixDQUFDO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsNEJBQTRCLENBQUM7QUFDMUQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ2xDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbEQsNEZBQTRGO0FBQzVGLGtFQUFrRTtBQUNsRSxNQUFNLEtBQUssR0FBRzs7Ozs7OztjQU9BLENBQUM7QUFFZixLQUFLLFVBQVUsVUFBVSxDQUFDLFFBQWdCO0lBQ3RDLElBQUksQ0FBQztRQUNELE1BQU0sa0JBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUFDLE9BQU8sQ0FB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LE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBwYXJzZVdlYmhvb2tGaWxlIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplS2V5cywgcmVhZFJlcG9LZXlzLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgZmluZFNvdXJjZUtleSwgS0VZU19ESVJfTkFNRSwgc291cmNlS2V5UGF0aCwgc291cmNlTmFtZSwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIFJFVk9LRV9LRVlfTEFCRUwsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IGxlZ2FjeVNvdXJjZUtleVBhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyByZXZva2VkS2V5c0luUmVwbyB9IGZyb20gXCIuL3VucmV2b2tlXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi9rZXlzUmVwb1wiO1xuaW1wb3J0IHsgZXhwYW5kSG9tZSB9IGZyb20gXCIuLi9oZWxwZXJzL3BhdGhzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCByZWFkUmVtb3RlRmlsZSwgcmVtb3RlQ29tbWFuZEV4aXN0cywgcnVuT3ZlclNTSCwgU1VET19QUkVBTUJMRSwgVEhJU19NQUNISU5FLCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcblxuY29uc3QgU0VSVklDRV9TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRhZW1vblwiLCBcInBvcnRzZWN1cmUuc2VydmljZVwiKTtcbi8vIFRoZSBkYWVtb24gcnVucyBmcm9tIGEgY2hlY2tvdXQgb2YgdGhpcyByZXBvIG9uIHRoZSBob3N0LCByYXRoZXIgdGhhbiBmcm9tIGEgY29weSB3ZSB1cGxvYWQsIHNvXG4vLyBhIGhvc3QgdXBkYXRlcyBpdHNlbGYgZnJvbSBnaXRodWIgdGhlIHNhbWUgd2F5IGFueXRoaW5nIGVsc2UgZG9lcy4gc2xpZnR1dGlscyBpcyBwdWJsaWMsIHNvIHRoaXNcbi8vIG5lZWRzIG5vIGtleS5cbmNvbnN0IFNMSUZUVVRJTFNfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3Qvc2xpZnR1dGlscy5naXRcIjtcbmNvbnN0IFJFTU9URV9DSEVDS09VVF9QQVRIID0gXCIvb3B0L3BvcnRzZWN1cmUvc2xpZnR1dGlsc1wiO1xuY29uc3QgUkVNT1RFX1NFUlZJQ0VfUEFUSCA9IFwiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9wb3J0c2VjdXJlLnNlcnZpY2VcIjtcbmNvbnN0IFJFTU9URV9DT05GSUdfUEFUSCA9IFwiL2V0Yy9wb3J0c2VjdXJlL2RhZW1vbi5qc29uXCI7XG5jb25zdCBST09UX0FVVEhPUklaRURfS0VZUyA9IFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIjtcbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IFwicG9ydHNlY3VyZVwiO1xuY29uc3QgTUFYX0VSUk9SX0JPRFlfTEVOR1RIID0gNTAwO1xuY29uc3QgVkVSQlMgPSBbXCJhZGRcIiwgXCJyZW1vdmVcIiwgXCJsaXN0XCIsIFwidXBkYXRlXCJdO1xuLy8gVGhlIGhvc3QgaXMgb3B0aW9uYWwsIGFuZCB3aXRob3V0IG9uZSBldmVyeXRoaW5nIGhhcHBlbnMgb24gdGhpcyBtYWNoaW5lLiBUaGUgcmVwbyB1cmwgaXNcbi8vIG9wdGlvbmFsIHRvbywgYW5kIGRlZmF1bHRzIHRvIHRoZSByZXBvIHRoZSBjb21tYW5kIGlzIHJ1biBmcm9tLlxuY29uc3QgVVNBR0UgPSBgVXNhZ2U6XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1cbiAgeWFybiBzZWN1cmVzc2ggW2hvc3RdIHJlbW92ZSBbcmVwby11cmxdXG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBsaXN0XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSB1cGRhdGVcblxuV2l0aCBubyBob3N0IGl0IGFjdHMgb24gdGhpcyBtYWNoaW5lLCBhbmQgc3RpbGwgaW5zdGFsbHMgZnJvbSBnaXRodWIgcmF0aGVyIHRoYW4gZnJvbSB3aGVyZXZlclxudGhpcyB3YXMgcnVuLmA7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9jYWwoY29uZmlnOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgY29tbWFuZCwgYXJncywgY3dkLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZCwgYXJncywgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2NvbW1hbmR9IHRvIHJ1biwgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDAgJiYgIWFsbG93RmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBIHByaXZhdGUga2V5IGNhbm5vdCBhdXRoZW50aWNhdGUgYW4gaHR0cHMgcmVtb3RlLCBzbyBnaXRodWIgdXJscyBhcmUgY29udmVydGVkIHRvIHRoZSBzc2ggZm9ybVxuICAgIHRoZSBrZXkgY2FuIGFjdHVhbGx5IGJlIHVzZWQgd2l0aC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9VUkwocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IGh0dHBzTWF0Y2ggPSByZXBvVVJMLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylcXC8oLis/KSg/OlxcLmdpdCk/XFwvPyQvKTtcbiAgICBpZiAoIWh0dHBzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9VUkw7XG4gICAgfVxuICAgIGxldCBbLCBob3N0LCByZXBvUGF0aF0gPSBodHRwc01hdGNoO1xuICAgIHJldHVybiBgZ2l0QCR7aG9zdH06JHtyZXBvUGF0aH0uZ2l0YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2l0V2l0aEtleShjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIC8vIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyBrZXkgc2VsZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAgbGV0IHNzaENvbW1hbmQgPSBgc3NoIC1pICR7a2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5hcmdzXSwgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQXNrcyBzc2ggd2hpY2gga2V5IGl0IGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQgd2l0aC4gVGhpcyBpcyB0aGUga2V5IHRoYXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIGRhZW1vbiB0YWtpbmcgb3ZlciBhdXRob3JpemVkX2tleXMsIG90aGVyd2lzZSBhIGRlcGxveSBsb2NrcyB1cyBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJzc2hcIixcbiAgICAgICAgYXJnczogW1wiLXZcIiwgXCItb1wiLCBcIkJhdGNoTW9kZT15ZXNcIiwgXCItb1wiLCBcIkNvbm5lY3RUaW1lb3V0PTEwXCIsIGhvc3QsIFwidHJ1ZVwiXSxcbiAgICB9KTtcbiAgICBsZXQgdmVyYm9zZU91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgXCJcIjtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIHNzaCBpbnRvICR7aG9zdH0sIGZhaWxlZC4gJHt2ZXJib3NlT3V0cHV0LnNsaWNlKC1NQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBsZXQgYWNjZXB0ZWRNYXRjaCA9IHZlcmJvc2VPdXRwdXQubWF0Y2goL1NlcnZlciBhY2NlcHRzIGtleTouKj8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICBpZiAoIWFjY2VwdGVkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gYWNjZXB0IGEgcHVibGljIGtleSwgYnV0IHRoZSBzZXNzaW9uIGRpZCBub3QgYXV0aGVudGljYXRlIHdpdGggb25lLmBcbiAgICAgICAgICAgICsgYCBwb3J0c2VjdXJlIGRpc2FibGVzIHBhc3N3b3JkIGxvZ2luLCBzbyBrZXkgYmFzZWQgYWNjZXNzIGhhcyB0byB3b3JrIGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2VwdGVkTWF0Y2hbMV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50S2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1rZXlzLVwiKSk7XG4gICAgbGV0IGtleXNQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJhdXRob3JpemVkX2tleXNcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGtleXNQYXRoLCBgJHtrZXlzLmpvaW4oXCJcXG5cIil9XFxuYCk7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJzc2gta2V5Z2VuXCIsIGFyZ3M6IFtcIi1sZlwiLCBrZXlzUGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBsZXQgZmluZ2VycHJpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBmaW5nZXJwcmludHMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbmdlcnByaW50cztcbn1cblxuLyoqIFdoZXJlIHRoZSBkYWVtb24gb24gdGhhdCBtYWNoaW5lIGtlZXBzIGl0cyBrZXlzOiB0aGUgaG9tZSBvZiB0aGUgdXNlciBpdCBydW5zIGFzLiBBc2tlZCBvZiB0aGVcbiAgICBtYWNoaW5lIGl0c2VsZiwgYmVjYXVzZSB0aGUgYW5zd2VyIGlzIG5vdCB0aGUgc2FtZSBldmVyeXdoZXJlIGFuZCBjZXJ0YWlubHkgbm90IHRoZSBzYW1lIGFzIHRoZVxuICAgIGhvbWUgb2Ygd2hvZXZlciBpcyBydW5uaW5nIHRoaXMuICovXG5hc3luYyBmdW5jdGlvbiBkYWVtb25LZXlzRGlyKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxcbiRTVURPIGdldGVudCBwYXNzd2Qgcm9vdCB8IGN1dCAtZDogLWY2YCxcbiAgICB9KTtcbiAgICBsZXQgaG9tZSA9IHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSBmb3Igcm9vdCwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aG9tZX0vJHtLRVlTX0RJUl9OQU1FfWA7XG59XG5cbi8qKiBUaGUgcHVibGljIGhhbGYgb2YgYSBwcml2YXRlIGtleSwgYXMgc3NoLWtleWdlbiBkZXJpdmVzIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVibGljS2V5T2YocHJpdmF0ZUtleVBhdGg6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwic3NoLWtleWdlblwiLCBhcmdzOiBbXCIteVwiLCBcIi1mXCIsIHByaXZhdGVLZXlQYXRoXSB9KTtcbiAgICByZXR1cm4gYCR7cmVzdWx0LnN0ZG91dC50cmltKCl9XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVSZXBvRm9ySW5zcGVjdGlvbihjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXBvLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJlcG9VUkwsIHJlcG9QYXRoXSB9KTtcbiAgICByZXR1cm4gcmVwb1BhdGg7XG59XG5cbi8qKiBXaXRoIG5vIHJlcG8gdXJsIGdpdmVuLCB0aGUga2V5cyByZXBvIHRoaXMgbWFjaGluZSByZXNvbHZlcyB0byBpcyB1c2VkIC0gdGhlIG9uZSB3ZSBhcmVcbiAgICBzdGFuZGluZyBpbiB3aGVuIHRoYXQgaG9sZHMga2V5cywgYW5kIHRoaXMgbWFjaGluZSdzIG93biBvdGhlcndpc2UuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1VSTChwYXNzZWRVUkw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwYXNzZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlcG9VUkwocGFzc2VkVVJMKTtcbiAgICB9XG4gICAgbGV0IHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9ID0gYXdhaXQgcmVzb2x2ZUtleXNSZXBvKCk7XG4gICAgbGV0IHJlcG9VUkwgPSBub3JtYWxpemVSZXBvVVJMKHNvdXJjZVVSTCk7XG4gICAgY29uc29sZS5sb2coYE5vIHJlcG8gdXJsIGdpdmVuLCB1c2luZyAke3JlcG9QYXRofTogJHtyZXBvVVJMfWApO1xuICAgIHJldHVybiByZXBvVVJMO1xufVxuXG4vKiogRXZlcnkgc291cmNlJ3MgcmV2b2tlIHJlcG8gaGFzIHRvIGV4aXN0IGFuZCBob2xkIGF0IGxlYXN0IG9uZSBjb21taXQsIG9yIHRoZSBob3N0cyB1c2luZyBpdFxuICAgIGNhbm5vdCByZWNvcmQgYSByZXZvY2F0aW9uLiBDaGVja2VkIHdpdGggdGhpcyBtYWNoaW5lJ3Mgb3duIGdpdCBjcmVkZW50aWFscywgc2luY2UgdXBkYXRlIGlzXG4gICAgbm90IGdpdmVuIGFueSBkZXBsb3kga2V5LCBhbmQgYW4gZW1wdHkgcmVwbyBpcyBpbml0aWFsaXNlZCByYXRoZXIgdGhhbiBtZXJlbHkgY29tcGxhaW5lZCBhYm91dC5cblxuICAgIEEgaG9zdCB0aGF0IGNhbm5vdCB3cml0ZSBhIHJldm9jYXRpb24gc2lsZW50bHkga2VlcHMgYWNjZXB0aW5nIGEga2V5IGl0IGp1c3Qgc2F3IGJlaW5nIG1pc3VzZWQsXG4gICAgd2hpY2ggaXMgdGhlIG9uZSBmYWlsdXJlIHRoaXMgd2hvbGUgdGhpbmcgZXhpc3RzIHRvIHByZXZlbnQsIHNvIGl0IGlzIGNoZWNrZWQgb24gZXZlcnkgZGVwbG95XG4gICAgYW5kIG5vdCBvbmx5IHdoZW4gYSBzb3VyY2UgaXMgZmlyc3QgYWRkZWQuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IHJlcG9VUkwgb2YgcmVwb1NvdXJjZXMpIHtcbiAgICAgICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgICAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgICAgICAvLyBPbiBhIG1hY2hpbmUgdGhhdCBpcyBhbHJlYWR5IGEgcG9ydHNlY3VyZSBob3N0LCB0aGUgc291cmNlJ3MgZGVwbG95IGtleSBpcyByaWdodCB0aGVyZSxcbiAgICAgICAgLy8gYW5kIHRoZSBrZXkgZGVyaXZlZCBmcm9tIGl0IGlzIHRoZSBvbmUgY3JlZGVudGlhbCB0aGF0IHJlcG8gaXMgZ3VhcmFudGVlZCB0byBhY2NlcHQuXG4gICAgICAgIC8vIEFueXdoZXJlIGVsc2UsIGEgcGVyc29uIGlzIHJ1bm5pbmcgdGhpcyBhbmQgaGFzIHRoZWlyIG93biBhY2Nlc3MuXG4gICAgICAgIGxldCBvd25LZXkgPSBcIlwiO1xuICAgICAgICBsZXQgbG9jYWxTb3VyY2VLZXkgPSBhd2FpdCBmaW5kU291cmNlS2V5KHJlcG9VUkwpO1xuICAgICAgICBpZiAobG9jYWxTb3VyY2VLZXkpIHtcbiAgICAgICAgICAgIGxldCBkZXJpdmVkID0gZGVyaXZlUmV2b2tlS2V5KGF3YWl0IGZzLnJlYWRGaWxlKGxvY2FsU291cmNlS2V5LCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgb3duS2V5ID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJrZXlcIik7XG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUob3duS2V5LCBkZXJpdmVkLnByaXZhdGVLZXlGaWxlLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbG9uZVJldm9rZSA9IGFzeW5jIChhbGxvd0ZhaWx1cmU6IGJvb2xlYW4pID0+IG93bktleVxuICAgICAgICAgICAgJiYgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSlcbiAgICAgICAgICAgIHx8IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSk7XG4gICAgICAgIGxldCBjbG9uZSA9IGF3YWl0IGNsb25lUmV2b2tlKHRydWUpO1xuICAgICAgICBpZiAoY2xvbmUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXZva2VVUkx9IHRvIGV4aXN0LCBpdCBkb2VzIG5vdCwgc28gJHtyZXBvVVJMfSBoYXMgbm93aGVyZSB0byByZWNvcmQgYWBcbiAgICAgICAgICAgICAgICArIGAgcmV2b2NhdGlvbi5cXG5DcmVhdGUgaXQsIHRoZW4gcnVuIFwieWFybiBzZWN1cmVzc2ggPGhvc3Q+IGFkZFwiIGZvciB0aGF0IHNvdXJjZSB0b2BcbiAgICAgICAgICAgICAgICArIGAgcmVnaXN0ZXIgaXRzIGRlcGxveSBrZXkuXFxuJHsoY2xvbmUuc3Rkb3V0ICsgY2xvbmUuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWFkID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoaGVhZC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVVSTH0gaXMgZW1wdHksIGdpdmluZyBpdCBhIGZpcnN0IGNvbW1pdGApO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjaGVja291dFBhdGgsIFwiUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICAgICArIGBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20sIGFuZCBpcyBubyBsb25nZXIgYWNjZXB0ZWQgYW55d2hlcmUuXFxuYCk7XG4gICAgICAgICAgICBmb3IgKGxldCBhcmdzIG9mIFtcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwiYWRkXCIsIFwiLUFcIl0sXG4gICAgICAgICAgICAgICAgW1wiLUNcIiwgY2hlY2tvdXRQYXRoLCBcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHB1c2ggPSBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl07XG4gICAgICAgICAgICBpZiAob3duS2V5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogcHVzaCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBwdXNoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHJlYWR5YCk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgYmUgd3JpdGFibGUgYmVmb3JlIGEgaG9zdCBpcyBzZXQgdXAsIGJlY2F1c2UgYSBob3N0IHRoYXRcbiAgICBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIGNhbm5vdCByZXZva2UgYSBrZXkgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiBUaGUga2V5IGZvciBpdCBpcyBkZXJpdmVkXG4gICAgZnJvbSB0aGUgc291cmNlJ3MsIHNpbmNlIGdpdGh1YiB3aWxsIG5vdCB0YWtlIG9uZSBwdWJsaWMga2V5IG9uIHR3byByZXBvcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG8oY29uZmlnOiB7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpKTtcblxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkZXJpdmVkS2V5UGF0aCwgZGVyaXZlZC5wcml2YXRlS2V5RmlsZSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuXG4gICAgbGV0IGV4cGxhaW4gPSAocHJvYmxlbTogc3RyaW5nKSA9PiBuZXcgRXJyb3IoXG4gICAgICAgIGAke3Byb2JsZW19XFxuYFxuICAgICAgICArIGBDcmVhdGUgJHtyZXZva2VVUkx9IGFuZCBhZGQgdGhpcyBhcyBhIGRlcGxveSBrZXkgV0lUSCBXUklURSBBQ0NFU1M6XFxuYFxuICAgICAgICArIGAgICR7ZGVyaXZlZC5wdWJsaWNLZXl9ICR7UkVWT0tFX0tFWV9MQUJFTH1cXG5gXG4gICAgICAgICsgYEl0IGhhcyB0byBiZSB0aGlzIGtleTogaXQgaXMgZGVyaXZlZCBmcm9tICR7a2V5UGF0aH0sIGFuZCBnaXRodWIgd2lsbCBub3QgYWNjZXB0IHRoZSBzYW1lYFxuICAgICAgICArIGAgcHVibGljIGtleSBvbiB0d28gcmVwb3NpdG9yaWVzLmBcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmV2b2tlVVJMfWApO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gYmUgcmVhZGFibGUgd2l0aCB0aGUgZGVyaXZlZCBrZXksIGl0IGlzIG5vdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbXB0eSByZXBvIGhhcyBubyBicmFuY2ggZm9yIHRoZSBkYWVtb24gdG8gY2xvbmUsIHNvIGl0IGdldHMgaXRzIGZpcnN0IGNvbW1pdCBoZXJlLiBUaGF0XG4gICAgLy8gZG91YmxlcyBhcyB0aGUgcHJvb2YgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gaXQuXG4gICAgbGV0IGhlYWQgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICBbXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgIFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJncywgY3dkOiBjaGVja291dFBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2ggPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IGNoZWNrb3V0UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIHRoZSBmaXJzdCBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRyeVJ1biA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIi0tZHJ5LXJ1blwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChkcnlSdW4uc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCB3cml0ZSBhY2Nlc3MgdG8gJHtyZXZva2VVUkx9LCBhIGRyeSBydW4gcHVzaCB3YXMgcmVmdXNlZC5cXG4keyhkcnlSdW4uc3Rkb3V0ICsgZHJ5UnVuLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHdyaXRhYmxlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVDb25maWcoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaG9zdExhYmVsOiBob3N0LCByZXBvU291cmNlczogW10gYXMgc3RyaW5nW10gfTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgcmV0dXJuIHsgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzOiBwYXJzZWQucmVwb1NvdXJjZXMgfHwgW10gfTtcbn1cblxuLyoqIFJlYWRzIHRoZSBrZXlzIGEgc291cmNlJ3MgY2hlY2tvdXQgY3VycmVudGx5IGhvbGRzIG9uIHRoZSBob3N0LCBzbyB0aGUgbWVyZ2VkIHJlc3VsdCBjYW4gYmVcbiAgICB3b3JrZWQgb3V0IHdpdGhvdXQgbmVlZGluZyB0aGF0IHNvdXJjZSdzIHByaXZhdGUga2V5IGxvY2FsbHkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUmVtb3RlU291cmNlS2V5cyhjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbmlmICRTVURPIHRlc3QgLWYgXCIke3JlcG9QYXRofS9hdXRob3JpemVkX2tleXNcIjsgdGhlblxuICAgICRTVURPIGNhdCBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiXG5lbGlmICRTVURPIHRlc3QgLWQgXCIke3JlcG9QYXRofVwiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH1cIi8qLnB1YiAyPi9kZXYvbnVsbCB8fCB0cnVlXG5maWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbm9ybWFsaXplS2V5cyhvdXRwdXQuc3Rkb3V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERhZW1vbihjb25maWc6IHsgaG9zdDogc3RyaW5nOyBob3N0TGFiZWw6IHN0cmluZzsgcmVwb1NvdXJjZXM6IHN0cmluZ1tdIH0pIHtcbiAgICBsZXQgeyBob3N0LCBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0gPSBjb25maWc7XG4gICAgZm9yIChsZXQgY29tbWFuZCBvZiBbXCJub2RlXCIsIFwiZ2l0XCIsIFwieWFyblwiXSkge1xuICAgICAgICBpZiAoIWF3YWl0IHJlbW90ZUNvbW1hbmRFeGlzdHMoeyBob3N0LCBjb21tYW5kIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gYmUgaW5zdGFsbGVkIG9uICR7aG9zdH0sIGl0IGlzIG5vdC4gSW5zdGFsbCBpdCBhbmQgcmVydW4uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY2hlY2tvdXQgaXMgYnJvdWdodCB0byB0aGUgbGF0ZXN0IGNvbW1pdCByYXRoZXIgdGhhbiBhIGNvcHkgYmVpbmcgcHVzaGVkLCBzbyB3aGF0IHJ1bnMgb25cbiAgICAvLyB0aGUgaG9zdCBpcyBleGFjdGx5IHdoYXQgaXMgb24gZ2l0aHViLlxuICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyAke1JFTU9URV9DSEVDS09VVF9QQVRIfSBvbiAke2Rlc2NyaWJlSG9zdChob3N0KX1gKTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBta2RpciAtcCBcIiR7cGF0aC5wb3NpeC5kaXJuYW1lKFJFTU9URV9DSEVDS09VVF9QQVRIKX1cIlxuaWYgJFNVRE8gdGVzdCAtZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9Ly5naXRcIjsgdGhlblxuICAgICMgU3Rhc2hlZCBmaXJzdCwgdGhlIHdheSBtYWNoaW5lLWFsd2F5c3VwIGRvZXMgaXQuIEFueXRoaW5nIHNpdHRpbmcgbW9kaWZpZWQgaW4gYSBob3N0J3NcbiAgICAjIGNoZWNrb3V0IGlzIGVpdGhlciBhbiBhY2NpZGVudCBvciBzb21lYm9keSBlZGl0aW5nIHRoZSBkYWVtb24gaW4gcGxhY2UsIGFuZCBlaXRoZXIgd2F5IGl0IGlzXG4gICAgIyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHkgZXJhc2luZy4gVGhlIGlkZW50aXR5IGlzIHBhc3NlZCBpbmxpbmUgYmVjYXVzZSBhIGhvc3QgaGFzXG4gICAgIyBubyBnaXQgY29uZmlnIG9mIGl0cyBvd24gYW5kIHN0YXNoIHdyaXRlcyBhIGNvbW1pdC5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGFkZCAtLWFsbFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgLWMgdXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdCAtYyB1c2VyLm5hbWU9cG9ydHNlY3VyZSBzdGFzaFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgZmV0Y2ggLS1wcnVuZSBvcmlnaW5cbiAgICAjIEEgc3Rhc2ggYW5kIGEgcHVsbCBjYW5ub3QgY3Jvc3MgYSBicmFuY2ggdGhhdCBoYXMgZGl2ZXJnZWQsIGFuZCBhIGRyaWZ0ZWQgY2hlY2tvdXQgbXVzdCBub3QgYmVcbiAgICAjIGFibGUgdG8gbGVhdmUgYSBob3N0IHJ1bm5pbmcgb2xkIGNvZGUsIHNvIGl0IGlzIHB1dCBvbiB0aGUgcmVtb3RlJ3Mgc3RhdGUgcmF0aGVyIHRoYW4gbWVyZ2VkXG4gICAgIyB3aXRoIGl0LiBzZXQtaGVhZCBzbyB0aGF0IGlzIHRoZSByZW1vdGUncyBkZWZhdWx0IGJyYW5jaCBub3csIG5vdCB0aGUgb25lIGl0IGhhZCBhdCBjbG9uZS5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIHJlbW90ZSBzZXQtaGVhZCBvcmlnaW4gLS1hdXRvXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiByZXNldCAtLWhhcmQgb3JpZ2luL0hFQURcbmVsc2VcbiAgICAkU1VETyBybSAtcmYgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiXG4gICAgJFNVRE8gZ2l0IGNsb25lIFwiJHtTTElGVFVUSUxTX1VSTH1cIiBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCJcbmZpXG4kU1VETyB5YXJuIC0tY3dkIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiBpbnN0YWxsIC0tcHJvZHVjdGlvbiAtLW5vbi1pbnRlcmFjdGl2ZVxuIyBUaGUgc2luZ2xlIGZpbGUgZGFlbW9uIHRoaXMgcmVwbGFjZWQsIGxlZnQgb3ZlciBvbiBhIGhvc3Qgc2V0IHVwIGJ5IGFuIG9sZGVyIHZlcnNpb24uXG4kU1VETyBybSAtZiAvb3B0L3BvcnRzZWN1cmUvcG9ydHNlY3VyZS1kYWVtb24uanNgLFxuICAgIH0pO1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEgsXG4gICAgICAgIC8vIE9ubHkgd2hhdCBkaWZmZXJzIGJldHdlZW4gbWFjaGluZXMuIEV2ZXJ5IHBhdGggdGhlIGRhZW1vbiB1c2VzIGlzIGRlcml2ZWQgaW4gdGhlIGRhZW1vblxuICAgICAgICAvLyBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byBkcmlmdCBvdXQgb2Ygc3luYy5cbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHsgaG9zdExhYmVsLCByZXBvU291cmNlcyB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIixcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IFJFTU9URV9TRVJWSUNFX1BBVEgsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBmcy5yZWFkRmlsZShTRVJWSUNFX1NPVVJDRSwgXCJ1dGY4XCIpLFxuICAgICAgICBmaWxlTW9kZTogXCI2NDRcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3NTVcIixcbiAgICB9KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZFxuJFNVRE8gc3lzdGVtY3RsIGVuYWJsZSAke1NFUlZJQ0VfTkFNRX1cbiRTVURPIHN5c3RlbWN0bCByZXN0YXJ0ICR7U0VSVklDRV9OQU1FfWAsXG4gICAgfSk7XG5cbiAgICBsZXQgc3RhdHVzID0gKGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICBob3N0LFxuICAgICAgICBzY3JpcHQ6IGBzeXN0ZW1jdGwgaXMtYWN0aXZlICR7U0VSVklDRV9OQU1FfSB8fCB0cnVlYCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChzdGF0dXMgIT09IFwiYWN0aXZlXCIpIHtcbiAgICAgICAgbGV0IGpvdXJuYWwgPSAoYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gam91cm5hbGN0bCAtdSAke1NFUlZJQ0VfTkFNRX0gLW4gNDAgLS1uby1wYWdlciB8fCB0cnVlYCxcbiAgICAgICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICAgICAgfSkpLnN0ZG91dDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke1NFUlZJQ0VfTkFNRX0gdG8gYmUgYWN0aXZlIG9uICR7aG9zdH0sIHdhcyAke3N0YXR1c30uXFxuJHtqb3VybmFsLnNsaWNlKC0yMDAwKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgc3RpbGxSZWFjaGFibGUgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBcImVjaG8gcmVhY2hhYmxlXCIsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAoc3RpbGxSZWFjaGFibGUuc3Rkb3V0LnRyaW0oKSAhPT0gXCJyZWFjaGFibGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBzdGlsbCBiZSByZWFjaGFibGUgYWZ0ZXIgdGhlIGRhZW1vbiBzdGFydGVkLCBpdCBpcyBub3QuYFxuICAgICAgICAgICAgKyBgIENoZWNrIGNvbnNvbGUgYWNjZXNzIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJlYWRSZW1vdGVGaWxlKHsgaG9zdCwgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSBEaXNjb3JkIHdlYmhvb2sgYXQgJHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfSBvbiAke2hvc3R9LCBubyBzdWNoIGZpbGUgZXhpc3RzLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdpbGwgbm90IHN0YXJ0IHdpdGhvdXQgb25lLlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCBmaXJzdDpcXG4gIHlhcm4gc2V0dXBub3RpZnkgJHtob3N0fSA8ZGlzY29yZC13ZWJob29rLXVybD5gLnJlcGxhY2UoXCIgPGRpc2NvcmRcIiwgaG9zdCAmJiBcIiA8ZGlzY29yZFwiIHx8IFwiPGRpc2NvcmRcIilcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50cywgc291cmNlTmFtZTogYCR7aG9zdH06JHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfWAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmc7IHJlcG9VUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgaG9zdCwga2V5UGF0aCwgcmVwb1VSTCB9ID0gY29uZmlnO1xuICAgIGlmICghYXdhaXQgcGF0aEV4aXN0cyhrZXlQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgcHJpdmF0ZSBrZXkgYXQgJHtrZXlQYXRofSwgbm8gc3VjaCBmaWxlIGV4aXN0c2ApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyAke3JlcG9VUkx9IGlzIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH1gKTtcbiAgICBsZXQgcmVhY2hhYmxlID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGgsIGFyZ3M6IFtcImxzLXJlbW90ZVwiLCByZXBvVVJMXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChyZWFjaGFibGUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGJlIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH0sIGdpdCBscy1yZW1vdGUgZmFpbGVkLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGZldGNoIGtleXMuXFxuYFxuICAgICAgICAgICAgKyBgJHsocmVhY2hhYmxlLnN0ZG91dCArIHJlYWNoYWJsZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAocmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmluY2x1ZGVzKHJlcG9VUkwpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gYWxyZWFkeSBoYXMgJHtyZXBvVVJMfSwgcmVmcmVzaGluZyBpdHMga2V5IGFuZCB0aGUgZGFlbW9uLmApO1xuICAgIH1cblxuICAgIC8vIENvcGllZCBpbnRvIHBsYWNlIGJlZm9yZSBhbnl0aGluZyBlbHNlIG5lZWRzIGl0LiBUaGUgY2hlY2tzIGJlbG93IGxvb2sgdGhpcyBzb3VyY2UncyBrZXkgdXBcbiAgICAvLyB3aGVyZSB0aGUgbWFjaGluZSBrZWVwcyBpdCwgbm90IGF0IHRoZSBwYXRoIGl0IHdhcyBoYW5kZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgc28gYSBrZXkgdGhhdFxuICAgIC8vIGlzIHN0aWxsIG9ubHkgc2l0dGluZyBpbiB0aGUgY2FsbGVyJ3MgZGlyZWN0b3J5IHJlYWRzIGFzIG5vIGtleSBhdCBhbGwuXG4gICAgLy9cbiAgICAvLyBJbnRvIHRoZSBob21lIG9mIHdob2V2ZXIgdGhlIGRhZW1vbiBydW5zIGFzLCB3aGljaCBpcyB3aGVyZSBpdCBsb29rcy4gQXNrZWQgb2YgdGhlIGhvc3RcbiAgICAvLyByYXRoZXIgdGhhbiB3b3JrZWQgb3V0IGhlcmU6IHRoaXMgbWF5IGJlIHJ1bm5pbmcgb24gYSBtYWNoaW5lIHdpdGggbm8gc3VjaCB1c2VyLCBhbmQgd2l0aCBhXG4gICAgLy8gaG9tZSBkaXJlY3RvcnkgaW4gYW4gZW50aXJlbHkgZGlmZmVyZW50IHNoYXBlLlxuICAgIGxldCBob3N0S2V5c0RpcmVjdG9yeSA9IGF3YWl0IGRhZW1vbktleXNEaXIoaG9zdCk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9YCxcbiAgICAgICAgY29udGVudHM6IGF3YWl0IGZzLnJlYWRGaWxlKGtleVBhdGgsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgLy8gVGhlIHB1YmxpYyBoYWxmIHRvbywgc28gdGhlIGRlcGxveSBrZXkgdGhhdCBhIHJlcG8gd2FzIGdpdmVuIGNhbiBiZSBsb29rZWQgdXAgb24gdGhlIG1hY2hpbmVcbiAgICAvLyB1c2luZyBpdCwgcmF0aGVyIHRoYW4gb25seSBpbiB3aGF0ZXZlciBnaXRodWIgc2hvd3MuXG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9LnB1YmAsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBwdWJsaWNLZXlPZihrZXlQYXRoKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjQ0XCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbWVyZ2VkIHJlc3VsdCBpcyB3aGF0IHJvb3QgZW5kcyB1cCB3aXRoLCBzbyBvdXIgb3duIGtleSBoYXMgdG8gYmUgc29tZXdoZXJlIGluIGl0LiBPblxuICAgIC8vIHRoaXMgbWFjaGluZSB0aGVyZSBpcyBubyBzc2ggc2Vzc2lvbiB0byBwcmVzZXJ2ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBjaGVjay5cbiAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBcIlwiO1xuICAgIGlmIChob3N0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBzdXJ2aXZlcyB0aGUgbWVyZ2VkIGtleXNgKTtcbiAgICAgICAgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICB9XG4gICAgbGV0IGluc3BlY3Rpb25QYXRoID0gYXdhaXQgY2xvbmVSZXBvRm9ySW5zcGVjdGlvbih7IHJlcG9VUkwsIGtleVBhdGggfSk7XG4gICAgbGV0IG5ld0tleXMgPSBhd2FpdCByZWFkUmVwb0tleXMoaW5zcGVjdGlvblBhdGgpO1xuICAgIC8vIFdoYXRldmVyIGlzIGFwcGxpZWQgb24gdGhlIGhvc3QgY2FtZSBmcm9tIHRoZSBleGlzdGluZyBzb3VyY2VzLCBzbyBpdCBzdGF5cyBpbiB0aGUgbWVyZ2UuXG4gICAgbGV0IGV4aXN0aW5nS2V5cyA9IG5vcm1hbGl6ZUtleXMoYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUk9PVF9BVVRIT1JJWkVEX0tFWVMgfSkgfHwgXCJcIik7XG4gICAgbGV0IG1lcmdlZEZpbmdlcnByaW50cyA9IGF3YWl0IGZpbmdlcnByaW50S2V5cyhbLi4uZXhpc3RpbmdLZXlzLCAuLi5uZXdLZXlzXSk7XG4gICAgaWYgKG91ckZpbmdlcnByaW50ICYmICFtZXJnZWRGaW5nZXJwcmludHMuaW5jbHVkZXMob3VyRmluZ2VycHJpbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBiZSBpbiB0aGUgbWVyZ2VkIGtleXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICArIGBPdXJzOiAgICR7b3VyRmluZ2VycHJpbnR9XFxuYFxuICAgICAgICAgICAgKyBgTWVyZ2VkOiAke21lcmdlZEZpbmdlcnByaW50cy5qb2luKFwiXFxuICAgICAgICBcIikgfHwgXCIobm9uZSlcIn1cXG5gXG4gICAgICAgICAgICArIGBUaGUgZGFlbW9uIHJlcGxhY2VzIHJvb3QncyBhdXRob3JpemVkX2tleXMgd2l0aCB0aGUgbWVyZ2VkIHNvdXJjZXMsIHNvIHRoaXMgd291bGRgXG4gICAgICAgICAgICArIGAgbG9jayB5b3Ugb3V0IG9mICR7aG9zdH0uIEFkZCB5b3VyIHB1YmxpYyBrZXkgdG8gJHtyZXBvVVJMfSBmaXJzdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChvdXJGaW5nZXJwcmludCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgT3VyIGtleSAke291ckZpbmdlcnByaW50fSBpcyBpbiB0aGUgbWVyZ2VkIGtleXMsIGFjY2VzcyB3aWxsIHN1cnZpdmUuYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlUmV2b2tlUmVwbyh7IGtleVBhdGgsIHJlcG9VUkwgfSk7XG5cbiAgICAvLyBEZXBsb3lpbmcgYSByZXBvIHRoYXQgc3RpbGwgaG9sZHMgYSByZXZva2VkIGtleSB3b3VsZCBoYW5kIGl0IGJhY2sgdG8gZXZlcnkgbWFjaGluZS5cbiAgICBsZXQgcmV2b2tlZCA9IGF3YWl0IHJldm9rZWRLZXlzSW5SZXBvKHsgcmVwb1BhdGg6IGluc3BlY3Rpb25QYXRoLCBzb3VyY2VVUkw6IHJlcG9VUkwgfSk7XG4gICAgaWYgKHJldm9rZWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGhvbGQgbm8gcmV2b2tlZCBrZXlzLCBpdCBob2xkcyAke3Jldm9rZWQubGVuZ3RofTpcXG5gXG4gICAgICAgICAgICArIHJldm9rZWQubWFwKGVudHJ5ID0+IGAgICR7ZW50cnkucmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieWBcbiAgICAgICAgICAgICAgICArIGAgJHtlbnRyeS5yZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gYWZ0ZXIgdXNlIGZyb20gJHtlbnRyeS5yZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiP1wifWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICsgYFxcbkRlbGV0ZSB0aGVtIGZyb20gdGhlIHJlcG8sIG9yIHJ1biBcInlhcm4gdW5yZXZva2VcIiB0aGVyZSB0byBhbGxvdyB0aGVtIGFnYWluLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2ViaG9va1VSTCA9IGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbm90aWZpZXMgJHt3ZWJob29rVVJMfWApO1xuXG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmZpbHRlcihzb3VyY2UgPT4gc291cmNlICE9PSByZXBvVVJMKTtcbiAgICByZXBvU291cmNlcy5wdXNoKHJlcG9VUkwpO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHJlbW90ZUNvbmZpZy5ob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IGFkZGVkIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfS4gJHtyZXBvU291cmNlcy5sZW5ndGh9IHNvdXJjZShzKSBub3cgbWVyZ2VkLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTb3VyY2UoY29uZmlnOiB7IGhvc3Q6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgYSBzb3VyY2Ugb24gJHtob3N0fSwgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYENvbmZpZ3VyZWQ6XFxuICAke3JlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5qb2luKFwiXFxuICBcIikgfHwgXCIobm9uZSlcIn1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG5cbiAgICAvLyBPbiB0aGlzIG1hY2hpbmUgdGhlcmUgaXMgbm8gc3NoIHNlc3Npb24gdG8gcHJlc2VydmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2suXG4gICAgaWYgKHJlcG9Tb3VyY2VzLmxlbmd0aCAmJiBob3N0KSB7XG4gICAgICAgIC8vIFRoZSBrZXlzIGxlZnQgb3ZlciBhcmUgd2hhdCByb290IGdldHMsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBhbW9uZyB0aGVtLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgb3VyIGFjY2VzcyB0byAke2Rlc2NyaWJlSG9zdChob3N0KX0gc3Vydml2ZXMgd2l0aG91dCAke3JlcG9VUkx9YCk7XG4gICAgICAgIGxldCBvdXJGaW5nZXJwcmludCA9IGF3YWl0IGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3QpO1xuICAgICAgICBsZXQgcmVtYWluaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgICAgICByZW1haW5pbmdLZXlzLnB1c2goLi4uYXdhaXQgcmVhZFJlbW90ZVNvdXJjZUtleXMoeyBob3N0LCByZXBvVVJMOiBzb3VyY2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1haW5pbmdGaW5nZXJwcmludHMgPSBhd2FpdCBmaW5nZXJwcmludEtleXMocmVtYWluaW5nS2V5cyk7XG4gICAgICAgIGlmICghcmVtYWluaW5nRmluZ2VycHJpbnRzLmluY2x1ZGVzKG91ckZpbmdlcnByaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBzdGlsbCBiZSBpbiB0aGUgcmVtYWluaW5nIHNvdXJjZXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICAgICAgKyBgT3VyczogICAgICAke291ckZpbmdlcnByaW50fVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1haW5pbmc6ICR7cmVtYWluaW5nRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1vdmluZyAke3JlcG9VUkx9IHdvdWxkIGxvY2sgeW91IG91dCBvZiAke2hvc3R9LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWVyZ2UsIHNvIHRoZSBkYWVtb24gbGVhdmVzIHJvb3QncyBhdXRob3JpemVkX2tleXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gaXMgdGhlIGxhc3Qgc291cmNlLCBzbyByb290J3MgYXV0aG9yaXplZF9rZXlzIHN0YXlzIGFzIGl0IGlzIG5vdy5gKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gcm0gLWYgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9XCIgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9LnB1YlwiIFwiJHtsZWdhY3lTb3VyY2VLZXlQYXRoKHJlcG9VUkwpfVwiXG4kU1VETyBybSAtcmYgXCIke3NvdXJjZVJlcG9QYXRoKHJlcG9VUkwpfVwiYCxcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSByZW1vdmVkIGZyb20gJHtkZXNjcmliZUhvc3QoaG9zdCl9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIGxlZnQuYCk7XG59XG5cbi8qKiBBbnN3ZXJzIFwid2hvIGNhbiBsb2cgaW50byB0aGlzIGJveCwgYW5kIHdoaWNoIHJlcG8gc2F5cyBzb1wiLiBUaGUgcGF0aHMgdGhlIGRhZW1vbiB1c2VzIGFyZVxuICAgIGxlZnQgb3V0IG9uIHB1cnBvc2UsIHRoZXkgYXJlIHBsdW1iaW5nIHJhdGhlciB0aGFuIHNvbWV0aGluZyB0byBhY3Qgb24uICovXG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhbHJlYWR5IGhhdmUgcG9ydHNlY3VyZSwgJHtSRU1PVEVfQ09ORklHX1BBVEh9IGRvZXMgbm90IGV4aXN0LlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCB3aXRoOlxcbiAgeWFybiBzZWN1cmVzc2ggJHtob3N0fSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB7IGhvc3RMYWJlbD86IHN0cmluZzsgcmVwb1NvdXJjZXM/OiBzdHJpbmdbXSB9O1xuICAgIGxldCByZXBvU291cmNlcyA9IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXTtcbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGBVcGRhdGVkIHRoZSBkYWVtb24gb24gJHtkZXNjcmliZUhvc3QoaG9zdCl9LCBhbmQgcmVzdGFydGVkIGl0LmApO1xuICAgIGNvbnNvbGUubG9nKGBJdHMgJHtyZXBvU291cmNlcy5sZW5ndGh9IGtleSBzb3VyY2Uocykgd2VyZSBsZWZ0IGFzIHRoZXkgYXJlLCBhbG9uZyB3aXRoIHRoZSBrZXlzIGFuZGApO1xuICAgIGNvbnNvbGUubG9nKGBzaWduZXJzIGl0IGhhcyBhbHJlYWR5IGFjY2VwdGVkLiBPbmx5IHRoZSBkYWVtb24gaXRzZWxmIGNoYW5nZWQ6YCk7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZXBvU291cmNlcykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke3JlcG9VUkx9YCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0U291cmNlcyhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAoIXJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBoYXMgbm8ga2V5IHNvdXJjZXMuIHJvb3QncyBhdXRob3JpemVkX2tleXMgaXMgbGVmdCBleGFjdGx5IGFzIGl0IGlzLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbGV0cyByb290IGxvZyBpbiB3aXRoIHRoZSBrZXlzIGZyb20gJHtyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RofSByZXBvKHMpOmApO1xuICAgIGxldCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcykge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTCB9KTtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtyZXBvVVJMfWApO1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyBubyBrZXlzIC0gdGhlIGNoZWNrb3V0IGlzIG1pc3Npbmcgb3IgZW1wdHlgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgZ3JhbnRzICR7a2V5cy5sZW5ndGh9IGtleShzKTpgKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAke3N1bW1hcml6ZUtleShrZXkpfWApO1xuICAgICAgICAgICAgbWVyZ2VkLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuJHttZXJnZWQuc2l6ZX0ga2V5KHMpIGluIHRvdGFsIG9uY2UgZHVwbGljYXRlcyBhcmUgbWVyZ2VkLmApO1xuICAgIH1cbn1cblxuLyoqIFRoZSB2ZXJiIGlzIGEgZml4ZWQgd29yZCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uLCBzbyBpdCBpcyBwdWxsZWQgb3V0IG9mIHRoZSBhcmd1bWVudHMgd2hlcmV2ZXJcbiAgICBpdCB3YXMgdHlwZWQgYW5kIGV2ZXJ5dGhpbmcgbGVmdCBvdmVyIGlzIHBvc2l0aW9uYWwuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgdmVyYnMgPSBhcmd2LmZpbHRlcihhcmcgPT4gVkVSQlMuaW5jbHVkZXMoYXJnKSk7XG4gICAgaWYgKCF2ZXJicy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9IHNvbWV3aGVyZSBpbiB0aGUgYXJndW1lbnRzLCB3YXMgJHthcmd2LmpvaW4oXCIgXCIpIHx8IFwiKG5vdGhpbmcpXCJ9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9LCB3YXMgJHt2ZXJicy5qb2luKFwiIGFuZCBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHZlcmIgPSB2ZXJic1swXTtcbiAgICBsZXQgcG9zaXRpb25hbCA9IGFyZ3YuZmlsdGVyKGFyZyA9PiBhcmcgIT09IHZlcmIpO1xuICAgIC8vIEEgaG9zdCwgd2hlbiB0aGVyZSBpcyBvbmUsIGNvbWVzIGZpcnN0IGFuZCBpcyBhIGJhcmUgbmFtZSBvciBhZGRyZXNzLiBFdmVyeXRoaW5nIGVsc2UgdGhhdFxuICAgIC8vIGNhbiBhcHBlYXIgaGVyZSBpcyBhIHBhdGggb3IgYSByZXBvIHVybCwgYW5kIHRob3NlIGFsbCBjYXJyeSBhIHNsYXNoLCB3aGljaCBpcyB3aGF0IHRlbGxzXG4gICAgLy8gdGhlbSBhcGFydC4gU28gbm8gaG9zdCBhdCBhbGwgbWVhbnMgdGhpcyBtYWNoaW5lLlxuICAgIGxldCBob3N0ID0gVEhJU19NQUNISU5FO1xuICAgIGlmIChwb3NpdGlvbmFsLmxlbmd0aCAmJiAhL1tcXC9+XFxcXF0vLnRlc3QocG9zaXRpb25hbFswXSkpIHtcbiAgICAgICAgaG9zdCA9IHBvc2l0aW9uYWxbMF07XG4gICAgICAgIHBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IGFyZ3VtZW50cyBlYWNoIHZlcmIgdGFrZXMsIGNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiB3aGVyZSB0aGUgdmVyYiBpcyBhY3RlZCBvbiwgc29cbiAgICAvLyB0aGF0IGEgY29tbWFuZCB3aGljaCB3YXMgdHlwZWQgd3Jvbmcgc2F5cyBzbyBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb21wbGFpbmVkIGFib3V0LlxuICAgIGlmICh2ZXJiID09PSBcImxpc3RcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdGhpbmcgYWZ0ZXIgbGlzdCwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIgJiYgcG9zaXRpb25hbC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3RoaW5nIGFmdGVyIHVwZGF0ZSwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwiYWRkXCIgJiYgKCFwb3NpdGlvbmFsLmxlbmd0aCB8fCBwb3NpdGlvbmFsLmxlbmd0aCA+IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhbmQgb3B0aW9uYWxseSBhIHJlcG8gdXJsLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJyZW1vdmVcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0IGEgcmVwbyB1cmwgdG8gcmVtb3ZlLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICByZXR1cm4geyB2ZXJiLCBob3N0LCByZXN0OiBwb3NpdGlvbmFsIH07XG59XG5cbi8qKiBFdmVyeXRoaW5nIGhlcmUgaXMgcm9vdCdzOiByb290J3MgYXV0aG9yaXplZF9rZXlzLCByb290J3Mga2V5cyBkaXJlY3RvcnksIHRoZSBzc2hkIGNvbmZpZywgdGhlXG4gICAgc3lzdGVtZCB1bml0LiBSdW4gYXMgYW55b25lIGVsc2UgaXQgcmVhZHMgYSBkaWZmZXJlbnQgaG9tZSBhbmQgd3JpdGVzIGZpbGVzIHRoZSBkYWVtb24gd2lsbFxuICAgIG5ldmVyIHNlZSwgYW5kIGl0IGdldHMgdGhlcmUgc2V2ZXJhbCBzdGVwcyBpbiByYXRoZXIgdGhhbiBmYWlsaW5nIGF0IHRoZSBzdGFydC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVSb290KCkge1xuICAgIGxldCB1aWQgPSBwcm9jZXNzLmdldHVpZD8uKCk7XG4gICAgaWYgKHVpZCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdG8gYmUgcnVubmluZyBhcyByb290LCBpcyB1aWQgJHt1aWQgPz8gXCJ1bmtub3duXCJ9LlxcbmBcbiAgICAgICAgICAgICsgYFJlcnVuIHRoaXMgd2l0aCBzdWRvLmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgLy8gV2hhdCB3YXMgdHlwZWQgaXMgY2hlY2tlZCBiZWZvcmUgYW55dGhpbmcgYWJvdXQgdGhpcyBtYWNoaW5lIGlzLiBBIGNvbW1hbmQgdGhhdCBkb2VzIG5vdFxuICAgIC8vIG1ha2Ugc2Vuc2UgaXMgd29ydGggc2F5aW5nIHNvIGFib3V0IHdob2V2ZXIgaXMgcnVubmluZyBpdCwgYW5kIGJlaW5nIHRvbGQgdG8gZmluZCBzdWRvIG9ubHlcbiAgICAvLyB0byB0aGVuIGJlIHRvbGQgdGhlIGFyZ3VtZW50cyB3ZXJlIHdyb25nIGlzIHR3byB0cmlwcyBmb3Igb25lIG1pc3Rha2UuXG4gICAgbGV0IHsgdmVyYiwgaG9zdCwgcmVzdCB9ID0gcGFyc2VBcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG4gICAgLy8gV2l0aCBhIGhvc3QsIGV2ZXJ5dGhpbmcgcm9vdC1vd25lZCBoYXBwZW5zIG9uIHRoYXQgaG9zdCB0aHJvdWdoICRTVURPIG92ZXIgc3NoLCBzbyBiZWluZyByb290IGhlcmUgcHJvdmVzIG5vdGhpbmcgYW5kIHdvdWxkIGJsb2NrIHJ1bm5pbmcgdGhpcyBmcm9tIGEgd29ya3N0YXRpb24uXG4gICAgaWYgKGhvc3QgPT09IFRISVNfTUFDSElORSkge1xuICAgICAgICByZXF1aXJlUm9vdCgpO1xuICAgIH1cblxuICAgIGlmICh2ZXJiID09PSBcImxpc3RcIikge1xuICAgICAgICBhd2FpdCBsaXN0U291cmNlcyhob3N0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJ1cGRhdGVcIikge1xuICAgICAgICBhd2FpdCB1cGRhdGVEYWVtb24oaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwiYWRkXCIpIHtcbiAgICAgICAgYXdhaXQgYWRkU291cmNlKHsgaG9zdCwga2V5UGF0aDogZXhwYW5kSG9tZShyZXN0WzBdKSwgcmVwb1VSTDogYXdhaXQgcmVzb2x2ZVJlcG9VUkwocmVzdFsxXSkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgcmVtb3ZlU291cmNlKHsgaG9zdCwgcmVwb1VSTDogYXdhaXQgcmVzb2x2ZVJlcG9VUkwocmVzdFswXSkgfSk7XG59XG5cbm1haW4oKS5jYXRjaChlID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGAke2V9YCk7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG59KS5maW5hbGx5KCgpID0+IHByb2Nlc3MuZXhpdCgpKTtcbiJdfQ=//=
617
+ /* _JS_SOURCE_HASH = "b515cb9fc7c470adfb73197e096b9e92eb86218b0b4612c6ba4c6d34715ec393"; */
@@ -5,36 +5,32 @@ import { getTrustedMachines } from "./machines";
5
5
 
6
6
  const MAX_SIGNED_AGE = 5 * 60 * 1000;
7
7
 
8
- // A request says who it is from AND who it believes it is talking to. The "to" is whatever both
9
- // sides use to identify the server - an IP, a machineId, a threadId - and being inside the signed
10
- // payload is what stops a machine in the middle: a request addressed to someone else cannot be
11
- // replayed at the real server, and the middleman cannot write requests of its own because it is
12
- // not a trusted machine.
13
8
  export type SignedRequest<T> = {
14
9
  signature: string;
15
10
  payload: {
11
+ // When it was signed - anything older than MAX_SIGNED_AGE is refused
16
12
  time: number;
17
- to: string;
13
+ // Who the sender believes it is talking to: an IP, a machineId, a threadId - whatever
14
+ // both sides use to name the server. Being inside the signed payload is what stops a
15
+ // machine in the middle: a request addressed to someone else cannot be replayed at the
16
+ // real server, and the middleman cannot write requests of its own because it is not a
17
+ // trusted machine.
18
+ targetId: string;
19
+ // The thread certificate that signed this
18
20
  cert: string;
21
+ // The machine CA that issued cert - the machineId comes from its common name
19
22
  certIssuer: string;
20
23
  data: T;
21
24
  };
22
25
  };
23
26
 
24
- // The reply echoes the request it answers, with the data collapsed to its hash - resending the
25
- // data would say nothing the hash does not. Signed by the replying thread's certificate, which
26
- // chains to its machine CA, which is where the machineId comes from.
27
27
  export type SignedReply<T> = {
28
28
  signature: string;
29
29
  payload: {
30
30
  time: number;
31
- request: {
32
- time: number;
33
- to: string;
34
- cert: string;
35
- certIssuer: string;
36
- dataHash: string;
37
- };
31
+ // The request this reply answers, with the data collapsed to its hash - resending the
32
+ // data would say nothing the hash does not
33
+ request: Omit<SignedRequest<unknown>["payload"], "data"> & { dataHash: string };
38
34
  cert: string;
39
35
  certIssuer: string;
40
36
  data: T;
@@ -45,12 +41,12 @@ function dataHash(data: unknown) {
45
41
  return sha256.sha256(JSON.stringify(data));
46
42
  }
47
43
 
48
- export function signRequest<T>(domain: string, config: { to: string; data: T }): SignedRequest<T> {
44
+ export function signRequest<T>(domain: string, config: { targetId: string; data: T }): SignedRequest<T> {
49
45
  let threadKeyCert = getThreadKeyCert(domain);
50
46
  let issuer = getIdentityCA(domain);
51
- let payload = {
47
+ let payload: SignedRequest<T>["payload"] = {
52
48
  time: Date.now(),
53
- to: config.to,
49
+ targetId: config.targetId,
54
50
  cert: threadKeyCert.cert.toString(),
55
51
  certIssuer: issuer.cert.toString(),
56
52
  data: config.data,
@@ -58,11 +54,17 @@ export function signRequest<T>(domain: string, config: { to: string; data: T }):
58
54
  return { signature: sign(threadKeyCert, payload), payload };
59
55
  }
60
56
 
61
- /** Returns the machineId that signed, and the data. Throws if the signature, certificate chain,
62
- or time do not check out, or if the request was addressed to someone we are not: ownIdentities
63
- is every name this server answers to - its IPs (there are always several, internal and
64
- external), its machineId, its threadId - and the signed "to" must be one of them. */
65
- export function verifyRequest<T>(domain: string, signed: SignedRequest<T>, ownIdentities: string[]): { machineId: string; data: T } {
57
+ /** Returns the machineId that signed, the data, and reply - which signs a reply to exactly this
58
+ request, so a reply cannot be produced for a request that was never verified. Throws if the
59
+ signature, certificate chain, or time do not check out, or if the request was addressed to
60
+ someone we are not: ownIdentities is every name this server answers to - its IPs (there are
61
+ always several, internal and external), its machineId, its threadId - and the signed targetId
62
+ must be one of them. */
63
+ export function verifyRequest<T>(domain: string, signed: SignedRequest<T>, ownIdentities: string[]): {
64
+ machineId: string;
65
+ data: T;
66
+ reply<R>(data: R): SignedReply<R>;
67
+ } {
66
68
  let { signature, payload } = signed;
67
69
  let signedThreshold = Date.now() - MAX_SIGNED_AGE;
68
70
  if (payload.time < signedThreshold) {
@@ -70,30 +72,27 @@ export function verifyRequest<T>(domain: string, signed: SignedRequest<T>, ownId
70
72
  }
71
73
  verify(payload.cert, signature, payload);
72
74
  validateCertificate(domain, payload.cert, payload.certIssuer);
73
- if (!ownIdentities.includes(payload.to)) {
74
- throw new Error(`Request is for someone else. It is addressed to ${payload.to}, we are ${ownIdentities.join(", ")}`);
75
+ if (!ownIdentities.includes(payload.targetId)) {
76
+ throw new Error(`Request is for someone else. It is addressed to ${payload.targetId}, we are ${ownIdentities.join(", ")}`);
75
77
  }
76
78
  let machineId = getMachineId(getCommonName(payload.certIssuer), domain);
77
- return { machineId, data: payload.data };
78
- }
79
-
80
- export function signReply<T>(domain: string, request: SignedRequest<unknown>, data: T): SignedReply<T> {
81
- let threadKeyCert = getThreadKeyCert(domain);
82
- let issuer = getIdentityCA(domain);
83
- let payload = {
84
- time: Date.now(),
85
- request: {
86
- time: request.payload.time,
87
- to: request.payload.to,
88
- cert: request.payload.cert,
89
- certIssuer: request.payload.certIssuer,
90
- dataHash: dataHash(request.payload.data),
79
+ return {
80
+ machineId,
81
+ data: payload.data,
82
+ reply<R>(data: R): SignedReply<R> {
83
+ let threadKeyCert = getThreadKeyCert(domain);
84
+ let issuer = getIdentityCA(domain);
85
+ let { data: requestData, ...requestRest } = payload;
86
+ let replyPayload: SignedReply<R>["payload"] = {
87
+ time: Date.now(),
88
+ request: { ...requestRest, dataHash: dataHash(requestData) },
89
+ cert: threadKeyCert.cert.toString(),
90
+ certIssuer: issuer.cert.toString(),
91
+ data,
92
+ };
93
+ return { signature: sign(threadKeyCert, replyPayload), payload: replyPayload };
91
94
  },
92
- cert: threadKeyCert.cert.toString(),
93
- certIssuer: issuer.cert.toString(),
94
- data,
95
95
  };
96
- return { signature: sign(threadKeyCert, payload), payload };
97
96
  }
98
97
 
99
98
  /** Returns the machineId that replied, and the data. Throws if the signature, certificate chain,
@@ -108,13 +107,9 @@ export async function verifyReply<T>(domain: string, request: SignedRequest<unkn
108
107
  }
109
108
  verify(payload.cert, signature, payload);
110
109
  validateCertificate(domain, payload.cert, payload.certIssuer);
111
- let echoed = payload.request;
112
- if (echoed.time !== request.payload.time
113
- || echoed.to !== request.payload.to
114
- || echoed.cert !== request.payload.cert
115
- || echoed.certIssuer !== request.payload.certIssuer
116
- || echoed.dataHash !== dataHash(request.payload.data)
117
- ) {
110
+ let { data: requestData, ...requestRest } = request.payload;
111
+ let { dataHash: echoedHash, ...echoedRest } = payload.request;
112
+ if (echoedHash !== dataHash(requestData) || JSON.stringify(echoedRest) !== JSON.stringify(requestRest)) {
118
113
  throw new Error(`Reply answers a different request than the one we sent`);
119
114
  }
120
115
  let machineId = getMachineId(getCommonName(payload.certIssuer), domain);