UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

258 lines 40.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable import/order */ const chalk = require("chalk"); const console_listener_1 = require("./console-listener"); const stack_activity_monitor_1 = require("../../lib/api/util/cloudformation/stack-activity-monitor"); const client_cloudformation_1 = require("@aws-sdk/client-cloudformation"); const cli_io_host_1 = require("../../lib/toolkit/cli-io-host"); let TIMESTAMP; let HUMAN_TIME; beforeAll(() => { TIMESTAMP = new Date().getTime(); HUMAN_TIME = new Date(TIMESTAMP).toLocaleTimeString(); cli_io_host_1.CliIoHost.instance().isCI = false; }); test('prints 0/4 progress report, when addActivity is called with an "IN_PROGRESS" ResourceStatus', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 3, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.CREATE_IN_PROGRESS, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); }); expect(output[0].trim()).toStrictEqual(`stack-name | 0/4 | ${HUMAN_TIME} | ${chalk.reset('CREATE_IN_PROGRESS ')} | AWS::CloudFormation::Stack | ${chalk.reset(chalk.bold('stack1'))}`); }); test('prints 1/4 progress report, when addActivity is called with an "UPDATE_COMPLETE" ResourceStatus', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 3, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_COMPLETE, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); }); expect(output[0].trim()).toStrictEqual(`stack-name | 1/4 | ${HUMAN_TIME} | ${chalk.green('UPDATE_COMPLETE ')} | AWS::CloudFormation::Stack | ${chalk.green(chalk.bold('stack1'))}`); }); test('prints 1/4 progress report, when addActivity is called with an "UPDATE_COMPLETE" ResourceStatus', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 3, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_COMPLETE, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); }); expect(output[0].trim()).toStrictEqual(`stack-name | 1/4 | ${HUMAN_TIME} | ${chalk.green('UPDATE_COMPLETE ')} | AWS::CloudFormation::Stack | ${chalk.green(chalk.bold('stack1'))}`); }); test('prints 1/4 progress report, when addActivity is called with an "ROLLBACK_COMPLETE" ResourceStatus', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 3, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.ROLLBACK_COMPLETE, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); }); expect(output[0].trim()).toStrictEqual(`stack-name | 1/4 | ${HUMAN_TIME} | ${chalk.yellow('ROLLBACK_COMPLETE ')} | AWS::CloudFormation::Stack | ${chalk.yellow(chalk.bold('stack1'))}`); }); test('prints 0/4 progress report, when addActivity is called with an "UPDATE_FAILED" ResourceStatus', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 3, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_FAILED, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); }); expect(output[0].trim()).toStrictEqual(`stack-name | 0/4 | ${HUMAN_TIME} | ${chalk.red('UPDATE_FAILED ')} | AWS::CloudFormation::Stack | ${chalk.red(chalk.bold('stack1'))}`); }); test('does not print "Failed Resources:" list, when all deployments are successful', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 1, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_IN_PROGRESS, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_COMPLETE, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack2', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_COMPLETE, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); historyActivityPrinter.stop(); }); expect(output.length).toStrictEqual(3); expect(output[0].trim()).toStrictEqual(`stack-name | 0/2 | ${HUMAN_TIME} | ${chalk.reset('UPDATE_IN_PROGRESS ')} | AWS::CloudFormation::Stack | ${chalk.reset(chalk.bold('stack1'))}`); expect(output[1].trim()).toStrictEqual(`stack-name | 1/2 | ${HUMAN_TIME} | ${chalk.green('UPDATE_COMPLETE ')} | AWS::CloudFormation::Stack | ${chalk.green(chalk.bold('stack1'))}`); expect(output[2].trim()).toStrictEqual(`stack-name | 2/2 | ${HUMAN_TIME} | ${chalk.green('UPDATE_COMPLETE ')} | AWS::CloudFormation::Stack | ${chalk.green(chalk.bold('stack2'))}`); }); test('prints "Failed Resources:" list, when at least one deployment fails', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 1, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_IN_PROGRESS, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_FAILED, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', }, parentStackLogicalIds: [], }); historyActivityPrinter.stop(); }); expect(output.length).toStrictEqual(4); expect(output[0].trim()).toStrictEqual(`stack-name | 0/2 | ${HUMAN_TIME} | ${chalk.reset('UPDATE_IN_PROGRESS ')} | AWS::CloudFormation::Stack | ${chalk.reset(chalk.bold('stack1'))}`); expect(output[1].trim()).toStrictEqual(`stack-name | 0/2 | ${HUMAN_TIME} | ${chalk.red('UPDATE_FAILED ')} | AWS::CloudFormation::Stack | ${chalk.red(chalk.bold('stack1'))}`); expect(output[2].trim()).toStrictEqual('Failed resources:'); expect(output[3].trim()).toStrictEqual(`stack-name | ${HUMAN_TIME} | ${chalk.red('UPDATE_FAILED ')} | AWS::CloudFormation::Stack | ${chalk.red(chalk.bold('stack1'))}`); }); test('print failed resources because of hook failures', () => { const historyActivityPrinter = new stack_activity_monitor_1.HistoryActivityPrinter({ resourceTypeColumnWidth: 23, resourcesTotal: 1, stream: process.stderr, }); const output = console_listener_1.stderr.inspectSync(() => { historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_IN_PROGRESS, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', HookStatus: 'HOOK_COMPLETE_FAILED', HookType: 'hook1', HookStatusReason: 'stack1 must obey certain rules', }, parentStackLogicalIds: [], }); historyActivityPrinter.addActivity({ event: { LogicalResourceId: 'stack1', ResourceStatus: client_cloudformation_1.ResourceStatus.UPDATE_FAILED, Timestamp: new Date(TIMESTAMP), ResourceType: 'AWS::CloudFormation::Stack', StackId: '', EventId: '', StackName: 'stack-name', ResourceStatusReason: 'The following hook(s) failed: hook1', }, parentStackLogicalIds: [], }); historyActivityPrinter.stop(); }); expect(output.length).toStrictEqual(4); expect(output[0].trim()).toStrictEqual(`stack-name | 0/2 | ${HUMAN_TIME} | ${chalk.reset('UPDATE_IN_PROGRESS ')} | AWS::CloudFormation::Stack | ${chalk.reset(chalk.bold('stack1'))}`); expect(output[1].trim()).toStrictEqual(`stack-name | 0/2 | ${HUMAN_TIME} | ${chalk.red('UPDATE_FAILED ')} | AWS::CloudFormation::Stack | ${chalk.red(chalk.bold('stack1'))} ${chalk.red(chalk.bold('The following hook(s) failed: hook1 : stack1 must obey certain rules'))}`); expect(output[2].trim()).toStrictEqual('Failed resources:'); expect(output[3].trim()).toStrictEqual(`stack-name | ${HUMAN_TIME} | ${chalk.red('UPDATE_FAILED ')} | AWS::CloudFormation::Stack | ${chalk.red(chalk.bold('stack1'))} ${chalk.red(chalk.bold('The following hook(s) failed: hook1 : stack1 must obey certain rules'))}`); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stYWN0aXZpdHktbW9uaXRvci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stYWN0aXZpdHktbW9uaXRvci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLCtCQUErQjtBQUMvQix5REFBNEM7QUFDNUMscUdBQWtHO0FBQ2xHLDBFQUFnRTtBQUNoRSwrREFBMEQ7QUFFMUQsSUFBSSxTQUFpQixDQUFDO0FBQ3RCLElBQUksVUFBa0IsQ0FBQztBQUV2QixTQUFTLENBQUMsR0FBRyxFQUFFO0lBQ2IsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDdEQsdUJBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDZGQUE2RixFQUFFLEdBQUcsRUFBRTtJQUN2RyxNQUFNLHNCQUFzQixHQUFHLElBQUksK0NBQXNCLENBQUM7UUFDeEQsdUJBQXVCLEVBQUUsRUFBRTtRQUMzQixjQUFjLEVBQUUsQ0FBQztRQUNqQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQUcseUJBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ3JDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztZQUNqQyxLQUFLLEVBQUU7Z0JBQ0wsaUJBQWlCLEVBQUUsUUFBUTtnQkFDM0IsY0FBYyxFQUFFLHNDQUFjLENBQUMsa0JBQWtCO2dCQUNqRCxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM5QixZQUFZLEVBQUUsNEJBQTRCO2dCQUMxQyxPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFB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YSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FDcEMsZ0JBQWdCLFVBQVUsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLG1DQUFtQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsc0VBQXNFLENBQUMsQ0FBQyxFQUFFLENBQ3ZPLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9vcmRlciAqL1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgc3RkZXJyIH0gZnJvbSAnLi9jb25zb2xlLWxpc3RlbmVyJztcbmltcG9ydCB7IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIgfSBmcm9tICcuLi8uLi9saWIvYXBpL3V0aWwvY2xvdWRmb3JtYXRpb24vc3RhY2stYWN0aXZpdHktbW9uaXRvcic7XG5pbXBvcnQgeyBSZXNvdXJjZVN0YXR1cyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBDbGlJb0hvc3QgfSBmcm9tICcuLi8uLi9saWIvdG9vbGtpdC9jbGktaW8taG9zdCc7XG5cbmxldCBUSU1FU1RBTVA6IG51bWJlcjtcbmxldCBIVU1BTl9USU1FOiBzdHJpbmc7XG5cbmJlZm9yZUFsbCgoKSA9PiB7XG4gIFRJTUVTVEFNUCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBIVU1BTl9USU1FID0gbmV3IERhdGUoVElNRVNUQU1QKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgQ2xpSW9Ib3N0Lmluc3RhbmNlKCkuaXNDSSA9IGZhbHNlO1xufSk7XG5cbnRlc3QoJ3ByaW50cyAwLzQgcHJvZ3Jlc3MgcmVwb3J0LCB3aGVuIGFkZEFjdGl2aXR5IGlzIGNhbGxlZCB3aXRoIGFuIFwiSU5fUFJPR1JFU1NcIiBSZXNvdXJjZVN0YXR1cycsICgpID0+IHtcbiAgY29uc3QgaGlzdG9yeUFjdGl2aXR5UHJpbnRlciA9IG5ldyBIaXN0b3J5QWN0aXZpdHlQcmludGVyKHtcbiAgICByZXNvdXJjZVR5cGVDb2x1bW5XaWR0aDogMjMsXG4gICAgcmVzb3VyY2VzVG90YWw6IDMsXG4gICAgc3RyZWFtOiBwcm9jZXNzLnN0ZGVycixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLkNSRUFURV9JTl9QUk9HUkVTUyxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgZXhwZWN0KG91dHB1dFswXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAwLzQgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5yZXNldCgnQ1JFQVRFX0lOX1BST0dSRVNTICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsucmVzZXQoY2hhbGsuYm9sZCgnc3RhY2sxJykpfWAsXG4gICk7XG59KTtcblxudGVzdCgncHJpbnRzIDEvNCBwcm9ncmVzcyByZXBvcnQsIHdoZW4gYWRkQWN0aXZpdHkgaXMgY2FsbGVkIHdpdGggYW4gXCJVUERBVEVfQ09NUExFVEVcIiBSZXNvdXJjZVN0YXR1cycsICgpID0+IHtcbiAgY29uc3QgaGlzdG9yeUFjdGl2aXR5UHJpbnRlciA9IG5ldyBIaXN0b3J5QWN0aXZpdHlQcmludGVyKHtcbiAgICByZXNvdXJjZVR5cGVDb2x1bW5XaWR0aDogMjMsXG4gICAgcmVzb3VyY2VzVG90YWw6IDMsXG4gICAgc3RyZWFtOiBwcm9jZXNzLnN0ZGVycixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9DT01QTEVURSxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgZXhwZWN0KG91dHB1dFswXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAxLzQgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5ncmVlbignVVBEQVRFX0NPTVBMRVRFICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnc3RhY2sxJykpfWAsXG4gICk7XG59KTtcblxudGVzdCgncHJpbnRzIDEvNCBwcm9ncmVzcyByZXBvcnQsIHdoZW4gYWRkQWN0aXZpdHkgaXMgY2FsbGVkIHdpdGggYW4gXCJVUERBVEVfQ09NUExFVEVcIiBSZXNvdXJjZVN0YXR1cycsICgpID0+IHtcbiAgY29uc3QgaGlzdG9yeUFjdGl2aXR5UHJpbnRlciA9IG5ldyBIaXN0b3J5QWN0aXZpdHlQcmludGVyKHtcbiAgICByZXNvdXJjZVR5cGVDb2x1bW5XaWR0aDogMjMsXG4gICAgcmVzb3VyY2VzVG90YWw6IDMsXG4gICAgc3RyZWFtOiBwcm9jZXNzLnN0ZGVycixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9DT01QTEVURSxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgZXhwZWN0KG91dHB1dFswXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAxLzQgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5ncmVlbignVVBEQVRFX0NPTVBMRVRFICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnc3RhY2sxJykpfWAsXG4gICk7XG59KTtcblxudGVzdCgncHJpbnRzIDEvNCBwcm9ncmVzcyByZXBvcnQsIHdoZW4gYWRkQWN0aXZpdHkgaXMgY2FsbGVkIHdpdGggYW4gXCJST0xMQkFDS19DT01QTEVURVwiIFJlc291cmNlU3RhdHVzJywgKCkgPT4ge1xuICBjb25zdCBoaXN0b3J5QWN0aXZpdHlQcmludGVyID0gbmV3IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIoe1xuICAgIHJlc291cmNlVHlwZUNvbHVtbldpZHRoOiAyMyxcbiAgICByZXNvdXJjZXNUb3RhbDogMyxcbiAgICBzdHJlYW06IHByb2Nlc3Muc3RkZXJyLFxuICB9KTtcblxuICBjb25zdCBvdXRwdXQgPSBzdGRlcnIuaW5zcGVjdFN5bmMoKCkgPT4ge1xuICAgIGhpc3RvcnlBY3Rpdml0eVByaW50ZXIuYWRkQWN0aXZpdHkoe1xuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgTG9naWNhbFJlc291cmNlSWQ6ICdzdGFjazEnLFxuICAgICAgICBSZXNvdXJjZVN0YXR1czogUmVzb3VyY2VTdGF0dXMuUk9MTEJBQ0tfQ09NUExFVEUsXG4gICAgICAgIFRpbWVzdGFtcDogbmV3IERhdGUoVElNRVNUQU1QKSxcbiAgICAgICAgUmVzb3VyY2VUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICBTdGFja0lkOiAnJyxcbiAgICAgICAgRXZlbnRJZDogJycsXG4gICAgICAgIFN0YWNrTmFtZTogJ3N0YWNrLW5hbWUnLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogW10sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGV4cGVjdChvdXRwdXRbMF0udHJpbSgpKS50b1N0cmljdEVxdWFsKFxuICAgIGBzdGFjay1uYW1lIHwgMS80IHwgJHtIVU1BTl9USU1FfSB8ICR7Y2hhbGsueWVsbG93KCdST0xMQkFDS19DT01QTEVURSAgICcpfSB8IEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIHwgJHtjaGFsay55ZWxsb3coY2hhbGsuYm9sZCgnc3RhY2sxJykpfWAsXG4gICk7XG59KTtcblxudGVzdCgncHJpbnRzIDAvNCBwcm9ncmVzcyByZXBvcnQsIHdoZW4gYWRkQWN0aXZpdHkgaXMgY2FsbGVkIHdpdGggYW4gXCJVUERBVEVfRkFJTEVEXCIgUmVzb3VyY2VTdGF0dXMnLCAoKSA9PiB7XG4gIGNvbnN0IGhpc3RvcnlBY3Rpdml0eVByaW50ZXIgPSBuZXcgSGlzdG9yeUFjdGl2aXR5UHJpbnRlcih7XG4gICAgcmVzb3VyY2VUeXBlQ29sdW1uV2lkdGg6IDIzLFxuICAgIHJlc291cmNlc1RvdGFsOiAzLFxuICAgIHN0cmVhbTogcHJvY2Vzcy5zdGRlcnIsXG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dCA9IHN0ZGVyci5pbnNwZWN0U3luYygoKSA9PiB7XG4gICAgaGlzdG9yeUFjdGl2aXR5UHJpbnRlci5hZGRBY3Rpdml0eSh7XG4gICAgICBldmVudDoge1xuICAgICAgICBMb2dpY2FsUmVzb3VyY2VJZDogJ3N0YWNrMScsXG4gICAgICAgIFJlc291cmNlU3RhdHVzOiBSZXNvdXJjZVN0YXR1cy5VUERBVEVfRkFJTEVELFxuICAgICAgICBUaW1lc3RhbXA6IG5ldyBEYXRlKFRJTUVTVEFNUCksXG4gICAgICAgIFJlc291cmNlVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgU3RhY2tJZDogJycsXG4gICAgICAgIEV2ZW50SWQ6ICcnLFxuICAgICAgICBTdGFja05hbWU6ICdzdGFjay1uYW1lJyxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IFtdLFxuICAgIH0pO1xuICB9KTtcblxuICBleHBlY3Qob3V0cHV0WzBdLnRyaW0oKSkudG9TdHJpY3RFcXVhbChcbiAgICBgc3RhY2stbmFtZSB8IDAvNCB8ICR7SFVNQU5fVElNRX0gfCAke2NoYWxrLnJlZCgnVVBEQVRFX0ZBSUxFRCAgICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsucmVkKGNoYWxrLmJvbGQoJ3N0YWNrMScpKX1gLFxuICApO1xufSk7XG5cbnRlc3QoJ2RvZXMgbm90IHByaW50IFwiRmFpbGVkIFJlc291cmNlczpcIiBsaXN0LCB3aGVuIGFsbCBkZXBsb3ltZW50cyBhcmUgc3VjY2Vzc2Z1bCcsICgpID0+IHtcbiAgY29uc3QgaGlzdG9yeUFjdGl2aXR5UHJpbnRlciA9IG5ldyBIaXN0b3J5QWN0aXZpdHlQcmludGVyKHtcbiAgICByZXNvdXJjZVR5cGVDb2x1bW5XaWR0aDogMjMsXG4gICAgcmVzb3VyY2VzVG90YWw6IDEsXG4gICAgc3RyZWFtOiBwcm9jZXNzLnN0ZGVycixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9JTl9QUk9HUkVTUyxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9DT01QTEVURSxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2syJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9DT01QTEVURSxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLnN0b3AoKTtcbiAgfSk7XG5cbiAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvU3RyaWN0RXF1YWwoMyk7XG4gIGV4cGVjdChvdXRwdXRbMF0udHJpbSgpKS50b1N0cmljdEVxdWFsKFxuICAgIGBzdGFjay1uYW1lIHwgMC8yIHwgJHtIVU1BTl9USU1FfSB8ICR7Y2hhbGsucmVzZXQoJ1VQREFURV9JTl9QUk9HUkVTUyAgJyl9IHwgQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgfCAke2NoYWxrLnJlc2V0KGNoYWxrLmJvbGQoJ3N0YWNrMScpKX1gLFxuICApO1xuICBleHBlY3Qob3V0cHV0WzFdLnRyaW0oKSkudG9TdHJpY3RFcXVhbChcbiAgICBgc3RhY2stbmFtZSB8IDEvMiB8ICR7SFVNQU5fVElNRX0gfCAke2NoYWxrLmdyZWVuKCdVUERBVEVfQ09NUExFVEUgICAgICcpfSB8IEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIHwgJHtjaGFsay5ncmVlbihjaGFsay5ib2xkKCdzdGFjazEnKSl9YCxcbiAgKTtcbiAgZXhwZWN0KG91dHB1dFsyXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAyLzIgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5ncmVlbignVVBEQVRFX0NPTVBMRVRFICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnc3RhY2syJykpfWAsXG4gICk7XG59KTtcblxudGVzdCgncHJpbnRzIFwiRmFpbGVkIFJlc291cmNlczpcIiBsaXN0LCB3aGVuIGF0IGxlYXN0IG9uZSBkZXBsb3ltZW50IGZhaWxzJywgKCkgPT4ge1xuICBjb25zdCBoaXN0b3J5QWN0aXZpdHlQcmludGVyID0gbmV3IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIoe1xuICAgIHJlc291cmNlVHlwZUNvbHVtbldpZHRoOiAyMyxcbiAgICByZXNvdXJjZXNUb3RhbDogMSxcbiAgICBzdHJlYW06IHByb2Nlc3Muc3RkZXJyLFxuICB9KTtcblxuICBjb25zdCBvdXRwdXQgPSBzdGRlcnIuaW5zcGVjdFN5bmMoKCkgPT4ge1xuICAgIGhpc3RvcnlBY3Rpdml0eVByaW50ZXIuYWRkQWN0aXZpdHkoe1xuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgTG9naWNhbFJlc291cmNlSWQ6ICdzdGFjazEnLFxuICAgICAgICBSZXNvdXJjZVN0YXR1czogUmVzb3VyY2VTdGF0dXMuVVBEQVRFX0lOX1BST0dSRVNTLFxuICAgICAgICBUaW1lc3RhbXA6IG5ldyBEYXRlKFRJTUVTVEFNUCksXG4gICAgICAgIFJlc291cmNlVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgU3RhY2tJZDogJycsXG4gICAgICAgIEV2ZW50SWQ6ICcnLFxuICAgICAgICBTdGFja05hbWU6ICdzdGFjay1uYW1lJyxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IFtdLFxuICAgIH0pO1xuICAgIGhpc3RvcnlBY3Rpdml0eVByaW50ZXIuYWRkQWN0aXZpdHkoe1xuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgTG9naWNhbFJlc291cmNlSWQ6ICdzdGFjazEnLFxuICAgICAgICBSZXNvdXJjZVN0YXR1czogUmVzb3VyY2VTdGF0dXMuVVBEQVRFX0ZBSUxFRCxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBbXSxcbiAgICB9KTtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLnN0b3AoKTtcbiAgfSk7XG5cbiAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvU3RyaWN0RXF1YWwoNCk7XG4gIGV4cGVjdChvdXRwdXRbMF0udHJpbSgpKS50b1N0cmljdEVxdWFsKFxuICAgIGBzdGFjay1uYW1lIHwgMC8yIHwgJHtIVU1BTl9USU1FfSB8ICR7Y2hhbGsucmVzZXQoJ1VQREFURV9JTl9QUk9HUkVTUyAgJyl9IHwgQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgfCAke2NoYWxrLnJlc2V0KGNoYWxrLmJvbGQoJ3N0YWNrMScpKX1gLFxuICApO1xuICBleHBlY3Qob3V0cHV0WzFdLnRyaW0oKSkudG9TdHJpY3RFcXVhbChcbiAgICBgc3RhY2stbmFtZSB8IDAvMiB8ICR7SFVNQU5fVElNRX0gfCAke2NoYWxrLnJlZCgnVVBEQVRFX0ZBSUxFRCAgICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsucmVkKGNoYWxrLmJvbGQoJ3N0YWNrMScpKX1gLFxuICApO1xuICBleHBlY3Qob3V0cHV0WzJdLnRyaW0oKSkudG9TdHJpY3RFcXVhbCgnRmFpbGVkIHJlc291cmNlczonKTtcbiAgZXhwZWN0KG91dHB1dFszXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5yZWQoJ1VQREFURV9GQUlMRUQgICAgICAgJyl9IHwgQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgfCAke2NoYWxrLnJlZChjaGFsay5ib2xkKCdzdGFjazEnKSl9YCxcbiAgKTtcbn0pO1xuXG50ZXN0KCdwcmludCBmYWlsZWQgcmVzb3VyY2VzIGJlY2F1c2Ugb2YgaG9vayBmYWlsdXJlcycsICgpID0+IHtcbiAgY29uc3QgaGlzdG9yeUFjdGl2aXR5UHJpbnRlciA9IG5ldyBIaXN0b3J5QWN0aXZpdHlQcmludGVyKHtcbiAgICByZXNvdXJjZVR5cGVDb2x1bW5XaWR0aDogMjMsXG4gICAgcmVzb3VyY2VzVG90YWw6IDEsXG4gICAgc3RyZWFtOiBwcm9jZXNzLnN0ZGVycixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc3RkZXJyLmluc3BlY3RTeW5jKCgpID0+IHtcbiAgICBoaXN0b3J5QWN0aXZpdHlQcmludGVyLmFkZEFjdGl2aXR5KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiAnc3RhY2sxJyxcbiAgICAgICAgUmVzb3VyY2VTdGF0dXM6IFJlc291cmNlU3RhdHVzLlVQREFURV9JTl9QUk9HUkVTUyxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICAgIEhvb2tTdGF0dXM6ICdIT09LX0NPTVBMRVRFX0ZBSUxFRCcsXG4gICAgICAgIEhvb2tUeXBlOiAnaG9vazEnLFxuICAgICAgICBIb29rU3RhdHVzUmVhc29uOiAnc3RhY2sxIG11c3Qgb2JleSBjZXJ0YWluIHJ1bGVzJyxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IFtdLFxuICAgIH0pO1xuICAgIGhpc3RvcnlBY3Rpdml0eVByaW50ZXIuYWRkQWN0aXZpdHkoe1xuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgTG9naWNhbFJlc291cmNlSWQ6ICdzdGFjazEnLFxuICAgICAgICBSZXNvdXJjZVN0YXR1czogUmVzb3VyY2VTdGF0dXMuVVBEQVRFX0ZBSUxFRCxcbiAgICAgICAgVGltZXN0YW1wOiBuZXcgRGF0ZShUSU1FU1RBTVApLFxuICAgICAgICBSZXNvdXJjZVR5cGU6ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycsXG4gICAgICAgIFN0YWNrSWQ6ICcnLFxuICAgICAgICBFdmVudElkOiAnJyxcbiAgICAgICAgU3RhY2tOYW1lOiAnc3RhY2stbmFtZScsXG4gICAgICAgIFJlc291cmNlU3RhdHVzUmVhc29uOiAnVGhlIGZvbGxvd2luZyBob29rKHMpIGZhaWxlZDogaG9vazEnLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogW10sXG4gICAgfSk7XG4gICAgaGlzdG9yeUFjdGl2aXR5UHJpbnRlci5zdG9wKCk7XG4gIH0pO1xuXG4gIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b1N0cmljdEVxdWFsKDQpO1xuICBleHBlY3Qob3V0cHV0WzBdLnRyaW0oKSkudG9TdHJpY3RFcXVhbChcbiAgICBgc3RhY2stbmFtZSB8IDAvMiB8ICR7SFVNQU5fVElNRX0gfCAke2NoYWxrLnJlc2V0KCdVUERBVEVfSU5fUFJPR1JFU1MgICcpfSB8IEFXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrIHwgJHtjaGFsay5yZXNldChjaGFsay5ib2xkKCdzdGFjazEnKSl9YCxcbiAgKTtcbiAgZXhwZWN0KG91dHB1dFsxXS50cmltKCkpLnRvU3RyaWN0RXF1YWwoXG4gICAgYHN0YWNrLW5hbWUgfCAwLzIgfCAke0hVTUFOX1RJTUV9IHwgJHtjaGFsay5yZWQoJ1VQREFURV9GQUlMRUQgICAgICAgJyl9IHwgQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2sgfCAke2NoYWxrLnJlZChjaGFsay5ib2xkKCdzdGFjazEnKSl9ICR7Y2hhbGsucmVkKGNoYWxrLmJvbGQoJ1RoZSBmb2xsb3dpbmcgaG9vayhzKSBmYWlsZWQ6IGhvb2sxIDogc3RhY2sxIG11c3Qgb2JleSBjZXJ0YWluIHJ1bGVzJykpfWAsXG4gICk7XG4gIGV4cGVjdChvdXRwdXRbMl0udHJpbSgpKS50b1N0cmljdEVxdWFsKCdGYWlsZWQgcmVzb3VyY2VzOicpO1xuICBleHBlY3Qob3V0cHV0WzNdLnRyaW0oKSkudG9TdHJpY3RFcXVhbChcbiAgICBgc3RhY2stbmFtZSB8ICR7SFVNQU5fVElNRX0gfCAke2NoYWxrLnJlZCgnVVBEQVRFX0ZBSUxFRCAgICAgICAnKX0gfCBBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjayB8ICR7Y2hhbGsucmVkKGNoYWxrLmJvbGQoJ3N0YWNrMScpKX0gJHtjaGFsay5yZWQoY2hhbGsuYm9sZCgnVGhlIGZvbGxvd2luZyBob29rKHMpIGZhaWxlZDogaG9vazEgOiBzdGFjazEgbXVzdCBvYmV5IGNlcnRhaW4gcnVsZXMnKSl9YCxcbiAgKTtcbn0pO1xuIl19