152 lines
20 KiB
JavaScript
152 lines
20 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const chalk_1 = __importDefault(require("chalk"));
|
|
const runtime_1 = require("../errors/runtime");
|
|
const types_1 = require("../errors/types");
|
|
const argument_parser_1 = __importDefault(require("./argument-parser"));
|
|
const termination_handler_1 = __importDefault(require("./termination-handler"));
|
|
const log_1 = __importDefault(require("./log"));
|
|
const remotes_wizard_1 = __importDefault(require("./remotes-wizard"));
|
|
const correct_browsers_and_sources_1 = __importDefault(require("./correct-browsers-and-sources"));
|
|
const __1 = __importDefault(require("../"));
|
|
const debug_1 = __importDefault(require("debug"));
|
|
const log_entry_1 = __importDefault(require("../utils/log-entry"));
|
|
const dashboard_1 = __importDefault(require("../dashboard"));
|
|
const LOGGER = (0, debug_1.default)('testcafe:cli');
|
|
// NOTE: Load the provider pool lazily to reduce startup time
|
|
const lazyRequire = require('import-lazy')(require);
|
|
const browserProviderPool = lazyRequire('../browser/provider/pool');
|
|
let showMessageOnExit = true;
|
|
let exitMessageShown = false;
|
|
let exiting = false;
|
|
function exitHandler(terminationLevel) {
|
|
if (showMessageOnExit && !exitMessageShown) {
|
|
exitMessageShown = true;
|
|
log_1.default.write('Stopping TestCafe...');
|
|
process.on('exit', () => log_1.default.hideSpinner(true));
|
|
}
|
|
if (exiting || terminationLevel < 2)
|
|
return;
|
|
exiting = true;
|
|
exit(0);
|
|
}
|
|
function exit(code) {
|
|
log_1.default.hideSpinner(true);
|
|
// NOTE: give a process time to flush the output.
|
|
// It's necessary in some environments.
|
|
setTimeout(() => process.exit(code), 0);
|
|
}
|
|
function error(err) {
|
|
log_1.default.hideSpinner();
|
|
let message = null;
|
|
if (err instanceof runtime_1.GeneralError)
|
|
message = err.message;
|
|
else if (err instanceof runtime_1.APIError)
|
|
message = err.coloredStack;
|
|
else
|
|
message = err.stack;
|
|
log_1.default.write(chalk_1.default.red('ERROR ') + message + '\n');
|
|
log_1.default.write(chalk_1.default.gray('Type "testcafe -h" for help.'));
|
|
exit(1);
|
|
}
|
|
async function runTests(argParser) {
|
|
const opts = argParser.opts;
|
|
const port1 = opts.ports && opts.ports[0];
|
|
const port2 = opts.ports && opts.ports[1];
|
|
const proxy = opts.proxy;
|
|
const proxyBypass = opts.proxyBypass;
|
|
const configFile = opts.configFile;
|
|
log_1.default.showSpinner();
|
|
const { hostname, ssl, dev, experimentalDebug, retryTestPages, cache, disableHttp2, v8Flags, experimentalProxyless, disableCrossDomain, experimentalEsm, } = opts;
|
|
const testCafe = await (0, __1.default)({
|
|
developmentMode: dev,
|
|
isCli: true,
|
|
hostname,
|
|
port1,
|
|
port2,
|
|
ssl,
|
|
experimentalDebug,
|
|
retryTestPages,
|
|
cache,
|
|
configFile,
|
|
disableHttp2,
|
|
v8Flags,
|
|
experimentalProxyless,
|
|
disableCrossDomain,
|
|
experimentalEsm,
|
|
});
|
|
const correctedBrowsersAndSources = await (0, correct_browsers_and_sources_1.default)(argParser, testCafe.configuration);
|
|
const automatedBrowsers = correctedBrowsersAndSources.browsers;
|
|
const remoteBrowsers = await (0, remotes_wizard_1.default)(testCafe, argParser.remoteCount, opts.qrCode);
|
|
const browsers = automatedBrowsers.concat(remoteBrowsers);
|
|
const sources = correctedBrowsersAndSources.sources;
|
|
const runner = opts.live ? testCafe.createLiveModeRunner() : testCafe.createRunner();
|
|
let failed = 0;
|
|
runner
|
|
.useProxy(proxy, proxyBypass)
|
|
.src(sources)
|
|
.tsConfigPath(argParser.opts.tsConfigPath)
|
|
.browsers(browsers)
|
|
.reporter(argParser.opts.reporter)
|
|
.concurrency(argParser.opts.concurrency)
|
|
.filter(argParser.opts.filter)
|
|
.video(opts.video, opts.videoOptions, opts.videoEncodingOptions)
|
|
.screenshots(opts.screenshots)
|
|
.startApp(opts.app, opts.appInitDelay)
|
|
.clientScripts(argParser.opts.clientScripts)
|
|
.compilerOptions(argParser.opts.compilerOptions);
|
|
runner.once('done-bootstrapping', () => log_1.default.hideSpinner());
|
|
try {
|
|
const runOpts = argParser.getRunOptions();
|
|
failed = await runner.run(runOpts);
|
|
}
|
|
finally {
|
|
showMessageOnExit = false;
|
|
await testCafe.close();
|
|
}
|
|
exit(failed);
|
|
}
|
|
async function runDashboardIntegration(state) {
|
|
await (0, dashboard_1.default)(state);
|
|
exit(0);
|
|
}
|
|
async function listBrowsers(providerName) {
|
|
const provider = await browserProviderPool.getProvider(providerName);
|
|
if (!provider)
|
|
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.browserProviderNotFound, providerName);
|
|
if (provider.isMultiBrowser) {
|
|
const browserNames = await provider.getBrowserList();
|
|
await browserProviderPool.dispose();
|
|
if (providerName === 'locally-installed')
|
|
console.log(browserNames.join('\n'));
|
|
else
|
|
console.log(browserNames.map(browserName => `"${providerName}:${browserName}"`).join('\n'));
|
|
}
|
|
else
|
|
console.log(`"${providerName}"`);
|
|
exit(0);
|
|
}
|
|
(async function cli() {
|
|
const terminationHandler = new termination_handler_1.default();
|
|
terminationHandler.on(termination_handler_1.default.TERMINATION_LEVEL_INCREASED_EVENT, exitHandler);
|
|
try {
|
|
const argParser = new argument_parser_1.default();
|
|
(0, log_entry_1.default)(LOGGER, process.argv);
|
|
await argParser.parse(process.argv);
|
|
(0, log_entry_1.default)(LOGGER, argParser.opts);
|
|
if (argParser.isDashboardCommand)
|
|
await runDashboardIntegration(argParser.sendReportState);
|
|
else if (argParser.opts.listBrowsers)
|
|
await listBrowsers(argParser.opts.providerName);
|
|
else
|
|
await runTests(argParser);
|
|
}
|
|
catch (err) {
|
|
showMessageOnExit = false;
|
|
error(err);
|
|
}
|
|
})();
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9jbGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQTJEO0FBQzNELDJDQUFpRDtBQUNqRCx3RUFBa0Q7QUFDbEQsZ0ZBQXVEO0FBQ3ZELGdEQUF3QjtBQUN4QixzRUFBNkM7QUFDN0Msa0dBQXVFO0FBQ3ZFLDRDQUFpQztBQUNqQyxrREFBMEI7QUFDMUIsbUVBQTBDO0FBQzFDLDZEQUFnRDtBQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGVBQUssRUFBQyxjQUFjLENBQUMsQ0FBQztBQUVyQyw2REFBNkQ7QUFDN0QsTUFBTSxXQUFXLEdBQVcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFcEUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDN0IsSUFBSSxnQkFBZ0IsR0FBSSxLQUFLLENBQUM7QUFDOUIsSUFBSSxPQUFPLEdBQWEsS0FBSyxDQUFDO0FBRTlCLFNBQVMsV0FBVyxDQUFFLGdCQUFnQjtJQUNsQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGFBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRyxDQUFDO1FBQy9CLE9BQU87SUFFWCxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsSUFBSSxD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QUFNLFNBQVMsR0FBRyxJQUFJLHlCQUFpQixFQUFFLENBQUM7UUFFMUMsSUFBQSxtQkFBUSxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0IsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFBLG1CQUFRLEVBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxJQUFJLFNBQVMsQ0FBQyxrQkFBa0I7WUFDNUIsTUFBTSx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDeEQsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDaEMsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7WUFFaEQsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDakM7SUFDRCxPQUFPLEdBQUcsRUFBRTtRQUNSLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZDtBQUNMLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yLCBBUElFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBDbGlBcmd1bWVudFBhcnNlciBmcm9tICcuL2FyZ3VtZW50LXBhcnNlcic7XG5pbXBvcnQgVGVybWluYXRpb25IYW5kbGVyIGZyb20gJy4vdGVybWluYXRpb24taGFuZGxlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCByZW1vdGVzV2l6YXJkIGZyb20gJy4vcmVtb3Rlcy13aXphcmQnO1xuaW1wb3J0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMgZnJvbSAnLi9jb3JyZWN0LWJyb3dzZXJzLWFuZC1zb3VyY2VzJztcbmltcG9ydCBjcmVhdGVUZXN0Q2FmZSBmcm9tICcuLi8nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBsb2dFbnRyeSBmcm9tICcuLi91dGlscy9sb2ctZW50cnknO1xuaW1wb3J0IGRhc2hib2FyZEludGVncmF0aW9uIGZyb20gJy4uL2Rhc2hib2FyZCc7XG5cbmNvbnN0IExPR0dFUiA9IGRlYnVnKCd0ZXN0Y2FmZTpjbGknKTtcblxuLy8gTk9URTogTG9hZCB0aGUgcHJvdmlkZXIgcG9vbCBsYXppbHkgdG8gcmVkdWNlIHN0YXJ0dXAgdGltZVxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICA9IHJlcXVpcmUoJ2ltcG9ydC1sYXp5JykocmVxdWlyZSk7XG5jb25zdCBicm93c2VyUHJvdmlkZXJQb29sID0gbGF6eVJlcXVpcmUoJy4uL2Jyb3dzZXIvcHJvdmlkZXIvcG9vbCcpO1xuXG5sZXQgc2hvd01lc3NhZ2VPbkV4aXQgPSB0cnVlO1xubGV0IGV4aXRNZXNzYWdlU2hvd24gID0gZmFsc2U7XG5sZXQgZXhpdGluZyAgICAgICAgICAgPSBmYWxzZTtcblxuZnVuY3Rpb24gZXhpdEhhbmRsZXIgKHRlcm1pbmF0aW9uTGV2ZWwpIHtcbiAgICBpZiAoc2hvd01lc3NhZ2VPbkV4aXQgJiYgIWV4aXRNZXNzYWdlU2hvd24pIHtcbiAgICAgICAgZXhpdE1lc3NhZ2VTaG93biA9IHRydWU7XG5cbiAgICAgICAgbG9nLndyaXRlKCdTdG9wcGluZyBUZXN0Q2FmZS4uLicpO1xuXG4gICAgICAgIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiBsb2cuaGlkZVNwaW5uZXIodHJ1ZSkpO1xuICAgIH1cblxuICAgIGlmIChleGl0aW5nIHx8IHRlcm1pbmF0aW9uTGV2ZWwgPCAyKVxuICAgICAgICByZXR1cm47XG5cbiAgICBleGl0aW5nID0gdHJ1ZTtcblxuICAgIGV4aXQoMCk7XG59XG5cbmZ1bmN0aW9uIGV4aXQgKGNvZGUpIHtcbiAgICBsb2cuaGlkZVNwaW5uZXIodHJ1ZSk7XG5cbiAgICAvLyBOT1RFOiBnaXZlIGEgcHJvY2VzcyB0aW1lIHRvIGZsdXNoIHRoZSBvdXRwdXQuXG4gICAgLy8gSXQncyBuZWNlc3NhcnkgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksIDApO1xufVxuXG5mdW5jdGlvbiBlcnJvciAoZXJyKSB7XG4gICAgbG9nLmhpZGVTcGlubmVyKCk7XG5cbiAgICBsZXQgbWVzc2FnZSA9IG51bGw7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2VuZXJhbEVycm9yKVxuICAgICAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2U7XG5cbiAgICBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBBUElFcnJvcilcbiAgICAgICAgbWVzc2FnZSA9IGVyci5jb2xvcmVkU3RhY2s7XG5cbiAgICBlbHNlXG4gICAgICAgIG1lc3NhZ2UgPSBlcnIuc3RhY2s7XG5cbiAgICBsb2cud3JpdGUoY2hhbGsucmVkKCdFUlJPUiAnKSArIG1lc3NhZ2UgKyAnXFxuJyk7XG4gICAgbG9nLndyaXRlKGNoYWxrLmdyYXkoJ1R5cGUgXCJ0ZXN0Y2FmZSAtaFwiIGZvciBoZWxwLicpKTtcblxuICAgIGV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzIChhcmdQYXJzZXIpIHtcbiAgICBjb25zdCBvcHRzICAgICAgICA9IGFyZ1BhcnNlci5vcHRzO1xuICAgIGNvbnN0IHBvcnQxICAgICAgID0gb3B0cy5wb3J0cyAmJiBvcHRzLnBvcnRzWzBdO1xuICAgIGNvbnN0IHBvcnQyICAgICAgID0gb3B0cy5wb3J0cyAmJiBvcHRzLnBvcnRzWzFdO1xuICAgIGNvbnN0IHByb3h5ICAgICAgID0gb3B0cy5wcm94eTtcbiAgICBjb25zdCBwcm94eUJ5cGFzcyA9IG9wdHMucHJveHlCeXBhc3M7XG4gICAgY29uc3QgY29uZmlnRmlsZSAgPSBvcHRzLmNvbmZpZ0ZpbGU7XG5cbiAgICBsb2cuc2hvd1NwaW5uZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHNzbCxcbiAgICAgICAgZGV2LFxuICAgICAgICBleHBlcmltZW50YWxEZWJ1ZyxcbiAgICAgICAgcmV0cnlUZXN0UGFnZXMsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBkaXNhYmxlSHR0cDIsXG4gICAgICAgIHY4RmxhZ3MsXG4gICAgICAgIGV4cGVyaW1lbnRhbFByb3h5bGVzcyxcbiAgICAgICAgZGlzYWJsZUNyb3NzRG9tYWluLFxuICAgICAgICBleHBlcmltZW50YWxFc20sXG4gICAgfSA9IG9wdHM7XG5cbiAgICBjb25zdCB0ZXN0Q2FmZSA9IGF3YWl0IGNyZWF0ZVRlc3RDYWZlKHtcbiAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiBkZXYsXG4gICAgICAgIGlzQ2xpOiAgICAgICAgICAgdHJ1ZSxcblxuICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgcG9ydDEsXG4gICAgICAgIHBvcnQyLFxuICAgICAgICBzc2wsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlYnVnLFxuICAgICAgICByZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICAgIGRpc2FibGVIdHRwMixcbiAgICAgICAgdjhGbGFncyxcbiAgICAgICAgZXhwZXJpbWVudGFsUHJveHlsZXNzLFxuICAgICAgICBkaXNhYmxlQ3Jvc3NEb21haW4sXG4gICAgICAgIGV4cGVyaW1lbnRhbEVzbSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZEJyb3dzZXJzQW5kU291cmNlcyA9IGF3YWl0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMoYXJnUGFyc2VyLCB0ZXN0Q2FmZS5jb25maWd1cmF0aW9uKTtcbiAgICBjb25zdCBhdXRvbWF0ZWRCcm93c2VycyAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuYnJvd3NlcnM7XG4gICAgY29uc3QgcmVtb3RlQnJvd3NlcnMgICAgICAgICAgICAgID0gYXdhaXQgcmVtb3Rlc1dpemFyZCh0ZXN0Q2FmZSwgYXJnUGFyc2VyLnJlbW90ZUNvdW50LCBvcHRzLnFyQ29kZSk7XG4gICAgY29uc3QgYnJvd3NlcnMgICAgICAgICAgICAgICAgICAgID0gYXV0b21hdGVkQnJvd3NlcnMuY29uY2F0KHJlbW90ZUJyb3dzZXJzKTtcbiAgICBjb25zdCBzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuc291cmNlcztcblxuICAgIGNvbnN0IHJ1bm5lciA9IG9wdHMubGl2ZSA/IHRlc3RDYWZlLmNyZWF0ZUxpdmVNb2RlUnVubmVyKCkgOiB0ZXN0Q2FmZS5jcmVhdGVSdW5uZXIoKTtcblxuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgcnVubmVyXG4gICAgICAgIC51c2VQcm94eShwcm94eSwgcHJveHlCeXBhc3MpXG4gICAgICAgIC5zcmMoc291cmNlcylcbiAgICAgICAgLnRzQ29uZmlnUGF0aChhcmdQYXJzZXIub3B0cy50c0NvbmZpZ1BhdGgpXG4gICAgICAgIC5icm93c2Vycyhicm93c2VycylcbiAgICAgICAgLnJlcG9ydGVyKGFyZ1BhcnNlci5vcHRzLnJlcG9ydGVyKVxuICAgICAgICAuY29uY3VycmVuY3koYXJnUGFyc2VyLm9wdHMuY29uY3VycmVuY3kpXG4gICAgICAgIC5maWx0ZXIoYXJnUGFyc2VyLm9wdHMuZmlsdGVyKVxuICAgICAgICAudmlkZW8ob3B0cy52aWRlbywgb3B0cy52aWRlb09wdGlvbnMsIG9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMpXG4gICAgICAgIC5zY3JlZW5zaG90cyhvcHRzLnNjcmVlbnNob3RzKVxuICAgICAgICAuc3RhcnRBcHAob3B0cy5hcHAsIG9wdHMuYXBwSW5pdERlbGF5KVxuICAgICAgICAuY2xpZW50U2NyaXB0cyhhcmdQYXJzZXIub3B0cy5jbGllbnRTY3JpcHRzKVxuICAgICAgICAuY29tcGlsZXJPcHRpb25zKGFyZ1BhcnNlci5vcHRzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICBydW5uZXIub25jZSgnZG9uZS1ib290c3RyYXBwaW5nJywgKCkgPT4gbG9nLmhpZGVTcGlubmVyKCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcnVuT3B0cyA9IGFyZ1BhcnNlci5nZXRSdW5PcHRpb25zKCk7XG5cbiAgICAgICAgZmFpbGVkID0gYXdhaXQgcnVubmVyLnJ1bihydW5PcHRzKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRlc3RDYWZlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZXhpdChmYWlsZWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5EYXNoYm9hcmRJbnRlZ3JhdGlvbiAoc3RhdGUpIHtcbiAgICBhd2FpdCBkYXNoYm9hcmRJbnRlZ3JhdGlvbihzdGF0ZSk7XG5cbiAgICBleGl0KDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJvd3NlcnMgKHByb3ZpZGVyTmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5nZXRQcm92aWRlcihwcm92aWRlck5hbWUpO1xuXG4gICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5icm93c2VyUHJvdmlkZXJOb3RGb3VuZCwgcHJvdmlkZXJOYW1lKTtcblxuICAgIGlmIChwcm92aWRlci5pc011bHRpQnJvd3Nlcikge1xuICAgICAgICBjb25zdCBicm93c2VyTmFtZXMgPSBhd2FpdCBwcm92aWRlci5nZXRCcm93c2VyTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmIChwcm92aWRlck5hbWUgPT09ICdsb2NhbGx5LWluc3RhbGxlZCcpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMuam9pbignXFxuJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMubWFwKGJyb3dzZXJOYW1lID0+IGBcIiR7IHByb3ZpZGVyTmFtZSB9OiR7IGJyb3dzZXJOYW1lIH1cImApLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBjb25zb2xlLmxvZyhgXCIkeyBwcm92aWRlck5hbWUgfVwiYCk7XG5cbiAgICBleGl0KDApO1xufVxuXG4oYXN5bmMgZnVuY3Rpb24gY2xpICgpIHtcbiAgICBjb25zdCB0ZXJtaW5hdGlvbkhhbmRsZXIgPSBuZXcgVGVybWluYXRpb25IYW5kbGVyKCk7XG5cbiAgICB0ZXJtaW5hdGlvbkhhbmRsZXIub24oVGVybWluYXRpb25IYW5kbGVyLlRFUk1JTkFUSU9OX0xFVkVMX0lOQ1JFQVNFRF9FVkVOVCwgZXhpdEhhbmRsZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJnUGFyc2VyID0gbmV3IENsaUFyZ3VtZW50UGFyc2VyKCk7XG5cbiAgICAgICAgbG9nRW50cnkoTE9HR0VSLCBwcm9jZXNzLmFyZ3YpO1xuXG4gICAgICAgIGF3YWl0IGFyZ1BhcnNlci5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG4gICAgICAgIGxvZ0VudHJ5KExPR0dFUiwgYXJnUGFyc2VyLm9wdHMpO1xuXG4gICAgICAgIGlmIChhcmdQYXJzZXIuaXNEYXNoYm9hcmRDb21tYW5kKVxuICAgICAgICAgICAgYXdhaXQgcnVuRGFzaGJvYXJkSW50ZWdyYXRpb24oYXJnUGFyc2VyLnNlbmRSZXBvcnRTdGF0ZSk7XG4gICAgICAgIGVsc2UgaWYgKGFyZ1BhcnNlci5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIGF3YWl0IGxpc3RCcm93c2VycyhhcmdQYXJzZXIub3B0cy5wcm92aWRlck5hbWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBydW5UZXN0cyhhcmdQYXJzZXIpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGVycm9yKGVycik7XG4gICAgfVxufSkoKTtcblxuIl19
|