@aws-cdk-testing/cli-integ
Version:
Integration tests for the AWS CDK CLI
101 lines • 16.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const path = require("path");
const with_tool_context_1 = require("./with-tool-context");
const lib_1 = require("../../lib");
const TIMEOUT = 1800000;
(0, lib_1.integTest)('amplify integration', (0, with_tool_context_1.withToolContext)(async (context) => {
const shell = lib_1.ShellHelper.fromContext(context);
////////////////////////////////////////////////////////////////////////
// Make sure that create-amplify installs the right versions of the CLI and framework
//
// Install `create-amplify` without running it, then hack the json file with the
// package versions in it before we execute.
await shell.shell(['npm', 'init', '-y']);
await shell.shell(['npm', 'install', '--save-dev', 'create-amplify@latest']);
// This will create 'package.json' implicating a certain version of the CDK
await shell.shell(['npm', 'config', 'set', 'save-exact', 'true']);
await mutateAmplifyDepOnCdk(context, context.packages.requestedCliVersion(), context.packages.requestedFrameworkVersion());
////////////////////////////////////////////////////////////////////////
// Run the `npm create` workflow
//
// I tested to confirm that this will use the locally installed `create-amplify`
await shell.shell(['npm', 'create', '-y', 'amplify']);
await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
const awsCreds = context.aws.identityEnv();
await shell.shell(['npx', 'ampx', 'sandbox', '--once'], {
modEnv: {
AWS_REGION: context.aws.region,
...awsCreds
},
});
try {
// Future code goes here, putting the try/finally here already so it doesn't
// get forgotten.
}
finally {
await shell.shell(['npx', 'ampx', 'sandbox', 'delete', '--yes'], {
modEnv: {
AWS_REGION: context.aws.region,
...awsCreds
},
});
}
}), TIMEOUT);
async function mutateAmplifyDepOnCdk(context, cliVersion, libVersion) {
// default_packages.json is where create-amplify reads when installing npm dependencies
const amplifyDepFile = path.join(context.integTestDir, 'node_modules', 'create-amplify', 'lib', 'default_packages.json');
const amplifyDepJson = JSON.parse(await fs_1.promises.readFile(amplifyDepFile, { encoding: 'utf-8' }));
// Be extra paranoid about the types here, since we don't fully control them
assertIsObject(amplifyDepJson);
assertIsStringArray(amplifyDepJson.defaultDevPackages);
// Amplify is removing the dependency on aws-cdk, since Amplify is now using the toolkit-lib
// To prepare for this change, we need allow both situations: aws-cdk being listed and not being listed
// Fix is to simply allow the replace operation to also NOT replace the version
// @see https://github.com/aws-amplify/amplify-backend/pull/2614
replacePackageVersionIn('aws-cdk', cliVersion, amplifyDepJson.defaultDevPackages, false);
replacePackageVersionIn('aws-cdk-lib', libVersion, amplifyDepJson.defaultDevPackages);
await fs_1.promises.writeFile(amplifyDepFile, JSON.stringify(amplifyDepJson, undefined, 2), { encoding: 'utf-8' });
const packageJsonFile = path.join(context.integTestDir, 'package.json');
const packageJson = JSON.parse(await fs_1.promises.readFile(packageJsonFile, { encoding: 'utf-8' }));
assertIsObject(packageJson);
packageJson.overrides = {
"aws-cdk-lib": libVersion,
};
await fs_1.promises.writeFile(packageJsonFile, JSON.stringify(packageJson, undefined, 2), { encoding: 'utf-8' });
}
/**
* Mutably update the given string array, replacing the version of packages with the given name
*
* We assume the list of packages is a string array of the form
*
* ```
* ["package@version", "package@version", ...]
* ```
*
* It's a failure if we don't find an entry to update, unless we explicitly pass an option to say that's okay.
*/
function replacePackageVersionIn(packName, version, xs, failIfMissing = true) {
let didUpdate = false;
for (let i = 0; i < xs.length; i++) {
if (xs[i].startsWith(`${packName}@`)) {
xs[i] = `${packName}@${version}`;
didUpdate = true;
}
}
if (failIfMissing && !didUpdate) {
throw new Error(`Did not find a package version to update for ${packName} in ${JSON.stringify(xs)}`);
}
}
function assertIsObject(xs) {
if (typeof xs !== 'object' || xs === null) {
throw new Error(`Expected object, got ${JSON.stringify(xs)}`);
}
}
function assertIsStringArray(xs) {
if (!Array.isArray(xs) || xs.length === 0 || typeof xs[0] !== 'string') {
throw new Error(`Expected list of strings, got ${JSON.stringify(xs)}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGlmeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhbXBsaWZ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFvQztBQUNwQyw2QkFBNkI7QUFDN0IsMkRBQXNEO0FBQ3RELG1DQUE4RTtBQUU5RSxNQUFNLE9BQU8sR0FBRyxPQUFRLENBQUM7QUFFekIsSUFBQSxlQUFTLEVBQUMscUJBQXFCLEVBQUUsSUFBQSxtQ0FBZSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqRSxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyx3RUFBd0U7SUFDeEUsc0ZBQXNGO0lBQ3RGLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsNENBQTRDO0lBQzVDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDN0UsMkVBQTJFO0lBQzNFLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUUzSCx3RUFBd0U7SUFDeEUsaUNBQWlDO0lBQ2pDLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUV4RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ3RELE1BQU0sRUFBRTtZQUNOLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07WUFDOUIsR0FBRyxRQUFRO1NBQ1o7S0FDRixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsaUJBQWlCO0lBRW5CLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQy9ELE1BQU0sRUFBRTtnQkFDTixVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO2dCQUM5QixHQUFHLFFBQVE7YUFDWjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUViLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxPQUFrQyxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDN0csdUZBQXVGO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDekgsTUFBTSxjQUFjLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLGFBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVyRyw0RUFBNEU7SUFDNUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9CLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXZELDRGQUE0RjtJQUM1Rix1R0FBdUc7SUFDdkcsK0VBQStFO0lBQy9FLGdFQUFnRTtJQUNoRSx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6Rix1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXRGLE1BQU0sYUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFeEcsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sV0FBVyxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxhQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbkcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVCLFdBQVcsQ0FBQyxTQUFTLEdBQUc7UUFDdEIsYUFBYSxFQUFFLFVBQVU7S0FDMUIsQ0FBQztJQUNGLE1BQU0sYUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDdkcsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLEVBQVksRUFBRSxhQUFhLEdBQUcsSUFBSTtJQUNwRyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGFBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELFFBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQVc7SUFDakMsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUFXO0lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2l0aFRvb2xDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRvb2wtY29udGV4dCc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIFNoZWxsSGVscGVyLCBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi4vLi4vbGliJztcblxuY29uc3QgVElNRU9VVCA9IDE4MDBfMDAwO1xuXG5pbnRlZ1Rlc3QoJ2FtcGxpZnkgaW50ZWdyYXRpb24nLCB3aXRoVG9vbENvbnRleHQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgY29uc3Qgc2hlbGwgPSBTaGVsbEhlbHBlci5mcm9tQ29udGV4dChjb250ZXh0KTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gIE1ha2Ugc3VyZSB0aGF0IGNyZWF0ZS1hbXBsaWZ5IGluc3RhbGxzIHRoZSByaWdodCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIGFuZCBmcmFtZXdvcmtcbiAgLy9cblxuICAvLyBJbnN0YWxsIGBjcmVhdGUtYW1wbGlmeWAgd2l0aG91dCBydW5uaW5nIGl0LCB0aGVuIGhhY2sgdGhlIGpzb24gZmlsZSB3aXRoIHRoZVxuICAvLyBwYWNrYWdlIHZlcnNpb25zIGluIGl0IGJlZm9yZSB3ZSBleGVjdXRlLlxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdpbml0JywgJy15J10pO1xuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdpbnN0YWxsJywgJy0tc2F2ZS1kZXYnLCAnY3JlYXRlLWFtcGxpZnlAbGF0ZXN0J10pO1xuICAvLyBUaGlzIHdpbGwgY3JlYXRlICdwYWNrYWdlLmpzb24nIGltcGxpY2F0aW5nIGEgY2VydGFpbiB2ZXJzaW9uIG9mIHRoZSBDREtcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnY29uZmlnJywgJ3NldCcsICdzYXZlLWV4YWN0JywgJ3RydWUnXSk7XG4gIGF3YWl0IG11dGF0ZUFtcGxpZnlEZXBPbkNkayhjb250ZXh0LCBjb250ZXh0LnBhY2thZ2VzLnJlcXVlc3RlZENsaVZlcnNpb24oKSwgY29udGV4dC5wYWNrYWdlcy5yZXF1ZXN0ZWRGcmFtZXdvcmtWZXJzaW9uKCkpO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyAgUnVuIHRoZSBgbnBtIGNyZWF0ZWAgd29ya2Zsb3dcbiAgLy9cblxuICAvLyBJIHRlc3RlZCB0byBjb25maXJtIHRoYXQgdGhpcyB3aWxsIHVzZSB0aGUgbG9jYWxseSBpbnN0YWxsZWQgYGNyZWF0ZS1hbXBsaWZ5YFxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdjcmVhdGUnLCAnLXknLCAnYW1wbGlmeSddKTtcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAnYW1weCcsICdjb25maWd1cmUnLCAndGVsZW1ldHJ5JywgJ2Rpc2FibGUnXSk7XG5cbiAgY29uc3QgYXdzQ3JlZHMgPSBjb250ZXh0LmF3cy5pZGVudGl0eUVudigpO1xuXG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnB4JywgJ2FtcHgnLCAnc2FuZGJveCcsICctLW9uY2UnXSwge1xuICAgIG1vZEVudjoge1xuICAgICAgQVdTX1JFR0lPTjogY29udGV4dC5hd3MucmVnaW9uLFxuICAgICAgLi4uYXdzQ3JlZHNcbiAgICB9LFxuICB9KTtcbiAgdHJ5IHtcblxuICAgIC8vIEZ1dHVyZSBjb2RlIGdvZXMgaGVyZSwgcHV0dGluZyB0aGUgdHJ5L2ZpbmFsbHkgaGVyZSBhbHJlYWR5IHNvIGl0IGRvZXNuJ3RcbiAgICAvLyBnZXQgZm9yZ290dGVuLlxuXG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAnYW1weCcsICdzYW5kYm94JywgJ2RlbGV0ZScsICctLXllcyddLCB7XG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgQVdTX1JFR0lPTjogY29udGV4dC5hd3MucmVnaW9uLFxuICAgICAgICAuLi5hd3NDcmVkc1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufSksIFRJTUVPVVQpO1xuXG5hc3luYyBmdW5jdGlvbiBtdXRhdGVBbXBsaWZ5RGVwT25DZGsoY29udGV4dDogVGVtcG9yYXJ5RGlyZWN0b3J5Q29udGV4dCwgY2xpVmVyc2lvbjogc3RyaW5nLCBsaWJWZXJzaW9uOiBzdHJpbmcpIHtcbiAgLy8gZGVmYXVsdF9wYWNrYWdlcy5qc29uIGlzIHdoZXJlIGNyZWF0ZS1hbXBsaWZ5IHJlYWRzIHdoZW4gaW5zdGFsbGluZyBucG0gZGVwZW5kZW5jaWVzXG4gIGNvbnN0IGFtcGxpZnlEZXBGaWxlID0gcGF0aC5qb2luKGNvbnRleHQuaW50ZWdUZXN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ2NyZWF0ZS1hbXBsaWZ5JywgJ2xpYicsICdkZWZhdWx0X3BhY2thZ2VzLmpzb24nKTtcbiAgY29uc3QgYW1wbGlmeURlcEpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGFtcGxpZnlEZXBGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKTtcblxuICAvLyBCZSBleHRyYSBwYXJhbm9pZCBhYm91dCB0aGUgdHlwZXMgaGVyZSwgc2luY2Ugd2UgZG9uJ3QgZnVsbHkgY29udHJvbCB0aGVtXG4gIGFzc2VydElzT2JqZWN0KGFtcGxpZnlEZXBKc29uKTtcbiAgYXNzZXJ0SXNTdHJpbmdBcnJheShhbXBsaWZ5RGVwSnNvbi5kZWZhdWx0RGV2UGFja2FnZXMpO1xuXG4gIC8vIEFtcGxpZnkgaXMgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYXdzLWNkaywgc2luY2UgQW1wbGlmeSBpcyBub3cgdXNpbmcgdGhlIHRvb2xraXQtbGliXG4gIC8vIFRvIHByZXBhcmUgZm9yIHRoaXMgY2hhbmdlLCB3ZSBuZWVkIGFsbG93IGJvdGggc2l0dWF0aW9uczogYXdzLWNkayBiZWluZyBsaXN0ZWQgYW5kIG5vdCBiZWluZyBsaXN0ZWRcbiAgLy8gRml4IGlzIHRvIHNpbXBseSBhbGxvdyB0aGUgcmVwbGFjZSBvcGVyYXRpb24gdG8gYWxzbyBOT1QgcmVwbGFjZSB0aGUgdmVyc2lvblxuICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtYW1wbGlmeS9hbXBsaWZ5LWJhY2tlbmQvcHVsbC8yNjE0XG4gIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKCdhd3MtY2RrJywgY2xpVmVyc2lvbiwgYW1wbGlmeURlcEpzb24uZGVmYXVsdERldlBhY2thZ2VzLCBmYWxzZSk7XG4gIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKCdhd3MtY2RrLWxpYicsIGxpYlZlcnNpb24sIGFtcGxpZnlEZXBKc29uLmRlZmF1bHREZXZQYWNrYWdlcyk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGFtcGxpZnlEZXBGaWxlLCBKU09OLnN0cmluZ2lmeShhbXBsaWZ5RGVwSnNvbiwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICBjb25zdCBwYWNrYWdlSnNvbkZpbGUgPSBwYXRoLmpvaW4oY29udGV4dC5pbnRlZ1Rlc3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QgcGFja2FnZUpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhY2thZ2VKc29uRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG5cbiAgYXNzZXJ0SXNPYmplY3QocGFja2FnZUpzb24pO1xuICBwYWNrYWdlSnNvbi5vdmVycmlkZXMgPSB7XG4gICAgXCJhd3MtY2RrLWxpYlwiOiBsaWJWZXJzaW9uLFxuICB9O1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGFja2FnZUpzb25GaWxlLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxufVxuXG4vKipcbiAqIE11dGFibHkgdXBkYXRlIHRoZSBnaXZlbiBzdHJpbmcgYXJyYXksIHJlcGxhY2luZyB0aGUgdmVyc2lvbiBvZiBwYWNrYWdlcyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gKlxuICogV2UgYXNzdW1lIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGlzIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmb3JtXG4gKlxuICogYGBgXG4gKiBbXCJwYWNrYWdlQHZlcnNpb25cIiwgXCJwYWNrYWdlQHZlcnNpb25cIiwgLi4uXVxuICogYGBgXG4gKlxuICogSXQncyBhIGZhaWx1cmUgaWYgd2UgZG9uJ3QgZmluZCBhbiBlbnRyeSB0byB1cGRhdGUsIHVubGVzcyB3ZSBleHBsaWNpdGx5IHBhc3MgYW4gb3B0aW9uIHRvIHNheSB0aGF0J3Mgb2theS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBhY2thZ2VWZXJzaW9uSW4ocGFja05hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCB4czogc3RyaW5nW10sIGZhaWxJZk1pc3NpbmcgPSB0cnVlKSB7XG4gIGxldCBkaWRVcGRhdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4c1tpXS5zdGFydHNXaXRoKGAke3BhY2tOYW1lfUBgKSkge1xuICAgICAgeHNbaV0gPSBgJHtwYWNrTmFtZX1AJHt2ZXJzaW9ufWA7XG4gICAgICBkaWRVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmYWlsSWZNaXNzaW5nICYmICFkaWRVcGRhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZCBub3QgZmluZCBhIHBhY2thZ2UgdmVyc2lvbiB0byB1cGRhdGUgZm9yICR7cGFja05hbWV9IGluICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KHhzOiB1bmtub3duKTogYXNzZXJ0cyB4cyBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh0eXBlb2YgeHMgIT09ICdvYmplY3QnIHx8IHhzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QsIGdvdCAke0pTT04uc3RyaW5naWZ5KHhzKX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRJc1N0cmluZ0FycmF5KHhzOiB1bmtub3duKTogYXNzZXJ0cyB4cyBpcyBzdHJpbmdbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh4cykgfHwgeHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB4c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGxpc3Qgb2Ygc3RyaW5ncywgZ290ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICB9XG59XG4iXX0=