@dollhousemcp/mcp-server 1.4.3 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"PortfolioManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ1D,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA8B;IAClE,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WA4BO,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,gBAAgB;IAiBrE;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;YACW,qBAAqB;IAqCnC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C/D;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0ClE;;OAEG;IACU,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjF;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAIrC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAWlE;;;OAGG;YACW,8BAA8B;CA+D7C"}
1
+ {"version":3,"file":"PortfolioManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ1D,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA8B;IAClE,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO;WA4BO,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,gBAAgB;IAiBrE;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;IAI/C;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxC;;OAEG;YACW,qBAAqB;IAiDnC;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACU,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C/D;;OAEG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA0ClE;;OAEG;IACU,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASjF;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAIrC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlD;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAWlE;;;OAGG;YACW,8BAA8B;CA+D7C"}
@@ -99,7 +99,20 @@ export class PortfolioManager {
99
99
  async performInitialization() {
100
100
  logger.info('[PortfolioManager] Initializing portfolio directory structure');
101
101
  // Create base directory
102
- await fs.mkdir(this.baseDir, { recursive: true });
102
+ try {
103
+ await fs.mkdir(this.baseDir, { recursive: true });
104
+ }
105
+ catch (error) {
106
+ const err = error;
107
+ // In read-only environments (like Docker), we can't create directories
108
+ // Log but continue - the portfolio will be empty but functional
109
+ if (err.code === 'EACCES' || err.code === 'EROFS' || err.code === 'ENOENT') {
110
+ logger.warn(`[PortfolioManager] Cannot create portfolio directory (read-only environment?): ${err.message}`);
111
+ console.log(`[DollhouseMCP] Running in read-only mode - portfolio features disabled`);
112
+ return;
113
+ }
114
+ throw error;
115
+ }
103
116
  // Create subdirectories for each element type
104
117
  for (const elementType of Object.values(ElementType)) {
105
118
  const elementDir = path.join(this.baseDir, elementType);
@@ -323,4 +336,4 @@ export class PortfolioManager {
323
336
  }
324
337
  }
325
338
  }
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxZQUFZO0FBQ1osTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7QUFFckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBR3ZCLE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsTUFBTSxDQUFDLFFBQVEsQ0FBbUI7SUFDbEMsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxNQUFNLENBQUMscUJBQXFCLEdBQXlCLElBQUksQ0FBQztJQUMxRCxPQUFPLENBQVM7SUFFeEIsWUFBb0IsTUFBd0I7UUFDMUMscURBQXFEO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8s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QUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxpREFBaUQ7b0JBQ3pELE9BQU8sRUFBRSwyQkFBMkIsT0FBTyxPQUFPLE9BQU8sMkJBQTJCO29CQUNwRixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2lCQUM3QixDQUFDLENBQUM7WUFFTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiw2Q0FBNkM7Z0JBQzdDLElBQUssS0FBYSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRmb2xpbyBNYW5hZ2VyIC0gTWFuYWdlcyB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB9IGZyb20gJy4vRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyc7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgRUxFTUVOVF9GSUxFX0VYVEVOU0lPTiA9ICcubWQnO1xuXG5leHBvcnQgeyBFbGVtZW50VHlwZSB9O1xuZXhwb3J0IHR5cGUgeyBQb3J0Zm9saW9Db25maWcgfTtcblxuZXhwb3J0IGNsYXNzIFBvcnRmb2xpb01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemF0aW9uTG9jayA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBiYXNlRGlyOiBzdHJpbmc7XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGNvbmZpZz86IFBvcnRmb2xpb0NvbmZpZykge1xuICAgIC8vIEdldCBwb3RlbnRpYWwgZGlyZWN0b3J5IGZyb20gZW52aXJvbm1lbnQgb3IgY29uZmlnXG4gICAgY29uc3QgZW52RGlyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1BPUlRGT0xJT19ESVI7XG4gICAgY29uc3QgY29uZmlnRGlyID0gY29uZmlnPy5iYXNlRGlyO1xuICAgIGNvbnN0IGRlZmF1bHREaXIgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nKTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBwcm92aWRlZFxuICAgIGlmIChlbnZEaXIpIHtcbiAgICAgIGlmICghcGF0aC5pc0Fic29sdXRlKGVudkRpcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdET0xMSE9VU0VfUE9SVEZPTElPX0RJUiBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igc3VzcGljaW91cyBwYXRoc1xuICAgICAgaWYgKGVudkRpci5pbmNsdWRlcygnLi4nKSB8fCBlbnZEaXIuc3RhcnRzV2l0aCgnL2V0YycpIHx8IGVudkRpci5zdGFydHNXaXRoKCcvc3lzJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdET0xMSE9VU0VfUE9SVEZPTElPX0RJUiBjb250YWlucyBzdXNwaWNpb3VzIHBhdGggc2VnbWVudHMnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29uZmlnIGRpcmVjdG9yeSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWdEaXIgJiYgIXBhdGguaXNBYnNvbHV0ZShjb25maWdEaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBjb25maWcgYmFzZURpciBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGgnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHNldCwgb3RoZXJ3aXNlIGNvbmZpZywgb3RoZXJ3aXNlIGRlZmF1bHRcbiAgICB0aGlzLmJhc2VEaXIgPSBlbnZEaXIgfHwgY29uZmlnRGlyIHx8IGRlZmF1bHREaXI7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oYFtQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gYmFzZSBkaXJlY3Rvcnk6ICR7dGhpcy5iYXNlRGlyfWApO1xuICB9XG4gIFxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKGNvbmZpZz86IFBvcnRmb2xpb0NvbmZpZyk6IFBvcnRmb2xpb01hbmFnZXIge1xuICAgIGlmICghUG9ydGZvbGlvTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBjcmVhdGluZyB0aGUgaW5zdGFuY2VcbiAgICAgIGlmIChQb3J0Zm9saW9NYW5hZ2VyLmluc3RhbmNlTG9jaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpb01hbmFnZXIgaW5zdGFuY2UgaXMgYmVpbmcgY3JlYXRlZCBieSBhbm90aGVyIHRocmVhZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBQb3J0Zm9saW9NYW5hZ2VyLmluc3RhbmNlTG9jayA9IHRydWU7XG4gICAgICAgIFBvcnRmb2xpb01hbmFnZXIuaW5zdGFuY2UgPSBuZXcgUG9ydGZvbGlvTWFuYWdlcihjb25maWcpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUG9ydGZvbGlvTWFuYWdlci5pbnN0YW5jZUxvY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFBvcnRmb2xpb01hbmFnZXIuaW5zdGFuY2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2UgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgKi9cbiAgcHVibGljIGdldEJhc2VEaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlRGlyO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudERpcih0eXBlOiBFbGVtZW50VHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmJhc2VEaXIsIHR5cGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICogVXNlcyBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyBjb25jdXJyZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBJZiBhbHJlYWR5IGluaXRpYWxpemluZywgd2FpdCBmb3IgdGhlIGV4aXN0aW5nIGluaXRpYWxpemF0aW9uXG4gICAgaWYgKFBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6YXRpb25Qcm9taXNlKSB7XG4gICAgICByZXR1cm4gUG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIGFscmVhZHkgaW5pdGlhbGl6ZWQsIGNoZWNrIGlmIGRpcmVjdG9yaWVzIGV4aXN0XG4gICAgaWYgKGF3YWl0IHRoaXMuZXhpc3RzKCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1BvcnRmb2xpb01hbmFnZXJdIFBvcnRmb2xpbyBhbHJlYWR5IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBpbml0aWFsaXphdGlvbiBwcm9taXNlIHRvIHByZXZlbnQgY29uY3VycmVudCBpbml0aWFsaXphdGlvblxuICAgIFBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gdGhpcy5wZXJmb3JtSW5pdGlhbGl6YXRpb24oKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUG9ydGZvbGlvTWFuYWdlci5pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFyIHRoZSBwcm9taXNlIGFmdGVyIGNvbXBsZXRpb25cbiAgICAgIFBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gLSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtSW5pdGlhbGl6YXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ1tQb3J0Zm9saW9NYW5hZ2VyXSBJbml0aWFsaXppbmcgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUnKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgYmFzZSBkaXJlY3RvcnlcbiAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmJhc2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzdWJkaXJlY3RvcmllcyBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBjb25zdCBlbGVtZW50RGlyID0gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgZWxlbWVudFR5cGUpO1xuICAgICAgYXdhaXQgZnMubWtkaXIoZWxlbWVudERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtQb3J0Zm9saW9NYW5hZ2VyXSBDcmVhdGVkIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgc3BlY2lhbCBkaXJlY3RvcmllcyBmb3Igc3RhdGVmdWwgZWxlbWVudHNcbiAgICBjb25zdCBhZ2VudFN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgRWxlbWVudFR5cGUuQUdFTlQsICcuc3RhdGUnKTtcbiAgICBhd2FpdCBmcy5ta2RpcihhZ2VudFN0YXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnW1BvcnRmb2xpb01hbmFnZXJdIFBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlIGluaXRpYWxpemVkJyk7XG4gICAgXG4gICAgLy8gTWlncmF0aW9uIGZvciB2MS40LjIgdXNlcnM6IHJlbmFtZSBzaW5ndWxhciBkaXJlY3RvcmllcyB0byBwbHVyYWxcbiAgICBhd2FpdCB0aGlzLm1pZ3JhdGVGcm9tU2luZ3VsYXJEaXJlY3RvcmllcygpO1xuICAgIFxuICAgIC8vIFBvcHVsYXRlIHdpdGggZGVmYXVsdCBlbGVtZW50cyBpZiB0aGlzIGlzIGEgbmV3IGluc3RhbGxhdGlvblxuICAgIC8vIFNraXAgZHVyaW5nIHRlc3RzIHRvIGF2b2lkIGludGVyZmVyZW5jZVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRQcm92aWRlcigpO1xuICAgICAgICBhd2FpdCBkZWZhdWx0UHJvdmlkZXIucG9wdWxhdGVEZWZhdWx0cyh0aGlzLmJhc2VEaXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbUG9ydGZvbGlvTWFuYWdlcl0gRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGVsZW1lbnRzOicsIGVycm9yKTtcbiAgICAgICAgLy8gTG9nIHRvIHN0ZGVyciBmb3IgQ2xhdWRlIERlc2t0b3AgdmlzaWJpbGl0eVxuICAgICAgICBjb25zb2xlLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gQ1JJVElDQUw6IEZhaWxlZCB0byBwb3B1bGF0ZSBkZWZhdWx0IGVsZW1lbnRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgLy8gQ29udGludWUgYW55d2F5IC0gZW1wdHkgcG9ydGZvbGlvIGlzIHZhbGlkXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgcG9ydGZvbGlvIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmJhc2VEaXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogTGlzdCBhbGwgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnREaXIgPSB0aGlzLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihlbGVtZW50RGlyKTtcbiAgICAgIC8vIEZpbHRlciBmb3IgbWFya2Rvd24gZmlsZXMgb25seVxuICAgICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoRUxFTUVOVF9GSUxFX0VYVEVOU0lPTikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgeWV0IC0gdGhpcyBpcyBleHBlY3RlZCBmb3IgbmV3IGluc3RhbGxhdGlvbnNcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbUG9ydGZvbGlvTWFuYWdlcl0gRWxlbWVudCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCB5ZXQ6ICR7ZWxlbWVudERpcn1gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnIHx8IGVyci5jb2RlID09PSAnRVBFUk0nKSB7XG4gICAgICAgIC8vIFBlcm1pc3Npb24gZGVuaWVkIC0gbG9nIGJ1dCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gUGVybWlzc2lvbiBkZW5pZWQgYWNjZXNzaW5nIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWAsIHtcbiAgICAgICAgICBjb2RlOiBlcnIuY29kZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9URElSJykge1xuICAgICAgICAvLyBQYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIFBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAke2VsZW1lbnREaXJ9YCwge1xuICAgICAgICAgIGNvZGU6IGVyci5jb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggaXMgbm90IGEgZGlyZWN0b3J5OiAke2VsZW1lbnREaXJ9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCB0aHJvdyB3aXRoIGNvbnRleHRcbiAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIEVycm9yIHJlYWRpbmcgZGlyZWN0b3J5OiAke2VsZW1lbnREaXJ9YCwge1xuICAgICAgICBjb2RlOiBlcnIuY29kZSxcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnIuc3RhY2tcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGZ1bGwgcGF0aCB0byBhbiBlbGVtZW50IGZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50UGF0aCh0eXBlOiBFbGVtZW50VHlwZSwgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbFxuICAgIGlmICghZmlsZW5hbWUgfHwgdHlwZW9mIGZpbGVuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIGZpbGVuYW1lIHByb3ZpZGVkOiAke3R5cGVvZiBmaWxlbmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZmlsZW5hbWU6IFN0cmluZyhmaWxlbmFtZSkgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmlsZW5hbWU6IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcygnLi4nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnLycpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXFxcJykgfHwgcGF0aC5pc0Fic29sdXRlKGZpbGVuYW1lKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCBpbiBmaWxlbmFtZTogJHtmaWxlbmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZmlsZW5hbWUgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZW5hbWU6IGNvbnRhaW5zIHBhdGggdHJhdmVyc2FsIGNoYXJhY3RlcnM6ICR7ZmlsZW5hbWV9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3IgaGlkZGVuIGZpbGVzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXDAnKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIGZpbGVuYW1lIGNoYXJhY3RlcnMgZGV0ZWN0ZWQ6ICR7ZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lLCBoYXNIaWRkZW5GaWxlOiBmaWxlbmFtZS5zdGFydHNXaXRoKCcuJyksIGhhc051bGxCeXRlOiBmaWxlbmFtZS5pbmNsdWRlcygnXFwwJykgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZW5hbWU6IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHtmaWxlbmFtZX1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZpbGVuYW1lIGVuZHMgd2l0aCAubWRcbiAgICBjb25zdCBzYWZlRmlsZW5hbWUgPSBmaWxlbmFtZS5lbmRzV2l0aCgnLm1kJykgPyBmaWxlbmFtZSA6IGAke2ZpbGVuYW1lfS5tZGA7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmdldEVsZW1lbnREaXIodHlwZSksIHNhZmVGaWxlbmFtZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVsZW1lbnRFeGlzdHModHlwZTogRWxlbWVudFR5cGUsIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHRoaXMuZ2V0RWxlbWVudFBhdGgodHlwZSwgZmlsZW5hbWUpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBsZWdhY3kgcGVyc29uYXMgZGlyZWN0b3J5IHBhdGggKGZvciBtaWdyYXRpb24pXG4gICAqL1xuICBwdWJsaWMgZ2V0TGVnYWN5UGVyc29uYXNEaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncGVyc29uYXMnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGxlZ2FjeSBwZXJzb25hcyBkaXJlY3RvcnkgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFzTGVnYWN5UGVyc29uYXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmdldExlZ2FjeVBlcnNvbmFzRGlyKCkpO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMuZ2V0TGVnYWN5UGVyc29uYXNEaXIoKSk7XG4gICAgICByZXR1cm4gZmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdGF0aXN0aWNzKCk6IFByb21pc2U8UmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdEVsZW1lbnRzKGVsZW1lbnRUeXBlKTtcbiAgICAgIHN0YXRzW2VsZW1lbnRUeXBlXSA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRzIGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1pZ3JhdGUgZnJvbSB2MS40LjIgc2luZ3VsYXIgZGlyZWN0b3J5IG5hbWVzIHRvIHYxLjQuMyBwbHVyYWwgbmFtZXNcbiAgICogVGhpcyBoYW5kbGVzIHRoZSB1cGdyYWRlIHBhdGggZm9yIGV4aXN0aW5nIHVzZXJzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVGcm9tU2luZ3VsYXJEaXJlY3RvcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGRUb05ldzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdwZXJzb25hJzogJ3BlcnNvbmFzJyxcbiAgICAgICdza2lsbCc6ICdza2lsbHMnLFxuICAgICAgJ3RlbXBsYXRlJzogJ3RlbXBsYXRlcycsXG4gICAgICAnYWdlbnQnOiAnYWdlbnRzJyxcbiAgICAgICdtZW1vcnknOiAnbWVtb3JpZXMnLFxuICAgICAgJ2Vuc2VtYmxlJzogJ2Vuc2VtYmxlcydcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG9sZFRvTmV3KSkge1xuICAgICAgLy8gVW5pY29kZSBub3JtYWxpemUgdGhlIGRpcmVjdG9yeSBuYW1lcyAoZXZlbiB0aG91Z2ggdGhleSdyZSBoYXJkY29kZWQsIGZvciBzZWN1cml0eSBhdWRpdClcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRPbGQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvbGROYW1lKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuZXdOYW1lKTtcbiAgICAgIFxuICAgICAgaWYgKCFub3JtYWxpemVkT2xkLmlzVmFsaWQgfHwgIW5vcm1hbGl6ZWROZXcuaXNWYWxpZCkge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBvdXIgaGFyZGNvZGVkIHZhbHVlcywgYnV0IGZvciBjb21wbGV0ZW5lc3NcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gSW52YWxpZCBVbmljb2RlIGluIGRpcmVjdG9yeSBuYW1lcyBkdXJpbmcgbWlncmF0aW9uYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBvbGREaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBub3JtYWxpemVkT2xkLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIGNvbnN0IG5ld0RpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIG5vcm1hbGl6ZWROZXcubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICAvLyBDaGVjayBpZiBvbGQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3Mob2xkRGlyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIG5ldyBkaXJlY3RvcnkgYWxyZWFkeSBoYXMgY29udGVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5ld0RpckZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihuZXdEaXIpO1xuICAgICAgICAgIGlmIChuZXdEaXJGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtQb3J0Zm9saW9NYW5hZ2VyXSBCb3RoICR7b2xkTmFtZX0gYW5kICR7bmV3TmFtZX0gZGlyZWN0b3JpZXMgZXhpc3QuIEtlZXBpbmcgJHtuZXdOYW1lfSwgc2tpcHBpbmcgbWlncmF0aW9uLmAsXG4gICAgICAgICAgICAgIHsgb2xkRGlyLCBuZXdEaXIsIGZpbGVDb3VudDogbmV3RGlyRmlsZXMubGVuZ3RoIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldyBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBpcyBlbXB0eSwgcHJvY2VlZCB3aXRoIG1pZ3JhdGlvblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBtaWdyYXRpb25cbiAgICAgICAgbG9nZ2VyLmluZm8oYFtQb3J0Zm9saW9NYW5hZ2VyXSBNaWdyYXRpbmcgJHtvbGROYW1lfSDihpIgJHtuZXdOYW1lfWApO1xuICAgICAgICBhd2FpdCBmcy5yZW5hbWUob2xkRGlyLCBuZXdEaXIpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RJUkVDVE9SWV9NSUdSQVRJT04nLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9NYW5hZ2VyLm1pZ3JhdGVGcm9tU2luZ3VsYXJEaXJlY3RvcmllcycsXG4gICAgICAgICAgZGV0YWlsczogYE1pZ3JhdGVkIGRpcmVjdG9yeSBmcm9tICR7b2xkTmFtZX0gdG8gJHtuZXdOYW1lfSBmb3IgdjEuNC4zIGNvbXBhdGliaWxpdHlgLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IG9sZERpciwgbmV3RGlyIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2xkIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIEVycm9yIGR1cmluZyBtaWdyYXRpb24gb2YgJHtvbGROYW1lfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxZQUFZO0FBQ1osTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7QUFFckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBR3ZCLE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsTUFBTSxDQUFDLFFBQVEsQ0FBbUI7SUFDbEMsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxNQUFNLENBQUMscUJBQXFCLEdBQXlCLElBQUksQ0FBQztJQUMxRCxPQUFPLENBQVM7SUFFeEIsWUFBb0IsTUFBd0I7UUFDMUMscURBQXFEO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8s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QUM7d0JBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsMkJBQTJCLE9BQU8sUUFBUSxPQUFPLCtCQUErQixPQUFPLHVCQUF1QixFQUM5RyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FDbEQsQ0FBQzt3QkFDRixTQUFTO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1Asa0VBQWtFO2dCQUNwRSxDQUFDO2dCQUVELHdCQUF3QjtnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsT0FBTyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRWhDLHFDQUFxQztnQkFDckMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUscUJBQXFCO29CQUMzQixRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsaURBQWlEO29CQUN6RCxPQUFPLEVBQUUsMkJBQTJCLE9BQU8sT0FBTyxPQUFPLDJCQUEyQjtvQkFDcEYsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtpQkFDN0IsQ0FBQyxDQUFDO1lBRUwsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsNkNBQTZDO2dCQUM3QyxJQUFLLEtBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELE9BQU8sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gTWFuYWdlciAtIE1hbmFnZXMgdGhlIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhbGwgZWxlbWVudCB0eXBlc1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlLCBQb3J0Zm9saW9Db25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IERlZmF1bHRFbGVtZW50UHJvdmlkZXIgfSBmcm9tICcuL0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuanMnO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IEVMRU1FTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcblxuZXhwb3J0IHsgRWxlbWVudFR5cGUgfTtcbmV4cG9ydCB0eXBlIHsgUG9ydGZvbGlvQ29uZmlnIH07XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jayA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXRpYyBpbml0aWFsaXphdGlvbkxvY2sgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFzZURpcjogc3RyaW5nO1xuICBcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc/OiBQb3J0Zm9saW9Db25maWcpIHtcbiAgICAvLyBHZXQgcG90ZW50aWFsIGRpcmVjdG9yeSBmcm9tIGVudmlyb25tZW50IG9yIGNvbmZpZ1xuICAgIGNvbnN0IGVudkRpciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9QT1JURk9MSU9fRElSO1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IGNvbmZpZz8uYmFzZURpcjtcbiAgICBjb25zdCBkZWZhdWx0RGlyID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJyk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgcHJvdmlkZWRcbiAgICBpZiAoZW52RGlyKSB7XG4gICAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZShlbnZEaXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRE9MTEhPVVNFX1BPUlRGT0xJT19ESVIgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoJyk7XG4gICAgICB9XG4gICAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHN1c3BpY2lvdXMgcGF0aHNcbiAgICAgIGlmIChlbnZEaXIuaW5jbHVkZXMoJy4uJykgfHwgZW52RGlyLnN0YXJ0c1dpdGgoJy9ldGMnKSB8fCBlbnZEaXIuc3RhcnRzV2l0aCgnL3N5cycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRE9MTEhPVVNFX1BPUlRGT0xJT19ESVIgY29udGFpbnMgc3VzcGljaW91cyBwYXRoIHNlZ21lbnRzJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZyBkaXJlY3RvcnkgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnRGlyICYmICFwYXRoLmlzQWJzb2x1dGUoY29uZmlnRGlyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW8gY29uZmlnIGJhc2VEaXIgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBzZXQsIG90aGVyd2lzZSBjb25maWcsIG90aGVyd2lzZSBkZWZhdWx0XG4gICAgdGhpcy5iYXNlRGlyID0gZW52RGlyIHx8IGNvbmZpZ0RpciB8fCBkZWZhdWx0RGlyO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKGBbUG9ydGZvbGlvTWFuYWdlcl0gUG9ydGZvbGlvIGJhc2UgZGlyZWN0b3J5OiAke3RoaXMuYmFzZURpcn1gKTtcbiAgfVxuICBcbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShjb25maWc/OiBQb3J0Zm9saW9Db25maWcpOiBQb3J0Zm9saW9NYW5hZ2VyIHtcbiAgICBpZiAoIVBvcnRmb2xpb01hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIC8vIENoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgY3JlYXRpbmcgdGhlIGluc3RhbmNlXG4gICAgICBpZiAoUG9ydGZvbGlvTWFuYWdlci5pbnN0YW5jZUxvY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW9NYW5hZ2VyIGluc3RhbmNlIGlzIGJlaW5nIGNyZWF0ZWQgYnkgYW5vdGhlciB0aHJlYWQnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgUG9ydGZvbGlvTWFuYWdlci5pbnN0YW5jZUxvY2sgPSB0cnVlO1xuICAgICAgICBQb3J0Zm9saW9NYW5hZ2VyLmluc3RhbmNlID0gbmV3IFBvcnRmb2xpb01hbmFnZXIoY29uZmlnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFBvcnRmb2xpb01hbmFnZXIuaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQb3J0Zm9saW9NYW5hZ2VyLmluc3RhbmNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICovXG4gIHB1YmxpYyBnZXRCYXNlRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZURpcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnREaXIodHlwZTogRWxlbWVudFR5cGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCB0eXBlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIFVzZXMgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSWYgYWxyZWFkeSBpbml0aWFsaXppbmcsIHdhaXQgZm9yIHRoZSBleGlzdGluZyBpbml0aWFsaXphdGlvblxuICAgIGlmIChQb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIFBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBhbHJlYWR5IGluaXRpYWxpemVkLCBjaGVjayBpZiBkaXJlY3RvcmllcyBleGlzdFxuICAgIGlmIChhd2FpdCB0aGlzLmV4aXN0cygpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gYWxyZWFkeSBpbml0aWFsaXplZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgaW5pdGlhbGl6YXRpb24gcHJvbWlzZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgaW5pdGlhbGl6YXRpb25cbiAgICBQb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybUluaXRpYWxpemF0aW9uKCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciB0aGUgcHJvbWlzZSBhZnRlciBjb21wbGV0aW9uXG4gICAgICBQb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGluaXRpYWxpemF0aW9uIC0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKCdbUG9ydGZvbGlvTWFuYWdlcl0gSW5pdGlhbGl6aW5nIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlJyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGJhc2UgZGlyZWN0b3J5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuYmFzZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICAgIC8vIEluIHJlYWQtb25seSBlbnZpcm9ubWVudHMgKGxpa2UgRG9ja2VyKSwgd2UgY2FuJ3QgY3JlYXRlIGRpcmVjdG9yaWVzXG4gICAgICAvLyBMb2cgYnV0IGNvbnRpbnVlIC0gdGhlIHBvcnRmb2xpbyB3aWxsIGJlIGVtcHR5IGJ1dCBmdW5jdGlvbmFsXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnIHx8IGVyci5jb2RlID09PSAnRVJPRlMnIHx8IGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIud2FybihgW1BvcnRmb2xpb01hbmFnZXJdIENhbm5vdCBjcmVhdGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAocmVhZC1vbmx5IGVudmlyb25tZW50Pyk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9sbGhvdXNlTUNQXSBSdW5uaW5nIGluIHJlYWQtb25seSBtb2RlIC0gcG9ydGZvbGlvIGZlYXR1cmVzIGRpc2FibGVkYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgc3ViZGlyZWN0b3JpZXMgZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgY29uc3QgZWxlbWVudERpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGVsZW1lbnREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbUG9ydGZvbGlvTWFuYWdlcl0gQ3JlYXRlZCBkaXJlY3Rvcnk6ICR7ZWxlbWVudERpcn1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHNwZWNpYWwgZGlyZWN0b3JpZXMgZm9yIHN0YXRlZnVsIGVsZW1lbnRzXG4gICAgY29uc3QgYWdlbnRTdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5ULCAnLnN0YXRlJyk7XG4gICAgYXdhaXQgZnMubWtkaXIoYWdlbnRTdGF0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1tQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBpbml0aWFsaXplZCcpO1xuICAgIFxuICAgIC8vIE1pZ3JhdGlvbiBmb3IgdjEuNC4yIHVzZXJzOiByZW5hbWUgc2luZ3VsYXIgZGlyZWN0b3JpZXMgdG8gcGx1cmFsXG4gICAgYXdhaXQgdGhpcy5taWdyYXRlRnJvbVNpbmd1bGFyRGlyZWN0b3JpZXMoKTtcbiAgICBcbiAgICAvLyBQb3B1bGF0ZSB3aXRoIGRlZmF1bHQgZWxlbWVudHMgaWYgdGhpcyBpcyBhIG5ldyBpbnN0YWxsYXRpb25cbiAgICAvLyBTa2lwIGR1cmluZyB0ZXN0cyB0byBhdm9pZCBpbnRlcmZlcmVuY2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRFbGVtZW50UHJvdmlkZXIoKTtcbiAgICAgICAgYXdhaXQgZGVmYXVsdFByb3ZpZGVyLnBvcHVsYXRlRGVmYXVsdHModGhpcy5iYXNlRGlyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignW1BvcnRmb2xpb01hbmFnZXJdIEVycm9yIHBvcHVsYXRpbmcgZGVmYXVsdCBlbGVtZW50czonLCBlcnJvcik7XG4gICAgICAgIC8vIExvZyB0byBzdGRlcnIgZm9yIENsYXVkZSBEZXNrdG9wIHZpc2liaWxpdHlcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIENSSVRJQ0FMOiBGYWlsZWQgdG8gcG9wdWxhdGUgZGVmYXVsdCBlbGVtZW50czogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICAgIC8vIENvbnRpbnVlIGFueXdheSAtIGVtcHR5IHBvcnRmb2xpbyBpcyB2YWxpZFxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIHBvcnRmb2xpbyBkaXJlY3RvcnkgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhpc3RzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3ModGhpcy5iYXNlRGlyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIExpc3QgYWxsIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3RFbGVtZW50cyh0eXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBlbGVtZW50RGlyID0gdGhpcy5nZXRFbGVtZW50RGlyKHR5cGUpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZWxlbWVudERpcik7XG4gICAgICAvLyBGaWx0ZXIgZm9yIG1hcmtkb3duIGZpbGVzIG9ubHlcbiAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKEVMRU1FTlRfRklMRV9FWFRFTlNJT04pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IHlldCAtIHRoaXMgaXMgZXhwZWN0ZWQgZm9yIG5ldyBpbnN0YWxsYXRpb25zXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnRmb2xpb01hbmFnZXJdIEVsZW1lbnQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgeWV0OiAke2VsZW1lbnREaXJ9YCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFDQ0VTJyB8fCBlcnIuY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAvLyBQZXJtaXNzaW9uIGRlbmllZCAtIGxvZyBidXQgcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIFBlcm1pc3Npb24gZGVuaWVkIGFjY2Vzc2luZyBkaXJlY3Rvcnk6ICR7ZWxlbWVudERpcn1gLCB7XG4gICAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PVERJUicpIHtcbiAgICAgICAgLy8gUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFtQb3J0Zm9saW9NYW5hZ2VyXSBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWAsIHtcbiAgICAgICAgICBjb2RlOiBlcnIuY29kZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3IgYW55IG90aGVyIGVycm9ycywgdGhyb3cgd2l0aCBjb250ZXh0XG4gICAgICBsb2dnZXIuZXJyb3IoYFtQb3J0Zm9saW9NYW5hZ2VyXSBFcnJvciByZWFkaW5nIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWAsIHtcbiAgICAgICAgY29kZTogZXJyLmNvZGUsXG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyLnN0YWNrXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBmdWxsIHBhdGggdG8gYW4gZWxlbWVudCBmaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudFBhdGgodHlwZTogRWxlbWVudFR5cGUsIGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWxcbiAgICBpZiAoIWZpbGVuYW1lIHx8IHR5cGVvZiBmaWxlbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBmaWxlbmFtZSBwcm92aWRlZDogJHt0eXBlb2YgZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lOiBTdHJpbmcoZmlsZW5hbWUpIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbGVuYW1lOiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoJy4uJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJy8nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnXFxcXCcpIHx8IHBhdGguaXNBYnNvbHV0ZShmaWxlbmFtZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQgaW4gZmlsZW5hbWU6ICR7ZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGVuYW1lOiBjb250YWlucyBwYXRoIHRyYXZlcnNhbCBjaGFyYWN0ZXJzOiAke2ZpbGVuYW1lfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIGhpZGRlbiBmaWxlcyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy4nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIGRldGVjdGVkOiAke2ZpbGVuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBmaWxlbmFtZSwgaGFzSGlkZGVuRmlsZTogZmlsZW5hbWUuc3RhcnRzV2l0aCgnLicpLCBoYXNOdWxsQnl0ZTogZmlsZW5hbWUuaW5jbHVkZXMoJ1xcMCcpIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGVuYW1lOiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICR7ZmlsZW5hbWV9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBmaWxlbmFtZSBlbmRzIHdpdGggLm1kXG4gICAgY29uc3Qgc2FmZUZpbGVuYW1lID0gZmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpID8gZmlsZW5hbWUgOiBgJHtmaWxlbmFtZX0ubWRgO1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5nZXRFbGVtZW50RGlyKHR5cGUpLCBzYWZlRmlsZW5hbWUpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbGVtZW50RXhpc3RzKHR5cGU6IEVsZW1lbnRUeXBlLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmdldEVsZW1lbnRQYXRoKHR5cGUsIGZpbGVuYW1lKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgbGVnYWN5IHBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoIChmb3IgbWlncmF0aW9uKVxuICAgKi9cbiAgcHVibGljIGdldExlZ2FjeVBlcnNvbmFzRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BlcnNvbmFzJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBsZWdhY3kgcGVyc29uYXMgZGlyZWN0b3J5IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc0xlZ2FjeVBlcnNvbmFzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3ModGhpcy5nZXRMZWdhY3lQZXJzb25hc0RpcigpKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcih0aGlzLmdldExlZ2FjeVBlcnNvbmFzRGlyKCkpO1xuICAgICAgcmV0dXJuIGZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3RhdGlzdGljcygpOiBQcm9taXNlPFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHN0YXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3RFbGVtZW50cyhlbGVtZW50VHlwZSk7XG4gICAgICBzdGF0c1tlbGVtZW50VHlwZV0gPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0cyBhcyBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNaWdyYXRlIGZyb20gdjEuNC4yIHNpbmd1bGFyIGRpcmVjdG9yeSBuYW1lcyB0byB2MS40LjMgcGx1cmFsIG5hbWVzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgdXBncmFkZSBwYXRoIGZvciBleGlzdGluZyB1c2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlRnJvbVNpbmd1bGFyRGlyZWN0b3JpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb2xkVG9OZXc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAncGVyc29uYSc6ICdwZXJzb25hcycsXG4gICAgICAnc2tpbGwnOiAnc2tpbGxzJyxcbiAgICAgICd0ZW1wbGF0ZSc6ICd0ZW1wbGF0ZXMnLFxuICAgICAgJ2FnZW50JzogJ2FnZW50cycsXG4gICAgICAnbWVtb3J5JzogJ21lbW9yaWVzJyxcbiAgICAgICdlbnNlbWJsZSc6ICdlbnNlbWJsZXMnXG4gICAgfTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBPYmplY3QuZW50cmllcyhvbGRUb05ldykpIHtcbiAgICAgIC8vIFVuaWNvZGUgbm9ybWFsaXplIHRoZSBkaXJlY3RvcnkgbmFtZXMgKGV2ZW4gdGhvdWdoIHRoZXkncmUgaGFyZGNvZGVkLCBmb3Igc2VjdXJpdHkgYXVkaXQpXG4gICAgICBjb25zdCBub3JtYWxpemVkT2xkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob2xkTmFtZSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkTmV3ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmV3TmFtZSk7XG4gICAgICBcbiAgICAgIGlmICghbm9ybWFsaXplZE9sZC5pc1ZhbGlkIHx8ICFub3JtYWxpemVkTmV3LmlzVmFsaWQpIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggb3VyIGhhcmRjb2RlZCB2YWx1ZXMsIGJ1dCBmb3IgY29tcGxldGVuZXNzXG4gICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIEludmFsaWQgVW5pY29kZSBpbiBkaXJlY3RvcnkgbmFtZXMgZHVyaW5nIG1pZ3JhdGlvbmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3Qgb2xkRGlyID0gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgbm9ybWFsaXplZE9sZC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICBjb25zdCBuZXdEaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBub3JtYWxpemVkTmV3Lm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb2xkIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKG9sZERpcik7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBuZXcgZGlyZWN0b3J5IGFscmVhZHkgaGFzIGNvbnRlbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXdEaXJGaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIobmV3RGlyKTtcbiAgICAgICAgICBpZiAobmV3RGlyRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbUG9ydGZvbGlvTWFuYWdlcl0gQm90aCAke29sZE5hbWV9IGFuZCAke25ld05hbWV9IGRpcmVjdG9yaWVzIGV4aXN0LiBLZWVwaW5nICR7bmV3TmFtZX0sIHNraXBwaW5nIG1pZ3JhdGlvbi5gLFxuICAgICAgICAgICAgICB7IG9sZERpciwgbmV3RGlyLCBmaWxlQ291bnQ6IG5ld0RpckZpbGVzLmxlbmd0aCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBOZXcgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgZW1wdHksIHByb2NlZWQgd2l0aCBtaWdyYXRpb25cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgbWlncmF0aW9uXG4gICAgICAgIGxvZ2dlci5pbmZvKGBbUG9ydGZvbGlvTWFuYWdlcl0gTWlncmF0aW5nICR7b2xkTmFtZX0g4oaSICR7bmV3TmFtZX1gKTtcbiAgICAgICAgYXdhaXQgZnMucmVuYW1lKG9sZERpciwgbmV3RGlyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdESVJFQ1RPUllfTUlHUkFUSU9OJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvTWFuYWdlci5taWdyYXRlRnJvbVNpbmd1bGFyRGlyZWN0b3JpZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBNaWdyYXRlZCBkaXJlY3RvcnkgZnJvbSAke29sZE5hbWV9IHRvICR7bmV3TmFtZX0gZm9yIHYxLjQuMyBjb21wYXRpYmlsaXR5YCxcbiAgICAgICAgICBtZXRhZGF0YTogeyBvbGREaXIsIG5ld0RpciB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9sZCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgd2hpY2ggaXMgZmluZVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtQb3J0Zm9saW9NYW5hZ2VyXSBFcnJvciBkdXJpbmcgbWlncmF0aW9uIG9mICR7b2xkTmFtZX06YCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59Il19
@@ -34,6 +34,11 @@ export declare class UpdateChecker {
34
34
  private signatureVerifier;
35
35
  private static purifyWindow;
36
36
  private static purify;
37
+ /**
38
+ * Lazily initialize DOMPurify to prevent crashes during startup
39
+ * CRITICAL FIX: Prevents jsdom from crashing during MCP initialization
40
+ */
41
+ private initializeDOMPurify;
37
42
  private readonly releaseNotesMaxLength;
38
43
  private readonly urlMaxLength;
39
44
  private readonly securityLogger?;
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateChecker.d.ts","sourceRoot":"","sources":["../../src/update/UpdateChecker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAoB;IAK7C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAGvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAG9C,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;QACvD,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;QACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC;IA+CH;;;;;;;OAOG;YACW,qBAAqB;IAgCnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA4H1D;;;OAGG;IACH,kBAAkB,IAAI;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAUD;;;;;;OAMG;IACH,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IAoF/G;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAiCnB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IA+E5B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;WACW,UAAU,IAAI,IAAI;CAIjC"}
1
+ {"version":3,"file":"UpdateChecker.d.ts","sourceRoot":"","sources":["../../src/update/UpdateChecker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAoB;IAK7C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAEvD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAG9C,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;QACvD,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;QACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC;IA+CH;;;;;;;OAOG;YACW,qBAAqB;IAgCnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA4H1D;;;OAGG;IACH,kBAAkB,IAAI;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAUD;;;;;;OAMG;IACH,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IAoF/G;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAiCnB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAqF5B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;WACW,UAAU,IAAI,IAAI;CAIjC"}
@@ -29,6 +29,39 @@ export class UpdateChecker {
29
29
  // but maintain type safety for DOMPurify instance
30
30
  static purifyWindow = null;
31
31
  static purify = null;
32
+ /**
33
+ * Lazily initialize DOMPurify to prevent crashes during startup
34
+ * CRITICAL FIX: Prevents jsdom from crashing during MCP initialization
35
+ */
36
+ initializeDOMPurify() {
37
+ if (UpdateChecker.purify)
38
+ return;
39
+ try {
40
+ // Lazy load dependencies only when needed
41
+ const DOMPurify = require('dompurify');
42
+ const { JSDOM } = require('jsdom');
43
+ const dom = new JSDOM('');
44
+ UpdateChecker.purifyWindow = dom.window;
45
+ UpdateChecker.purify = DOMPurify(UpdateChecker.purifyWindow);
46
+ console.log('[UpdateChecker] DOMPurify initialized successfully');
47
+ }
48
+ catch (error) {
49
+ console.error('[DollhouseMCP] Failed to initialize DOMPurify:', error);
50
+ // Continue without HTML sanitization - better than crashing
51
+ UpdateChecker.purify = {
52
+ sanitize: (str) => {
53
+ // Basic fallback sanitization - escape HTML entities
54
+ // This is safer than trying to remove tags with regex
55
+ return str
56
+ .replace(/&/g, '&')
57
+ .replace(/</g, '&lt;')
58
+ .replace(/>/g, '&gt;')
59
+ .replace(/"/g, '&quot;')
60
+ .replace(/'/g, '&#039;');
61
+ }
62
+ };
63
+ }
64
+ }
32
65
  // Security configuration with sensible defaults
33
66
  releaseNotesMaxLength;
34
67
  urlMaxLength;
@@ -381,16 +414,20 @@ export class UpdateChecker {
381
414
  UpdateChecker.purify = DOMPurify(UpdateChecker.purifyWindow);
382
415
  }
383
416
  const beforeSanitize = sanitized;
417
+ // CRITICAL FIX: Initialize DOMPurify lazily to prevent startup crashes
418
+ this.initializeDOMPurify();
384
419
  // DOMPurify configuration for maximum security
385
420
  // ALLOWED_TAGS: [] strips all HTML tags
386
421
  // ALLOWED_ATTR: [] strips all attributes
387
422
  // Additional options for extra security
388
- sanitized = UpdateChecker.purify.sanitize(sanitized, {
389
- ALLOWED_TAGS: [], // Strip all HTML tags
390
- ALLOWED_ATTR: [], // Strip all attributes
391
- FORBID_TAGS: ['style', 'script', 'iframe', 'object', 'embed', 'link'],
392
- FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover']
393
- });
423
+ if (UpdateChecker.purify && UpdateChecker.purify.sanitize) {
424
+ sanitized = UpdateChecker.purify.sanitize(sanitized, {
425
+ ALLOWED_TAGS: [], // Strip all HTML tags
426
+ ALLOWED_ATTR: [], // Strip all attributes
427
+ FORBID_TAGS: ['style', 'script', 'iframe', 'object', 'embed', 'link'],
428
+ FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover']
429
+ });
430
+ }
394
431
  if (beforeSanitize !== sanitized) {
395
432
  this.logSecurityEvent('html_content_removed', {
396
433
  removedLength: beforeSanitize.length - sanitized.length
@@ -466,4 +503,4 @@ export class UpdateChecker {
466
503
  UpdateChecker.purify = null;
467
504
  }
468
505
  }
469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlQ2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cGRhdGUvVXBkYXRlQ2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWlCOUUsTUFBTSxPQUFPLGFBQWE7SUFDaEIsY0FBYyxDQUFpQjtJQUMvQixXQUFXLENBQWM7SUFDekIsaUJBQWlCLENBQW9CO0lBRTdDLG9EQUFvRDtJQUNwRCxnRUFBZ0U7SUFDaEUsa0RBQWtEO0lBQzFDLE1BQU0sQ0FBQyxZQUFZLEdBQVEsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQTZCLElBQUksQ0FBQztJQUV2RCxnREFBZ0Q7SUFDL0IscUJBQXFCLENBQVM7SUFDOUIsWUFBWSxDQUFTO0lBQ3JCLGNBQWMsQ0FBeUM7SUFDdkQscUJBQXFCLENBQVU7SUFFaEQsWUFDRSxjQUE4QixFQUM5QixPQU9DO1FBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFFckMsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLEVBQUUscUJBQXFCLElBQUksSUFBSSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLEVBQUUsY0FBYyxDQUFDO1FBRTlDLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksa0JBQWtCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUV6RiwrQ0FBK0M7UUFDL0MsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWTtZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNO1lBQ3pCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztRQUV6RCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxJQUFJLGlCQUFpQixDQUFDO1lBQzNFLG1EQUFtRDtZQUNuRCxrQkFBa0IsRUFBRSxDQUFDLFlBQVk7U0FDbEMsQ0FBQyxDQUFDO1FBRUgsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLEVBQUUscUJBQXFCLElBQUksWUFBWSxDQUFDO1FBRTVFLHNDQUFzQztRQUN0QyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixhQUFhLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDeEMsb0RBQW9EO1lBQ3BELGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLFNBQTJCLEVBQzNCLGFBQXFCLENBQUMsRUFDdEIsWUFBb0IsSUFBSTtRQUV4QixJQUFJLFNBQWdCLENBQUM7UUFFckIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sU0FBUyxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLEtBQWMsQ0FBQztnQkFFM0Isa0NBQWtDO2dCQUNsQyxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDM0IsTUFBTTtnQkFDUixDQUFDO2dCQUVELDZDQUE2QztnQkFDN0MsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzVELE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCwyQ0FBMkM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBVSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWU7UUFDbkIsNkNBQTZDO1FBQzdDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFhLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUVsQyxNQUFNLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLEdBQUcsV0FBVyxVQUFVLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsVUFBVSxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDM0csQ0FBQyxDQUFDLEdBQUcsV0FBVyxVQUFVLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFFM0QsTUFBTSxJQUFJLEtBQUssQ0FDYixvQ0FBb0MsT0FBTyxzQ0FBc0M7Z0JBQ2pGLElBQUksZUFBZSxDQUFDLGVBQWUsa0NBQWtDLGVBQWUsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUN2SCxDQUFDO1FBQ0osQ0FBQztRQUVELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRWhDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXJFLGdFQUFnRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFbkYsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixFQUFFO29CQUM3QyxPQUFPLEVBQUU7d0JBQ1AsUUFBUSxFQUFFLGdDQUFnQzt3QkFDMUMsWUFBWSxFQUFFLGtCQUFrQjtxQkFDakM7b0JBQ0QsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2lCQUMxQixDQUFDLENBQUM7Z0JBRUgsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLENBQUMsb0JBQW9CO1lBQ25DLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sYUFBYSxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDckUsd0NBQXdDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFFN0MsbUJBQW1CO1FBQ25CLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsSUFBSSxJQUFJLDZCQUE2QixDQUFDO1FBRXZFLDRDQUE0QztRQUM1QyxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLFVBQThCLENBQUM7UUFFbkMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQztnQkFDSCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBRWhELElBQUksa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25DLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7b0JBQzVDLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2pDLFVBQVUsSUFBSSxLQUFLLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxDQUFDO29CQUNyRCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsNkJBQTZCO2dCQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRTt3QkFDNUMsT0FBTzt3QkFDUCxRQUFRLEVBQUUsaUJBQWlCO3dCQUMzQixTQUFTLEVBQUUsa0JBQWtCLENBQUMsU0FBUzt3QkFDdkMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUs7cUJBQ2hDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELGdFQUFnRTtnQkFDaEUsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDBDQUEwQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksZUFBZSxJQUFJO3dCQUN6Rix1REFBdUQsQ0FDeEQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsMkRBQTJEO2dCQUMzRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUMvQixNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUNELDhCQUE4QjtnQkFDOUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLEVBQUU7d0JBQ2xELE9BQU87d0JBQ1AsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQzlELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsY0FBYztZQUNkLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsV0FBVyxFQUFFLFdBQVcsRUFBRyxtREFBbUQ7WUFDOUUsWUFBWTtZQUNaLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUTtZQUNoQyxPQUFPO1lBQ1AsaUJBQWlCO1lBQ2pCLFVBQVU7U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQU1oQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFDekMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLGVBQWUsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDekYsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCx1QkFBdUIsQ0FBQyxNQUFnQyxFQUFFLEtBQWEsRUFBRSxtQkFBMkIsRUFBRTtRQUNwRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7WUFDakQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFdEUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixPQUFPLGdCQUFnQjtvQkFDckIsK0JBQStCO29CQUMvQixLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU07b0JBQ3RCLHlCQUF5QjtvQkFDekIsb0RBQW9EO29CQUNwRCx1REFBdUQ7b0JBQ3ZELHdCQUF3QjtvQkFDeEIsdURBQXVEO29CQUN2RCxzRUFBc0U7b0JBQ3RFLHNFQUFzRSxDQUFDO1lBQzNFLENBQUM7WUFFRCxPQUFPLGdCQUFnQjtnQkFDckIsK0JBQStCO2dCQUMvQixTQUFTLEdBQUcsWUFBWSxHQUFHLE1BQU07Z0JBQ2pDLENBQUMsWUFBWTtvQkFDWCxDQUFDLENBQUMsNkVBQTZFO29CQUMvRSxDQUFDLENBQUMsU0FBUzt3QkFDVCxvQ0FBb0M7d0JBQ3BDLHFDQUFxQzt3QkFDckMsd0RBQXdEO3dCQUN4RCw2REFBNkQsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDakMsT0FBTyxnQkFBZ0I7Z0JBQ3JCLGtDQUFrQztnQkFDbEMsMEJBQTBCLEdBQUcsY0FBYyxHQUFHLElBQUk7Z0JBQ2xELHFEQUFxRDtnQkFDckQsNkZBQTZGO2dCQUM3RixzQkFBc0I7Z0JBQ3RCLG1FQUFtRSxDQUFDO1FBQ3hFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRztZQUNsQixnQkFBZ0IsR0FBRyxrQ0FBa0M7WUFDckQsMEJBQTBCLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJO1lBQ3pELHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSTtZQUN2RCxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJO1NBQ2pFLENBQUM7UUFFRixvQ0FBb0M7UUFDcEMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0IsV0FBVyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDdEIsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO2dCQUNELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUVELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkIsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QixXQUFXLENBQUMsSUFBSSxDQUNkLDZCQUE2QixFQUM3QixvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sRUFDOUUsa0JBQWtCLEVBQ2xCLCtCQUErQixFQUMvQixjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxFQUM3RCxzRUFBc0UsQ0FDdkUsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxDQUFDLElBQUksQ0FDZCwrQkFBK0IsRUFDL0IsOENBQThDLEVBQzlDLHFEQUFxRCxDQUN0RCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFcEIsbUJBQW1CO1FBQ25CLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRTtnQkFDcEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzVCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUUsMEJBQTBCO2FBQ3BFLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDLENBQUUsZUFBZTtRQUM3QixDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUU7b0JBQzVDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUTtvQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUUsa0NBQWtDO2lCQUMxRCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLENBQUMsQ0FBRSw0Q0FBNEM7WUFDMUQsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFFLCtCQUErQjthQUN2RCxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsQ0FBQyxDQUFFLGNBQWM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNLLG9CQUFvQixDQUFDLEtBQWE7UUFDeEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLDZCQUE2QixDQUFDO1FBRWpELHFEQUFxRDtRQUNyRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxTQUFTLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixDQUFDO1FBRWhELElBQUksYUFBYSxDQUFDLGNBQWMsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUNBQWlDLEVBQUU7Z0JBQ3ZELE1BQU0sRUFBRSxhQUFhLENBQUMsY0FBYztnQkFDcEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRTtnQkFDL0MsY0FBYyxFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUNoQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjthQUN0QyxDQUFDLENBQUM7WUFDSCxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3pFLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekQsMERBQTBEO1lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLGFBQWEsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUN4QyxhQUFhLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNqQywrQ0FBK0M7UUFDL0Msd0NBQXdDO1FBQ3hDLHlDQUF5QztRQUN6Qyx3Q0FBd0M7UUFDeEMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuRCxZQUFZLEVBQUUsRUFBRSxFQUFPLHNCQUFzQjtZQUM3QyxZQUFZLEVBQUUsRUFBRSxFQUFPLHVCQUF1QjtZQUM5QyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUNyRSxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUM7U0FDN0QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFO2dCQUM1QyxhQUFhLEVBQUUsY0FBYyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTTthQUN4RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQseURBQXlEO1FBQ3pELG9FQUFvRTtRQUNwRSxnRUFBZ0U7UUFDaEUsK0NBQStDO1FBQy9DLE1BQU0sUUFBUSxHQUFHO1lBQ2YsaUJBQWlCLEVBQVksK0NBQStDO1lBQzVFLHFCQUFxQixFQUFRLCtDQUErQztZQUM1RSxxQkFBcUIsRUFBUSw2Q0FBNkM7WUFDMUUscUJBQXFCLEVBQVEsMkNBQTJDO1lBQ3hFLHlCQUF5QixFQUFJLCtEQUErRDtZQUM1RixtQkFBbUIsRUFBVSx5Q0FBeUM7WUFDdEUsb0JBQW9CLEVBQVMsK0NBQStDO1lBQzVFLG9CQUFvQixFQUFTLDJDQUEyQztZQUN4RSxlQUFlLENBQWMsMkNBQTJDO1NBQ3pFLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDakMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMvQixTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsRUFBRTtnQkFDbEQsYUFBYSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU07YUFDeEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVSxDQUFDLE9BQWU7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxPQUFPLENBQUMsQ0FBRSw2QkFBNkI7WUFDaEQsQ0FBQztZQUVELHlEQUF5RDtZQUN6RCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3RDLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRSxNQUFNO2dCQUNiLEdBQUcsRUFBRSxTQUFTO2dCQUNkLFFBQVEsRUFBRSxLQUFLLENBQUUsNkJBQTZCO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLE9BQU8sQ0FBQyxDQUFFLDJCQUEyQjtRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQVk7UUFDbEQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVU7UUFDdEIsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDbEMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXBkYXRlQ2hlY2tlciAtIFNlY3VyZSBHaXRIdWIgcmVsZWFzZSB1cGRhdGUgY2hlY2tpbmcgd2l0aCBjb21wcmVoZW5zaXZlIHNhbml0aXphdGlvblxuICogXG4gKiBTZWN1cml0eSBtZWFzdXJlcyBpbXBsZW1lbnRlZDpcbiAqIDEuIFhTUyBQcm90ZWN0aW9uOiBET01QdXJpZnkgd2l0aCBzdHJpY3Qgbm8tdGFncy9uby1hdHRyaWJ1dGVzIHBvbGljeVxuICogMi4gQ29tbWFuZCBJbmplY3Rpb24gUHJldmVudGlvbjogTXVsdGlwbGUgcmVnZXggcGF0dGVybnMgZm9yIHZhcmlvdXMgZXNjYXBlIHNlcXVlbmNlc1xuICogMy4gVVJMIFZhbGlkYXRpb246IFdoaXRlbGlzdCBhcHByb2FjaCBhbGxvd2luZyBvbmx5IGh0dHAvaHR0cHMgc2NoZW1lc1xuICogNC4gSW5mb3JtYXRpb24gRGlzY2xvc3VyZSBQcmV2ZW50aW9uOiBTYW5pdGl6ZWQgbG9nZ2luZyBvZiBzZW5zaXRpdmUgZGF0YVxuICogNS4gTGVuZ3RoIExpbWl0czogQ29uZmlndXJhYmxlIGxpbWl0cyB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gKiA2LiBPV0FTUCBQYXR0ZXJuczogUHJvdGVjdGlvbiBhZ2FpbnN0IFBIUCwgQVNQLCBoZXgsIHVuaWNvZGUsIGFuZCBvY3RhbCBlc2NhcGVzXG4gKiBcbiAqIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnM6XG4gKiAtIENhY2hlZCBET01QdXJpZnkgaW5zdGFuY2UgdG8gYXZvaWQgcmVjcmVhdGlvbiBvdmVyaGVhZFxuICogLSBTaW5nbGUtcGFzcyByZWdleCBwcm9jZXNzaW5nIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAqIC0gRXhwb25lbnRpYWwgYmFja29mZiBmb3IgbmV0d29yayByZXRyaWVzXG4gKi9cblxuaW1wb3J0IHsgUkVMRUFTRVNfQVBJX1VSTCB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVmVyc2lvbk1hbmFnZXIgfSBmcm9tICcuL1ZlcnNpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyLCBSYXRlTGltaXRlckZhY3RvcnkgfSBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNpZ25hdHVyZVZlcmlmaWVyIH0gZnJvbSAnLi9TaWduYXR1cmVWZXJpZmllci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoZWNrUmVzdWx0IHtcbiAgY3VycmVudFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBpc1VwZGF0ZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgcmVsZWFzZURhdGU6IHN0cmluZztcbiAgcmVsZWFzZU5vdGVzOiBzdHJpbmc7XG4gIHJlbGVhc2VVcmw6IHN0cmluZztcbiAgdGFnTmFtZT86IHN0cmluZztcbiAgc2lnbmF0dXJlVmVyaWZpZWQ/OiBib29sZWFuO1xuICBzaWduZXJJbmZvPzogc3RyaW5nO1xufVxuXG4vLyBUeXBlIGRlY2xhcmF0aW9ucyBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG50eXBlIERPTVB1cmlmeUluc3RhbmNlID0gUmV0dXJuVHlwZTx0eXBlb2YgRE9NUHVyaWZ5PjtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUNoZWNrZXIge1xuICBwcml2YXRlIHZlcnNpb25NYW5hZ2VyOiBWZXJzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSByYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIHByaXZhdGUgc2lnbmF0dXJlVmVyaWZpZXI6IFNpZ25hdHVyZVZlcmlmaWVyO1xuICBcbiAgLy8gU3RhdGljIGNhY2hlIGZvciBET01QdXJpZnkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAvLyBXZSB1c2UgJ2FueScgZm9yIEpTRE9NIHdpbmRvdyB0byBhdm9pZCBjb21wbGV4IHR5cGUgY29uZmxpY3RzXG4gIC8vIGJ1dCBtYWludGFpbiB0eXBlIHNhZmV0eSBmb3IgRE9NUHVyaWZ5IGluc3RhbmNlXG4gIHByaXZhdGUgc3RhdGljIHB1cmlmeVdpbmRvdzogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcHVyaWZ5OiBET01QdXJpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gU2VjdXJpdHkgY29uZmlndXJhdGlvbiB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVsZWFzZU5vdGVzTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsTWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlMb2dnZXI/OiAoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVTaWduZWRSZWxlYXNlczogYm9vbGVhbjtcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZlcnNpb25NYW5hZ2VyOiBWZXJzaW9uTWFuYWdlcixcbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVsZWFzZU5vdGVzTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgdXJsTWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgc2VjdXJpdHlMb2dnZXI/OiAoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KSA9PiB2b2lkO1xuICAgICAgcmF0ZUxpbWl0ZXI/OiBSYXRlTGltaXRlcjtcbiAgICAgIHNpZ25hdHVyZVZlcmlmaWVyPzogU2lnbmF0dXJlVmVyaWZpZXI7XG4gICAgICByZXF1aXJlU2lnbmVkUmVsZWFzZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7XG4gICAgaWYgKCF2ZXJzaW9uTWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJzaW9uTWFuYWdlciBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICB0aGlzLnZlcnNpb25NYW5hZ2VyID0gdmVyc2lvbk1hbmFnZXI7XG4gICAgXG4gICAgLy8gQXBwbHkgb3B0aW9ucyB3aXRoIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uXG4gICAgdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggPSBvcHRpb25zPy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggPz8gNTAwMDtcbiAgICB0aGlzLnVybE1heExlbmd0aCA9IG9wdGlvbnM/LnVybE1heExlbmd0aCA/PyAyMDQ4O1xuICAgIHRoaXMuc2VjdXJpdHlMb2dnZXIgPSBvcHRpb25zPy5zZWN1cml0eUxvZ2dlcjtcbiAgICBcbiAgICAvLyBVc2UgcHJvdmlkZWQgcmF0ZSBsaW1pdGVyIG9yIGNyZWF0ZSBkZWZhdWx0XG4gICAgdGhpcy5yYXRlTGltaXRlciA9IG9wdGlvbnM/LnJhdGVMaW1pdGVyIHx8IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVVcGRhdGVDaGVja0xpbWl0ZXIoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UncmUgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5DSSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhcHJvY2Vzcy5lbnYuQUxMT1dfVU5TSUdORURfUkVMRUFTRVM7XG4gICAgXG4gICAgLy8gVXNlIHByb3ZpZGVkIHNpZ25hdHVyZSB2ZXJpZmllciBvciBjcmVhdGUgZGVmYXVsdFxuICAgIHRoaXMuc2lnbmF0dXJlVmVyaWZpZXIgPSBvcHRpb25zPy5zaWduYXR1cmVWZXJpZmllciB8fCBuZXcgU2lnbmF0dXJlVmVyaWZpZXIoe1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2Ugc2hvdWxkIHJlcXVpcmUgc2lnbmVkIHJlbGVhc2VzXG4gICAgICBhbGxvd1Vuc2lnbmVkSW5EZXY6ICFpc1Byb2R1Y3Rpb25cbiAgICB9KTtcbiAgICBcbiAgICAvLyBXaGV0aGVyIHRvIHJlcXVpcmUgc2lnbmVkIHJlbGVhc2VzIChkZWZhdWx0OiB0cnVlIGluIHByb2R1Y3Rpb24pXG4gICAgdGhpcy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMgPSBvcHRpb25zPy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMgPz8gaXNQcm9kdWN0aW9uO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gZm9yIHNlY3VyaXR5XG4gICAgaWYgKHRoaXMucmVsZWFzZU5vdGVzTWF4TGVuZ3RoIDwgMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbGVhc2VOb3Rlc01heExlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDEwMCBjaGFyYWN0ZXJzIGZvciBzZWN1cml0eScpO1xuICAgIH1cbiAgICBpZiAodGhpcy51cmxNYXhMZW5ndGggPCA1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cmxNYXhMZW5ndGggbXVzdCBiZSBhdCBsZWFzdCA1MCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY2FjaGVkIERPTVB1cmlmeSBpbnN0YW5jZSBmb3IgcGVyZm9ybWFuY2VcbiAgICAvLyBUaGlzIGF2b2lkcyBjcmVhdGluZyBhIG5ldyBKU0RPTSB3aW5kb3cgZm9yIGVhY2ggc2FuaXRpemF0aW9uXG4gICAgaWYgKCFVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdykge1xuICAgICAgY29uc3QgZG9tID0gbmV3IEpTRE9NKCcnKTtcbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93ID0gZG9tLndpbmRvdztcbiAgICAgIC8vIERPTVB1cmlmeSBleHBlY3RzIGEgV2luZG93LWxpa2Ugb2JqZWN0IGZyb20gSlNET01cbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5ID0gRE9NUHVyaWZ5KFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgbmV0d29yayBvcGVyYXRpb24gd2l0aCByZXRyeSBsb2dpYyBhbmQgZXhwb25lbnRpYWwgYmFja29mZlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIGFzeW5jIG9wZXJhdGlvbiB0byBleGVjdXRlXG4gICAqIEBwYXJhbSBtYXhSZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgKGRlZmF1bHQ6IDMpXG4gICAqIEBwYXJhbSBiYXNlRGVsYXkgLSBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBmb3IgZXhwb25lbnRpYWwgYmFja29mZiAoZGVmYXVsdDogMTAwMG1zKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgb3BlcmF0aW9uIHJlc3VsdFxuICAgKiBAdGhyb3dzIFRoZSBsYXN0IGVycm9yIGlmIGFsbCByZXRyaWVzIGZhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmV0cnlOZXR3b3JrT3BlcmF0aW9uPFQ+KFxuICAgIG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPiwgXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gMyxcbiAgICBiYXNlRGVsYXk6IG51bWJlciA9IDEwMDBcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3I7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgXG4gICAgICAgIC8vIERvbid0IHJldHJ5IG9uIHRoZSBsYXN0IGF0dGVtcHRcbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgY2VydGFpbiBlcnJvcnMgKGxpa2UgNDA0LCA0MDEpXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwNCcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENhbGN1bGF0ZSBkZWxheSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgdXBkYXRlcyBmcm9tIEdpdEh1YiByZWxlYXNlcyB3aXRoIHNlY3VyaXR5IGFuZCBlcnJvciBoYW5kbGluZ1xuICAgKiBAcmV0dXJucyBVcGRhdGVDaGVja1Jlc3VsdCBpZiB1cGRhdGUgaW5mbyBpcyBhdmFpbGFibGUsIG51bGwgaWYgbm8gcmVsZWFzZXMgZm91bmRcbiAgICogQHRocm93cyBFcnJvciBmb3IgbmV0d29yayBvciBBUEkgZmFpbHVyZXMgb3IgcmF0ZSBsaW1pdCBleGNlZWRlZFxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzKCk6IFByb21pc2U8VXBkYXRlQ2hlY2tSZXN1bHQgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgcmF0ZSBsaW1pdCBiZWZvcmUgbWFraW5nIEFQSSByZXF1ZXN0XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5yYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgY29uc3Qgd2FpdFRpbWUgPSBNYXRoLmNlaWwocmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNcyEgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHdhaXRNaW51dGVzID0gTWF0aC5mbG9vcih3YWl0VGltZSAvIDYwKTtcbiAgICAgIGNvbnN0IHdhaXRTZWNvbmRzID0gd2FpdFRpbWUgJSA2MDtcbiAgICAgIFxuICAgICAgY29uc3QgdGltZVN0ciA9IHdhaXRNaW51dGVzID4gMCBcbiAgICAgICAgPyBgJHt3YWl0TWludXRlc30gbWludXRlJHt3YWl0TWludXRlcyA+IDEgPyAncycgOiAnJ30gJHt3YWl0U2Vjb25kc30gc2Vjb25kJHt3YWl0U2Vjb25kcyAhPT0gMSA/ICdzJyA6ICcnfWBcbiAgICAgICAgOiBgJHt3YWl0U2Vjb25kc30gc2Vjb25kJHt3YWl0U2Vjb25kcyAhPT0gMSA/ICdzJyA6ICcnfWA7XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB3YWl0ICR7dGltZVN0cn0gYmVmb3JlIGNoZWNraW5nIGZvciB1cGRhdGVzIGFnYWluLiBgICtcbiAgICAgICAgYCgke3JhdGVMaW1pdFN0YXR1cy5yZW1haW5pbmdUb2tlbnN9IHJlcXVlc3RzIHJlbWFpbmluZywgcmVzZXRzIGF0ICR7cmF0ZUxpbWl0U3RhdHVzLnJlc2V0VGltZS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYFxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29uc3VtZSBhIHJhdGUgbGltaXQgdG9rZW5cbiAgICB0aGlzLnJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgIFxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgdGhpcy52ZXJzaW9uTWFuYWdlci5nZXRDdXJyZW50VmVyc2lvbigpO1xuICAgIFxuICAgIC8vIENoZWNrIEdpdEh1YiByZWxlYXNlcyBBUEkgZm9yIGxhdGVzdCB2ZXJzaW9uIHdpdGggcmV0cnkgbG9naWNcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmV0cnlOZXR3b3JrT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMTAwMDApOyAvLyAxMCBzZWNvbmQgdGltZW91dFxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFJFTEVBU0VTX0FQSV9VUkwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBObyByZWxlYXNlcyBmb3VuZFxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRIdWIgQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZWxlYXNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zdCB0YWdOYW1lID0gcmVsZWFzZURhdGEudGFnX25hbWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRhZ05hbWU/LnJlcGxhY2UoL152LywgJycpIHx8IHJlbGVhc2VEYXRhLm5hbWU7XG4gICAgLy8gVXNlIGNvbnNpc3RlbnQgZGF0ZSBmb3JtYXR0aW5nIG1ldGhvZFxuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gcmVsZWFzZURhdGEucHVibGlzaGVkX2F0O1xuICAgIFxuICAgIC8vIENvbXBhcmUgdmVyc2lvbnNcbiAgICBjb25zdCBpc1VwZGF0ZUF2YWlsYWJsZSA9IHRoaXMudmVyc2lvbk1hbmFnZXIuY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA8IDA7XG4gICAgXG4gICAgY29uc3QgcmVsZWFzZU5vdGVzID0gcmVsZWFzZURhdGEuYm9keSB8fCAnU2VlIHJlbGVhc2Ugbm90ZXMgb24gR2l0SHViJztcbiAgICBcbiAgICAvLyBWZXJpZnkgcmVsZWFzZSBzaWduYXR1cmUgaWYgd2UgaGF2ZSBhIHRhZ1xuICAgIGxldCBzaWduYXR1cmVWZXJpZmllZCA9IGZhbHNlO1xuICAgIGxldCBzaWduZXJJbmZvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuc2lnbmF0dXJlVmVyaWZpZXIudmVyaWZ5VGFnU2lnbmF0dXJlKHRhZ05hbWUpO1xuICAgICAgICBzaWduYXR1cmVWZXJpZmllZCA9IHZlcmlmaWNhdGlvblJlc3VsdC52ZXJpZmllZDtcbiAgICAgICAgXG4gICAgICAgIGlmICh2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyRW1haWwpIHtcbiAgICAgICAgICBzaWduZXJJbmZvID0gdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25lckVtYWlsO1xuICAgICAgICAgIGlmICh2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyS2V5KSB7XG4gICAgICAgICAgICBzaWduZXJJbmZvICs9IGAgKCR7dmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25lcktleX0pYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIExvZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlY3VyaXR5TG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5zZWN1cml0eUxvZ2dlcignc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicsIHtcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICB2ZXJpZmllZDogc2lnbmF0dXJlVmVyaWZpZWQsXG4gICAgICAgICAgICBzaWduZXJLZXk6IHZlcmlmaWNhdGlvblJlc3VsdC5zaWduZXJLZXksXG4gICAgICAgICAgICBlcnJvcjogdmVyaWZpY2F0aW9uUmVzdWx0LmVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQgYW5kIGZhaWxlZCwgdGhyb3cgZXJyb3JcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZVNpZ25lZFJlbGVhc2VzICYmICFzaWduYXR1cmVWZXJpZmllZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBSZWxlYXNlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAke3ZlcmlmaWNhdGlvblJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcid9LiBgICtcbiAgICAgICAgICAgICdPbmx5IHNpZ25lZCByZWxlYXNlcyBhcmUgYWNjZXB0ZWQgaW4gcHJvZHVjdGlvbiBtb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhbmQgaXQncyByZXF1aXJlZCwgZmFpbFxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIGxvZyBhbmQgY29udGludWVcbiAgICAgICAgaWYgKHRoaXMuc2VjdXJpdHlMb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLnNlY3VyaXR5TG9nZ2VyKCdzaWduYXR1cmVfdmVyaWZpY2F0aW9uX2Vycm9yJywge1xuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgaXNVcGRhdGVBdmFpbGFibGUsXG4gICAgICByZWxlYXNlRGF0ZTogcHVibGlzaGVkQXQsICAvLyBXaWxsIGJlIGZvcm1hdHRlZCBieSBmb3JtYXREYXRlKCkgd2hlbiBkaXNwbGF5ZWRcbiAgICAgIHJlbGVhc2VOb3RlcyxcbiAgICAgIHJlbGVhc2VVcmw6IHJlbGVhc2VEYXRhLmh0bWxfdXJsLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIHNpZ25hdHVyZVZlcmlmaWVkLFxuICAgICAgc2lnbmVySW5mb1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCByYXRlIGxpbWl0IHN0YXR1c1xuICAgKiBAcmV0dXJucyBDdXJyZW50IHJhdGUgbGltaXQgc3RhdHVzIGluY2x1ZGluZyByZW1haW5pbmcgcmVxdWVzdHMgYW5kIHJlc2V0IHRpbWVcbiAgICovXG4gIGdldFJhdGVMaW1pdFN0YXR1cygpOiB7IFxuICAgIGFsbG93ZWQ6IGJvb2xlYW47IFxuICAgIHJlbWFpbmluZ1JlcXVlc3RzOiBudW1iZXI7IFxuICAgIHJlc2V0VGltZTogRGF0ZTtcbiAgICB3YWl0VGltZVNlY29uZHM/OiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucmF0ZUxpbWl0ZXIuZ2V0U3RhdHVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IHN0YXR1cy5hbGxvd2VkLFxuICAgICAgcmVtYWluaW5nUmVxdWVzdHM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICByZXNldFRpbWU6IHN0YXR1cy5yZXNldFRpbWUsXG4gICAgICB3YWl0VGltZVNlY29uZHM6IHN0YXR1cy5yZXRyeUFmdGVyTXMgPyBNYXRoLmNlaWwoc3RhdHVzLnJldHJ5QWZ0ZXJNcyAvIDEwMDApIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCB1cGRhdGUgY2hlY2sgcmVzdWx0cyBmb3IgZGlzcGxheSB3aXRoIGNvbXByZWhlbnNpdmUgc2FuaXRpemF0aW9uXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgdXBkYXRlIGNoZWNrIHJlc3VsdCB0byBmb3JtYXRcbiAgICogQHBhcmFtIGVycm9yIC0gT3B0aW9uYWwgZXJyb3IgZnJvbSB1cGRhdGUgY2hlY2tcbiAgICogQHBhcmFtIHBlcnNvbmFJbmRpY2F0b3IgLSBPcHRpb25hbCBwZXJzb25hIGluZGljYXRvciBwcmVmaXhcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHN0cmluZyBzYWZlIGZvciBkaXNwbGF5XG4gICAqL1xuICBmb3JtYXRVcGRhdGVDaGVja1Jlc3VsdChyZXN1bHQ6IFVwZGF0ZUNoZWNrUmVzdWx0IHwgbnVsbCwgZXJyb3I/OiBFcnJvciwgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc3QgaXNBYm9ydEVycm9yID0gZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNSYXRlTGltaXRFcnJvciA9IGVycm9yTWVzc2FnZS5pbmNsdWRlcygnUmF0ZSBsaW1pdCBleGNlZWRlZCcpO1xuICAgICAgXG4gICAgICBpZiAoaXNSYXRlTGltaXRFcnJvcikge1xuICAgICAgICByZXR1cm4gcGVyc29uYUluZGljYXRvciArIFxuICAgICAgICAgICfij7MgKipSYXRlIExpbWl0IEV4Y2VlZGVkKipcXG5cXG4nICtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICsgJ1xcblxcbicgK1xuICAgICAgICAgICcqKldoeSB0aGlzIGhhcHBlbnM6KipcXG4nICtcbiAgICAgICAgICAn4oCiIFVwZGF0ZSBjaGVja3MgYXJlIGxpbWl0ZWQgdG8gcHJldmVudCBBUEkgYWJ1c2VcXG4nICtcbiAgICAgICAgICAn4oCiIEdpdEh1YiBBUEkgaGFzIHJhdGUgbGltaXRzIGZvciBhbGwgYXBwbGljYXRpb25zXFxuXFxuJyArXG4gICAgICAgICAgJyoqV2hhdCB5b3UgY2FuIGRvOioqXFxuJyArXG4gICAgICAgICAgJ+KAoiBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIHRpbWUgYmVmb3JlIGNoZWNraW5nIGFnYWluXFxuJyArXG4gICAgICAgICAgJ+KAoiBVc2UgYGdldF9zZXJ2ZXJfc3RhdHVzYCB0byBzZWUgY3VycmVudCB2ZXJzaW9uIHdpdGhvdXQgQVBJIGNhbGxzXFxuJyArXG4gICAgICAgICAgJ+KAoiBWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvcmVsZWFzZXMgZGlyZWN0bHknO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gcGVyc29uYUluZGljYXRvciArIFxuICAgICAgICAn4p2MICoqVXBkYXRlIENoZWNrIEZhaWxlZCoqXFxuXFxuJyArXG4gICAgICAgICdFcnJvcjogJyArIGVycm9yTWVzc2FnZSArICdcXG5cXG4nICtcbiAgICAgICAgKGlzQWJvcnRFcnJvciBcbiAgICAgICAgICA/ICdUaGUgcmVxdWVzdCB0aW1lZCBvdXQuIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nXG4gICAgICAgICAgOiAnVGlwczpcXG4nICtcbiAgICAgICAgICAgICfigKIgQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uXFxuJyArXG4gICAgICAgICAgICAn4oCiIEVuc3VyZSBHaXRIdWIuY29tIGlzIGFjY2Vzc2libGVcXG4nICtcbiAgICAgICAgICAgICfigKIgVHJ5IHJ1bm5pbmcgYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWAgZm9yIG1hbnVhbCB1cGRhdGVcXG4nICtcbiAgICAgICAgICAgICfigKIgVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyL3JlbGVhc2VzJyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9ICd1bmtub3duJztcbiAgICAgIHJldHVybiBwZXJzb25hSW5kaWNhdG9yICsgXG4gICAgICAgICfwn5OmICoqVXBkYXRlIENoZWNrIENvbXBsZXRlKipcXG5cXG4nICtcbiAgICAgICAgJ/CflIQgKipDdXJyZW50IFZlcnNpb246KiogJyArIGN1cnJlbnRWZXJzaW9uICsgJ1xcbicgK1xuICAgICAgICAn8J+ToSAqKlJlbW90ZSBTdGF0dXM6KiogTm8gcmVsZWFzZXMgZm91bmQgb24gR2l0SHViXFxuJyArXG4gICAgICAgICfihLnvuI8gKipOb3RlOioqIFRoaXMgbWF5IGJlIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvciByZWxlYXNlcyBoYXZlblxcJ3QgYmVlbiBwdWJsaXNoZWQgeWV0LlxcblxcbicgK1xuICAgICAgICAnKipNYW51YWwgVXBkYXRlOioqXFxuJyArXG4gICAgICAgICdVc2UgYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWAgdG8gcHVsbCBsYXRlc3QgY2hhbmdlcyBmcm9tIG1haW4gYnJhbmNoLic7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHN0YXR1c1BhcnRzID0gW1xuICAgICAgcGVyc29uYUluZGljYXRvciArICfwn5OmICoqVXBkYXRlIENoZWNrIENvbXBsZXRlKipcXG5cXG4nLFxuICAgICAgJ/CflIQgKipDdXJyZW50IFZlcnNpb246KiogJyArIHJlc3VsdC5jdXJyZW50VmVyc2lvbiArICdcXG4nLFxuICAgICAgJ/Cfk6EgKipMYXRlc3QgVmVyc2lvbjoqKiAnICsgcmVzdWx0LmxhdGVzdFZlcnNpb24gKyAnXFxuJyxcbiAgICAgICfwn5OFICoqUmVsZWFzZWQ6KiogJyArIHRoaXMuZm9ybWF0RGF0ZShyZXN1bHQucmVsZWFzZURhdGUpICsgJ1xcbidcbiAgICBdO1xuICAgIFxuICAgIC8vIEFkZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHN0YXR1c1xuICAgIGlmIChyZXN1bHQuc2lnbmF0dXJlVmVyaWZpZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlc3VsdC5zaWduYXR1cmVWZXJpZmllZCkge1xuICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKCfinIUgKipTaWduYXR1cmU6KiogVmVyaWZpZWQnKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zaWduZXJJbmZvKSB7XG4gICAgICAgICAgc3RhdHVzUGFydHMucHVzaChgIGJ5ICR7cmVzdWx0LnNpZ25lckluZm99YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzUGFydHMucHVzaCgnXFxuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKCfimqDvuI8gKipTaWduYXR1cmU6KiogTm90IHZlcmlmaWVkXFxuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXR1c1BhcnRzLnB1c2goJ1xcbicpO1xuICAgIFxuICAgIGlmIChyZXN1bHQuaXNVcGRhdGVBdmFpbGFibGUpIHtcbiAgICAgIHN0YXR1c1BhcnRzLnB1c2goXG4gICAgICAgICfinKggKipVcGRhdGUgQXZhaWxhYmxlISoqXFxuXFxuJyxcbiAgICAgICAgJyoqV2hhdFxcJ3MgTmV3OioqXFxuJyArIHRoaXMuc2FuaXRpemVSZWxlYXNlTm90ZXMocmVzdWx0LnJlbGVhc2VOb3RlcykgKyAnXFxuXFxuJyxcbiAgICAgICAgJyoqVG8gVXBkYXRlOioqXFxuJyxcbiAgICAgICAgJ+KAoiBVc2U6IGB1cGRhdGVfc2VydmVyIHRydWVgXFxuJyxcbiAgICAgICAgJ+KAoiBPciB2aXNpdDogJyArIHRoaXMuc2FuaXRpemVVcmwocmVzdWx0LnJlbGVhc2VVcmwpICsgJ1xcblxcbicsXG4gICAgICAgICfimqDvuI8gKipOb3RlOioqIFVwZGF0ZSB3aWxsIHJlc3RhcnQgdGhlIHNlcnZlciBhbmQgcmVsb2FkIGFsbCBwZXJzb25hcy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXNQYXJ0cy5wdXNoKFxuICAgICAgICAn4pyFICoqWW91XFwncmUgVXAgdG8gRGF0ZSEqKlxcblxcbicsXG4gICAgICAgICdZb3VyIERvbGxob3VzZU1DUCBpbnN0YWxsYXRpb24gaXMgY3VycmVudC5cXG4nLFxuICAgICAgICAnQ2hlY2sgYmFjayBsYXRlciBmb3IgbmV3IGZlYXR1cmVzIGFuZCBpbXByb3ZlbWVudHMuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXR1c1BhcnRzLmpvaW4oJycpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgVVJMcyB0byBwcmV2ZW50IGRhbmdlcm91cyBzY2hlbWVzIGFuZCBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlXG4gICAqIFxuICAgKiBTZWN1cml0eSBtZWFzdXJlczpcbiAgICogLSBMZW5ndGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IERvU1xuICAgKiAtIFdoaXRlbGlzdCBhcHByb2FjaDogb25seSBodHRwL2h0dHBzIGFsbG93ZWRcbiAgICogLSBTYW5pdGl6ZWQgbG9nZ2luZyB0byBwcmV2ZW50IHNlbnNpdGl2ZSBkYXRhIGV4cG9zdXJlXG4gICAqIFxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBzYW5pdGl6ZVxuICAgKiBAcmV0dXJucyBFbXB0eSBzdHJpbmcgaWYgaW52YWxpZC9kYW5nZXJvdXMsIG9yaWdpbmFsIFVSTCBpZiBzYWZlXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIENoZWNrIFVSTCBsZW5ndGhcbiAgICBpZiAodXJsLmxlbmd0aCA+IHRoaXMudXJsTWF4TGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ3VybF90b29fbG9uZycsIHsgXG4gICAgICAgIGxlbmd0aDogdXJsLmxlbmd0aCwgXG4gICAgICAgIG1heExlbmd0aDogdGhpcy51cmxNYXhMZW5ndGgsXG4gICAgICAgIHVybFByZWZpeDogdXJsLnN1YnN0cmluZygwLCA1MCkgKyAnLi4uJyAgLy8gT25seSBsb2cgZmlyc3QgNTAgY2hhcnNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICcnOyAgLy8gVVJMIHRvbyBsb25nXG4gICAgfVxuICAgIFxuICAgIC8vIE9ubHkgYWxsb3cgaHR0cCBhbmQgaHR0cHMgc2NoZW1lc1xuICAgIGNvbnN0IGFsbG93ZWRTY2hlbWVzID0gWydodHRwOicsICdodHRwczonXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgaWYgKCFhbGxvd2VkU2NoZW1lcy5pbmNsdWRlcyhwYXJzZWQucHJvdG9jb2wpKSB7XG4gICAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnZGFuZ2Vyb3VzX3VybF9zY2hlbWUnLCB7IFxuICAgICAgICAgIHNjaGVtZTogcGFyc2VkLnByb3RvY29sLFxuICAgICAgICAgIGhvc3Q6IHBhcnNlZC5ob3N0bmFtZSAgLy8gTG9nIG9ubHkgaG9zdG5hbWUsIG5vdCBmdWxsIFVSTFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICcnOyAgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBmb3IgZGFuZ2Vyb3VzIHNjaGVtZXNcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ2ludmFsaWRfdXJsJywgeyBcbiAgICAgICAgdXJsTGVuZ3RoOiB1cmwubGVuZ3RoICAvLyBMb2cgbGVuZ3RoIG9ubHksIG5vdCBjb250ZW50XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAnJzsgIC8vIEludmFsaWQgVVJMXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgcmVsZWFzZSBub3RlcyB0byBwcmV2ZW50IFhTUywgY29tbWFuZCBpbmplY3Rpb24sIGFuZCBEb1NcbiAgICogXG4gICAqIFNlY3VyaXR5IGxheWVyczpcbiAgICogMS4gTGVuZ3RoIGxpbWl0aW5nIChjb25maWd1cmFibGUsIGRlZmF1bHQgNTAwMCBjaGFycylcbiAgICogMi4gSFRNTC9KUyBzYW5pdGl6YXRpb24gdmlhIERPTVB1cmlmeSAobm8gdGFncy9hdHRyaWJ1dGVzIGFsbG93ZWQpXG4gICAqIDMuIENvbW1hbmQgaW5qZWN0aW9uIHBhdHRlcm4gcmVtb3ZhbCAoYmFja3RpY2tzLCBjb21tYW5kIHN1YnN0aXR1dGlvbilcbiAgICogNC4gT1dBU1AgcGF0dGVybiByZW1vdmFsIChQSFAsIEFTUCwgaGV4L3VuaWNvZGUvb2N0YWwgZXNjYXBlcylcbiAgICogXG4gICAqIEBwYXJhbSBub3RlcyAtIFRoZSByZWxlYXNlIG5vdGVzIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCByZWxlYXNlIG5vdGVzIHNhZmUgZm9yIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVSZWxlYXNlTm90ZXMobm90ZXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFub3RlcykgcmV0dXJuICdTZWUgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWInO1xuICAgIFxuICAgIC8vIEZpcnN0LCBub3JtYWxpemUgVW5pY29kZSB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5vdGVzKTtcbiAgICBsZXQgc2FuaXRpemVkID0gdW5pY29kZVJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICBpZiAodW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3VlcyAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgndW5pY29kZV9pc3N1ZXNfaW5fcmVsZWFzZV9ub3RlcycsIHtcbiAgICAgICAgaXNzdWVzOiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLFxuICAgICAgICBzZXZlcml0eTogdW5pY29kZVJlc3VsdC5zZXZlcml0eVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGxlbmd0aCBsaW1pdFxuICAgIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgncmVsZWFzZV9ub3Rlc190cnVuY2F0ZWQnLCB7IFxuICAgICAgICBvcmlnaW5hbExlbmd0aDogc2FuaXRpemVkLmxlbmd0aCwgXG4gICAgICAgIG1heExlbmd0aDogdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggXG4gICAgICB9KTtcbiAgICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgdGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGgpICsgJy4uLic7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBjYWNoZWQgRE9NUHVyaWZ5IGluc3RhbmNlIHdpdGggYXV0b21hdGljIHJlY292ZXJ5XG4gICAgaWYgKCFVcGRhdGVDaGVja2VyLnB1cmlmeSB8fCAhVXBkYXRlQ2hlY2tlci5wdXJpZnlXaW5kb3cpIHtcbiAgICAgIC8vIFJlaW5pdGlhbGl6ZSBpZiBzb21laG93IGNvcnJ1cHRlZCAtIHByb3ZpZGVzIHJlc2lsaWVuY2VcbiAgICAgIGNvbnN0IGRvbSA9IG5ldyBKU0RPTSgnJyk7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyA9IGRvbS53aW5kb3c7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeSA9IERPTVB1cmlmeShVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJlZm9yZVNhbml0aXplID0gc2FuaXRpemVkO1xuICAgIC8vIERPTVB1cmlmeSBjb25maWd1cmF0aW9uIGZvciBtYXhpbXVtIHNlY3VyaXR5XG4gICAgLy8gQUxMT1dFRF9UQUdTOiBbXSBzdHJpcHMgYWxsIEhUTUwgdGFnc1xuICAgIC8vIEFMTE9XRURfQVRUUjogW10gc3RyaXBzIGFsbCBhdHRyaWJ1dGVzXG4gICAgLy8gQWRkaXRpb25hbCBvcHRpb25zIGZvciBleHRyYSBzZWN1cml0eVxuICAgIHNhbml0aXplZCA9IFVwZGF0ZUNoZWNrZXIucHVyaWZ5LnNhbml0aXplKHNhbml0aXplZCwgeyBcbiAgICAgIEFMTE9XRURfVEFHUzogW10sICAgICAgLy8gU3RyaXAgYWxsIEhUTUwgdGFnc1xuICAgICAgQUxMT1dFRF9BVFRSOiBbXSwgICAgICAvLyBTdHJpcCBhbGwgYXR0cmlidXRlc1xuICAgICAgRk9SQklEX1RBR1M6IFsnc3R5bGUnLCAnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnbGluayddLFxuICAgICAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlciddXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKGJlZm9yZVNhbml0aXplICE9PSBzYW5pdGl6ZWQpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnaHRtbF9jb250ZW50X3JlbW92ZWQnLCB7IFxuICAgICAgICByZW1vdmVkTGVuZ3RoOiBiZWZvcmVTYW5pdGl6ZS5sZW5ndGggLSBzYW5pdGl6ZWQubGVuZ3RoIFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgc2FuaXRpemF0aW9uIGZvciBjb21tYW5kIGluamVjdGlvbiBwYXR0ZXJuc1xuICAgIC8vIFNpbmdsZS1wYXNzIHByb2Nlc3NpbmcgZm9yIHBlcmZvcm1hbmNlIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgLy8gVGhlc2UgcGF0dGVybnMgY292ZXIgdmFyaW91cyBpbmplY3Rpb24gdmVjdG9ycyBiZXlvbmQgSFRNTC9KU1xuICAgIC8vIExlbmd0aCBsaW1pdHMgYWRkZWQgdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gICAgY29uc3QgcGF0dGVybnMgPSBbXG4gICAgICAvYFteYF17MCwxMDAwfWAvZywgICAgICAgICAgIC8vIEJhY2t0aWNrIGV4cHJlc3Npb25zIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFwkXFwoW14pXXswLDEwMDB9XFwpL2csICAgICAgIC8vIENvbW1hbmQgc3Vic3RpdHV0aW9uIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFwkXFx7W159XXswLDEwMDB9XFx9L2csICAgICAgIC8vIFZhcmlhYmxlIGV4cGFuc2lvbiAobGltaXRlZCB0byAxMDAwIGNoYXJzKVxuICAgICAgLzxcXD9bXj5dezAsMTAwMH1cXD8+L2csICAgICAgIC8vIFBIUCB0YWdzIChPV0FTUCkgKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC8mbHQ7JVtePl17MCwxMDAwfSUmZ3Q7L2csICAgLy8gQVNQIHRhZ3MgKEhUTUwtZW5jb2RlZCBieSBET01QdXJpZnkpIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvPCVbXj5dezAsMTAwMH0lPi9nLCAgICAgICAgIC8vIEFTUCB0YWdzIChyYXcpIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS9nLCAgICAgICAgLy8gSGV4IGVzY2FwZXMgKE9XQVNQKSAtIGFscmVhZHkgbGltaXRlZCBieSB7Mn1cbiAgICAgIC9cXFxcdVswLTlhLWZBLUZdezR9L2csICAgICAgICAvLyBVbmljb2RlIGVzY2FwZXMgLSBhbHJlYWR5IGxpbWl0ZWQgYnkgezR9XG4gICAgICAvXFxcXFswLTddezEsM30vZyAgICAgICAgICAgICAgLy8gT2N0YWwgZXNjYXBlcyAtIGFscmVhZHkgbGltaXRlZCBieSB7MSwzfVxuICAgIF07XG4gICAgXG4gICAgY29uc3QgYmVmb3JlUGF0dGVybnMgPSBzYW5pdGl6ZWQ7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnJyk7XG4gICAgfVxuICAgIFxuICAgIGlmIChiZWZvcmVQYXR0ZXJucyAhPT0gc2FuaXRpemVkKSB7XG4gICAgICB0aGlzLmxvZ1NlY3VyaXR5RXZlbnQoJ2luamVjdGlvbl9wYXR0ZXJuc19yZW1vdmVkJywgeyBcbiAgICAgICAgcmVtb3ZlZExlbmd0aDogYmVmb3JlUGF0dGVybnMubGVuZ3RoIC0gc2FuaXRpemVkLmxlbmd0aCBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IGRhdGUgdG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0IHdpdGggY29uc2lzdGVudCB0aW1lem9uZSBoYW5kbGluZ1xuICAgKiBAcGFyYW0gZGF0ZVN0ciAtIElTTyBkYXRlIHN0cmluZyB0byBmb3JtYXRcbiAgICogQHJldHVybnMgSHVtYW4tcmVhZGFibGUgZGF0ZSBzdHJpbmcgKGUuZy4sIFwiSmFudWFyeSA1LCAyMDI1XCIpXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZVN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHIpO1xuICAgICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICByZXR1cm4gZGF0ZVN0cjsgIC8vIFJldHVybiBvcmlnaW5hbCBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBVVEMgbWV0aG9kcyB0byBlbnN1cmUgY29uc2lzdGVudCB0aW1lem9uZSBoYW5kbGluZ1xuICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgdGltZVpvbmU6ICdVVEMnICAvLyBFbnN1cmUgY29uc2lzdGVudCB0aW1lem9uZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGF0ZVN0cjsgIC8vIFJldHVybiBvcmlnaW5hbCBvbiBlcnJvclxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIExvZyBzZWN1cml0eSBldmVudHMgZm9yIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nXG4gICAqIE9ubHkgbG9ncyBpZiBzZWN1cml0eUxvZ2dlciBjYWxsYmFjayB3YXMgcHJvdmlkZWQgaW4gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHNlY3VyaXR5IGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgLSBFdmVudCBkZXRhaWxzIChzYW5pdGl6ZWQgdG8gcHJldmVudCBpbmZvIGRpc2Nsb3N1cmUpXG4gICAqL1xuICBwcml2YXRlIGxvZ1NlY3VyaXR5RXZlbnQoZXZlbnQ6IHN0cmluZywgZGV0YWlsczogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdXJpdHlMb2dnZXIpIHtcbiAgICAgIHRoaXMuc2VjdXJpdHlMb2dnZXIoZXZlbnQsIGRldGFpbHMpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyBET01QdXJpZnkgY2FjaGUgKHVzZWZ1bCBmb3IgbG9uZy1ydW5uaW5nIHByb2Nlc3NlcylcbiAgICogVGhpcyBwcmV2ZW50cyBtZW1vcnkgYWNjdW11bGF0aW9uIGluIHNlcnZpY2VzIHRoYXQgcnVuIGZvciBleHRlbmRlZCBwZXJpb2RzXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRDYWNoZSgpOiB2b2lkIHtcbiAgICBVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyA9IG51bGw7XG4gICAgVXBkYXRlQ2hlY2tlci5wdXJpZnkgPSBudWxsO1xuICB9XG59Il19
506
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlQ2hlY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cGRhdGUvVXBkYXRlQ2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWlCOUUsTUFBTSxPQUFPLGFBQWE7SUFDaEIsY0FBYyxDQUFpQjtJQUMvQixXQUFXLENBQWM7SUFDekIsaUJBQWlCLENBQW9CO0lBRTdDLG9EQUFvRDtJQUNwRCxnRUFBZ0U7SUFDaEUsa0RBQWtEO0lBQzFDLE1BQU0sQ0FBQyxZQUFZLEdBQVEsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQTZCLElBQUksQ0FBQztJQUV2RDs7O09BR0c7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxhQUFhLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFakMsSUFBSSxDQUFDO1lBQ0gsMENBQTBDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLGFBQWEsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUN4QyxhQUFhLENBQUMsTUFBTSxHQUFH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QUFLLENBQUUsNkJBQTZCO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLE9BQU8sQ0FBQyxDQUFFLDJCQUEyQjtRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQVk7UUFDbEQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVU7UUFDdEIsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDbEMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXBkYXRlQ2hlY2tlciAtIFNlY3VyZSBHaXRIdWIgcmVsZWFzZSB1cGRhdGUgY2hlY2tpbmcgd2l0aCBjb21wcmVoZW5zaXZlIHNhbml0aXphdGlvblxuICogXG4gKiBTZWN1cml0eSBtZWFzdXJlcyBpbXBsZW1lbnRlZDpcbiAqIDEuIFhTUyBQcm90ZWN0aW9uOiBET01QdXJpZnkgd2l0aCBzdHJpY3Qgbm8tdGFncy9uby1hdHRyaWJ1dGVzIHBvbGljeVxuICogMi4gQ29tbWFuZCBJbmplY3Rpb24gUHJldmVudGlvbjogTXVsdGlwbGUgcmVnZXggcGF0dGVybnMgZm9yIHZhcmlvdXMgZXNjYXBlIHNlcXVlbmNlc1xuICogMy4gVVJMIFZhbGlkYXRpb246IFdoaXRlbGlzdCBhcHByb2FjaCBhbGxvd2luZyBvbmx5IGh0dHAvaHR0cHMgc2NoZW1lc1xuICogNC4gSW5mb3JtYXRpb24gRGlzY2xvc3VyZSBQcmV2ZW50aW9uOiBTYW5pdGl6ZWQgbG9nZ2luZyBvZiBzZW5zaXRpdmUgZGF0YVxuICogNS4gTGVuZ3RoIExpbWl0czogQ29uZmlndXJhYmxlIGxpbWl0cyB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gKiA2LiBPV0FTUCBQYXR0ZXJuczogUHJvdGVjdGlvbiBhZ2FpbnN0IFBIUCwgQVNQLCBoZXgsIHVuaWNvZGUsIGFuZCBvY3RhbCBlc2NhcGVzXG4gKiBcbiAqIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnM6XG4gKiAtIENhY2hlZCBET01QdXJpZnkgaW5zdGFuY2UgdG8gYXZvaWQgcmVjcmVhdGlvbiBvdmVyaGVhZFxuICogLSBTaW5nbGUtcGFzcyByZWdleCBwcm9jZXNzaW5nIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAqIC0gRXhwb25lbnRpYWwgYmFja29mZiBmb3IgbmV0d29yayByZXRyaWVzXG4gKi9cblxuaW1wb3J0IHsgUkVMRUFTRVNfQVBJX1VSTCB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVmVyc2lvbk1hbmFnZXIgfSBmcm9tICcuL1ZlcnNpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyLCBSYXRlTGltaXRlckZhY3RvcnkgfSBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFNpZ25hdHVyZVZlcmlmaWVyIH0gZnJvbSAnLi9TaWduYXR1cmVWZXJpZmllci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoZWNrUmVzdWx0IHtcbiAgY3VycmVudFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBpc1VwZGF0ZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgcmVsZWFzZURhdGU6IHN0cmluZztcbiAgcmVsZWFzZU5vdGVzOiBzdHJpbmc7XG4gIHJlbGVhc2VVcmw6IHN0cmluZztcbiAgdGFnTmFtZT86IHN0cmluZztcbiAgc2lnbmF0dXJlVmVyaWZpZWQ/OiBib29sZWFuO1xuICBzaWduZXJJbmZvPzogc3RyaW5nO1xufVxuXG4vLyBUeXBlIGRlY2xhcmF0aW9ucyBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG50eXBlIERPTVB1cmlmeUluc3RhbmNlID0gUmV0dXJuVHlwZTx0eXBlb2YgRE9NUHVyaWZ5PjtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUNoZWNrZXIge1xuICBwcml2YXRlIHZlcnNpb25NYW5hZ2VyOiBWZXJzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSByYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIHByaXZhdGUgc2lnbmF0dXJlVmVyaWZpZXI6IFNpZ25hdHVyZVZlcmlmaWVyO1xuICBcbiAgLy8gU3RhdGljIGNhY2hlIGZvciBET01QdXJpZnkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAvLyBXZSB1c2UgJ2FueScgZm9yIEpTRE9NIHdpbmRvdyB0byBhdm9pZCBjb21wbGV4IHR5cGUgY29uZmxpY3RzXG4gIC8vIGJ1dCBtYWludGFpbiB0eXBlIHNhZmV0eSBmb3IgRE9NUHVyaWZ5IGluc3RhbmNlXG4gIHByaXZhdGUgc3RhdGljIHB1cmlmeVdpbmRvdzogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcHVyaWZ5OiBET01QdXJpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuICBcbiAgLyoqXG4gICAqIExhemlseSBpbml0aWFsaXplIERPTVB1cmlmeSB0byBwcmV2ZW50IGNyYXNoZXMgZHVyaW5nIHN0YXJ0dXBcbiAgICogQ1JJVElDQUwgRklYOiBQcmV2ZW50cyBqc2RvbSBmcm9tIGNyYXNoaW5nIGR1cmluZyBNQ1AgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURPTVB1cmlmeSgpOiB2b2lkIHtcbiAgICBpZiAoVXBkYXRlQ2hlY2tlci5wdXJpZnkpIHJldHVybjtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gTGF6eSBsb2FkIGRlcGVuZGVuY2llcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICBjb25zdCBET01QdXJpZnkgPSByZXF1aXJlKCdkb21wdXJpZnknKTtcbiAgICAgIGNvbnN0IHsgSlNET00gfSA9IHJlcXVpcmUoJ2pzZG9tJyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGRvbSA9IG5ldyBKU0RPTSgnJyk7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyA9IGRvbS53aW5kb3c7XG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeSA9IERPTVB1cmlmeShVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdyk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdbVXBkYXRlQ2hlY2tlcl0gRE9NUHVyaWZ5IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBET01QdXJpZnk6JywgZXJyb3IpO1xuICAgICAgLy8gQ29udGludWUgd2l0aG91dCBIVE1MIHNhbml0aXphdGlvbiAtIGJldHRlciB0aGFuIGNyYXNoaW5nXG4gICAgICBVcGRhdGVDaGVja2VyLnB1cmlmeSA9IHtcbiAgICAgICAgc2FuaXRpemU6IChzdHI6IHN0cmluZykgPT4ge1xuICAgICAgICAgIC8vIEJhc2ljIGZhbGxiYWNrIHNhbml0aXphdGlvbiAtIGVzY2FwZSBIVE1MIGVudGl0aWVzXG4gICAgICAgICAgLy8gVGhpcyBpcyBzYWZlciB0aGFuIHRyeWluZyB0byByZW1vdmUgdGFncyB3aXRoIHJlZ2V4XG4gICAgICAgICAgcmV0dXJuIHN0clxuICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKTtcbiAgICAgICAgfVxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIFxuICAvLyBTZWN1cml0eSBjb25maWd1cmF0aW9uIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgcHJpdmF0ZSByZWFkb25seSByZWxlYXNlTm90ZXNNYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxNYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWN1cml0eUxvZ2dlcj86IChldmVudDogc3RyaW5nLCBkZXRhaWxzOiBhbnkpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWlyZVNpZ25lZFJlbGVhc2VzOiBib29sZWFuO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgdmVyc2lvbk1hbmFnZXI6IFZlcnNpb25NYW5hZ2VyLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICByZWxlYXNlTm90ZXNNYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgICB1cmxNYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgICBzZWN1cml0eUxvZ2dlcj86IChldmVudDogc3RyaW5nLCBkZXRhaWxzOiBhbnkpID0+IHZvaWQ7XG4gICAgICByYXRlTGltaXRlcj86IFJhdGVMaW1pdGVyO1xuICAgICAgc2lnbmF0dXJlVmVyaWZpZXI/OiBTaWduYXR1cmVWZXJpZmllcjtcbiAgICAgIHJlcXVpcmVTaWduZWRSZWxlYXNlcz86IGJvb2xlYW47XG4gICAgfVxuICApIHtcbiAgICBpZiAoIXZlcnNpb25NYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb25NYW5hZ2VyIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIHRoaXMudmVyc2lvbk1hbmFnZXIgPSB2ZXJzaW9uTWFuYWdlcjtcbiAgICBcbiAgICAvLyBBcHBseSBvcHRpb25zIHdpdGggZGVmYXVsdHMgYW5kIHZhbGlkYXRpb25cbiAgICB0aGlzLnJlbGVhc2VOb3Rlc01heExlbmd0aCA9IG9wdGlvbnM/LnJlbGVhc2VOb3Rlc01heExlbmd0aCA/PyA1MDAwO1xuICAgIHRoaXMudXJsTWF4TGVuZ3RoID0gb3B0aW9ucz8udXJsTWF4TGVuZ3RoID8/IDIwNDg7XG4gICAgdGhpcy5zZWN1cml0eUxvZ2dlciA9IG9wdGlvbnM/LnNlY3VyaXR5TG9nZ2VyO1xuICAgIFxuICAgIC8vIFVzZSBwcm92aWRlZCByYXRlIGxpbWl0ZXIgb3IgY3JlYXRlIGRlZmF1bHRcbiAgICB0aGlzLnJhdGVMaW1pdGVyID0gb3B0aW9ucz8ucmF0ZUxpbWl0ZXIgfHwgUmF0ZUxpbWl0ZXJGYWN0b3J5LmNyZWF0ZVVwZGF0ZUNoZWNrTGltaXRlcigpO1xuICAgIFxuICAgIC8vIERldGVybWluZSBpZiB3ZSdyZSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkNJID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFwcm9jZXNzLmVudi5BTExPV19VTlNJR05FRF9SRUxFQVNFUztcbiAgICBcbiAgICAvLyBVc2UgcHJvdmlkZWQgc2lnbmF0dXJlIHZlcmlmaWVyIG9yIGNyZWF0ZSBkZWZhdWx0XG4gICAgdGhpcy5zaWduYXR1cmVWZXJpZmllciA9IG9wdGlvbnM/LnNpZ25hdHVyZVZlcmlmaWVyIHx8IG5ldyBTaWduYXR1cmVWZXJpZmllcih7XG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCB3ZSBzaG91bGQgcmVxdWlyZSBzaWduZWQgcmVsZWFzZXNcbiAgICAgIGFsbG93VW5zaWduZWRJbkRldjogIWlzUHJvZHVjdGlvblxuICAgIH0pO1xuICAgIFxuICAgIC8vIFdoZXRoZXIgdG8gcmVxdWlyZSBzaWduZWQgcmVsZWFzZXMgKGRlZmF1bHQ6IHRydWUgaW4gcHJvZHVjdGlvbilcbiAgICB0aGlzLnJlcXVpcmVTaWduZWRSZWxlYXNlcyA9IG9wdGlvbnM/LnJlcXVpcmVTaWduZWRSZWxlYXNlcyA/PyBpc1Byb2R1Y3Rpb247XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvbiBmb3Igc2VjdXJpdHlcbiAgICBpZiAodGhpcy5yZWxlYXNlTm90ZXNNYXhMZW5ndGggPCAxMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVsZWFzZU5vdGVzTWF4TGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMTAwIGNoYXJhY3RlcnMgZm9yIHNlY3VyaXR5Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVybE1heExlbmd0aCA8IDUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VybE1heExlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDUwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBjYWNoZWQgRE9NUHVyaWZ5IGluc3RhbmNlIGZvciBwZXJmb3JtYW5jZVxuICAgIC8vIFRoaXMgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IEpTRE9NIHdpbmRvdyBmb3IgZWFjaCBzYW5pdGl6YXRpb25cbiAgICBpZiAoIVVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93KSB7XG4gICAgICBjb25zdCBkb20gPSBuZXcgSlNET00oJycpO1xuICAgICAgVXBkYXRlQ2hlY2tlci5wdXJpZnlXaW5kb3cgPSBkb20ud2luZG93O1xuICAgICAgLy8gRE9NUHVyaWZ5IGV4cGVjdHMgYSBXaW5kb3ctbGlrZSBvYmplY3QgZnJvbSBKU0RPTVxuICAgICAgVXBkYXRlQ2hlY2tlci5wdXJpZnkgPSBET01QdXJpZnkoVXBkYXRlQ2hlY2tlci5wdXJpZnlXaW5kb3cpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBuZXR3b3JrIG9wZXJhdGlvbiB3aXRoIHJldHJ5IGxvZ2ljIGFuZCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgYXN5bmMgb3BlcmF0aW9uIHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIG1heFJldHJpZXMgLSBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyAoZGVmYXVsdDogMylcbiAgICogQHBhcmFtIGJhc2VEZWxheSAtIEJhc2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGZvciBleHBvbmVudGlhbCBiYWNrb2ZmIChkZWZhdWx0OiAxMDAwbXMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBvcGVyYXRpb24gcmVzdWx0XG4gICAqIEB0aHJvd3MgVGhlIGxhc3QgZXJyb3IgaWYgYWxsIHJldHJpZXMgZmFpbFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXRyeU5ldHdvcmtPcGVyYXRpb248VD4oXG4gICAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LCBcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSAzLFxuICAgIGJhc2VEZWxheTogbnVtYmVyID0gMTAwMFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvcjtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBvcGVyYXRpb24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgcmV0cnkgb24gdGhlIGxhc3QgYXR0ZW1wdFxuICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gbWF4UmV0cmllcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBEb24ndCByZXRyeSBjZXJ0YWluIGVycm9ycyAobGlrZSA0MDQsIDQwMSlcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnNDA0JykpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRlbGF5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheSAqIE1hdGgucG93KDIsIGF0dGVtcHQpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhyb3cgbGFzdEVycm9yITtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGZvciB1cGRhdGVzIGZyb20gR2l0SHViIHJlbGVhc2VzIHdpdGggc2VjdXJpdHkgYW5kIGVycm9yIGhhbmRsaW5nXG4gICAqIEByZXR1cm5zIFVwZGF0ZUNoZWNrUmVzdWx0IGlmIHVwZGF0ZSBpbmZvIGlzIGF2YWlsYWJsZSwgbnVsbCBpZiBubyByZWxlYXNlcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGZvciBuZXR3b3JrIG9yIEFQSSBmYWlsdXJlcyBvciByYXRlIGxpbWl0IGV4Y2VlZGVkXG4gICAqL1xuICBhc3luYyBjaGVja0ZvclVwZGF0ZXMoKTogUHJvbWlzZTxVcGRhdGVDaGVja1Jlc3VsdCB8IG51bGw+IHtcbiAgICAvLyBDaGVjayByYXRlIGxpbWl0IGJlZm9yZSBtYWtpbmcgQVBJIHJlcXVlc3RcbiAgICBjb25zdCByYXRlTGltaXRTdGF0dXMgPSB0aGlzLnJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICBpZiAoIXJhdGVMaW1pdFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICBjb25zdCB3YWl0VGltZSA9IE1hdGguY2VpbChyYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zISAvIDEwMDApO1xuICAgICAgY29uc3Qgd2FpdE1pbnV0ZXMgPSBNYXRoLmZsb29yKHdhaXRUaW1lIC8gNjApO1xuICAgICAgY29uc3Qgd2FpdFNlY29uZHMgPSB3YWl0VGltZSAlIDYwO1xuICAgICAgXG4gICAgICBjb25zdCB0aW1lU3RyID0gd2FpdE1pbnV0ZXMgPiAwIFxuICAgICAgICA/IGAke3dhaXRNaW51dGVzfSBtaW51dGUke3dhaXRNaW51dGVzID4gMSA/ICdzJyA6ICcnfSAke3dhaXRTZWNvbmRzfSBzZWNvbmQke3dhaXRTZWNvbmRzICE9PSAxID8gJ3MnIDogJyd9YFxuICAgICAgICA6IGAke3dhaXRTZWNvbmRzfSBzZWNvbmQke3dhaXRTZWNvbmRzICE9PSAxID8gJ3MnIDogJyd9YDtcbiAgICAgIFxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHdhaXQgJHt0aW1lU3RyfSBiZWZvcmUgY2hlY2tpbmcgZm9yIHVwZGF0ZXMgYWdhaW4uIGAgK1xuICAgICAgICBgKCR7cmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc30gcmVxdWVzdHMgcmVtYWluaW5nLCByZXNldHMgYXQgJHtyYXRlTGltaXRTdGF0dXMucmVzZXRUaW1lLnRvTG9jYWxlVGltZVN0cmluZygpfSlgXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25zdW1lIGEgcmF0ZSBsaW1pdCB0b2tlblxuICAgIHRoaXMucmF0ZUxpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG4gICAgXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBhd2FpdCB0aGlzLnZlcnNpb25NYW5hZ2VyLmdldEN1cnJlbnRWZXJzaW9uKCk7XG4gICAgXG4gICAgLy8gQ2hlY2sgR2l0SHViIHJlbGVhc2VzIEFQSSBmb3IgbGF0ZXN0IHZlcnNpb24gd2l0aCByZXRyeSBsb2dpY1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXRyeU5ldHdvcmtPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAxMDAwMCk7IC8vIDEwIHNlY29uZCB0aW1lb3V0XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goUkVMRUFTRVNfQVBJX1VSTCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHJlbGVhc2VzIGZvdW5kXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlbGVhc2VEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSByZWxlYXNlRGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gdGFnTmFtZT8ucmVwbGFjZSgvXnYvLCAnJykgfHwgcmVsZWFzZURhdGEubmFtZTtcbiAgICAvLyBVc2UgY29uc2lzdGVudCBkYXRlIGZvcm1hdHRpbmcgbWV0aG9kXG4gICAgY29uc3QgcHVibGlzaGVkQXQgPSByZWxlYXNlRGF0YS5wdWJsaXNoZWRfYXQ7XG4gICAgXG4gICAgLy8gQ29tcGFyZSB2ZXJzaW9uc1xuICAgIGNvbnN0IGlzVXBkYXRlQXZhaWxhYmxlID0gdGhpcy52ZXJzaW9uTWFuYWdlci5jb21wYXJlVmVyc2lvbnMoY3VycmVudFZlcnNpb24sIGxhdGVzdFZlcnNpb24pIDwgMDtcbiAgICBcbiAgICBjb25zdCByZWxlYXNlTm90ZXMgPSByZWxlYXNlRGF0YS5ib2R5IHx8ICdTZWUgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWInO1xuICAgIFxuICAgIC8vIFZlcmlmeSByZWxlYXNlIHNpZ25hdHVyZSBpZiB3ZSBoYXZlIGEgdGFnXG4gICAgbGV0IHNpZ25hdHVyZVZlcmlmaWVkID0gZmFsc2U7XG4gICAgbGV0IHNpZ25lckluZm86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBcbiAgICBpZiAodGFnTmFtZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5zaWduYXR1cmVWZXJpZmllci52ZXJpZnlUYWdTaWduYXR1cmUodGFnTmFtZSk7XG4gICAgICAgIHNpZ25hdHVyZVZlcmlmaWVkID0gdmVyaWZpY2F0aW9uUmVzdWx0LnZlcmlmaWVkO1xuICAgICAgICBcbiAgICAgICAgaWYgKHZlcmlmaWNhdGlvblJlc3VsdC5zaWduZXJFbWFpbCkge1xuICAgICAgICAgIHNpZ25lckluZm8gPSB2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyRW1haWw7XG4gICAgICAgICAgaWYgKHZlcmlmaWNhdGlvblJlc3VsdC5zaWduZXJLZXkpIHtcbiAgICAgICAgICAgIHNpZ25lckluZm8gKz0gYCAoJHt2ZXJpZmljYXRpb25SZXN1bHQuc2lnbmVyS2V5fSlgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTG9nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbiAgICAgICAgaWYgKHRoaXMuc2VjdXJpdHlMb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLnNlY3VyaXR5TG9nZ2VyKCdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJywge1xuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIHZlcmlmaWVkOiBzaWduYXR1cmVWZXJpZmllZCxcbiAgICAgICAgICAgIHNpZ25lcktleTogdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25lcktleSxcbiAgICAgICAgICAgIGVycm9yOiB2ZXJpZmljYXRpb25SZXN1bHQuZXJyb3JcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZCBhbmQgZmFpbGVkLCB0aHJvdyBlcnJvclxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlU2lnbmVkUmVsZWFzZXMgJiYgIXNpZ25hdHVyZVZlcmlmaWVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFJlbGVhc2Ugc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICR7dmVyaWZpY2F0aW9uUmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJ30uIGAgK1xuICAgICAgICAgICAgJ09ubHkgc2lnbmVkIHJlbGVhc2VzIGFyZSBhY2NlcHRlZCBpbiBwcm9kdWN0aW9uIG1vZGUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHdlIGNhbid0IHZlcmlmeSB0aGUgc2lnbmF0dXJlIGFuZCBpdCdzIHJlcXVpcmVkLCBmYWlsXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVTaWduZWRSZWxlYXNlcykge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgbG9nIGFuZCBjb250aW51ZVxuICAgICAgICBpZiAodGhpcy5zZWN1cml0eUxvZ2dlcikge1xuICAgICAgICAgIHRoaXMuc2VjdXJpdHlMb2dnZXIoJ3NpZ25hdHVyZV92ZXJpZmljYXRpb25fZXJyb3InLCB7XG4gICAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmVyc2lvbixcbiAgICAgIGxhdGVzdFZlcnNpb24sXG4gICAgICBpc1VwZGF0ZUF2YWlsYWJsZSxcbiAgICAgIHJlbGVhc2VEYXRlOiBwdWJsaXNoZWRBdCwgIC8vIFdpbGwgYmUgZm9ybWF0dGVkIGJ5IGZvcm1hdERhdGUoKSB3aGVuIGRpc3BsYXllZFxuICAgICAgcmVsZWFzZU5vdGVzLFxuICAgICAgcmVsZWFzZVVybDogcmVsZWFzZURhdGEuaHRtbF91cmwsXG4gICAgICB0YWdOYW1lLFxuICAgICAgc2lnbmF0dXJlVmVyaWZpZWQsXG4gICAgICBzaWduZXJJbmZvXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHJhdGUgbGltaXQgc3RhdHVzXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgcmF0ZSBsaW1pdCBzdGF0dXMgaW5jbHVkaW5nIHJlbWFpbmluZyByZXF1ZXN0cyBhbmQgcmVzZXQgdGltZVxuICAgKi9cbiAgZ2V0UmF0ZUxpbWl0U3RhdHVzKCk6IHsgXG4gICAgYWxsb3dlZDogYm9vbGVhbjsgXG4gICAgcmVtYWluaW5nUmVxdWVzdHM6IG51bWJlcjsgXG4gICAgcmVzZXRUaW1lOiBEYXRlO1xuICAgIHdhaXRUaW1lU2Vjb25kcz86IG51bWJlcjtcbiAgfSB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5yYXRlTGltaXRlci5nZXRTdGF0dXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogc3RhdHVzLmFsbG93ZWQsXG4gICAgICByZW1haW5pbmdSZXF1ZXN0czogc3RhdHVzLnJlbWFpbmluZ1Rva2VucyxcbiAgICAgIHJlc2V0VGltZTogc3RhdHVzLnJlc2V0VGltZSxcbiAgICAgIHdhaXRUaW1lU2Vjb25kczogc3RhdHVzLnJldHJ5QWZ0ZXJNcyA/IE1hdGguY2VpbChzdGF0dXMucmV0cnlBZnRlck1zIC8gMTAwMCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IHVwZGF0ZSBjaGVjayByZXN1bHRzIGZvciBkaXNwbGF5IHdpdGggY29tcHJlaGVuc2l2ZSBzYW5pdGl6YXRpb25cbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSB1cGRhdGUgY2hlY2sgcmVzdWx0IHRvIGZvcm1hdFxuICAgKiBAcGFyYW0gZXJyb3IgLSBPcHRpb25hbCBlcnJvciBmcm9tIHVwZGF0ZSBjaGVja1xuICAgKiBAcGFyYW0gcGVyc29uYUluZGljYXRvciAtIE9wdGlvbmFsIHBlcnNvbmEgaW5kaWNhdG9yIHByZWZpeFxuICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIHNhZmUgZm9yIGRpc3BsYXlcbiAgICovXG4gIGZvcm1hdFVwZGF0ZUNoZWNrUmVzdWx0KHJlc3VsdDogVXBkYXRlQ2hlY2tSZXN1bHQgfCBudWxsLCBlcnJvcj86IEVycm9yLCBwZXJzb25hSW5kaWNhdG9yOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPSBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1JhdGVMaW1pdEVycm9yID0gZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdSYXRlIGxpbWl0IGV4Y2VlZGVkJyk7XG4gICAgICBcbiAgICAgIGlmIChpc1JhdGVMaW1pdEVycm9yKSB7XG4gICAgICAgIHJldHVybiBwZXJzb25hSW5kaWNhdG9yICsgXG4gICAgICAgICAgJ+KPsyAqKlJhdGUgTGltaXQgRXhjZWVkZWQqKlxcblxcbicgK1xuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKyAnXFxuXFxuJyArXG4gICAgICAgICAgJyoqV2h5IHRoaXMgaGFwcGVuczoqKlxcbicgK1xuICAgICAgICAgICfigKIgVXBkYXRlIGNoZWNrcyBhcmUgbGltaXRlZCB0byBwcmV2ZW50IEFQSSBhYnVzZVxcbicgK1xuICAgICAgICAgICfigKIgR2l0SHViIEFQSSBoYXMgcmF0ZSBsaW1pdHMgZm9yIGFsbCBhcHBsaWNhdGlvbnNcXG5cXG4nICtcbiAgICAgICAgICAnKipXaGF0IHlvdSBjYW4gZG86KipcXG4nICtcbiAgICAgICAgICAn4oCiIFdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgdGltZSBiZWZvcmUgY2hlY2tpbmcgYWdhaW5cXG4nICtcbiAgICAgICAgICAn4oCiIFVzZSBgZ2V0X3NlcnZlcl9zdGF0dXNgIHRvIHNlZSBjdXJyZW50IHZlcnNpb24gd2l0aG91dCBBUEkgY2FsbHNcXG4nICtcbiAgICAgICAgICAn4oCiIFZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvbWNwLXNlcnZlci9yZWxlYXNlcyBkaXJlY3RseSc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBwZXJzb25hSW5kaWNhdG9yICsgXG4gICAgICAgICfinYwgKipVcGRhdGUgQ2hlY2sgRmFpbGVkKipcXG5cXG4nICtcbiAgICAgICAgJ0Vycm9yOiAnICsgZXJyb3JNZXNzYWdlICsgJ1xcblxcbicgK1xuICAgICAgICAoaXNBYm9ydEVycm9yIFxuICAgICAgICAgID8gJ1RoZSByZXF1ZXN0IHRpbWVkIG91dC4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLidcbiAgICAgICAgICA6ICdUaXBzOlxcbicgK1xuICAgICAgICAgICAgJ+KAoiBDaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb25cXG4nICtcbiAgICAgICAgICAgICfigKIgRW5zdXJlIEdpdEh1Yi5jb20gaXMgYWNjZXNzaWJsZVxcbicgK1xuICAgICAgICAgICAgJ+KAoiBUcnkgcnVubmluZyBgdXBkYXRlX3NlcnZlciB0cnVlYCBmb3IgbWFudWFsIHVwZGF0ZVxcbicgK1xuICAgICAgICAgICAgJ+KAoiBWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvcmVsZWFzZXMnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gJ3Vua25vd24nO1xuICAgICAgcmV0dXJuIHBlcnNvbmFJbmRpY2F0b3IgKyBcbiAgICAgICAgJ/Cfk6YgKipVcGRhdGUgQ2hlY2sgQ29tcGxldGUqKlxcblxcbicgK1xuICAgICAgICAn8J+UhCAqKkN1cnJlbnQgVmVyc2lvbjoqKiAnICsgY3VycmVudFZlcnNpb24gKyAnXFxuJyArXG4gICAgICAgICfwn5OhICoqUmVtb3RlIFN0YXR1czoqKiBObyByZWxlYXNlcyBmb3VuZCBvbiBHaXRIdWJcXG4nICtcbiAgICAgICAgJ+KEue+4jyAqKk5vdGU6KiogVGhpcyBtYXkgYmUgYSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9yIHJlbGVhc2VzIGhhdmVuXFwndCBiZWVuIHB1Ymxpc2hlZCB5ZXQuXFxuXFxuJyArXG4gICAgICAgICcqKk1hbnVhbCBVcGRhdGU6KipcXG4nICtcbiAgICAgICAgJ1VzZSBgdXBkYXRlX3NlcnZlciB0cnVlYCB0byBwdWxsIGxhdGVzdCBjaGFuZ2VzIGZyb20gbWFpbiBicmFuY2guJztcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc3RhdHVzUGFydHMgPSBbXG4gICAgICBwZXJzb25hSW5kaWNhdG9yICsgJ/Cfk6YgKipVcGRhdGUgQ2hlY2sgQ29tcGxldGUqKlxcblxcbicsXG4gICAgICAn8J+UhCAqKkN1cnJlbnQgVmVyc2lvbjoqKiAnICsgcmVzdWx0LmN1cnJlbnRWZXJzaW9uICsgJ1xcbicsXG4gICAgICAn8J+ToSAqKkxhdGVzdCBWZXJzaW9uOioqICcgKyByZXN1bHQubGF0ZXN0VmVyc2lvbiArICdcXG4nLFxuICAgICAgJ/Cfk4UgKipSZWxlYXNlZDoqKiAnICsgdGhpcy5mb3JtYXREYXRlKHJlc3VsdC5yZWxlYXNlRGF0ZSkgKyAnXFxuJ1xuICAgIF07XG4gICAgXG4gICAgLy8gQWRkIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gc3RhdHVzXG4gICAgaWYgKHJlc3VsdC5zaWduYXR1cmVWZXJpZmllZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVzdWx0LnNpZ25hdHVyZVZlcmlmaWVkKSB7XG4gICAgICAgIHN0YXR1c1BhcnRzLnB1c2goJ+KchSAqKlNpZ25hdHVyZToqKiBWZXJpZmllZCcpO1xuICAgICAgICBpZiAocmVzdWx0LnNpZ25lckluZm8pIHtcbiAgICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKGAgYnkgJHtyZXN1bHQuc2lnbmVySW5mb31gKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0dXNQYXJ0cy5wdXNoKCdcXG4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1c1BhcnRzLnB1c2goJ+KaoO+4jyAqKlNpZ25hdHVyZToqKiBOb3QgdmVyaWZpZWRcXG4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdHVzUGFydHMucHVzaCgnXFxuJyk7XG4gICAgXG4gICAgaWYgKHJlc3VsdC5pc1VwZGF0ZUF2YWlsYWJsZSkge1xuICAgICAgc3RhdHVzUGFydHMucHVzaChcbiAgICAgICAgJ+KcqCAqKlVwZGF0ZSBBdmFpbGFibGUhKipcXG5cXG4nLFxuICAgICAgICAnKipXaGF0XFwncyBOZXc6KipcXG4nICsgdGhpcy5zYW5pdGl6ZVJlbGVhc2VOb3RlcyhyZXN1bHQucmVsZWFzZU5vdGVzKSArICdcXG5cXG4nLFxuICAgICAgICAnKipUbyBVcGRhdGU6KipcXG4nLFxuICAgICAgICAn4oCiIFVzZTogYHVwZGF0ZV9zZXJ2ZXIgdHJ1ZWBcXG4nLFxuICAgICAgICAn4oCiIE9yIHZpc2l0OiAnICsgdGhpcy5zYW5pdGl6ZVVybChyZXN1bHQucmVsZWFzZVVybCkgKyAnXFxuXFxuJyxcbiAgICAgICAgJ+KaoO+4jyAqKk5vdGU6KiogVXBkYXRlIHdpbGwgcmVzdGFydCB0aGUgc2VydmVyIGFuZCByZWxvYWQgYWxsIHBlcnNvbmFzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c1BhcnRzLnB1c2goXG4gICAgICAgICfinIUgKipZb3VcXCdyZSBVcCB0byBEYXRlISoqXFxuXFxuJyxcbiAgICAgICAgJ1lvdXIgRG9sbGhvdXNlTUNQIGluc3RhbGxhdGlvbiBpcyBjdXJyZW50LlxcbicsXG4gICAgICAgICdDaGVjayBiYWNrIGxhdGVyIGZvciBuZXcgZmVhdHVyZXMgYW5kIGltcHJvdmVtZW50cy4nXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3RhdHVzUGFydHMuam9pbignJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBVUkxzIHRvIHByZXZlbnQgZGFuZ2Vyb3VzIHNjaGVtZXMgYW5kIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVcbiAgICogXG4gICAqIFNlY3VyaXR5IG1lYXN1cmVzOlxuICAgKiAtIExlbmd0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgRG9TXG4gICAqIC0gV2hpdGVsaXN0IGFwcHJvYWNoOiBvbmx5IGh0dHAvaHR0cHMgYWxsb3dlZFxuICAgKiAtIFNhbml0aXplZCBsb2dnaW5nIHRvIHByZXZlbnQgc2Vuc2l0aXZlIGRhdGEgZXhwb3N1cmVcbiAgICogXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIEVtcHR5IHN0cmluZyBpZiBpbnZhbGlkL2Rhbmdlcm91cywgb3JpZ2luYWwgVVJMIGlmIHNhZmVcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gQ2hlY2sgVVJMIGxlbmd0aFxuICAgIGlmICh1cmwubGVuZ3RoID4gdGhpcy51cmxNYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgndXJsX3Rvb19sb25nJywgeyBcbiAgICAgICAgbGVuZ3RoOiB1cmwubGVuZ3RoLCBcbiAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLnVybE1heExlbmd0aCxcbiAgICAgICAgdXJsUHJlZml4OiB1cmwuc3Vic3RyaW5nKDAsIDUwKSArICcuLi4nICAvLyBPbmx5IGxvZyBmaXJzdCA1MCBjaGFyc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gJyc7ICAvLyBVUkwgdG9vIGxvbmdcbiAgICB9XG4gICAgXG4gICAgLy8gT25seSBhbGxvdyBodHRwIGFuZCBodHRwcyBzY2hlbWVzXG4gICAgY29uc3QgYWxsb3dlZFNjaGVtZXMgPSBbJ2h0dHA6JywgJ2h0dHBzOiddO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgICBpZiAoIWFsbG93ZWRTY2hlbWVzLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgdGhpcy5sb2dTZWN1cml0eUV2ZW50KCdkYW5nZXJvdXNfdXJsX3NjaGVtZScsIHsgXG4gICAgICAgICAgc2NoZW1lOiBwYXJzZWQucHJvdG9jb2wsXG4gICAgICAgICAgaG9zdDogcGFyc2VkLmhvc3RuYW1lICAvLyBMb2cgb25seSBob3N0bmFtZSwgbm90IGZ1bGwgVVJMXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gJyc7ICAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBkYW5nZXJvdXMgc2NoZW1lc1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnaW52YWxpZF91cmwnLCB7IFxuICAgICAgICB1cmxMZW5ndGg6IHVybC5sZW5ndGggIC8vIExvZyBsZW5ndGggb25seSwgbm90IGNvbnRlbnRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICcnOyAgLy8gSW52YWxpZCBVUkxcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSByZWxlYXNlIG5vdGVzIHRvIHByZXZlbnQgWFNTLCBjb21tYW5kIGluamVjdGlvbiwgYW5kIERvU1xuICAgKiBcbiAgICogU2VjdXJpdHkgbGF5ZXJzOlxuICAgKiAxLiBMZW5ndGggbGltaXRpbmcgKGNvbmZpZ3VyYWJsZSwgZGVmYXVsdCA1MDAwIGNoYXJzKVxuICAgKiAyLiBIVE1ML0pTIHNhbml0aXphdGlvbiB2aWEgRE9NUHVyaWZ5IChubyB0YWdzL2F0dHJpYnV0ZXMgYWxsb3dlZClcbiAgICogMy4gQ29tbWFuZCBpbmplY3Rpb24gcGF0dGVybiByZW1vdmFsIChiYWNrdGlja3MsIGNvbW1hbmQgc3Vic3RpdHV0aW9uKVxuICAgKiA0LiBPV0FTUCBwYXR0ZXJuIHJlbW92YWwgKFBIUCwgQVNQLCBoZXgvdW5pY29kZS9vY3RhbCBlc2NhcGVzKVxuICAgKiBcbiAgICogQHBhcmFtIG5vdGVzIC0gVGhlIHJlbGVhc2Ugbm90ZXMgdG8gc2FuaXRpemVcbiAgICogQHJldHVybnMgU2FuaXRpemVkIHJlbGVhc2Ugbm90ZXMgc2FmZSBmb3IgZGlzcGxheVxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZVJlbGVhc2VOb3Rlcyhub3Rlczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5vdGVzKSByZXR1cm4gJ1NlZSByZWxlYXNlIG5vdGVzIG9uIEdpdEh1Yic7XG4gICAgXG4gICAgLy8gRmlyc3QsIG5vcm1hbGl6ZSBVbmljb2RlIHRvIHByZXZlbnQgYnlwYXNzIGF0dGFja3NcbiAgICBjb25zdCB1bmljb2RlUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobm90ZXMpO1xuICAgIGxldCBzYW5pdGl6ZWQgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIGlmICh1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzICYmIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2dTZWN1cml0eUV2ZW50KCd1bmljb2RlX2lzc3Vlc19pbl9yZWxlYXNlX25vdGVzJywge1xuICAgICAgICBpc3N1ZXM6IHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMsXG4gICAgICAgIHNldmVyaXR5OiB1bmljb2RlUmVzdWx0LnNldmVyaXR5XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgbGVuZ3RoIGxpbWl0XG4gICAgaWYgKHNhbml0aXplZC5sZW5ndGggPiB0aGlzLnJlbGVhc2VOb3Rlc01heExlbmd0aCkge1xuICAgICAgdGhpcy5sb2dTZWN1cml0eUV2ZW50KCdyZWxlYXNlX25vdGVzX3RydW5jYXRlZCcsIHsgXG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoOiBzYW5pdGl6ZWQubGVuZ3RoLCBcbiAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLnJlbGVhc2VOb3Rlc01heExlbmd0aCBcbiAgICAgIH0pO1xuICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnN1YnN0cmluZygwLCB0aGlzLnJlbGVhc2VOb3Rlc01heExlbmd0aCkgKyAnLi4uJztcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGNhY2hlZCBET01QdXJpZnkgaW5zdGFuY2Ugd2l0aCBhdXRvbWF0aWMgcmVjb3ZlcnlcbiAgICBpZiAoIVVwZGF0ZUNoZWNrZXIucHVyaWZ5IHx8ICFVcGRhdGVDaGVja2VyLnB1cmlmeVdpbmRvdykge1xuICAgICAgLy8gUmVpbml0aWFsaXplIGlmIHNvbWVob3cgY29ycnVwdGVkIC0gcHJvdmlkZXMgcmVzaWxpZW5jZVxuICAgICAgY29uc3QgZG9tID0gbmV3IEpTRE9NKCcnKTtcbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93ID0gZG9tLndpbmRvdztcbiAgICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5ID0gRE9NUHVyaWZ5KFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93KTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYmVmb3JlU2FuaXRpemUgPSBzYW5pdGl6ZWQ7XG4gICAgXG4gICAgLy8gQ1JJVElDQUwgRklYOiBJbml0aWFsaXplIERPTVB1cmlmeSBsYXppbHkgdG8gcHJldmVudCBzdGFydHVwIGNyYXNoZXNcbiAgICB0aGlzLmluaXRpYWxpemVET01QdXJpZnkoKTtcbiAgICBcbiAgICAvLyBET01QdXJpZnkgY29uZmlndXJhdGlvbiBmb3IgbWF4aW11bSBzZWN1cml0eVxuICAgIC8vIEFMTE9XRURfVEFHUzogW10gc3RyaXBzIGFsbCBIVE1MIHRhZ3NcbiAgICAvLyBBTExPV0VEX0FUVFI6IFtdIHN0cmlwcyBhbGwgYXR0cmlidXRlc1xuICAgIC8vIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgZXh0cmEgc2VjdXJpdHlcbiAgICBpZiAoVXBkYXRlQ2hlY2tlci5wdXJpZnkgJiYgVXBkYXRlQ2hlY2tlci5wdXJpZnkuc2FuaXRpemUpIHtcbiAgICAgIHNhbml0aXplZCA9IFVwZGF0ZUNoZWNrZXIucHVyaWZ5LnNhbml0aXplKHNhbml0aXplZCwgeyBcbiAgICAgICAgQUxMT1dFRF9UQUdTOiBbXSwgICAgICAvLyBTdHJpcCBhbGwgSFRNTCB0YWdzXG4gICAgICAgIEFMTE9XRURfQVRUUjogW10sICAgICAgLy8gU3RyaXAgYWxsIGF0dHJpYnV0ZXNcbiAgICAgICAgRk9SQklEX1RBR1M6IFsnc3R5bGUnLCAnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnbGluayddLFxuICAgICAgICBGT1JCSURfQVRUUjogWydvbmVycm9yJywgJ29ubG9hZCcsICdvbmNsaWNrJywgJ29ubW91c2VvdmVyJ11cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoYmVmb3JlU2FuaXRpemUgIT09IHNhbml0aXplZCkge1xuICAgICAgdGhpcy5sb2dTZWN1cml0eUV2ZW50KCdodG1sX2NvbnRlbnRfcmVtb3ZlZCcsIHsgXG4gICAgICAgIHJlbW92ZWRMZW5ndGg6IGJlZm9yZVNhbml0aXplLmxlbmd0aCAtIHNhbml0aXplZC5sZW5ndGggXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBzYW5pdGl6YXRpb24gZm9yIGNvbW1hbmQgaW5qZWN0aW9uIHBhdHRlcm5zXG4gICAgLy8gU2luZ2xlLXBhc3MgcHJvY2Vzc2luZyBmb3IgcGVyZm9ybWFuY2Ugd2hpbGUgbWFpbnRhaW5pbmcgc2VjdXJpdHlcbiAgICAvLyBUaGVzZSBwYXR0ZXJucyBjb3ZlciB2YXJpb3VzIGluamVjdGlvbiB2ZWN0b3JzIGJleW9uZCBIVE1ML0pTXG4gICAgLy8gTGVuZ3RoIGxpbWl0cyBhZGRlZCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgICBjb25zdCBwYXR0ZXJucyA9IFtcbiAgICAgIC9gW15gXXswLDEwMDB9YC9nLCAgICAgICAgICAgLy8gQmFja3RpY2sgZXhwcmVzc2lvbnMgKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC9cXCRcXChbXildezAsMTAwMH1cXCkvZywgICAgICAgLy8gQ29tbWFuZCBzdWJzdGl0dXRpb24gKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC9cXCRcXHtbXn1dezAsMTAwMH1cXH0vZywgICAgICAgLy8gVmFyaWFibGUgZXhwYW5zaW9uIChsaW1pdGVkIHRvIDEwMDAgY2hhcnMpXG4gICAgICAvPFxcP1tePl17MCwxMDAwfVxcPz4vZywgICAgICAgLy8gUEhQIHRhZ3MgKE9XQVNQKSAobGltaXRlZCB0byAxMDAwIGNoYXJzKVxuICAgICAgLyZsdDslW14+XXswLDEwMDB9JSZndDsvZywgICAvLyBBU1AgdGFncyAoSFRNTC1lbmNvZGVkIGJ5IERPTVB1cmlmeSkgKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC88JVtePl17MCwxMDAwfSU+L2csICAgICAgICAgLy8gQVNQIHRhZ3MgKHJhdykgKGxpbWl0ZWQgdG8gMTAwMCBjaGFycylcbiAgICAgIC9cXFxceFswLTlhLWZBLUZdezJ9L2csICAgICAgICAvLyBIZXggZXNjYXBlcyAoT1dBU1ApIC0gYWxyZWFkeSBsaW1pdGVkIGJ5IHsyfVxuICAgICAgL1xcXFx1WzAtOWEtZkEtRl17NH0vZywgICAgICAgIC8vIFVuaWNvZGUgZXNjYXBlcyAtIGFscmVhZHkgbGltaXRlZCBieSB7NH1cbiAgICAgIC9cXFxcWzAtN117MSwzfS9nICAgICAgICAgICAgICAvLyBPY3RhbCBlc2NhcGVzIC0gYWxyZWFkeSBsaW1pdGVkIGJ5IHsxLDN9XG4gICAgXTtcbiAgICBcbiAgICBjb25zdCBiZWZvcmVQYXR0ZXJucyA9IHNhbml0aXplZDtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5yZXBsYWNlKHBhdHRlcm4sICcnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGJlZm9yZVBhdHRlcm5zICE9PSBzYW5pdGl6ZWQpIHtcbiAgICAgIHRoaXMubG9nU2VjdXJpdHlFdmVudCgnaW5qZWN0aW9uX3BhdHRlcm5zX3JlbW92ZWQnLCB7IFxuICAgICAgICByZW1vdmVkTGVuZ3RoOiBiZWZvcmVQYXR0ZXJucy5sZW5ndGggLSBzYW5pdGl6ZWQubGVuZ3RoIFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgZGF0ZSB0byBodW1hbi1yZWFkYWJsZSBmb3JtYXQgd2l0aCBjb25zaXN0ZW50IHRpbWV6b25lIGhhbmRsaW5nXG4gICAqIEBwYXJhbSBkYXRlU3RyIC0gSVNPIGRhdGUgc3RyaW5nIHRvIGZvcm1hdFxuICAgKiBAcmV0dXJucyBIdW1hbi1yZWFkYWJsZSBkYXRlIHN0cmluZyAoZS5nLiwgXCJKYW51YXJ5IDUsIDIwMjVcIilcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHJldHVybiBkYXRlU3RyOyAgLy8gUmV0dXJuIG9yaWdpbmFsIGlmIGludmFsaWRcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXNlIFVUQyBtZXRob2RzIHRvIGVuc3VyZSBjb25zaXN0ZW50IHRpbWV6b25lIGhhbmRsaW5nXG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB0aW1lWm9uZTogJ1VUQycgIC8vIEVuc3VyZSBjb25zaXN0ZW50IHRpbWV6b25lXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkYXRlU3RyOyAgLy8gUmV0dXJuIG9yaWdpbmFsIG9uIGVycm9yXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogTG9nIHNlY3VyaXR5IGV2ZW50cyBmb3IgbW9uaXRvcmluZyBhbmQgYWxlcnRpbmdcbiAgICogT25seSBsb2dzIGlmIHNlY3VyaXR5TG9nZ2VyIGNhbGxiYWNrIHdhcyBwcm92aWRlZCBpbiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgc2VjdXJpdHkgZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0gZGV0YWlscyAtIEV2ZW50IGRldGFpbHMgKHNhbml0aXplZCB0byBwcmV2ZW50IGluZm8gZGlzY2xvc3VyZSlcbiAgICovXG4gIHByaXZhdGUgbG9nU2VjdXJpdHlFdmVudChldmVudDogc3RyaW5nLCBkZXRhaWxzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWN1cml0eUxvZ2dlcikge1xuICAgICAgdGhpcy5zZWN1cml0eUxvZ2dlcihldmVudCwgZGV0YWlscyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIERPTVB1cmlmeSBjYWNoZSAodXNlZnVsIGZvciBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzKVxuICAgKiBUaGlzIHByZXZlbnRzIG1lbW9yeSBhY2N1bXVsYXRpb24gaW4gc2VydmljZXMgdGhhdCBydW4gZm9yIGV4dGVuZGVkIHBlcmlvZHNcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldENhY2hlKCk6IHZvaWQge1xuICAgIFVwZGF0ZUNoZWNrZXIucHVyaWZ5V2luZG93ID0gbnVsbDtcbiAgICBVcGRhdGVDaGVja2VyLnB1cmlmeSA9IG51bGw7XG4gIH1cbn0iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "1.4.3",
3
+ "version": "1.4.5",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",