@aws-cdk/integ-runner
Version:
CDK Integration Testing Tool
240 lines • 28.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ToolkitLibRunnerEngine = void 0;
const path = require("node:path");
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
const chalk = require("chalk");
const fs = require("fs-extra");
/**
* A runner engine powered directly by the toolkit-lib
*/
class ToolkitLibRunnerEngine {
constructor(options) {
this.options = options;
this.showOutput = options.showOutput ?? false;
this.toolkit = new toolkit_lib_1.Toolkit({
ioHost: this.showOutput ? new IntegRunnerIoHost() : new NoopIoHost(),
// @TODO - these options are currently available on the action calls
// but toolkit-lib needs them at the constructor level.
// Need to decide what to do with them.
//
// Validations
// - assemblyFailureAt: options.strict ?? options.ignoreErrors
// Logging
// - options.color
// SDK
// - options.profile
// - options.proxy
// - options.caBundlePath
});
// @TODO - similar to the above, but in toolkit-lib these options would go on the IoHost
// - options.quiet
// - options.trace
// - options.verbose
// - options.json
}
/**
* Synthesizes the CDK app through the Toolkit
*/
async synth(options) {
const cx = await this.cx(options);
const lock = await this.toolkit.synth(cx, {
stacks: this.stackSelector(options),
validateStacks: options.validation,
});
await lock.dispose();
}
/**
* Synthesizes the CDK app quickly, by bypassing the Toolkit and just invoking the app command
*/
async synthFast(options) {
const cx = await this.toolkit.fromCdkApp(options.execCmd.join(' '), {
workingDirectory: this.options.workingDirectory,
outdir: options.output ? path.join(this.options.workingDirectory, options.output) : undefined,
contextStore: new toolkit_lib_1.MemoryContext(options.context),
lookups: false,
resolveDefaultEnvironment: false,
env: {
...this.options.env,
...options.env,
},
synthOptions: {
versionReporting: false,
pathMetadata: false,
assetMetadata: false,
},
});
try {
// @TODO - use produce to mimic the current behavior more closely
const lock = await cx.produce();
await lock.dispose();
// We should fix this once we have stabilized toolkit-lib as engine.
// What we really should do is this:
// const lock = await this.toolkit.synth(cx, {
// validateStacks: false,
// });
// await lock.dispose();
}
catch (e) {
if (e.message.includes('Missing context keys')) {
// @TODO - silently ignore missing context
// This is actually an undefined case in the old implementation, which doesn't use the toolkit code
// and won't fail for missing context. To persevere existing behavior, we do the same here.
// However in future we need to find a way for integ tests to provide context through snapshots.
return;
}
throw e;
}
}
/**
* Lists the stacks in the CDK app
*/
async list(options) {
// @TODO - existing list specific option, doesn't really make sense to support this in the context of integ-runner
// - options.long
const cx = await this.cx(options);
const stacks = await this.toolkit.list(cx, {
stacks: this.stackSelector(options),
});
return stacks.map(s => s.name);
}
/**
* Deploys the CDK app
*/
async deploy(options) {
// @TODO - existing deploy specific option, doesn't really make sense to support this in the context of integ-runner
// - options.progress
if (options.watch) {
return this.watch(options);
}
const cx = await this.cx(options);
await this.toolkit.deploy(cx, {
roleArn: options.roleArn,
traceLogs: options.traceLogs,
stacks: this.stackSelector(options),
deploymentMethod: this.deploymentMethod(options),
});
}
/**
* Watches the CDK app for changes and deploys them automatically
*/
async watch(options, events) {
const cx = await this.cx(options);
try {
const watcher = await this.toolkit.watch(cx, {
roleArn: options.roleArn,
traceLogs: options.traceLogs,
stacks: this.stackSelector(options),
deploymentMethod: this.deploymentMethod(options),
});
await watcher.waitForEnd();
}
catch (e) {
if (events?.onStderr) {
events.onStderr(String(e));
}
if (events?.onClose) {
events.onClose(1);
}
return;
}
if (events?.onClose) {
events.onClose(0);
}
}
/**
* Destroys the CDK app
*/
async destroy(options) {
const cx = await this.cx(options);
await this.toolkit.destroy(cx, {
roleArn: options.roleArn,
stacks: this.stackSelector(options),
});
}
/**
* Creates a Cloud Assembly Source from the provided options.
*/
async cx(options) {
if (!options.app) {
throw new Error('No app provided');
}
// check if the app is a path to existing snapshot and then use it as an assembly directory
const potentialCxPath = path.join(this.options.workingDirectory, options.app);
if (fs.pathExistsSync(potentialCxPath) && fs.statSync(potentialCxPath).isDirectory()) {
return this.toolkit.fromAssemblyDirectory(potentialCxPath);
}
let outdir;
if (options.output) {
outdir = path.join(this.options.workingDirectory, options.output);
}
return this.toolkit.fromCdkApp(options.app, {
workingDirectory: this.options.workingDirectory,
outdir,
lookups: options.lookups,
resolveDefaultEnvironment: false, // not part of the integ-runner contract
contextStore: new toolkit_lib_1.MemoryContext(options.context),
env: this.options.env,
synthOptions: {
debug: options.debug,
versionReporting: options.versionReporting ?? false,
pathMetadata: options.pathMetadata ?? false,
assetMetadata: options.assetMetadata ?? false,
assetStaging: options.staging,
},
});
}
/**
* Creates a StackSelector from the provided options.
*/
stackSelector(options) {
return {
strategy: options.all ? toolkit_lib_1.StackSelectionStrategy.ALL_STACKS : toolkit_lib_1.StackSelectionStrategy.PATTERN_MUST_MATCH,
patterns: options.stacks ?? ['**'],
expand: options.exclusively ? toolkit_lib_1.ExpandStackSelection.NONE : toolkit_lib_1.ExpandStackSelection.UPSTREAM,
};
}
/**
* Creates a DeploymentMethod from the provided options.
*/
deploymentMethod(options) {
if (options.hotswap && options.hotswap !== 'full-deployment') {
return {
method: 'hotswap',
fallback: options.hotswap === 'fall-back' ? { method: 'change-set' } : undefined,
};
}
return {
method: options.deploymentMethod ?? 'change-set',
};
}
}
exports.ToolkitLibRunnerEngine = ToolkitLibRunnerEngine;
/**
* An IoHost used in the integ-runner to provide non-interactive output
*/
class IntegRunnerIoHost extends toolkit_lib_1.NonInteractiveIoHost {
constructor(props = {}) {
super({
...props,
isTTY: false,
});
}
async notify(msg) {
return super.notify({
...msg,
message: chalk.gray(msg.message),
});
}
}
/**
* An IoHost that doesn't do anything
*/
class NoopIoHost {
async notify() {
}
async requestResponse(msg) {
return msg.defaultResponse;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC1saWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0b29sa2l0LWxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrQ0FBa0M7QUFJbEMsc0RBQWtJO0FBQ2xJLCtCQUErQjtBQUMvQiwrQkFBK0I7QUF5Qi9COztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFLakMsWUFBbUIsT0FBZ0M7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUU5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQU8sQ0FBQztZQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQSxDQUFDLENBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRTtZQUNuRSxvRUFBb0U7WUFDcEUsdURBQXVEO1lBQ3ZELHVDQUF1QztZQUN2QyxFQUFFO1lBQ0YsY0FBYztZQUNkLCtEQUErRDtZQUMvRCxVQUFVO1lBQ1YsbUJBQW1CO1lBQ25CLE1BQU07WUFDTixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLDBCQUEwQjtTQUMzQixDQUFDLENBQUM7UUFFSCx3RkFBd0Y7UUFDeEYsbUJBQW1CO1FBQ25CLG1CQUFtQjtRQUNuQixxQkFBcUI7UUFDckIsa0JBQWtCO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBcUI7UUFDdEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNuQyxjQUFjLEVBQUUs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RSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNqRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixJQUFJLFlBQVk7U0FDakQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWhPRCx3REFnT0M7QUFFRDs7R0FFRztBQUNILE1BQU0saUJBQWtCLFNBQVEsa0NBQW9CO0lBQ2xELFlBQW1CLFFBQW1DLEVBQUU7UUFDdEQsS0FBSyxDQUFDO1lBQ0osR0FBRyxLQUFLO1lBQ1IsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUF1QjtRQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbEIsR0FBRyxHQUFHO1lBQ04sT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVTtJQUNQLEtBQUssQ0FBQyxNQUFNO0lBQ25CLENBQUM7SUFDTSxLQUFLLENBQUMsZUFBZSxDQUFJLEdBQTBCO1FBQ3hELE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IERlcGxveU9wdGlvbnMsIElDZGssIExpc3RPcHRpb25zLCBTeW50aEZhc3RPcHRpb25zLCBTeW50aE9wdGlvbnMsIFdhdGNoRXZlbnRzIH0gZnJvbSAnQGF3cy1jZGsvY2RrLWNsaS13cmFwcGVyJztcbmltcG9ydCB0eXBlIHsgRGVmYXVsdENka09wdGlvbnMsIERlc3Ryb3lPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hL2xpYi9pbnRlZy10ZXN0cyc7XG5pbXBvcnQgdHlwZSB7IERlcGxveW1lbnRNZXRob2QsIElDbG91ZEFzc2VtYmx5U291cmNlLCBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvUmVxdWVzdCwgTm9uSW50ZXJhY3RpdmVJb0hvc3RQcm9wcywgU3RhY2tTZWxlY3RvciB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCB7IEV4cGFuZFN0YWNrU2VsZWN0aW9uLCBNZW1vcnlDb250ZXh0LCBOb25JbnRlcmFjdGl2ZUlvSG9zdCwgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSwgVG9vbGtpdCB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0TGliRW5naW5lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY2RrIGNvbW1hbmRzIGZyb21cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0XG4gICAqIGluIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhhdCB3aWxsIGJlIHJ1bm5pbmdcbiAgICogdGhlIGNkayBhcHBcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGVudiB2YXJzXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogU2hvdyB0aGUgb3V0cHV0IGZyb20gcnVubmluZyB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBydW5uZXIgZW5naW5lIHBvd2VyZWQgZGlyZWN0bHkgYnkgdGhlIHRvb2xraXQtbGliXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sa2l0TGliUnVubmVyRW5naW5lIGltcGxlbWVudHMgSUNkayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbGtpdDogVG9vbGtpdDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBUb29sa2l0TGliRW5naW5lT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3V0cHV0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBUb29sa2l0TGliRW5naW5lT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy50b29sa2l0ID0gbmV3IFRvb2xraXQoe1xuICAgICAgaW9Ib3N0OiB0aGlzLnNob3dPdXRwdXQ/IG5ldyBJbnRlZ1J1bm5lcklvSG9zdCgpIDogbmV3IE5vb3BJb0hvc3QoKSxcbiAgICAgIC8vIEBUT0RPIC0gdGhlc2Ugb3B0aW9ucyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZSBvbiB0aGUgYWN0aW9uIGNhbGxzXG4gICAgICAvLyBidXQgdG9vbGtpdC1saWIgbmVlZHMgdGhlbSBhdCB0aGUgY29uc3RydWN0b3IgbGV2ZWwuXG4gICAgICAvLyBOZWVkIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlbS5cbiAgICAgIC8vXG4gICAgICAvLyBWYWxpZGF0aW9uc1xuICAgICAgLy8gIC0gYXNzZW1ibHlGYWlsdXJlQXQ6IG9wdGlvbnMuc3RyaWN0ID8/IG9wdGlvbnMuaWdub3JlRXJyb3JzXG4gICAgICAvLyBMb2dnaW5nXG4gICAgICAvLyAgLSBvcHRpb25zLmNvbG9yXG4gICAgICAvLyBTREtcbiAgICAgIC8vICAtIG9wdGlvbnMucHJvZmlsZVxuICAgICAgLy8gIC0gb3B0aW9ucy5wcm94eVxuICAgICAgLy8gIC0gb3B0aW9ucy5jYUJ1bmRsZVBhdGhcbiAgICB9KTtcblxuICAgIC8vIEBUT0RPIC0gc2ltaWxhciB0byB0aGUgYWJvdmUsIGJ1dCBpbiB0b29sa2l0LWxpYiB0aGVzZSBvcHRpb25zIHdvdWxkIGdvIG9uIHRoZSBJb0hvc3RcbiAgICAvLyAgLSBvcHRpb25zLnF1aWV0XG4gICAgLy8gIC0gb3B0aW9ucy50cmFjZVxuICAgIC8vICAtIG9wdGlvbnMudmVyYm9zZVxuICAgIC8vICAtIG9wdGlvbnMuanNvblxuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemVzIHRoZSBDREsgYXBwIHRocm91Z2ggdGhlIFRvb2xraXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW50aChvcHRpb25zOiBTeW50aE9wdGlvbnMpIHtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3gob3B0aW9ucyk7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aChjeCwge1xuICAgICAgc3RhY2tzOiB0aGlzLnN0YWNrU2VsZWN0b3Iob3B0aW9ucyksXG4gICAgICB2YWxpZGF0ZVN0YWNrczogb3B0aW9ucy52YWxpZGF0aW9uLFxuICAgIH0pO1xuICAgIGF3YWl0IGxvY2suZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoZXNpemVzIHRoZSBDREsgYXBwIHF1aWNrbHksIGJ5IGJ5cGFzc2luZyB0aGUgVG9vbGtpdCBhbmQganVzdCBpbnZva2luZyB0aGUgYXBwIGNvbW1hbmRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW50aEZhc3Qob3B0aW9uczogU3ludGhGYXN0T3B0aW9ucykge1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAob3B0aW9ucy5leGVjQ21kLmpvaW4oJyAnKSwge1xuICAgICAgd29ya2luZ0RpcmVjdG9yeTogdGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICBvdXRkaXI6IG9wdGlvbnMub3V0cHV0ID8gcGF0aC5qb2luKHRoaXMub3B0aW9ucy53b3JraW5nRGlyZWN0b3J5LCBvcHRpb25zLm91dHB1dCkgOiB1bmRlZmluZWQsXG4gICAgICBjb250ZXh0U3RvcmU6IG5ldyBNZW1vcnlDb250ZXh0KG9wdGlvbnMuY29udGV4dCksXG4gICAgICBsb29rdXBzOiBmYWxzZSxcbiAgICAgIHJlc29sdmVEZWZhdWx0RW52aXJvbm1lbnQ6IGZhbHNlLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5lbnYsXG4gICAgICAgIC4uLm9wdGlvbnMuZW52LFxuICAgICAgfSxcbiAgICAgIHN5bnRoT3B0aW9uczoge1xuICAgICAgICB2ZXJzaW9uUmVwb3J0aW5nOiBmYWxzZSxcbiAgICAgICAgcGF0aE1ldGFkYXRhOiBmYWxzZSxcbiAgICAgICAgYXNzZXRNZXRhZGF0YTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEBUT0RPIC0gdXNlIHByb2R1Y2UgdG8gbWltaWMgdGhlIGN1cnJlbnQgYmVoYXZpb3IgbW9yZSBjbG9zZWx5XG4gICAgICBjb25zdCBsb2NrID0gYXdhaXQgY3gucHJvZHVjZSgpO1xuICAgICAgYXdhaXQgbG9jay5kaXNwb3NlKCk7XG4gICAgICAvLyBXZSBzaG91bGQgZml4IHRoaXMgb25jZSB3ZSBoYXZlIHN0YWJpbGl6ZWQgdG9vbGtpdC1saWIgYXMgZW5naW5lLlxuICAgICAgLy8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIHRoaXM6XG4gICAgICAvLyBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy50b29sa2l0LnN5bnRoKGN4LCB7XG4gICAgICAvLyAgIHZhbGlkYXRlU3RhY2tzOiBmYWxzZSxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gYXdhaXQgbG9jay5kaXNwb3NlKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKCdNaXNzaW5nIGNvbnRleHQga2V5cycpKSB7XG4gICAgICAgIC8vIEBUT0RPIC0gc2lsZW50bHkgaWdub3JlIG1pc3NpbmcgY29udGV4dFxuICAgICAgICAvLyBUaGlzIGlzIGFjdHVhbGx5IGFuIHVuZGVmaW5lZCBjYXNlIGluIHRoZSBvbGQgaW1wbGVtZW50YXRpb24sIHdoaWNoIGRvZXNuJ3QgdXNlIHRoZSB0b29sa2l0IGNvZGVcbiAgICAgICAgLy8gYW5kIHdvbid0IGZhaWwgZm9yIG1pc3NpbmcgY29udGV4dC4gVG8gcGVyc2V2ZXJlIGV4aXN0aW5nIGJlaGF2aW9yLCB3ZSBkbyB0aGUgc2FtZSBoZXJlLlxuICAgICAgICAvLyBIb3dldmVyIGluIGZ1dHVyZSB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkgZm9yIGludGVnIHRlc3RzIHRvIHByb3ZpZGUgY29udGV4dCB0aHJvdWdoIHNuYXBzaG90cy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIHN0YWNrcyBpbiB0aGUgQ0RLIGFwcFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3Qob3B0aW9uczogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgLy8gQFRPRE8gLSBleGlzdGluZyBsaXN0IHNwZWNpZmljIG9wdGlvbiwgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byBzdXBwb3J0IHRoaXMgaW4gdGhlIGNvbnRleHQgb2YgaW50ZWctcnVubmVyXG4gICAgLy8gIC0gb3B0aW9ucy5sb25nXG5cbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3gob3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgdGhpcy50b29sa2l0Lmxpc3QoY3gsIHtcbiAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0YWNrcy5tYXAocyA9PiBzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveXMgdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3kob3B0aW9uczogRGVwbG95T3B0aW9ucykge1xuICAgIC8vIEBUT0RPIC0gZXhpc3RpbmcgZGVwbG95IHNwZWNpZmljIG9wdGlvbiwgZG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSB0byBzdXBwb3J0IHRoaXMgaW4gdGhlIGNvbnRleHQgb2YgaW50ZWctcnVubmVyXG4gICAgLy8gIC0gb3B0aW9ucy5wcm9ncmVzc1xuXG4gICAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLndhdGNoKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeChvcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLnRvb2xraXQuZGVwbG95KGN4LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICB0cmFjZUxvZ3M6IG9wdGlvbnMudHJhY2VMb2dzLFxuICAgICAgc3RhY2tzOiB0aGlzLnN0YWNrU2VsZWN0b3Iob3B0aW9ucyksXG4gICAgICBkZXBsb3ltZW50TWV0aG9kOiB0aGlzLmRlcGxveW1lbnRNZXRob2Qob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcyB0aGUgQ0RLIGFwcCBmb3IgY2hhbmdlcyBhbmQgZGVwbG95cyB0aGVtIGF1dG9tYXRpY2FsbHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YXRjaChvcHRpb25zOiBEZXBsb3lPcHRpb25zLCBldmVudHM/OiBXYXRjaEV2ZW50cykge1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeChvcHRpb25zKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2F0Y2hlciA9IGF3YWl0IHRoaXMudG9vbGtpdC53YXRjaChjeCwge1xuICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIHRyYWNlTG9nczogb3B0aW9ucy50cmFjZUxvZ3MsXG4gICAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiB0aGlzLmRlcGxveW1lbnRNZXRob2Qob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHdhdGNoZXIud2FpdEZvckVuZCgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChldmVudHM/Lm9uU3RkZXJyKSB7XG4gICAgICAgIGV2ZW50cy5vblN0ZGVycihTdHJpbmcoZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50cz8ub25DbG9zZSkge1xuICAgICAgICBldmVudHMub25DbG9zZSgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRzPy5vbkNsb3NlKSB7XG4gICAgICBldmVudHMub25DbG9zZSgwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKSB7XG4gICAgY29uc3QgY3ggPSBhd2FpdCB0aGlzLmN4KG9wdGlvbnMpO1xuXG4gICAgYXdhaXQgdGhpcy50b29sa2l0LmRlc3Ryb3koY3gsIHtcbiAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZCBBc3NlbWJseSBTb3VyY2UgZnJvbSB0aGUgcHJvdmlkZWQgb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3gob3B0aW9uczogRGVmYXVsdENka09wdGlvbnMpOiBQcm9taXNlPElDbG91ZEFzc2VtYmx5U291cmNlPiB7XG4gICAgaWYgKCFvcHRpb25zLmFwcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhcHAgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgYXBwIGlzIGEgcGF0aCB0byBleGlzdGluZyBzbmFwc2hvdCBhbmQgdGhlbiB1c2UgaXQgYXMgYW4gYXNzZW1ibHkgZGlyZWN0b3J5XG4gICAgY29uc3QgcG90ZW50aWFsQ3hQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy53b3JraW5nRGlyZWN0b3J5LCBvcHRpb25zLmFwcCk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBvdGVudGlhbEN4UGF0aCkgJiYgZnMuc3RhdFN5bmMocG90ZW50aWFsQ3hQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b29sa2l0LmZyb21Bc3NlbWJseURpcmVjdG9yeShwb3RlbnRpYWxDeFBhdGgpO1xuICAgIH1cblxuICAgIGxldCBvdXRkaXI7XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgICBvdXRkaXIgPSBwYXRoLmpvaW4odGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksIG9wdGlvbnMub3V0cHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b29sa2l0LmZyb21DZGtBcHAob3B0aW9ucy5hcHAsIHtcbiAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHRoaXMub3B0aW9ucy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgb3V0ZGlyLFxuICAgICAgbG9va3Vwczogb3B0aW9ucy5sb29rdXBzLFxuICAgICAgcmVzb2x2ZURlZmF1bHRFbnZpcm9ubWVudDogZmFsc2UsIC8vIG5vdCBwYXJ0IG9mIHRoZSBpbnRlZy1ydW5uZXIgY29udHJhY3RcbiAgICAgIGNvbnRleHRTdG9yZTogbmV3IE1lbW9yeUNvbnRleHQob3B0aW9ucy5jb250ZXh0KSxcbiAgICAgIGVudjogdGhpcy5vcHRpb25zLmVudixcbiAgICAgIHN5bnRoT3B0aW9uczoge1xuICAgICAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICAgICAgdmVyc2lvblJlcG9ydGluZzogb3B0aW9ucy52ZXJzaW9uUmVwb3J0aW5nID8/IGZhbHNlLFxuICAgICAgICBwYXRoTWV0YWRhdGE6IG9wdGlvbnMucGF0aE1ldGFkYXRhID8/IGZhbHNlLFxuICAgICAgICBhc3NldE1ldGFkYXRhOiBvcHRpb25zLmFzc2V0TWV0YWRhdGEgPz8gZmFsc2UsXG4gICAgICAgIGFzc2V0U3RhZ2luZzogb3B0aW9ucy5zdGFnaW5nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgU3RhY2tTZWxlY3RvciBmcm9tIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFja1NlbGVjdG9yKG9wdGlvbnM6IERlZmF1bHRDZGtPcHRpb25zICYgeyByZWFkb25seSBleGNsdXNpdmVseT86IGJvb2xlYW4gfSk6IFN0YWNrU2VsZWN0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICBzdHJhdGVneTogb3B0aW9ucy5hbGwgPyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LkFMTF9TVEFDS1MgOiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSCxcbiAgICAgIHBhdHRlcm5zOiBvcHRpb25zLnN0YWNrcyA/PyBbJyoqJ10sXG4gICAgICBleHBhbmQ6IG9wdGlvbnMuZXhjbHVzaXZlbHkgPyBFeHBhbmRTdGFja1NlbGVjdGlvbi5OT05FIDogRXhwYW5kU3RhY2tTZWxlY3Rpb24uVVBTVFJFQU0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgRGVwbG95bWVudE1ldGhvZCBmcm9tIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXBsb3ltZW50TWV0aG9kKG9wdGlvbnM6IERlcGxveU9wdGlvbnMpOiBEZXBsb3ltZW50TWV0aG9kIHtcbiAgICBpZiAob3B0aW9ucy5ob3Rzd2FwICYmIG9wdGlvbnMuaG90c3dhcCAhPT0gJ2Z1bGwtZGVwbG95bWVudCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1ldGhvZDogJ2hvdHN3YXAnLFxuICAgICAgICBmYWxsYmFjazogb3B0aW9ucy5ob3Rzd2FwID09PSAnZmFsbC1iYWNrJyA/IHsgbWV0aG9kOiAnY2hhbmdlLXNldCcgfSA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kID8/ICdjaGFuZ2Utc2V0JyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQW4gSW9Ib3N0IHVzZWQgaW4gdGhlIGludGVnLXJ1bm5lciB0byBwcm92aWRlIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXRcbiAqL1xuY2xhc3MgSW50ZWdSdW5uZXJJb0hvc3QgZXh0ZW5kcyBOb25JbnRlcmFjdGl2ZUlvSG9zdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogTm9uSW50ZXJhY3RpdmVJb0hvc3RQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBpc1RUWTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGFzeW5jIG5vdGlmeShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci5ub3RpZnkoe1xuICAgICAgLi4ubXNnLFxuICAgICAgbWVzc2FnZTogY2hhbGsuZ3JheShtc2cubWVzc2FnZSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJb0hvc3QgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nXG4gKi9cbmNsYXNzIE5vb3BJb0hvc3QgaW1wbGVtZW50cyBJSW9Ib3N0IHtcbiAgcHVibGljIGFzeW5jIG5vdGlmeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgfVxuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPFQ+KG1zZzogSW9SZXF1ZXN0PHVua25vd24sIFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gIH1cbn1cbiJdfQ==