UNPKG

@wheatstalk/aws-cdk-exec

Version:

An AWS CDK Cloud Assembly-aware command to help find and execute lambda functions and state machines

188 lines 21.6 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.exportEnv = exports.cdkExec = void 0; const cxapi = __importStar(require("aws-cdk-lib/cx-api")); const chalk_1 = __importDefault(require("chalk")); const yargs = __importStar(require("yargs")); const aws_sdk_1 = require("../aws-sdk"); const executor_1 = require("../executor"); const find_matching_resources_1 = require("../find-matching-resources"); async function main() { const args = yargs .usage('$0 [path]', 'Execute the resource for a construct at a given path', builder => { var _a; return builder .positional('path', { type: 'string', description: 'Path to executable construct resource', }) .option('app', { type: 'string', default: (_a = process.env.CDK_EXEC_APP) !== null && _a !== void 0 ? _a : 'cdk.out', description: 'Path to your `cdk.out` cloud assembly directory', }) .option('all', { type: 'boolean', alias: 'a', description: 'Execute all matching resources', }) .option('export-env', { type: 'boolean', describe: 'Export a .env for all matching function environment variables', }) .option('metadata', { type: 'array', alias: 'm', description: 'Match resources with the given metadata key or key=value', }) .option('tag', { type: 'array', alias: 't', description: 'Match resources with the given tag key or key=value', }) .option('output', { type: 'boolean', description: 'Show execution output', default: true, }) .option('input', { type: 'string', description: 'Execute with custom JSON input', }); }) .argv; // TODO: Need a better way to handle config-based profiles. process.env.AWS_SDK_LOAD_CONFIG = '1'; if (args.exportEnv) { return exportEnv({ constructPath: args.path, app: args.app, metadata: args.metadata ? new find_matching_resources_1.MetadataMatch(args.metadata) : undefined, tags: args.tag ? new find_matching_resources_1.TagsMatch(args.tag) : undefined, }); } return cdkExec({ constructPath: args.path, app: args.app, all: args.all, metadata: args.metadata ? new find_matching_resources_1.MetadataMatch(args.metadata) : undefined, tags: args.tag ? new find_matching_resources_1.TagsMatch(args.tag) : undefined, input: args.input, showOutput: args.output, }); } async function cdkExec(options) { try { const assembly = new cxapi.CloudAssembly(options.app); const executors = await executor_1.Executor.find({ assembly, constructPath: options.constructPath, metadata: options.metadata, tags: options.tags, sdk: new aws_sdk_1.AwsSdk(), }); if (executors.length === 0) { console.log('❌ No matching executable constructs found'); return 1; } if (!options.all && executors.length > 1) { console.log('\n❌ Matched multiple resources: %s', executors.map(e => e.constructPath).join(', ')); return 1; } const executorResults = await Promise.all(executors.map(async (executor) => { console.log('⚡ Executing %s (%s)', executor.constructPath, executor.physicalResourceId); const result = await executor.execute(options.input); return { executor, ...result, }; })); let error = false; for (const result of executorResults) { console.log('\n\n✨ Final status of %s', result.executor.constructPath); if (options.showOutput && result.output) { console.log('\nOutput:\n%s', chalk_1.default.cyan(JSON.stringify(result.output, null, 2))); } if (result.error) { error = true; console.log('\n❌ Execution failed with an error message:\n\n%s', chalk_1.default.red(result.error)); } else { console.log('\n✅ Execution succeeded'); } } return error ? 1 : 0; } catch (e) { if (e instanceof Error) { if (e.stack && /new CloudAssembly/.test(e.stack)) { console.log('\n❌ AWS CDK lib error: %s', e.message); return 1; } } throw e; } } exports.cdkExec = cdkExec; async function exportEnv(options) { const assembly = new cxapi.CloudAssembly(options.app); const executors = await executor_1.Executor.find({ assembly, constructPath: options.constructPath, metadata: options.metadata, tags: options.tags, sdk: new aws_sdk_1.AwsSdk(), }); if (executors.length === 0) { console.error('❌ No matching executable constructs found'); return 1; } if (executors.length > 1) { console.error('\n❌ Matched multiple resources: %s', executors.map(e => e.constructPath).join(', ')); return 1; } for (const executor of executors) { const env = await executor.env(); for (const [k, v] of Object.entries(env)) { console.log(`${k}=${v}`); } } return 0; } exports.exportEnv = exportEnv; main() .then(exitCode => { process.exit(exitCode); }) .catch(e => { console.error(e); process.exit(1); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWV4ZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2Nkay1leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDBEQUE0QztBQUM1QyxrREFBMEI7QUFDMUIsNkNBQStCO0FBQy9CLHdDQUFvQztBQUNwQywwQ0FBdUM7QUFDdkMsd0VBQXNFO0FBRXRFLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sSUFBSSxHQUFRLEtBQUs7U0FDcEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxzREFBc0QsRUFBRSxPQUFPLENBQUMsRUFBRTs7UUFBQyxPQUFBLE9BQU87YUFDM0YsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSx1Q0FBdUM7U0FDckQsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxtQ0FBSSxTQUFTO1lBQzlDLFdBQVcsRUFBRSxpREFBaUQ7U0FDL0QsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLGdDQUFnQztTQUM5QyxDQUFDO2FBQ0QsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLFFBQVEsRUFBRSwrREFBK0Q7U0FDMUUsQ0FBQzthQUNELE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDbEIsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwwREFBMEQ7U0FDeEUsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FB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QUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUE5QkQsOEJBOEJDO0FBRUQsSUFBSSxFQUFFO0tBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUM7S0FDRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdhd3MtY2RrLWxpYi9jeC1hcGknO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IEF3c1NkayB9IGZyb20gJy4uL2F3cy1zZGsnO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tICcuLi9leGVjdXRvcic7XG5pbXBvcnQgeyBNZXRhZGF0YU1hdGNoLCBUYWdzTWF0Y2ggfSBmcm9tICcuLi9maW5kLW1hdGNoaW5nLXJlc291cmNlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgYXJnczogYW55ID0geWFyZ3NcbiAgICAudXNhZ2UoJyQwIFtwYXRoXScsICdFeGVjdXRlIHRoZSByZXNvdXJjZSBmb3IgYSBjb25zdHJ1Y3QgYXQgYSBnaXZlbiBwYXRoJywgYnVpbGRlciA9PiBidWlsZGVyXG4gICAgICAucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBleGVjdXRhYmxlIGNvbnN0cnVjdCByZXNvdXJjZScsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignYXBwJywge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogcHJvY2Vzcy5lbnYuQ0RLX0VYRUNfQVBQID8/ICdjZGsub3V0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHlvdXIgYGNkay5vdXRgIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeScsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignYWxsJywge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGFsaWFzOiAnYScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRXhlY3V0ZSBhbGwgbWF0Y2hpbmcgcmVzb3VyY2VzJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9uKCdleHBvcnQtZW52Jywge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaWJlOiAnRXhwb3J0IGEgLmVudiBmb3IgYWxsIG1hdGNoaW5nIGZ1bmN0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlcycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignbWV0YWRhdGEnLCB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGFsaWFzOiAnbScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTWF0Y2ggcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIG1ldGFkYXRhIGtleSBvciBrZXk9dmFsdWUnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ3RhZycsIHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgYWxpYXM6ICd0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdNYXRjaCByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gdGFnIGtleSBvciBrZXk9dmFsdWUnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ291dHB1dCcsIHtcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgZXhlY3V0aW9uIG91dHB1dCcsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignaW5wdXQnLCB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0V4ZWN1dGUgd2l0aCBjdXN0b20gSlNPTiBpbnB1dCcsXG4gICAgICB9KSlcbiAgICAuYXJndjtcblxuICAvLyBUT0RPOiBOZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgY29uZmlnLWJhc2VkIHByb2ZpbGVzLlxuICBwcm9jZXNzLmVudi5BV1NfU0RLX0xPQURfQ09ORklHID0gJzEnO1xuXG4gIGlmIChhcmdzLmV4cG9ydEVudikge1xuICAgIHJldHVybiBleHBvcnRFbnYoe1xuICAgICAgY29uc3RydWN0UGF0aDogYXJncy5wYXRoLFxuICAgICAgYXBwOiBhcmdzLmFwcCxcbiAgICAgIG1ldGFkYXRhOiBhcmdzLm1ldGFkYXRhID8gbmV3IE1ldGFkYXRhTWF0Y2goYXJncy5tZXRhZGF0YSkgOiB1bmRlZmluZWQsXG4gICAgICB0YWdzOiBhcmdzLnRhZyA/IG5ldyBUYWdzTWF0Y2goYXJncy50YWcpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNka0V4ZWMoe1xuICAgIGNvbnN0cnVjdFBhdGg6IGFyZ3MucGF0aCxcbiAgICBhcHA6IGFyZ3MuYXBwLFxuICAgIGFsbDogYXJncy5hbGwsXG4gICAgbWV0YWRhdGE6IGFyZ3MubWV0YWRhdGEgPyBuZXcgTWV0YWRhdGFNYXRjaChhcmdzLm1ldGFkYXRhKSA6IHVuZGVmaW5lZCxcbiAgICB0YWdzOiBhcmdzLnRhZyA/IG5ldyBUYWdzTWF0Y2goYXJncy50YWcpIDogdW5kZWZpbmVkLFxuICAgIGlucHV0OiBhcmdzLmlucHV0LFxuICAgIHNob3dPdXRwdXQ6IGFyZ3Mub3V0cHV0LFxuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBcHAgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYWxsIG1hdGNoZXMgcmF0aGVyIHRoYW4gZXJyb3Jpbmcgb24gYW1iaWd1aXR5XG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvZiB0aGUgY29uc3RydWN0IHRvIGV4ZWN1dGUuXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXRjaCByZWNvcmRzIHdpdGggdGhlIGdpdmVuIG1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IE1ldGFkYXRhTWF0Y2g7XG5cbiAgLyoqXG4gICAqIE1hdGNoIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ3NNYXRjaDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIGlucHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNka0V4ZWMob3B0aW9uczogQ2RrRXhlY09wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHkob3B0aW9ucy5hcHApO1xuXG4gICAgY29uc3QgZXhlY3V0b3JzID0gYXdhaXQgRXhlY3V0b3IuZmluZCh7XG4gICAgICBhc3NlbWJseSxcbiAgICAgIGNvbnN0cnVjdFBhdGg6IG9wdGlvbnMuY29uc3RydWN0UGF0aCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgc2RrOiBuZXcgQXdzU2RrKCksXG4gICAgfSk7XG5cbiAgICBpZiAoZXhlY3V0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCAgTm8gbWF0Y2hpbmcgZXhlY3V0YWJsZSBjb25zdHJ1Y3RzIGZvdW5kJyk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxsICYmIGV4ZWN1dG9ycy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zb2xlLmxvZygnXFxu4p2MICBNYXRjaGVkIG11bHRpcGxlIHJlc291cmNlczogJXMnLCBleGVjdXRvcnMubWFwKGUgPT4gZS5jb25zdHJ1Y3RQYXRoKS5qb2luKCcsICcpKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dG9yUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZXhlY3V0b3JzLm1hcChhc3luYyAoZXhlY3V0b3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KaoSAgRXhlY3V0aW5nICVzICglcyknLCBleGVjdXRvci5jb25zdHJ1Y3RQYXRoLCBleGVjdXRvci5waHlzaWNhbFJlc291cmNlSWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsZXQgZXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBleGVjdXRvclJlc3VsdHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdcXG5cXG7inKggIEZpbmFsIHN0YXR1cyBvZiAlcycsIHJlc3VsdC5leGVjdXRvci5jb25zdHJ1Y3RQYXRoKTtcbiAgICAgIGlmIChvcHRpb25zLnNob3dPdXRwdXQgJiYgcmVzdWx0Lm91dHB1dCkge1xuICAgICAgICBjb25zb2xlLmxvZygnXFxuT3V0cHV0OlxcbiVzJywgY2hhbGsuY3lhbihKU09OLnN0cmluZ2lmeShyZXN1bHQub3V0cHV0LCBudWxsLCAyKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ1xcbuKdjCAgRXhlY3V0aW9uIGZhaWxlZCB3aXRoIGFuIGVycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBjaGFsay5yZWQocmVzdWx0LmVycm9yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnXFxu4pyFICBFeGVjdXRpb24gc3VjY2VlZGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZS5zdGFjayAmJiAvbmV3IENsb3VkQXNzZW1ibHkvLnRlc3QoZS5zdGFjaykpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1xcbuKdjCAgQVdTIENESyBsaWIgZXJyb3I6ICVzJywgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEVudiB7XG4gIC8qKlxuICAgKiBBcHAgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgdGhlIGNvbnN0cnVjdCB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0UGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogTWF0Y2ggcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBtZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBNZXRhZGF0YU1hdGNoO1xuXG4gIC8qKlxuICAgKiBNYXRjaCByZWNvcmRzIHdpdGggdGhlIGdpdmVuIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdzTWF0Y2g7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnRFbnYob3B0aW9uczogRXhwb3J0RW52KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgYXNzZW1ibHkgPSBuZXcgY3hhcGkuQ2xvdWRBc3NlbWJseShvcHRpb25zLmFwcCk7XG5cbiAgY29uc3QgZXhlY3V0b3JzID0gYXdhaXQgRXhlY3V0b3IuZmluZCh7XG4gICAgYXNzZW1ibHksXG4gICAgY29uc3RydWN0UGF0aDogb3B0aW9ucy5jb25zdHJ1Y3RQYXRoLFxuICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICBzZGs6IG5ldyBBd3NTZGsoKSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWN1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCfinYwgIE5vIG1hdGNoaW5nIGV4ZWN1dGFibGUgY29uc3RydWN0cyBmb3VuZCcpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKGV4ZWN1dG9ycy5sZW5ndGggPiAxKSB7XG4gICAgY29uc29sZS5lcnJvcignXFxu4p2MICBNYXRjaGVkIG11bHRpcGxlIHJlc291cmNlczogJXMnLCBleGVjdXRvcnMubWFwKGUgPT4gZS5jb25zdHJ1Y3RQYXRoKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZXhlY3V0b3Igb2YgZXhlY3V0b3JzKSB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgZXhlY3V0b3IuZW52KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtrfT0ke3Z9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbm1haW4oKVxuICAudGhlbihleGl0Q29kZSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSlcbiAgLmNhdGNoKGUgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiJdfQ==