UNPKG

@aws-cdk-testing/cli-integ

Version:

Integration tests for the AWS CDK CLI

144 lines 18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable no-console */ const path = require("path"); const jest = require("jest"); const yargs = require("yargs"); const release_source_1 = require("../package-sources/release-source"); const repo_source_1 = require("../package-sources/repo-source"); const subprocess_1 = require("../package-sources/subprocess"); async function main() { var _a; const args = await yargs .usage('$0 <SUITENAME>') .positional('SUITENAME', { descripton: 'Name of the test suite to run', type: 'string', demandOption: true, }) .option('test', { descripton: 'Test pattern to selectively run tests', alias: 't', type: 'string', requiresArg: true, }) .option('test-file', { description: 'The specific test file to run', type: 'string', requiresArg: true, }) .option('use-source', { descripton: 'Use TypeScript packages from the given source repository (or "auto")', alias: 's', type: 'string', requiresArg: true, }) .option('use-cli-release', { descripton: 'Run the current tests against the CLI at the given version', alias: 'u', type: 'string', requiresArg: true, }) .option('auto-source', { alias: 'a', description: 'Automatically find the source tree from the current working directory', type: 'boolean', requiresArg: false, }) .option('runInBand', { descripton: 'Run all tests in one Node process', alias: 'i', type: 'boolean', }) .options('framework-version', { description: 'Framework version to use, if different than the CLI version (not all suites respect this)', alias: 'f', type: 'string', }) .options('verbose', { alias: 'v', description: 'Run in verbose mode', type: 'boolean', requiresArg: false, }) .options('passWithNoTests', { description: 'Allow passing if the test suite is not found (default true when IS_CANARY mode, false otherwise)', type: 'boolean', requiresArg: false, }) .options('maxWorkers', { alias: 'w', description: 'Specifies the maximum number of workers the worker-pool will spawn for running tests. We use a sensible default for running cli integ tests.', type: 'string', requiresArg: true, }) .help() .showHelpOnFail(false) .argv; const suiteName = args._[0]; if (!suiteName) { throw new Error('Usage: run-suite <SUITENAME>'); } let packageSource; function usePackageSource(s) { if (packageSource) { throw new Error('Cannot specify two package sources'); } packageSource = s; } if (args['use-source'] || args['auto-source']) { if (args['framework-version']) { throw new Error('Cannot use --framework-version with --use-source'); } const root = args['use-source'] && args['use-source'] !== 'auto' ? args['use-source'] : await (0, repo_source_1.autoFindRoot)(); usePackageSource(new repo_source_1.RepoPackageSourceSetup(root)); } else if (args['use-cli-release']) { usePackageSource(new release_source_1.ReleasePackageSourceSetup(args['use-cli-release'], args['framework-version'])); } if (!packageSource) { throw new Error('Specify either --use-source or --use-cli-release'); } console.log(`Package source: ${packageSource.description}`); console.log(`Test suite: ${suiteName}`); console.log(`Test version: ${thisPackageVersion()}`); await packageSource.prepare(); (0, subprocess_1.serializeForSubprocess)(packageSource); if (args.verbose) { process.env.VERBOSE = '1'; } // Motivation behind this behavior: when adding a new test suite to the pipeline, because of the way our // Pipeline package works, the suite would be added to the pipeline AND as a canary immediately. The canary // would fail until the package was actually released, so for canaries we make an exception so that the initial // canary would succeed even if the suite wasn't yet available. The fact that the suite is not optional in // the pipeline protects us from typos. const passWithNoTests = (_a = args.passWithNoTests) !== null && _a !== void 0 ? _a : !!process.env.IS_CANARY; // Communicate with the config file (integ.jest.config.js) process.env.TEST_SUITE_NAME = suiteName; try { await jest.run([ '--randomize', ...args.runInBand ? ['-i'] : [], ...args.test ? ['-t', args.test] : [], ...args.verbose ? ['--verbose'] : [], ...args.maxWorkers ? [`--maxWorkers=${args.maxWorkers}`] : [], ...passWithNoTests ? ['--passWithNoTests'] : [], ...args['test-file'] ? [args['test-file']] : [], ], path.resolve(__dirname, '..', '..', 'resources', 'integ.jest.config.js')); } finally { await packageSource.cleanup(); } } function thisPackageVersion() { // eslint-disable-next-line @typescript-eslint/no-require-imports return require('../../package.json').version; } main().catch(e => { // eslint-disable-next-line no-console console.error(e); process.exitCode = 1; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXN1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicnVuLXN1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLHNFQUE4RTtBQUM5RSxnRUFBc0Y7QUFFdEYsOERBQXVFO0FBRXZFLEtBQUssVUFBVSxJQUFJOztJQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUs7U0FDckIsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQ3ZCLFVBQVUsQ0FBQyxXQUFXLEVBQUU7UUFDdkIsVUFBVSxFQUFFLCtCQUErQjtRQUMzQyxJQUFJLEVBQUUsUUFBUTtRQUNkLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUM7U0FDRCxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ2QsVUFBVSxFQUFFLHVDQUF1QztRQUNuRCxLQUFLLEVBQUUsR0FBRztRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQztTQUNELE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDbkIsV0FBVyxFQUFFLCtCQUErQjtRQUM1QyxJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7U0FDRCxNQUFNLENBQUMsWUFBWSxFQUFFO1FBQ3BCLFVBQVUsRUFBRSxzRUFBc0U7UUFDbEYsS0FBSyxFQUFFLEdBQUc7UUFDVixJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7U0FDRCxNQUFNLENBQUMsaUJBQWlCLEVBQUU7UUFDekIsVUFBVSxFQUFFLDREQUE0RDtRQUN4RSxLQUFLLEVBQUUsR0FBRztRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQztTQUNELE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDckIsS0FBSyxFQUFFLEdBQUc7UUFDVixXQUFXLEVBQUUsdUVB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RUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3pCLGlFQUFpRTtJQUNqRSxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUMvQyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2Ysc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgamVzdCBmcm9tICdqZXN0JztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IFJlbGVhc2VQYWNrYWdlU291cmNlU2V0dXAgfSBmcm9tICcuLi9wYWNrYWdlLXNvdXJjZXMvcmVsZWFzZS1zb3VyY2UnO1xuaW1wb3J0IHsgUmVwb1BhY2thZ2VTb3VyY2VTZXR1cCwgYXV0b0ZpbmRSb290IH0gZnJvbSAnLi4vcGFja2FnZS1zb3VyY2VzL3JlcG8tc291cmNlJztcbmltcG9ydCB7IElQYWNrYWdlU291cmNlU2V0dXAgfSBmcm9tICcuLi9wYWNrYWdlLXNvdXJjZXMvc291cmNlJztcbmltcG9ydCB7IHNlcmlhbGl6ZUZvclN1YnByb2Nlc3MgfSBmcm9tICcuLi9wYWNrYWdlLXNvdXJjZXMvc3VicHJvY2Vzcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3MgPSBhd2FpdCB5YXJnc1xuICAgIC51c2FnZSgnJDAgPFNVSVRFTkFNRT4nKVxuICAgIC5wb3NpdGlvbmFsKCdTVUlURU5BTUUnLCB7XG4gICAgICBkZXNjcmlwdG9uOiAnTmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSB0byBydW4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCd0ZXN0Jywge1xuICAgICAgZGVzY3JpcHRvbjogJ1Rlc3QgcGF0dGVybiB0byBzZWxlY3RpdmVseSBydW4gdGVzdHMnLFxuICAgICAgYWxpYXM6ICd0JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCd0ZXN0LWZpbGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzcGVjaWZpYyB0ZXN0IGZpbGUgdG8gcnVuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCd1c2Utc291cmNlJywge1xuICAgICAgZGVzY3JpcHRvbjogJ1VzZSBUeXBlU2NyaXB0IHBhY2thZ2VzIGZyb20gdGhlIGdpdmVuIHNvdXJjZSByZXBvc2l0b3J5IChvciBcImF1dG9cIiknLFxuICAgICAgYWxpYXM6ICdzJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCd1c2UtY2xpLXJlbGVhc2UnLCB7XG4gICAgICBkZXNjcmlwdG9uOiAnUnVuIHRoZSBjdXJyZW50IHRlc3RzIGFnYWluc3QgdGhlIENMSSBhdCB0aGUgZ2l2ZW4gdmVyc2lvbicsXG4gICAgICBhbGlhczogJ3UnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICByZXF1aXJlc0FyZzogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ2F1dG8tc291cmNlJywge1xuICAgICAgYWxpYXM6ICdhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXV0b21hdGljYWxseSBmaW5kIHRoZSBzb3VyY2UgdHJlZSBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3J1bkluQmFuZCcsIHtcbiAgICAgIGRlc2NyaXB0b246ICdSdW4gYWxsIHRlc3RzIGluIG9uZSBOb2RlIHByb2Nlc3MnLFxuICAgICAgYWxpYXM6ICdpJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICB9KVxuICAgIC5vcHRpb25zKCdmcmFtZXdvcmstdmVyc2lvbicsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRnJhbWV3b3JrIHZlcnNpb24gdG8gdXNlLCBpZiBkaWZmZXJlbnQgdGhhbiB0aGUgQ0xJIHZlcnNpb24gKG5vdCBhbGwgc3VpdGVzIHJlc3BlY3QgdGhpcyknLFxuICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH0pXG4gICAgLm9wdGlvbnMoJ3ZlcmJvc2UnLCB7XG4gICAgICBhbGlhczogJ3YnLFxuICAgICAgZGVzY3JpcHRpb246ICdSdW4gaW4gdmVyYm9zZSBtb2RlJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICB9KVxuICAgIC5vcHRpb25zKCdwYXNzV2l0aE5vVGVzdHMnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0FsbG93IHBhc3NpbmcgaWYgdGhlIHRlc3Qgc3VpdGUgaXMgbm90IGZvdW5kIChkZWZhdWx0IHRydWUgd2hlbiBJU19DQU5BUlkgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlKScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgfSlcbiAgICAub3B0aW9ucygnbWF4V29ya2VycycsIHtcbiAgICAgIGFsaWFzOiAndycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd29ya2VycyB0aGUgd29ya2VyLXBvb2wgd2lsbCBzcGF3biBmb3IgcnVubmluZyB0ZXN0cy4gV2UgdXNlIGEgc2Vuc2libGUgZGVmYXVsdCBmb3IgcnVubmluZyBjbGkgaW50ZWcgdGVzdHMuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAuaGVscCgpXG4gICAgLnNob3dIZWxwT25GYWlsKGZhbHNlKVxuICAgIC5hcmd2O1xuXG4gIGNvbnN0IHN1aXRlTmFtZSA9IGFyZ3MuX1swXSBhcyBzdHJpbmc7XG4gIGlmICghc3VpdGVOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2FnZTogcnVuLXN1aXRlIDxTVUlURU5BTUU+Jyk7XG4gIH1cblxuICBsZXQgcGFja2FnZVNvdXJjZTogdW5kZWZpbmVkIHwgSVBhY2thZ2VTb3VyY2VTZXR1cDtcbiAgZnVuY3Rpb24gdXNlUGFja2FnZVNvdXJjZShzOiBJUGFja2FnZVNvdXJjZVNldHVwKSB7XG4gICAgaWYgKHBhY2thZ2VTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNwZWNpZnkgdHdvIHBhY2thZ2Ugc291cmNlcycpO1xuICAgIH1cbiAgICBwYWNrYWdlU291cmNlID0gcztcbiAgfVxuXG4gIGlmIChhcmdzWyd1c2Utc291cmNlJ10gfHwgYXJnc1snYXV0by1zb3VyY2UnXSkge1xuICAgIGlmIChhcmdzWydmcmFtZXdvcmstdmVyc2lvbiddKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgLS1mcmFtZXdvcmstdmVyc2lvbiB3aXRoIC0tdXNlLXNvdXJjZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSBhcmdzWyd1c2Utc291cmNlJ10gJiYgYXJnc1sndXNlLXNvdXJjZSddICE9PSAnYXV0bydcbiAgICAgID8gYXJnc1sndXNlLXNvdXJjZSddXG4gICAgICA6IGF3YWl0IGF1dG9GaW5kUm9vdCgpO1xuXG4gICAgdXNlUGFja2FnZVNvdXJjZShuZXcgUmVwb1BhY2thZ2VTb3VyY2VTZXR1cChyb290KSk7XG4gIH0gZWxzZSBpZiAoYXJnc1sndXNlLWNsaS1yZWxlYXNlJ10pIHtcbiAgICB1c2VQYWNrYWdlU291cmNlKG5ldyBSZWxlYXNlUGFja2FnZVNvdXJjZVNldHVwKGFyZ3NbJ3VzZS1jbGktcmVsZWFzZSddLCBhcmdzWydmcmFtZXdvcmstdmVyc2lvbiddKSk7XG4gIH1cbiAgaWYgKCFwYWNrYWdlU291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGVjaWZ5IGVpdGhlciAtLXVzZS1zb3VyY2Ugb3IgLS11c2UtY2xpLXJlbGVhc2UnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBQYWNrYWdlIHNvdXJjZTogJHtwYWNrYWdlU291cmNlLmRlc2NyaXB0aW9ufWApO1xuICBjb25zb2xlLmxvZyhgVGVzdCBzdWl0ZTogICAgICR7c3VpdGVOYW1lfWApO1xuICBjb25zb2xlLmxvZyhgVGVzdCB2ZXJzaW9uOiAgICR7dGhpc1BhY2thZ2VWZXJzaW9uKCl9YCk7XG5cbiAgYXdhaXQgcGFja2FnZVNvdXJjZS5wcmVwYXJlKCk7XG4gIHNlcmlhbGl6ZUZvclN1YnByb2Nlc3MocGFja2FnZVNvdXJjZSk7XG5cbiAgaWYgKGFyZ3MudmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LlZFUkJPU0UgPSAnMSc7XG4gIH1cblxuICAvLyBNb3RpdmF0aW9uIGJlaGluZCB0aGlzIGJlaGF2aW9yOiB3aGVuIGFkZGluZyBhIG5ldyB0ZXN0IHN1aXRlIHRvIHRoZSBwaXBlbGluZSwgYmVjYXVzZSBvZiB0aGUgd2F5IG91clxuICAvLyBQaXBlbGluZSBwYWNrYWdlIHdvcmtzLCB0aGUgc3VpdGUgd291bGQgYmUgYWRkZWQgdG8gdGhlIHBpcGVsaW5lIEFORCBhcyBhIGNhbmFyeSBpbW1lZGlhdGVseS4gVGhlIGNhbmFyeVxuICAvLyB3b3VsZCBmYWlsIHVudGlsIHRoZSBwYWNrYWdlIHdhcyBhY3R1YWxseSByZWxlYXNlZCwgc28gZm9yIGNhbmFyaWVzIHdlIG1ha2UgYW4gZXhjZXB0aW9uIHNvIHRoYXQgdGhlIGluaXRpYWxcbiAgLy8gY2FuYXJ5IHdvdWxkIHN1Y2NlZWQgZXZlbiBpZiB0aGUgc3VpdGUgd2Fzbid0IHlldCBhdmFpbGFibGUuIFRoZSBmYWN0IHRoYXQgdGhlIHN1aXRlIGlzIG5vdCBvcHRpb25hbCBpblxuICAvLyB0aGUgcGlwZWxpbmUgcHJvdGVjdHMgdXMgZnJvbSB0eXBvcy5cbiAgY29uc3QgcGFzc1dpdGhOb1Rlc3RzID0gYXJncy5wYXNzV2l0aE5vVGVzdHMgPz8gISFwcm9jZXNzLmVudi5JU19DQU5BUlk7XG5cbiAgLy8gQ29tbXVuaWNhdGUgd2l0aCB0aGUgY29uZmlnIGZpbGUgKGludGVnLmplc3QuY29uZmlnLmpzKVxuICBwcm9jZXNzLmVudi5URVNUX1NVSVRFX05BTUUgPSBzdWl0ZU5hbWU7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBqZXN0LnJ1bihbXG4gICAgICAnLS1yYW5kb21pemUnLFxuICAgICAgLi4uYXJncy5ydW5JbkJhbmQgPyBbJy1pJ10gOiBbXSxcbiAgICAgIC4uLmFyZ3MudGVzdCA/IFsnLXQnLCBhcmdzLnRlc3RdIDogW10sXG4gICAgICAuLi5hcmdzLnZlcmJvc2UgPyBbJy0tdmVyYm9zZSddIDogW10sXG4gICAgICAuLi5hcmdzLm1heFdvcmtlcnMgPyBbYC0tbWF4V29ya2Vycz0ke2FyZ3MubWF4V29ya2Vyc31gXSA6IFtdLFxuICAgICAgLi4ucGFzc1dpdGhOb1Rlc3RzID8gWyctLXBhc3NXaXRoTm9UZXN0cyddIDogW10sXG4gICAgICAuLi5hcmdzWyd0ZXN0LWZpbGUnXSA/IFthcmdzWyd0ZXN0LWZpbGUnXV0gOiBbXSxcbiAgICBdLCBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAncmVzb3VyY2VzJywgJ2ludGVnLmplc3QuY29uZmlnLmpzJykpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHBhY2thZ2VTb3VyY2UuY2xlYW51cCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRoaXNQYWNrYWdlVmVyc2lvbigpOiBzdHJpbmcge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGUpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbn0pO1xuIl19