"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.execProgram = execProgram; exports.createAssembly = createAssembly; const path = require("path"); const util_1 = require("util"); const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api"); const cxschema = require("@aws-cdk/cloud-assembly-schema"); const cxapi = require("@aws-cdk/cx-api"); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const fs = require("fs-extra"); const api_1 = require("../api"); const user_configuration_1 = require("../cli/user-configuration"); const version_1 = require("../cli/version"); /** Invokes the cloud executable and returns JSON output */ async function execProgram(aws, ioHelper, config) { const debugFn = (msg) => ioHelper.defaults.debug(msg); let errorFile; const params = (0, api_1.synthParametersFromSettings)(config.settings); const context = { ...config.context.all, ...params.context, }; await debugFn((0, util_1.format)('context:', context)); if (params.env.CDK_DEBUG === 'true') { await ioHelper.defaults.info('🔍 Synthesizing with debug information. This may take a bit longer.'); } const env = noUndefined({ // Versioning, outdir, default account and region ...await (0, api_1.prepareDefaultEnvironment)(aws, debugFn), // Environment variables derived from settings ...params.env, }); const build = config.settings.get(['build']); if (build) { await exec(build); } let app = config.settings.get(['app']); if (!app) { throw new toolkit_lib_1.ToolkitError('AppRequired', `--app is required either in command-line, in ${user_configuration_1.PROJECT_CONFIG} or in ${user_configuration_1.USER_DEFAULTS}`); } // bypass "synth" if app points to a cloud assembly if (await fs.pathExists(app) && (await fs.stat(app)).isDirectory()) { await debugFn('--app points to a cloud assembly, so we bypass synth'); // Acquire a read lock on this directory const lock = await new api_1.RWLock(app).acquireRead(); return { assembly: createAssembly(app), lock }; } // Traditionally it has been possible, though not widely advertised, to put a string[] into `cdk.json`. // However, we would just quickly join this array back up to string with spaces (unquoted even!) and proceed as usual, // thereby losing all the benefits of a pre-segmented command line. This coercion is just here for backwards // compatibility with existing configurations. An upcoming PR might retain the benefit of the string[]. if (Array.isArray(app)) { app = app.join(' '); } const commandLine = await (0, api_1.guessExecutable)(app, debugFn); const outdir = config.settings.get(['output']); if (!outdir) { throw new toolkit_lib_1.ToolkitError('OutputRequired', 'unexpected: --output is required'); } if (typeof outdir !== 'string') { throw new toolkit_lib_1.ToolkitError('OutputNotString', `--output takes a string, got ${JSON.stringify(outdir)}`); } try { await fs.mkdirp(outdir); } catch (error) { throw new toolkit_lib_1.ToolkitError('OutputDirCreateFailed', `Could not create output directory ${outdir} (${error.message})`); } await debugFn(`outdir: ${outdir}`); env[cxapi.OUTDIR_ENV] = outdir; // Send version information env[cxapi.CLI_ASM_VERSION_ENV] = cxschema.Manifest.version(); env[cxapi.CLI_VERSION_ENV] = (0, version_1.versionNumber)(); // Acquire a lock on the output directory const writerLock = await new api_1.RWLock(outdir).acquireWrite(); // Prepare an errorFile location errorFile = path.join(outdir, 'error.txt'); await fs.promises.rm(errorFile, { force: true }); env.CDK_ERROR_FILE = errorFile; await debugFn((0, util_1.format)('env:', env)); const cleanupTemp = (0, api_1.writeContextToEnv)(env, context, 'add-process-env-later'); try { await exec(commandLine); const assembly = createAssembly(outdir); return { assembly, lock: await writerLock.convertToReaderLock() }; } catch (e) { await writerLock.release(); throw e; } finally { await cleanupTemp(); } async function exec(commandAndArgs) { try { return await (0, api_1.execInChildProcess)(commandAndArgs, { env: { ...process.env, ...env, }, errorCodeFile: errorFile, // Not capturing the stdout/stderr of the CDK app. It must remain attached to a terminal // if the parent process is attached to a terminal. captureOutput: false, }); } catch (e) { await debugFn(`failed command: ${commandAndArgs}`); throw e; } } } /** * Creates an assembly with error handling */ function createAssembly(appDir) { try { return new cloud_assembly_api_1.CloudAssembly(appDir, { // We sort as we deploy topoSort: false, }); } catch (error) { if (error.message.includes(cxschema.VERSION_MISMATCH)) { // this means the CLI version is too old. // we instruct the user to upgrade. throw new toolkit_lib_1.ToolkitError('CliVersionMismatch', `This CDK CLI is not compatible with the CDK library used by your application. Please upgrade the CLI to the latest version.\n(${error.message})`); } throw error; } } function noUndefined(xs) { return Object.fromEntries(Object.entries(xs).filter(([_, v]) => v !== undefined)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvQkEsa0NBbUhDO0FBS0Qsd0NBY0M7QUExSkQsNkJBQTZCO0FBQzdCLCtCQUE4QjtBQUM5QixvRUFBNEQ7QUFDNUQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QyxzREFBb0Q7QUFDcEQsK0JBQStCO0FBRy9CLGdDQUFnSjtBQUVoSixrRUFBMEU7QUFDMUUsNENBQStDO0FBTy9DLDJEQUEyRDtBQUNwRCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQWdCLEVBQUUsUUFBa0IsRUFBRSxNQUFxQjtJQUMzRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUQsSUFBSSxTQUE2QixDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUEsaUNBQTJCLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTVELE1BQU0sT0FBTyxHQUFHO1FBQ2QsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUc7UUFDckIsR0FBRyxNQUFNLENBQUMsT0FBTztLQUNsQixDQUFDO0lBQ0YsTUFBTSxPQUFPLENBQUMsSUFBQSxhQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFM0MsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUEyQixXQUFXLENBQUM7UUFDOUMsaURBQWlEO1FBQ2pELEdBQUcsTUFBTSxJQUFBLCtCQUF5QixFQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDaEQsOENBQThDO1FBQzlDLEdBQUcsTUFBTSxD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aEIsTUFBTSxPQUFPLENBQUMsbUJBQW1CLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxNQUFjO0lBQzNDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxrQ0FBYSxDQUFDLE1BQU0sRUFBRTtZQUMvQix1QkFBdUI7WUFDdkIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3RELHlDQUF5QztZQUN6QyxtQ0FBbUM7WUFDbkMsTUFBTSxJQUFJLDBCQUFZLENBQUMsb0JBQW9CLEVBQUUsaUlBQWlJLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2xNLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUksRUFBcUI7SUFDM0MsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBUSxDQUFDO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBDbG91ZEFzc2VtYmx5IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciB9IGZyb20gJy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyLCBJUmVhZExvY2sgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgUldMb2NrLCBndWVzc0V4ZWN1dGFibGUsIHByZXBhcmVEZWZhdWx0RW52aXJvbm1lbnQsIHdyaXRlQ29udGV4dFRvRW52LCBzeW50aFBhcmFtZXRlcnNGcm9tU2V0dGluZ3MsIGV4ZWNJbkNoaWxkUHJvY2VzcyB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jbGkvdXNlci1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFBST0pFQ1RfQ09ORklHLCBVU0VSX0RFRkFVTFRTIH0gZnJvbSAnLi4vY2xpL3VzZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyB2ZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vY2xpL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNQcm9ncmFtUmVzdWx0IHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IENsb3VkQXNzZW1ibHk7XG4gIHJlYWRvbmx5IGxvY2s6IElSZWFkTG9jaztcbn1cblxuLyoqIEludm9rZXMgdGhlIGNsb3VkIGV4ZWN1dGFibGUgYW5kIHJldHVybnMgSlNPTiBvdXRwdXQgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjUHJvZ3JhbShhd3M6IFNka1Byb3ZpZGVyLCBpb0hlbHBlcjogSW9IZWxwZXIsIGNvbmZpZzogQ29uZmlndXJhdGlvbik6IFByb21pc2U8RXhlY1Byb2dyYW1SZXN1bHQ+IHtcbiAgY29uc3QgZGVidWdGbiA9IChtc2c6IHN0cmluZykgPT4gaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcobXNnKTtcbiAgbGV0IGVycm9yRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHBhcmFtcyA9IHN5bnRoUGFyYW1ldGVyc0Zyb21TZXR0aW5ncyhjb25maWcuc2V0dGluZ3MpO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgLi4uY29uZmlnLmNvbnRleHQuYWxsLFxuICAgIC4uLnBhcmFtcy5jb250ZXh0LFxuICB9O1xuICBhd2FpdCBkZWJ1Z0ZuKGZvcm1hdCgnY29udGV4dDonLCBjb250ZXh0KSk7XG5cbiAgaWYgKHBhcmFtcy5lbnYuQ0RLX0RFQlVHID09PSAndHJ1ZScpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfwn5SNIFN5bnRoZXNpemluZyB3aXRoIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIG1heSB0YWtlIGEgYml0IGxvbmdlci4nKTtcbiAgfVxuXG4gIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG5vVW5kZWZpbmVkKHtcbiAgICAvLyBWZXJzaW9uaW5nLCBvdXRkaXIsIGRlZmF1bHQgYWNjb3VudCBhbmQgcmVnaW9uXG4gICAgLi4uYXdhaXQgcHJlcGFyZURlZmF1bHRFbnZpcm9ubWVudChhd3MsIGRlYnVnRm4pLFxuICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyBkZXJpdmVkIGZyb20gc2V0dGluZ3NcbiAgICAuLi5wYXJhbXMuZW52LFxuICB9KTtcblxuICBjb25zdCBidWlsZCA9IGNvbmZpZy5zZXR0aW5ncy5nZXQoWydidWlsZCddKTtcbiAgaWYgKGJ1aWxkKSB7XG4gICAgYXdhaXQgZXhlYyhidWlsZCk7XG4gIH1cblxuICBsZXQgYXBwID0gY29uZmlnLnNldHRpbmdzLmdldChbJ2FwcCddKTtcbiAgaWYgKCFhcHApIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBcHBSZXF1aXJlZCcsIGAtLWFwcCBpcyByZXF1aXJlZCBlaXRoZXIgaW4gY29tbWFuZC1saW5lLCBpbiAke1BST0pFQ1RfQ09ORklHfSBvciBpbiAke1VTRVJfREVGQVVMVFN9YCk7XG4gIH1cblxuICAvLyBieXBhc3MgXCJzeW50aFwiIGlmIGFwcCBwb2ludHMgdG8gYSBjbG91ZCBhc3NlbWJseVxuICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhhcHApICYmIChhd2FpdCBmcy5zdGF0KGFwcCkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBhd2FpdCBkZWJ1Z0ZuKCctLWFwcCBwb2ludHMgdG8gYSBjbG91ZCBhc3NlbWJseSwgc28gd2UgYnlwYXNzIHN5bnRoJyk7XG5cbiAgICAvLyBBY3F1aXJlIGEgcmVhZCBsb2NrIG9uIHRoaXMgZGlyZWN0b3J5XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IG5ldyBSV0xvY2soYXBwKS5hY3F1aXJlUmVhZCgpO1xuXG4gICAgcmV0dXJuIHsgYXNzZW1ibHk6IGNyZWF0ZUFzc2VtYmx5KGFwcCksIGxvY2sgfTtcbiAgfVxuXG4gIC8vIFRyYWRpdGlvbmFsbHkgaXQgaGFzIGJlZW4gcG9zc2libGUsIHRob3VnaCBub3Qgd2lkZWx5IGFkdmVydGlzZWQsIHRvIHB1dCBhIHN0cmluZ1tdIGludG8gYGNkay5qc29uYC5cbiAgLy8gSG93ZXZlciwgd2Ugd291bGQganVzdCBxdWlja2x5IGpvaW4gdGhpcyBhcnJheSBiYWNrIHVwIHRvIHN0cmluZyB3aXRoIHNwYWNlcyAodW5xdW90ZWQgZXZlbiEpIGFuZCBwcm9jZWVkIGFzIHVzdWFsLFxuICAvLyB0aGVyZWJ5IGxvc2luZyBhbGwgdGhlIGJlbmVmaXRzIG9mIGEgcHJlLXNlZ21lbnRlZCBjb21tYW5kIGxpbmUuIFRoaXMgY29lcmNpb24gaXMganVzdCBoZXJlIGZvciBiYWNrd2FyZHNcbiAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25zLiBBbiB1cGNvbWluZyBQUiBtaWdodCByZXRhaW4gdGhlIGJlbmVmaXQgb2YgdGhlIHN0cmluZ1tdLlxuICBpZiAoQXJyYXkuaXNBcnJheShhcHApKSB7XG4gICAgYXBwID0gYXBwLmpvaW4oJyAnKTtcbiAgfVxuICBjb25zdCBjb21tYW5kTGluZSA9IGF3YWl0IGd1ZXNzRXhlY3V0YWJsZShhcHAsIGRlYnVnRm4pO1xuXG4gIGNvbnN0IG91dGRpciA9IGNvbmZpZy5zZXR0aW5ncy5nZXQoWydvdXRwdXQnXSk7XG4gIGlmICghb3V0ZGlyKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3V0cHV0UmVxdWlyZWQnLCAndW5leHBlY3RlZDogLS1vdXRwdXQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAodHlwZW9mIG91dGRpciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdPdXRwdXROb3RTdHJpbmcnLCBgLS1vdXRwdXQgdGFrZXMgYSBzdHJpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KG91dGRpcil9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcnAob3V0ZGlyKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ091dHB1dERpckNyZWF0ZUZhaWxlZCcsIGBDb3VsZCBub3QgY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgJHtvdXRkaXJ9ICgke2Vycm9yLm1lc3NhZ2V9KWApO1xuICB9XG5cbiAgYXdhaXQgZGVidWdGbihgb3V0ZGlyOiAke291dGRpcn1gKTtcblxuICBlbnZbY3hhcGkuT1VURElSX0VOVl0gPSBvdXRkaXI7XG5cbiAgLy8gU2VuZCB2ZXJzaW9uIGluZm9ybWF0aW9uXG4gIGVudltjeGFwaS5DTElfQVNNX1ZFUlNJT05fRU5WXSA9IGN4c2NoZW1hLk1hbmlmZXN0LnZlcnNpb24oKTtcbiAgZW52W2N4YXBpLkNMSV9WRVJTSU9OX0VOVl0gPSB2ZXJzaW9uTnVtYmVyKCk7XG5cbiAgLy8gQWNxdWlyZSBhIGxvY2sgb24gdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAgY29uc3Qgd3JpdGVyTG9jayA9IGF3YWl0IG5ldyBSV0xvY2sob3V0ZGlyKS5hY3F1aXJlV3JpdGUoKTtcblxuICAvLyBQcmVwYXJlIGFuIGVycm9yRmlsZSBsb2NhdGlvblxuICBlcnJvckZpbGUgPSBwYXRoLmpvaW4ob3V0ZGlyLCAnZXJyb3IudHh0Jyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKGVycm9yRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgZW52LkNES19FUlJPUl9GSUxFID0gZXJyb3JGaWxlO1xuXG4gIGF3YWl0IGRlYnVnRm4oZm9ybWF0KCdlbnY6JywgZW52KSk7XG5cbiAgY29uc3QgY2xlYW51cFRlbXAgPSB3cml0ZUNvbnRleHRUb0VudihlbnYsIGNvbnRleHQsICdhZGQtcHJvY2Vzcy1lbnYtbGF0ZXInKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKGNvbW1hbmRMaW5lKTtcblxuICAgIGNvbnN0IGFzc2VtYmx5ID0gY3JlYXRlQXNzZW1ibHkob3V0ZGlyKTtcblxuICAgIHJldHVybiB7IGFzc2VtYmx5LCBsb2NrOiBhd2FpdCB3cml0ZXJMb2NrLmNvbnZlcnRUb1JlYWRlckxvY2soKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgYXdhaXQgd3JpdGVyTG9jay5yZWxlYXNlKCk7XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBjbGVhbnVwVGVtcCgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZXhlYyhjb21tYW5kQW5kQXJnczogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjSW5DaGlsZFByb2Nlc3MoY29tbWFuZEFuZEFyZ3MsIHtcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgLi4uZW52LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvckNvZGVGaWxlOiBlcnJvckZpbGUsXG5cbiAgICAgICAgLy8gTm90IGNhcHR1cmluZyB0aGUgc3Rkb3V0L3N0ZGVyciBvZiB0aGUgQ0RLIGFwcC4gSXQgbXVzdCByZW1haW4gYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbFxuICAgICAgICAvLyBpZiB0aGUgcGFyZW50IHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gYSB0ZXJtaW5hbC5cbiAgICAgICAgY2FwdHVyZU91dHB1dDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGF3YWl0IGRlYnVnRm4oYGZhaWxlZCBjb21tYW5kOiAke2NvbW1hbmRBbmRBcmdzfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFzc2VtYmx5IHdpdGggZXJyb3IgaGFuZGxpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFzc2VtYmx5KGFwcERpcjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBDbG91ZEFzc2VtYmx5KGFwcERpciwge1xuICAgICAgLy8gV2Ugc29ydCBhcyB3ZSBkZXBsb3lcbiAgICAgIHRvcG9Tb3J0OiBmYWxzZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKGN4c2NoZW1hLlZFUlNJT05fTUlTTUFUQ0gpKSB7XG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSBDTEkgdmVyc2lvbiBpcyB0b28gb2xkLlxuICAgICAgLy8gd2UgaW5zdHJ1Y3QgdGhlIHVzZXIgdG8gdXBncmFkZS5cbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NsaVZlcnNpb25NaXNtYXRjaCcsIGBUaGlzIENESyBDTEkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQ0RLIGxpYnJhcnkgdXNlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBncmFkZSB0aGUgQ0xJIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cXG4oJHtlcnJvci5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9VbmRlZmluZWQ8QT4oeHM6IFJlY29yZDxzdHJpbmcsIEE+KTogUmVjb3JkPHN0cmluZywgTm9uTnVsbGFibGU8QT4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh4cykuZmlsdGVyKChbXywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCkpIGFzIGFueTtcbn1cbiJdfQ==