UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

153 lines 21.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EVENT_TO_LOGGER = exports.PublishingAws = void 0; exports.publishAssets = publishAssets; exports.buildAssets = buildAssets; const cx_api_1 = require("@aws-cdk/cx-api"); const cdk_assets_1 = require("cdk-assets"); const logging_1 = require("../../logging"); const error_1 = require("../../toolkit/error"); const plugin_1 = require("../plugin"); /** * Use cdk-assets to publish all assets in the given manifest. */ async function publishAssets(manifest, sdk, targetEnv, options) { // This shouldn't really happen (it's a programming error), but we don't have // the types here to guide us. Do an runtime validation to be super super sure. if (targetEnv.account === undefined || targetEnv.account === cx_api_1.UNKNOWN_ACCOUNT || targetEnv.region === undefined || targetEnv.account === cx_api_1.UNKNOWN_REGION) { throw new error_1.ToolkitError(`Asset publishing requires resolved account and region, got ${JSON.stringify(targetEnv)}`); } const publisher = new cdk_assets_1.AssetPublishing(manifest, { aws: new PublishingAws(sdk, targetEnv), progressListener: new PublishingProgressListener(options.quiet ?? false), throwOnError: false, publishInParallel: options.parallel ?? true, buildAssets: options.buildAssets ?? true, publishAssets: true, quiet: options.quiet, }); await publisher.publish({ allowCrossAccount: options.allowCrossAccount }); if (publisher.hasFailures) { throw new error_1.ToolkitError('Failed to publish one or more assets. See the error messages above for more information.'); } } /** * Use cdk-assets to build all assets in the given manifest. */ async function buildAssets(manifest, sdk, targetEnv, options = {}) { // This shouldn't really happen (it's a programming error), but we don't have // the types here to guide us. Do an runtime validation to be super super sure. if (targetEnv.account === undefined || targetEnv.account === cx_api_1.UNKNOWN_ACCOUNT || targetEnv.region === undefined || targetEnv.account === cx_api_1.UNKNOWN_REGION) { throw new error_1.ToolkitError(`Asset building requires resolved account and region, got ${JSON.stringify(targetEnv)}`); } const publisher = new cdk_assets_1.AssetPublishing(manifest, { aws: new PublishingAws(sdk, targetEnv), progressListener: new PublishingProgressListener(options.quiet ?? false), throwOnError: false, publishInParallel: options.parallel ?? true, buildAssets: true, publishAssets: false, }); await publisher.publish(); if (publisher.hasFailures) { throw new error_1.ToolkitError('Failed to build one or more assets. See the error messages above for more information.'); } } class PublishingAws { constructor( /** * The base SDK to work with */ aws, /** * Environment where the stack we're deploying is going */ targetEnv) { this.aws = aws; this.targetEnv = targetEnv; this.sdkCache = new Map(); } async discoverPartition() { return (await this.aws.baseCredentialsPartition(this.targetEnv, plugin_1.Mode.ForWriting)) ?? 'aws'; } async discoverDefaultRegion() { return this.targetEnv.region; } async discoverCurrentAccount() { const account = await this.aws.defaultAccount(); return (account ?? { accountId: '<unknown account>', partition: 'aws', }); } async discoverTargetAccount(options) { return (await this.sdk(options)).currentAccount(); } async s3Client(options) { return (await this.sdk(options)).s3(); } async ecrClient(options) { return (await this.sdk(options)).ecr(); } async secretsManagerClient(options) { return (await this.sdk(options)).secretsManager(); } /** * Get an SDK appropriate for the given client options */ async sdk(options) { const env = { ...this.targetEnv, region: options.region ?? this.targetEnv.region, // Default: same region as the stack }; const cacheKeyMap = { env, // region, name, account assumeRuleArn: options.assumeRoleArn, assumeRoleExternalId: options.assumeRoleExternalId, quiet: options.quiet, }; if (options.assumeRoleAdditionalOptions) { cacheKeyMap.assumeRoleAdditionalOptions = options.assumeRoleAdditionalOptions; } const cacheKey = JSON.stringify(cacheKeyMap); const maybeSdk = this.sdkCache.get(cacheKey); if (maybeSdk) { return maybeSdk; } const sdk = (await this.aws.forEnvironment(env, plugin_1.Mode.ForWriting, { assumeRoleArn: options.assumeRoleArn, assumeRoleExternalId: options.assumeRoleExternalId, assumeRoleAdditionalOptions: options.assumeRoleAdditionalOptions, }, options.quiet)).sdk; this.sdkCache.set(cacheKey, sdk); return sdk; } } exports.PublishingAws = PublishingAws; exports.EVENT_TO_LOGGER = { build: logging_1.debug, cached: logging_1.debug, check: logging_1.debug, debug: logging_1.debug, fail: logging_1.error, found: logging_1.debug, start: logging_1.info, success: logging_1.info, upload: logging_1.debug, }; class PublishingProgressListener { constructor(quiet) { this.quiet = quiet; } onPublishEvent(type, event) { const handler = this.quiet && type !== 'fail' ? logging_1.debug : exports.EVENT_TO_LOGGER[type]; handler(`[${event.percentComplete}%] ${type}: ${event.message}`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtcHVibGlzaGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFzc2V0LXB1Ymxpc2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaURBLHNDQThCQztBQW1CRCxrQ0E2QkM7QUEvSEQsNENBQW9GO0FBQ3BGLDJDQVlvQjtBQUVwQiwyQ0FBbUQ7QUFDbkQsK0NBQW1EO0FBRW5ELHNDQUFpQztBQTRCakM7O0dBRUc7QUFDSSxLQUFLLFVBQVUsYUFBYSxDQUNqQyxRQUF1QixFQUN2QixHQUFnQixFQUNoQixTQUFzQixFQUN0QixPQUE2QjtJQUU3Qiw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLElBQ0UsU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQy9CLFNBQVMsQ0FBQyxPQUFPLEtBQUssd0JBQWU7UUFDckMsU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTO1FBQzlCLFNBQVMsQ0FBQyxPQUFPLEtBQUssdUJBQWMsRUFDcEMsQ0FBQztRQUNELE1BQU0sSUFBSSxvQkFBWSxDQUFDLDhEQUE4RCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSw0QkFBZSxDQUFDLFFBQVEsRUFBRTtRQUM5QyxHQUFHLEVBQUUsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztRQUN0QyxnQkFBZ0IsRUFBRSxJQUFJLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO1FBQ3hFLFlBQVksRUFBRSxLQUFLO1FBQ25CLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUMzQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJO1FBQ3hDLGFBQWEsRUFBRSxJQUFJO1FBQ25CLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztLQUNyQixDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FB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RSxPQUFPLENBQUMsb0JBQW9CO1lBQ2xELDJCQUEyQixFQUFFLE9BQU8sQ0FBQywyQkFBMkI7U0FDakUsRUFDRCxPQUFPLENBQUMsS0FBSyxDQUNkLENBQ0YsQ0FBQyxHQUFHLENBQUM7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFakMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUE1RkQsc0NBNEZDO0FBRVksUUFBQSxlQUFlLEdBQTJDO0lBQ3JFLEtBQUssRUFBRSxlQUFLO0lBQ1osTUFBTSxFQUFFLGVBQUs7SUFDYixLQUFLLEVBQUUsZUFBSztJQUNaLEtBQUssRUFBTCxlQUFLO0lBQ0wsSUFBSSxFQUFFLGVBQUs7SUFDWCxLQUFLLEVBQUUsZUFBSztJQUNaLEtBQUssRUFBRSxjQUFJO0lBQ1gsT0FBTyxFQUFFLGNBQUk7SUFDYixNQUFNLEVBQUUsZUFBSztDQUNkLENBQUM7QUFFRixNQUFNLDBCQUEwQjtJQUM5QixZQUE2QixLQUFjO1FBQWQsVUFBSyxHQUFMLEtBQUssQ0FBUztJQUFHLENBQUM7SUFFeEMsY0FBYyxDQUFDLElBQWUsRUFBRSxLQUF1QjtRQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxDQUFDLENBQUMsdUJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxNQUFNLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEVudmlyb25tZW50LCBVTktOT1dOX0FDQ09VTlQsIFVOS05PV05fUkVHSU9OIH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7XG4gIHR5cGUgQWNjb3VudCxcbiAgdHlwZSBBc3NldE1hbmlmZXN0LFxuICBBc3NldFB1Ymxpc2hpbmcsXG4gIENsaWVudE9wdGlvbnMsXG4gIEV2ZW50VHlwZSxcbiAgdHlwZSBJQXdzLFxuICB0eXBlIElFQ1JDbGllbnQsXG4gIHR5cGUgSVB1Ymxpc2hQcm9ncmVzcyxcbiAgdHlwZSBJUHVibGlzaFByb2dyZXNzTGlzdGVuZXIsXG4gIHR5cGUgSVMzQ2xpZW50LFxuICB0eXBlIElTZWNyZXRzTWFuYWdlckNsaWVudCxcbn0gZnJvbSAnY2RrLWFzc2V0cyc7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uJztcbmltcG9ydCB7IGRlYnVnLCBlcnJvciwgaW5mbyB9IGZyb20gJy4uLy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9lcnJvcic7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgTW9kZSB9IGZyb20gJy4uL3BsdWdpbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEFzc2V0c09wdGlvbnMge1xuICAvKipcbiAgICogUHJpbnQgcHJvZ3Jlc3MgYXQgJ2RlYnVnJyBsZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGJ1aWxkIGFzc2V0cyBiZWZvcmUgcHVibGlzaGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZSBUbyByZW1haW4gYmFja3dhcmQgY29tcGF0aWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQXNzZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYWxsZWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNkay1hc3NldHMgaXMgYWxsb3dlZCB0byBkbyBjcm9zcyBhY2NvdW50IHB1Ymxpc2hpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGxvd0Nyb3NzQWNjb3VudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2UgY2RrLWFzc2V0cyB0byBwdWJsaXNoIGFsbCBhc3NldHMgaW4gdGhlIGdpdmVuIG1hbmlmZXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEFzc2V0cyhcbiAgbWFuaWZlc3Q6IEFzc2V0TWFuaWZlc3QsXG4gIHNkazogU2RrUHJvdmlkZXIsXG4gIHRhcmdldEVudjogRW52aXJvbm1lbnQsXG4gIG9wdGlvbnM6IFB1Ymxpc2hBc3NldHNPcHRpb25zLFxuKSB7XG4gIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKGl0J3MgYSBwcm9ncmFtbWluZyBlcnJvciksIGJ1dCB3ZSBkb24ndCBoYXZlXG4gIC8vIHRoZSB0eXBlcyBoZXJlIHRvIGd1aWRlIHVzLiBEbyBhbiBydW50aW1lIHZhbGlkYXRpb24gdG8gYmUgc3VwZXIgc3VwZXIgc3VyZS5cbiAgaWYgKFxuICAgIHRhcmdldEVudi5hY2NvdW50ID09PSB1bmRlZmluZWQgfHxcbiAgICB0YXJnZXRFbnYuYWNjb3VudCA9PT0gVU5LTk9XTl9BQ0NPVU5UIHx8XG4gICAgdGFyZ2V0RW52LnJlZ2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdGFyZ2V0RW52LmFjY291bnQgPT09IFVOS05PV05fUkVHSU9OXG4gICkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEFzc2V0IHB1Ymxpc2hpbmcgcmVxdWlyZXMgcmVzb2x2ZWQgYWNjb3VudCBhbmQgcmVnaW9uLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRFbnYpfWApO1xuICB9XG5cbiAgY29uc3QgcHVibGlzaGVyID0gbmV3IEFzc2V0UHVibGlzaGluZyhtYW5pZmVzdCwge1xuICAgIGF3czogbmV3IFB1Ymxpc2hpbmdBd3Moc2RrLCB0YXJnZXRFbnYpLFxuICAgIHByb2dyZXNzTGlzdGVuZXI6IG5ldyBQdWJsaXNoaW5nUHJvZ3Jlc3NMaXN0ZW5lcihvcHRpb25zLnF1aWV0ID8/IGZhbHNlKSxcbiAgICB0aHJvd09uRXJyb3I6IGZhbHNlLFxuICAgIHB1Ymxpc2hJblBhcmFsbGVsOiBvcHRpb25zLnBhcmFsbGVsID8/IHRydWUsXG4gICAgYnVpbGRBc3NldHM6IG9wdGlvbnMuYnVpbGRBc3NldHMgPz8gdHJ1ZSxcbiAgICBwdWJsaXNoQXNzZXRzOiB0cnVlLFxuICAgIHF1aWV0OiBvcHRpb25zLnF1aWV0LFxuICB9KTtcbiAgYXdhaXQgcHVibGlzaGVyLnB1Ymxpc2goeyBhbGxvd0Nyb3NzQWNjb3VudDogb3B0aW9ucy5hbGxvd0Nyb3NzQWNjb3VudCB9KTtcbiAgaWYgKHB1Ymxpc2hlci5oYXNGYWlsdXJlcykge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ZhaWxlZCB0byBwdWJsaXNoIG9uZSBvciBtb3JlIGFzc2V0cy4gU2VlIHRoZSBlcnJvciBtZXNzYWdlcyBhYm92ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQXNzZXRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQcmludCBwcm9ncmVzcyBhdCAnZGVidWcnIGxldmVsXG4gICAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwYXJhbGxlbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlIGNkay1hc3NldHMgdG8gYnVpbGQgYWxsIGFzc2V0cyBpbiB0aGUgZ2l2ZW4gbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFzc2V0cyhcbiAgbWFuaWZlc3Q6IEFzc2V0TWFuaWZlc3QsXG4gIHNkazogU2RrUHJvdmlkZXIsXG4gIHRhcmdldEVudjogRW52aXJvbm1lbnQsXG4gIG9wdGlvbnM6IEJ1aWxkQXNzZXRzT3B0aW9ucyA9IHt9LFxuKSB7XG4gIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKGl0J3MgYSBwcm9ncmFtbWluZyBlcnJvciksIGJ1dCB3ZSBkb24ndCBoYXZlXG4gIC8vIHRoZSB0eXBlcyBoZXJlIHRvIGd1aWRlIHVzLiBEbyBhbiBydW50aW1lIHZhbGlkYXRpb24gdG8gYmUgc3VwZXIgc3VwZXIgc3VyZS5cbiAgaWYgKFxuICAgIHRhcmdldEVudi5hY2NvdW50ID09PSB1bmRlZmluZWQgfHxcbiAgICB0YXJnZXRFbnYuYWNjb3VudCA9PT0gVU5LTk9XTl9BQ0NPVU5UIHx8XG4gICAgdGFyZ2V0RW52LnJlZ2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdGFyZ2V0RW52LmFjY291bnQgPT09IFVOS05PV05fUkVHSU9OXG4gICkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEFzc2V0IGJ1aWxkaW5nIHJlcXVpcmVzIHJlc29sdmVkIGFjY291bnQgYW5kIHJlZ2lvbiwgZ290ICR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0RW52KX1gKTtcbiAgfVxuXG4gIGNvbnN0IHB1Ymxpc2hlciA9IG5ldyBBc3NldFB1Ymxpc2hpbmcobWFuaWZlc3QsIHtcbiAgICBhd3M6IG5ldyBQdWJsaXNoaW5nQXdzKHNkaywgdGFyZ2V0RW52KSxcbiAgICBwcm9ncmVzc0xpc3RlbmVyOiBuZXcgUHVibGlzaGluZ1Byb2dyZXNzTGlzdGVuZXIob3B0aW9ucy5xdWlldCA/PyBmYWxzZSksXG4gICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbiAgICBwdWJsaXNoSW5QYXJhbGxlbDogb3B0aW9ucy5wYXJhbGxlbCA/PyB0cnVlLFxuICAgIGJ1aWxkQXNzZXRzOiB0cnVlLFxuICAgIHB1Ymxpc2hBc3NldHM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgcHVibGlzaGVyLnB1Ymxpc2goKTtcbiAgaWYgKHB1Ymxpc2hlci5oYXNGYWlsdXJlcykge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBvbmUgb3IgbW9yZSBhc3NldHMuIFNlZSB0aGUgZXJyb3IgbWVzc2FnZXMgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFB1Ymxpc2hpbmdBd3MgaW1wbGVtZW50cyBJQXdzIHtcbiAgcHJpdmF0ZSBzZGtDYWNoZTogTWFwPFN0cmluZywgU0RLPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBTREsgdG8gd29yayB3aXRoXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhd3M6IFNka1Byb3ZpZGVyLFxuXG4gICAgLyoqXG4gICAgICogRW52aXJvbm1lbnQgd2hlcmUgdGhlIHN0YWNrIHdlJ3JlIGRlcGxveWluZyBpcyBnb2luZ1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0RW52OiBFbnZpcm9ubWVudCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlclBhcnRpdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hd3MuYmFzZUNyZWRlbnRpYWxzUGFydGl0aW9uKHRoaXMudGFyZ2V0RW52LCBNb2RlLkZvcldyaXRpbmcpKSA/PyAnYXdzJztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlckRlZmF1bHRSZWdpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRFbnYucmVnaW9uO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpc2NvdmVyQ3VycmVudEFjY291bnQoKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IHRoaXMuYXdzLmRlZmF1bHRBY2NvdW50KCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGFjY291bnQgPz8ge1xuICAgICAgICBhY2NvdW50SWQ6ICc8dW5rbm93biBhY2NvdW50PicsXG4gICAgICAgIHBhcnRpdGlvbjogJ2F3cycsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlclRhcmdldEFjY291bnQob3B0aW9uczogQ2xpZW50T3B0aW9ucyk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZGsob3B0aW9ucykpLmN1cnJlbnRBY2NvdW50KCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgczNDbGllbnQob3B0aW9uczogQ2xpZW50T3B0aW9ucyk6IFByb21pc2U8SVMzQ2xpZW50PiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnNkayhvcHRpb25zKSkuczMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlY3JDbGllbnQob3B0aW9uczogQ2xpZW50T3B0aW9ucyk6IFByb21pc2U8SUVDUkNsaWVudD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZGsob3B0aW9ucykpLmVjcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlY3JldHNNYW5hZ2VyQ2xpZW50KG9wdGlvbnM6IENsaWVudE9wdGlvbnMpOiBQcm9taXNlPElTZWNyZXRzTWFuYWdlckNsaWVudD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZGsob3B0aW9ucykpLnNlY3JldHNNYW5hZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIFNESyBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIGNsaWVudCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNkayhvcHRpb25zOiBDbGllbnRPcHRpb25zKTogUHJvbWlzZTxTREs+IHtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi50aGlzLnRhcmdldEVudixcbiAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24gPz8gdGhpcy50YXJnZXRFbnYucmVnaW9uLCAvLyBEZWZhdWx0OiBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2tcbiAgICB9O1xuXG4gICAgY29uc3QgY2FjaGVLZXlNYXA6IGFueSA9IHtcbiAgICAgIGVudiwgLy8gcmVnaW9uLCBuYW1lLCBhY2NvdW50XG4gICAgICBhc3N1bWVSdWxlQXJuOiBvcHRpb25zLmFzc3VtZVJvbGVBcm4sXG4gICAgICBhc3N1bWVSb2xlRXh0ZXJuYWxJZDogb3B0aW9ucy5hc3N1bWVSb2xlRXh0ZXJuYWxJZCxcbiAgICAgIHF1aWV0OiBvcHRpb25zLnF1aWV0LFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy5hc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnMpIHtcbiAgICAgIGNhY2hlS2V5TWFwLmFzc3VtZVJvbGVBZGRpdGlvbmFsT3B0aW9ucyA9IG9wdGlvbnMuYXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gSlNPTi5zdHJpbmdpZnkoY2FjaGVLZXlNYXApO1xuXG4gICAgY29uc3QgbWF5YmVTZGsgPSB0aGlzLnNka0NhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKG1heWJlU2RrKSB7XG4gICAgICByZXR1cm4gbWF5YmVTZGs7XG4gICAgfVxuXG4gICAgY29uc3Qgc2RrID0gKFxuICAgICAgYXdhaXQgdGhpcy5hd3MuZm9yRW52aXJvbm1lbnQoXG4gICAgICAgIGVudixcbiAgICAgICAgTW9kZS5Gb3JXcml0aW5nLFxuICAgICAgICB7XG4gICAgICAgICAgYXNzdW1lUm9sZUFybjogb3B0aW9ucy5hc3N1bWVSb2xlQXJuLFxuICAgICAgICAgIGFzc3VtZVJvbGVFeHRlcm5hbElkOiBvcHRpb25zLmFzc3VtZVJvbGVFeHRlcm5hbElkLFxuICAgICAgICAgIGFzc3VtZVJvbGVBZGRpdGlvbmFsT3B0aW9uczogb3B0aW9ucy5hc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMucXVpZXQsXG4gICAgICApXG4gICAgKS5zZGs7XG4gICAgdGhpcy5zZGtDYWNoZS5zZXQoY2FjaGVLZXksIHNkayk7XG5cbiAgICByZXR1cm4gc2RrO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBFVkVOVF9UT19MT0dHRVI6IFJlY29yZDxFdmVudFR5cGUsICh4OiBzdHJpbmcpID0+IHZvaWQ+ID0ge1xuICBidWlsZDogZGVidWcsXG4gIGNhY2hlZDogZGVidWcsXG4gIGNoZWNrOiBkZWJ1ZyxcbiAgZGVidWcsXG4gIGZhaWw6IGVycm9yLFxuICBmb3VuZDogZGVidWcsXG4gIHN0YXJ0OiBpbmZvLFxuICBzdWNjZXNzOiBpbmZvLFxuICB1cGxvYWQ6IGRlYnVnLFxufTtcblxuY2xhc3MgUHVibGlzaGluZ1Byb2dyZXNzTGlzdGVuZXIgaW1wbGVtZW50cyBJUHVibGlzaFByb2dyZXNzTGlzdGVuZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHF1aWV0OiBib29sZWFuKSB7fVxuXG4gIHB1YmxpYyBvblB1Ymxpc2hFdmVudCh0eXBlOiBFdmVudFR5cGUsIGV2ZW50OiBJUHVibGlzaFByb2dyZXNzKTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMucXVpZXQgJiYgdHlwZSAhPT0gJ2ZhaWwnID8gZGVidWcgOiBFVkVOVF9UT19MT0dHRVJbdHlwZV07XG4gICAgaGFuZGxlcihgWyR7ZXZlbnQucGVyY2VudENvbXBsZXRlfSVdICR7dHlwZX06ICR7ZXZlbnQubWVzc2FnZX1gKTtcbiAgfVxufVxuIl19