lib-tools
Version:
The lib-tools helps you simplify the build, bundle, test and npm packaging workflows for Typescript, JavaScript, Angular library projects and assets module projects.
246 lines • 43.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.cliTest = void 0;
const path = require("path");
const karma = require("karma");
const helpers_1 = require("../../helpers");
const utils_1 = require("../../utils");
const configs_1 = require("../../webpack/configs");
async function cliTest(argv) {
const environment = helpers_1.getEnvironment(null, argv);
if (argv.environment) {
delete argv.environment;
}
if (argv.env) {
delete argv.env;
}
const workflowConfig = await helpers_1.getWorkflowConfig(argv, 'test');
const filterNames = argv.filter && Array.isArray(argv.filter)
? argv.filter.filter((n) => n.trim().length > 0)
: (argv.filter || '').split(',').filter((n) => n.trim().length > 0);
const filteredTestConfigs = await getFilteredTestConfigInternals(workflowConfig, filterNames, environment);
if (!filteredTestConfigs.length) {
throw new Error('No workflow test config is available.');
}
for (const testConfig of filteredTestConfigs) {
const defaultKarmaOptions = {
basePath: testConfig._workspaceRoot,
frameworks: ['jasmine', 'lib-tools'],
client: {
clearContext: false
},
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('karma-junit-reporter'),
require(path.resolve(__dirname, '../../karma-plugin'))
],
coverageReporter: {
dir: path.resolve(testConfig._workspaceRoot, 'coverage', testConfig._projectName),
subdir: '.',
reporters: [{ type: 'html' }, { type: 'lcovonly' }, { type: 'text-summary' }, { type: 'cobertura' }]
},
junitReporter: {
outputDir: utils_1.normalizePath(path.relative(testConfig._workspaceRoot, path.resolve(testConfig._workspaceRoot, `junit/${testConfig._projectName}`)))
},
port: 9876,
colors: true,
logLevel: argv.logLevel ? argv.logLevel.toUpperCase() : 'INFO',
autoWatch: true,
customLaunchers: {
ChromeHeadlessCI: {
base: 'ChromeHeadless',
flags: ['--no-sandbox']
}
},
restartOnFileChange: true
};
if (argv.codeCoverageExclude != null) {
testConfig.codeCoverageExclude = Array.isArray(argv.codeCoverageExclude)
? argv.codeCoverageExclude.filter((n) => n.trim().length > 0)
: argv.codeCoverageExclude.split(',').filter((n) => n.trim().length > 0);
}
if (argv.reporters != null) {
testConfig.reporters = Array.isArray(argv.reporters)
? argv.reporters.filter((n) => n.trim().length > 0)
: argv.reporters.split(',').filter((n) => n.trim().length > 0);
}
if (argv.browsers != null) {
testConfig.browsers = Array.isArray(argv.browsers)
? argv.browsers.filter((n) => n.trim().length > 0)
: argv.browsers.split(',').filter((n) => n.trim().length > 0);
}
if (argv.singleRun != null) {
testConfig.singleRun = argv.singleRun;
}
if (testConfig.coverageReporter) {
defaultKarmaOptions.coverageReporter = Object.assign(Object.assign({}, defaultKarmaOptions.coverageReporter), testConfig.coverageReporter);
}
if (testConfig.junitReporter) {
defaultKarmaOptions.junitReporter = Object.assign(Object.assign({}, defaultKarmaOptions.junitReporter), testConfig.junitReporter);
}
if (testConfig._karmaConfigPath) {
const customKarmaOptions = karma.config.parseConfig(testConfig._karmaConfigPath, {});
const karmaRoot = path.dirname(testConfig._karmaConfigPath);
if (customKarmaOptions.reporters && customKarmaOptions.reporters.length > 0 && !testConfig.reporters) {
testConfig.reporters = customKarmaOptions.reporters;
}
if (customKarmaOptions.browsers && customKarmaOptions.browsers.length > 0 && !testConfig.browsers) {
testConfig.browsers = customKarmaOptions.browsers;
}
if (customKarmaOptions.singleRun != null && testConfig.singleRun == null) {
testConfig.singleRun = customKarmaOptions.singleRun;
}
if (customKarmaOptions.coverageReporter && !testConfig.coverageReporter) {
if (customKarmaOptions.coverageReporter.dir &&
!path.isAbsolute(customKarmaOptions.coverageReporter.dir)) {
customKarmaOptions.coverageReporter.dir = path.resolve(karmaRoot, customKarmaOptions.coverageReporter.dir);
}
defaultKarmaOptions.coverageReporter = Object.assign(Object.assign({}, defaultKarmaOptions.coverageReporter), customKarmaOptions.coverageReporter);
}
if (customKarmaOptions.junitReporter && !testConfig.junitReporter) {
if (customKarmaOptions.junitReporter.outputDir) {
customKarmaOptions.junitReporter.outputDir = utils_1.normalizePath(path.relative(karmaRoot, path.resolve(karmaRoot, customKarmaOptions.junitReporter.outputDir)));
}
defaultKarmaOptions.junitReporter = Object.assign(Object.assign({}, defaultKarmaOptions.junitReporter), customKarmaOptions.junitReporter);
}
if (customKarmaOptions.plugins && customKarmaOptions.plugins.length > 0) {
defaultKarmaOptions.plugins = defaultKarmaOptions.plugins || [];
defaultKarmaOptions.plugins.push(...customKarmaOptions.plugins);
}
if (customKarmaOptions.port) {
defaultKarmaOptions.port = customKarmaOptions.port;
}
if (customKarmaOptions.colors != null) {
defaultKarmaOptions.colors = customKarmaOptions.colors;
}
if (customKarmaOptions.logLevel != null) {
defaultKarmaOptions.logLevel = customKarmaOptions.logLevel;
}
if (customKarmaOptions.autoWatch != null) {
defaultKarmaOptions.autoWatch = customKarmaOptions.autoWatch;
}
if (customKarmaOptions.customLaunchers != null) {
defaultKarmaOptions.customLaunchers = customKarmaOptions.customLaunchers;
}
if (customKarmaOptions.restartOnFileChange != null) {
defaultKarmaOptions.restartOnFileChange = customKarmaOptions.restartOnFileChange;
}
}
if (!testConfig.reporters) {
if (environment.ci) {
testConfig.reporters = ['junit', 'coverage'];
}
else {
testConfig.reporters = ['progress', 'kjhtml'];
}
}
if (!testConfig.browsers) {
if (environment.ci) {
testConfig.browsers = ['ChromeHeadlessCI'];
}
else {
testConfig.browsers = ['Chrome'];
}
}
if (testConfig.singleRun == null) {
testConfig.singleRun = environment.ci ? true : false;
}
const webpackConfig = await configs_1.getWebpackTestConfig(testConfig, argv);
const karmaOptions = Object.assign(Object.assign({}, defaultKarmaOptions), { configFile: testConfig._karmaConfigPath, webpackConfig, logLevel: argv.logLevel ? argv.logLevel.toUpperCase() : 'INFO' });
if (testConfig.browsers) {
karmaOptions.browsers = testConfig.browsers;
}
if (testConfig.reporters) {
karmaOptions.reporters = testConfig.reporters;
}
if (testConfig.singleRun != null) {
karmaOptions.singleRun = testConfig.singleRun;
}
let karmaServer;
const exitCode = await new Promise((res) => {
karmaServer = new karma.Server(karmaOptions, (serverExitCode) => {
res(serverExitCode);
});
karmaServer.start();
}).then((serverExitCode) => {
if (karmaServer) {
const karmaServerWithStop = karmaServer;
if (typeof karmaServerWithStop.stop === 'function') {
karmaServerWithStop.stop();
}
}
return serverExitCode;
});
if (exitCode !== 0) {
return exitCode;
}
}
return 0;
}
exports.cliTest = cliTest;
async function getFilteredTestConfigInternals(workflowConfig, filterNames, environment) {
const testConfigs = [];
const projectNames = Object.keys(workflowConfig.projects);
for (const projectName of projectNames) {
if (filterNames.length && !filterNames.includes(projectName)) {
continue;
}
const projectConfig = JSON.parse(JSON.stringify(workflowConfig.projects[projectName]));
if (projectConfig._config !== 'auto') {
await helpers_1.applyProjectExtends(projectConfig, workflowConfig.projects, projectConfig._config);
}
if (!projectConfig.tasks || !projectConfig.tasks.test) {
continue;
}
const testConfig = projectConfig.tasks.test;
if (projectConfig._config !== 'auto') {
helpers_1.applyEnvOverrides(testConfig, environment);
}
if (testConfig.skip) {
continue;
}
const workspaceRoot = projectConfig._workspaceRoot;
const projectRoot = projectConfig._projectRoot;
let karmaConfigPath = null;
let tsConfigPath = null;
let testIndexFilePath = null;
if (testConfig.karmaConfig) {
karmaConfigPath = path.resolve(projectRoot, testConfig.karmaConfig);
}
else if (projectConfig._config === 'auto') {
karmaConfigPath = await helpers_1.findKarmaConfigFile(projectRoot, workspaceRoot);
}
if (testConfig.tsConfig) {
tsConfigPath = path.resolve(projectRoot, testConfig.tsConfig);
}
else {
tsConfigPath = await helpers_1.findTestTsconfigFile(projectRoot, workspaceRoot);
}
if (testConfig.testIndexFile) {
testIndexFilePath = path.resolve(projectRoot, testConfig.testIndexFile);
}
else {
testIndexFilePath = await helpers_1.findTestIndexFile(projectRoot, workspaceRoot, tsConfigPath);
}
if (testConfig.coverageReporter &&
testConfig.coverageReporter.dir &&
!path.isAbsolute(testConfig.coverageReporter.dir)) {
testConfig.coverageReporter.dir = path.resolve(projectRoot, testConfig.coverageReporter.dir);
}
if (testConfig.junitReporter && testConfig.junitReporter.outputDir) {
testConfig.junitReporter.outputDir = utils_1.normalizePath(path.relative(projectRoot, path.resolve(projectRoot, testConfig.junitReporter.outputDir)));
}
let packageJson = null;
const packageJsonPath = await helpers_1.findPackageJsonPath(projectRoot, workspaceRoot);
if (packageJsonPath) {
packageJson = await helpers_1.readPackageJson(packageJsonPath);
}
const testConfigInternal = Object.assign(Object.assign({}, testConfig), { _config: projectConfig._config, _workspaceRoot: workspaceRoot, _projectRoot: projectRoot, _projectName: projectConfig._projectName, _packageJson: packageJson, _testIndexFilePath: testIndexFilePath, _tsConfigPath: tsConfigPath, _karmaConfigPath: karmaConfigPath });
testConfigs.push(testConfigInternal);
}
return testConfigs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRlc3QuanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbImNsaS90ZXN0L2NsaS10ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUU3QiwrQkFBK0I7QUFHL0IsMkNBVXVCO0FBVXZCLHVDQUE0QztBQUM1QyxtREFBNkQ7QUFTdEQsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFxRDtJQUMvRSxNQUFNLFdBQVcsR0FBRyx3QkFBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQzNCO0lBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQ25CO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSwyQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsTUFBTSxXQUFXLEdBQ2IsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLDhCQUE4QixDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7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YSBmcm9tICdrYXJtYSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIGFzIFdlYnBhY2tDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjayc7XG5cbmltcG9ydCB7XG4gICAgYXBwbHlFbnZPdmVycmlkZXMsXG4gICAgYXBwbHlQcm9qZWN0RXh0ZW5kcyxcbiAgICBmaW5kS2FybWFDb25maWdGaWxlLFxuICAgIGZpbmRQYWNrYWdlSnNvblBhdGgsXG4gICAgZmluZFRlc3RJbmRleEZpbGUsXG4gICAgZmluZFRlc3RUc2NvbmZpZ0ZpbGUsXG4gICAgZ2V0RW52aXJvbm1lbnQsXG4gICAgZ2V0V29ya2Zsb3dDb25maWcsXG4gICAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4uLy4uL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgICBDb3ZlcmFnZVJlcG9ydGVyT3B0aW9ucyxcbiAgICBKdW5pdFJlcG9ydGVyT3B0aW9ucyxcbiAgICBQYWNrYWdlSnNvbkxpa2UsXG4gICAgUHJvamVjdENvbmZpZ0ludGVybmFsLFxuICAgIFRlc3RDb21tYW5kT3B0aW9ucyxcbiAgICBUZXN0Q29uZmlnSW50ZXJuYWwsXG4gICAgV29ya2Zsb3dDb25maWdJbnRlcm5hbFxufSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGdldFdlYnBhY2tUZXN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vd2VicGFjay9jb25maWdzJztcblxuZXhwb3J0IGludGVyZmFjZSBLYXJtYUNvbmZpZ09wdGlvbnMgZXh0ZW5kcyBrYXJtYS5Db25maWdPcHRpb25zIHtcbiAgICB3ZWJwYWNrQ29uZmlnOiBXZWJwYWNrQ29uZmlndXJhdGlvbjtcbiAgICBjb25maWdGaWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb3ZlcmFnZVJlcG9ydGVyPzogQ292ZXJhZ2VSZXBvcnRlck9wdGlvbnM7XG4gICAganVuaXRSZXBvcnRlcj86IEp1bml0UmVwb3J0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpVGVzdChhcmd2OiBUZXN0Q29tbWFuZE9wdGlvbnMgJiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudChudWxsLCBhcmd2KTtcblxuICAgIGlmIChhcmd2LmVudmlyb25tZW50KSB7XG4gICAgICAgIGRlbGV0ZSBhcmd2LmVudmlyb25tZW50O1xuICAgIH1cblxuICAgIGlmIChhcmd2LmVudikge1xuICAgICAgICBkZWxldGUgYXJndi5lbnY7XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dDb25maWcgPSBhd2FpdCBnZXRXb3JrZmxvd0NvbmZpZyhhcmd2LCAndGVzdCcpO1xuICAgIGNvbnN0IGZpbHRlck5hbWVzID1cbiAgICAgICAgYXJndi5maWx0ZXIgJiYgQXJyYXkuaXNBcnJheShhcmd2LmZpbHRlcilcbiAgICAgICAgICAgID8gYXJndi5maWx0ZXIuZmlsdGVyKChuKSA9PiBuLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgOiAoYXJndi5maWx0ZXIgfHwgJycpLnNwbGl0KCcsJykuZmlsdGVyKChuKSA9PiBuLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWx0ZXJlZFRlc3RDb25maWdzID0gYXdhaXQgZ2V0RmlsdGVyZWRUZXN0Q29uZmlnSW50ZXJuYWxzKHdvcmtmbG93Q29uZmlnLCBmaWx0ZXJOYW1lcywgZW52aXJvbm1lbnQpO1xuICAgIGlmICghZmlsdGVyZWRUZXN0Q29uZmlncy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3b3JrZmxvdyB0ZXN0IGNvbmZpZyBpcyBhdmFpbGFibGUuJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0ZXN0Q29uZmlnIG9mIGZpbHRlcmVkVGVzdENvbmZpZ3MpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEthcm1hT3B0aW9uczogUGFydGlhbDxLYXJtYUNvbmZpZ09wdGlvbnM+ID0ge1xuICAgICAgICAgICAgYmFzZVBhdGg6IHRlc3RDb25maWcuX3dvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgICBmcmFtZXdvcmtzOiBbJ2phc21pbmUnLCAnbGliLXRvb2xzJ10sXG4gICAgICAgICAgICBjbGllbnQ6IHtcbiAgICAgICAgICAgICAgICBjbGVhckNvbnRleHQ6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2thcm1hLWphc21pbmUnKSxcbiAgICAgICAgICAgICAgICByZXF1aXJlKCdrYXJtYS1jaHJvbWUtbGF1bmNoZXInKSxcbiAgICAgICAgICAgICAgICByZXF1aXJlKCdrYXJtYS1qYXNtaW5lLWh0bWwtcmVwb3J0ZXInKSxcbiAgICAgICAgICAgICAgICByZXF1aXJlKCdrYXJtYS1jb3ZlcmFnZScpLFxuICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2thcm1hLWp1bml0LXJlcG9ydGVyJyksXG4gICAgICAgICAgICAgICAgcmVxdWlyZShwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4va2FybWEtcGx1Z2luJykpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY292ZXJhZ2VSZXBvcnRlcjoge1xuICAgICAgICAgICAgICAgIGRpcjogcGF0aC5yZXNvbHZlKHRlc3RDb25maWcuX3dvcmtzcGFjZVJvb3QsICdjb3ZlcmFnZScsIHRlc3RDb25maWcuX3Byb2plY3ROYW1lKSxcbiAgICAgICAgICAgICAgICBzdWJkaXI6ICcuJyxcbiAgICAgICAgICAgICAgICByZXBvcnRlcnM6IFt7IHR5cGU6ICdodG1sJyB9LCB7IHR5cGU6ICdsY292b25seScgfSwgeyB0eXBlOiAndGV4dC1zdW1tYXJ5JyB9LCB7IHR5cGU6ICdjb2JlcnR1cmEnIH1dXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAganVuaXRSZXBvcnRlcjoge1xuICAgICAgICAgICAgICAgIG91dHB1dERpcjogbm9ybWFsaXplUGF0aChcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5yZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDb25maWcuX3dvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUodGVzdENvbmZpZy5fd29ya3NwYWNlUm9vdCwgYGp1bml0LyR7dGVzdENvbmZpZy5fcHJvamVjdE5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3J0OiA5ODc2LFxuICAgICAgICAgICAgY29sb3JzOiB0cnVlLFxuICAgICAgICAgICAgbG9nTGV2ZWw6IGFyZ3YubG9nTGV2ZWwgPyBhcmd2LmxvZ0xldmVsLnRvVXBwZXJDYXNlKCkgOiAnSU5GTycsXG4gICAgICAgICAgICBhdXRvV2F0Y2g6IHRydWUsXG4gICAgICAgICAgICBjdXN0b21MYXVuY2hlcnM6IHtcbiAgICAgICAgICAgICAgICBDaHJvbWVIZWFkbGVzc0NJOiB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2U6ICdDaHJvbWVIZWFkbGVzcycsXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzOiBbJy0tbm8tc2FuZGJveCddXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3RhcnRPbkZpbGVDaGFuZ2U6IHRydWVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYXJndi5jb2RlQ292ZXJhZ2VFeGNsdWRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRlc3RDb25maWcuY29kZUNvdmVyYWdlRXhjbHVkZSA9IEFycmF5LmlzQXJyYXkoYXJndi5jb2RlQ292ZXJhZ2VFeGNsdWRlKVxuICAgICAgICAgICAgICAgID8gYXJndi5jb2RlQ292ZXJhZ2VFeGNsdWRlLmZpbHRlcigobikgPT4gbi50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICA6IGFyZ3YuY29kZUNvdmVyYWdlRXhjbHVkZS5zcGxpdCgnLCcpLmZpbHRlcigobikgPT4gbi50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJndi5yZXBvcnRlcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdENvbmZpZy5yZXBvcnRlcnMgPSBBcnJheS5pc0FycmF5KGFyZ3YucmVwb3J0ZXJzKVxuICAgICAgICAgICAgICAgID8gYXJndi5yZXBvcnRlcnMuZmlsdGVyKChuKSA9PiBuLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIDogYXJndi5yZXBvcnRlcnMuc3BsaXQoJywnKS5maWx0ZXIoKG4pID0+IG4udHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3YuYnJvd3NlcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdENvbmZpZy5icm93c2VycyA9IEFycmF5LmlzQXJyYXkoYXJndi5icm93c2VycylcbiAgICAgICAgICAgICAgICA/IGFyZ3YuYnJvd3NlcnMuZmlsdGVyKChuKSA9PiBuLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIDogYXJndi5icm93c2Vycy5zcGxpdCgnLCcpLmZpbHRlcigobikgPT4gbi50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJndi5zaW5nbGVSdW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdENvbmZpZy5zaW5nbGVSdW4gPSBhcmd2LnNpbmdsZVJ1bjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0Q29uZmlnLmNvdmVyYWdlUmVwb3J0ZXIpIHtcbiAgICAgICAgICAgIGRlZmF1bHRLYXJtYU9wdGlvbnMuY292ZXJhZ2VSZXBvcnRlciA9IHtcbiAgICAgICAgICAgICAgICAuLi5kZWZhdWx0S2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgLi4udGVzdENvbmZpZy5jb3ZlcmFnZVJlcG9ydGVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RDb25maWcuanVuaXRSZXBvcnRlcikge1xuICAgICAgICAgICAgZGVmYXVsdEthcm1hT3B0aW9ucy5qdW5pdFJlcG9ydGVyID0ge1xuICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRLYXJtYU9wdGlvbnMuanVuaXRSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAuLi50ZXN0Q29uZmlnLmp1bml0UmVwb3J0ZXJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdENvbmZpZy5fa2FybWFDb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21LYXJtYU9wdGlvbnMgPSAoa2FybWEuY29uZmlnLnBhcnNlQ29uZmlnKFxuICAgICAgICAgICAgICAgIHRlc3RDb25maWcuX2thcm1hQ29uZmlnUGF0aCxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKSBhcyB1bmtub3duKSBhcyBLYXJtYUNvbmZpZ09wdGlvbnM7XG5cbiAgICAgICAgICAgIGNvbnN0IGthcm1hUm9vdCA9IHBhdGguZGlybmFtZSh0ZXN0Q29uZmlnLl9rYXJtYUNvbmZpZ1BhdGgpO1xuXG4gICAgICAgICAgICBpZiAoY3VzdG9tS2FybWFPcHRpb25zLnJlcG9ydGVycyAmJiBjdXN0b21LYXJtYU9wdGlvbnMucmVwb3J0ZXJzLmxlbmd0aCA+IDAgJiYgIXRlc3RDb25maWcucmVwb3J0ZXJzKSB7XG4gICAgICAgICAgICAgICAgdGVzdENvbmZpZy5yZXBvcnRlcnMgPSBjdXN0b21LYXJtYU9wdGlvbnMucmVwb3J0ZXJzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tS2FybWFPcHRpb25zLmJyb3dzZXJzICYmIGN1c3RvbUthcm1hT3B0aW9ucy5icm93c2Vycy5sZW5ndGggPiAwICYmICF0ZXN0Q29uZmlnLmJyb3dzZXJzKSB7XG4gICAgICAgICAgICAgICAgdGVzdENvbmZpZy5icm93c2VycyA9IGN1c3RvbUthcm1hT3B0aW9ucy5icm93c2VycztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1c3RvbUthcm1hT3B0aW9ucy5zaW5nbGVSdW4gIT0gbnVsbCAmJiB0ZXN0Q29uZmlnLnNpbmdsZVJ1biA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVzdENvbmZpZy5zaW5nbGVSdW4gPSBjdXN0b21LYXJtYU9wdGlvbnMuc2luZ2xlUnVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tS2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXIgJiYgIXRlc3RDb25maWcuY292ZXJhZ2VSZXBvcnRlcikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tS2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXIuZGlyICYmXG4gICAgICAgICAgICAgICAgICAgICFwYXRoLmlzQWJzb2x1dGUoY3VzdG9tS2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXIuZGlyKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21LYXJtYU9wdGlvbnMuY292ZXJhZ2VSZXBvcnRlci5kaXIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBrYXJtYVJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21LYXJtYU9wdGlvbnMuY292ZXJhZ2VSZXBvcnRlci5kaXJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRLYXJtYU9wdGlvbnMuY292ZXJhZ2VSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgLi4uY3VzdG9tS2FybWFPcHRpb25zLmNvdmVyYWdlUmVwb3J0ZXJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VzdG9tS2FybWFPcHRpb25zLmp1bml0UmVwb3J0ZXIgJiYgIXRlc3RDb25maWcuanVuaXRSZXBvcnRlcikge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMuanVuaXRSZXBvcnRlci5vdXRwdXREaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tS2FybWFPcHRpb25zLmp1bml0UmVwb3J0ZXIub3V0cHV0RGlyID0gbm9ybWFsaXplUGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVsYXRpdmUoa2FybWFSb290LCBwYXRoLnJlc29sdmUoa2FybWFSb290LCBjdXN0b21LYXJtYU9wdGlvbnMuanVuaXRSZXBvcnRlci5vdXRwdXREaXIpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlZmF1bHRLYXJtYU9wdGlvbnMuanVuaXRSZXBvcnRlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZGVmYXVsdEthcm1hT3B0aW9ucy5qdW5pdFJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAuLi5jdXN0b21LYXJtYU9wdGlvbnMuanVuaXRSZXBvcnRlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMucGx1Z2lucyAmJiBjdXN0b21LYXJtYU9wdGlvbnMucGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEthcm1hT3B0aW9ucy5wbHVnaW5zID0gZGVmYXVsdEthcm1hT3B0aW9ucy5wbHVnaW5zIHx8IFtdO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLYXJtYU9wdGlvbnMucGx1Z2lucy5wdXNoKC4uLmN1c3RvbUthcm1hT3B0aW9ucy5wbHVnaW5zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1c3RvbUthcm1hT3B0aW9ucy5wb3J0KSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEthcm1hT3B0aW9ucy5wb3J0ID0gY3VzdG9tS2FybWFPcHRpb25zLnBvcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMuY29sb3JzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0S2FybWFPcHRpb25zLmNvbG9ycyA9IGN1c3RvbUthcm1hT3B0aW9ucy5jb2xvcnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMubG9nTGV2ZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLYXJtYU9wdGlvbnMubG9nTGV2ZWwgPSBjdXN0b21LYXJtYU9wdGlvbnMubG9nTGV2ZWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMuYXV0b1dhdGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0S2FybWFPcHRpb25zLmF1dG9XYXRjaCA9IGN1c3RvbUthcm1hT3B0aW9ucy5hdXRvV2F0Y2g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMuY3VzdG9tTGF1bmNoZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0S2FybWFPcHRpb25zLmN1c3RvbUxhdW5jaGVycyA9IGN1c3RvbUthcm1hT3B0aW9ucy5jdXN0b21MYXVuY2hlcnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21LYXJtYU9wdGlvbnMucmVzdGFydE9uRmlsZUNoYW5nZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEthcm1hT3B0aW9ucy5yZXN0YXJ0T25GaWxlQ2hhbmdlID0gY3VzdG9tS2FybWFPcHRpb25zLnJlc3RhcnRPbkZpbGVDaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRlc3RDb25maWcucmVwb3J0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQuY2kpIHtcbiAgICAgICAgICAgICAgICB0ZXN0Q29uZmlnLnJlcG9ydGVycyA9IFsnanVuaXQnLCAnY292ZXJhZ2UnXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVzdENvbmZpZy5yZXBvcnRlcnMgPSBbJ3Byb2dyZXNzJywgJ2tqaHRtbCddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXN0Q29uZmlnLmJyb3dzZXJzKSB7XG4gICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQuY2kpIHtcbiAgICAgICAgICAgICAgICB0ZXN0Q29uZmlnLmJyb3dzZXJzID0gWydDaHJvbWVIZWFkbGVzc0NJJ107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlc3RDb25maWcuYnJvd3NlcnMgPSBbJ0Nocm9tZSddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RDb25maWcuc2luZ2xlUnVuID09IG51bGwpIHtcbiAgICAgICAgICAgIHRlc3RDb25maWcuc2luZ2xlUnVuID0gZW52aXJvbm1lbnQuY2kgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja1Rlc3RDb25maWcodGVzdENvbmZpZywgYXJndik7XG5cbiAgICAgICAgY29uc3Qga2FybWFPcHRpb25zOiBLYXJtYUNvbmZpZ09wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0S2FybWFPcHRpb25zLFxuICAgICAgICAgICAgY29uZmlnRmlsZTogdGVzdENvbmZpZy5fa2FybWFDb25maWdQYXRoLFxuICAgICAgICAgICAgd2VicGFja0NvbmZpZyxcbiAgICAgICAgICAgIGxvZ0xldmVsOiBhcmd2LmxvZ0xldmVsID8gYXJndi5sb2dMZXZlbC50b1VwcGVyQ2FzZSgpIDogJ0lORk8nXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRlc3RDb25maWcuYnJvd3NlcnMpIHtcbiAgICAgICAgICAgIGthcm1hT3B0aW9ucy5icm93c2VycyA9IHRlc3RDb25maWcuYnJvd3NlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdENvbmZpZy5yZXBvcnRlcnMpIHtcbiAgICAgICAgICAgIGthcm1hT3B0aW9ucy5yZXBvcnRlcnMgPSB0ZXN0Q29uZmlnLnJlcG9ydGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0Q29uZmlnLnNpbmdsZVJ1biAhPSBudWxsKSB7XG4gICAgICAgICAgICBrYXJtYU9wdGlvbnMuc2luZ2xlUnVuID0gdGVzdENvbmZpZy5zaW5nbGVSdW47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQga2FybWFTZXJ2ZXI6IGthcm1hLlNlcnZlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXMpID0+IHtcbiAgICAgICAgICAgIGthcm1hU2VydmVyID0gbmV3IGthcm1hLlNlcnZlcihrYXJtYU9wdGlvbnMsIChzZXJ2ZXJFeGl0Q29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyhzZXJ2ZXJFeGl0Q29kZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAga2FybWFTZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfSkudGhlbigoc2VydmVyRXhpdENvZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChrYXJtYVNlcnZlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGthcm1hU2VydmVyV2l0aFN0b3AgPSAoa2FybWFTZXJ2ZXIgYXMgdW5rbm93bikgYXMgeyBzdG9wOiAoKSA9PiB2b2lkIH07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrYXJtYVNlcnZlcldpdGhTdG9wLnN0b3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAga2FybWFTZXJ2ZXJXaXRoU3RvcC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VydmVyRXhpdENvZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbHRlcmVkVGVzdENvbmZpZ0ludGVybmFscyhcbiAgICB3b3JrZmxvd0NvbmZpZzogV29ya2Zsb3dDb25maWdJbnRlcm5hbCxcbiAgICBmaWx0ZXJOYW1lczogc3RyaW5nW10sXG4gICAgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB8IHN0cmluZyB9XG4pOiBQcm9taXNlPFRlc3RDb25maWdJbnRlcm5hbFtdPiB7XG4gICAgY29uc3QgdGVzdENvbmZpZ3M6IFRlc3RDb25maWdJbnRlcm5hbFtdID0gW107XG4gICAgY29uc3QgcHJvamVjdE5hbWVzID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcucHJvamVjdHMpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdE5hbWUgb2YgcHJvamVjdE5hbWVzKSB7XG4gICAgICAgIGlmIChmaWx0ZXJOYW1lcy5sZW5ndGggJiYgIWZpbHRlck5hbWVzLmluY2x1ZGVzKHByb2plY3ROYW1lKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9qZWN0Q29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh3b3JrZmxvd0NvbmZpZy5wcm9qZWN0c1twcm9qZWN0TmFtZV0pKSBhcyBQcm9qZWN0Q29uZmlnSW50ZXJuYWw7XG5cbiAgICAgICAgaWYgKHByb2plY3RDb25maWcuX2NvbmZpZyAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBhd2FpdCBhcHBseVByb2plY3RFeHRlbmRzKHByb2plY3RDb25maWcsIHdvcmtmbG93Q29uZmlnLnByb2plY3RzLCBwcm9qZWN0Q29uZmlnLl9jb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcm9qZWN0Q29uZmlnLnRhc2tzIHx8ICFwcm9qZWN0Q29uZmlnLnRhc2tzLnRlc3QpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IHByb2plY3RDb25maWcudGFza3MudGVzdDtcblxuICAgICAgICBpZiAocHJvamVjdENvbmZpZy5fY29uZmlnICE9PSAnYXV0bycpIHtcbiAgICAgICAgICAgIGFwcGx5RW52T3ZlcnJpZGVzKHRlc3RDb25maWcsIGVudmlyb25tZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0Q29uZmlnLnNraXApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IHByb2plY3RDb25maWcuX3dvcmtzcGFjZVJvb3Q7XG4gICAgICAgIGNvbnN0IHByb2plY3RSb290ID0gcHJvamVjdENvbmZpZy5fcHJvamVjdFJvb3Q7XG5cbiAgICAgICAgbGV0IGthcm1hQ29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCB0c0NvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGVzdEluZGV4RmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmICh0ZXN0Q29uZmlnLmthcm1hQ29uZmlnKSB7XG4gICAgICAgICAgICBrYXJtYUNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIHRlc3RDb25maWcua2FybWFDb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2plY3RDb25maWcuX2NvbmZpZyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBrYXJtYUNvbmZpZ1BhdGggPSBhd2FpdCBmaW5kS2FybWFDb25maWdGaWxlKHByb2plY3RSb290LCB3b3Jrc3BhY2VSb290KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0Q29uZmlnLnRzQ29uZmlnKSB7XG4gICAgICAgICAgICB0c0NvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIHRlc3RDb25maWcudHNDb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHNDb25maWdQYXRoID0gYXdhaXQgZmluZFRlc3RUc2NvbmZpZ0ZpbGUocHJvamVjdFJvb3QsIHdvcmtzcGFjZVJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RDb25maWcudGVzdEluZGV4RmlsZSkge1xuICAgICAgICAgICAgdGVzdEluZGV4RmlsZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIHRlc3RDb25maWcudGVzdEluZGV4RmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXN0SW5kZXhGaWxlUGF0aCA9IGF3YWl0IGZpbmRUZXN0SW5kZXhGaWxlKHByb2plY3RSb290LCB3b3Jrc3BhY2VSb290LCB0c0NvbmZpZ1BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGVzdENvbmZpZy5jb3ZlcmFnZVJlcG9ydGVyICYmXG4gICAgICAgICAgICB0ZXN0Q29uZmlnLmNvdmVyYWdlUmVwb3J0ZXIuZGlyICYmXG4gICAgICAgICAgICAhcGF0aC5pc0Fic29sdXRlKHRlc3RDb25maWcuY292ZXJhZ2VSZXBvcnRlci5kaXIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGVzdENvbmZpZy5jb3ZlcmFnZVJlcG9ydGVyLmRpciA9IHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgdGVzdENvbmZpZy5jb3ZlcmFnZVJlcG9ydGVyLmRpcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdENvbmZpZy5qdW5pdFJlcG9ydGVyICYmIHRlc3RDb25maWcuanVuaXRSZXBvcnRlci5vdXRwdXREaXIpIHtcbiAgICAgICAgICAgIHRlc3RDb25maWcuanVuaXRSZXBvcnRlci5vdXRwdXREaXIgPSBub3JtYWxpemVQYXRoKFxuICAgICAgICAgICAgICAgIHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgdGVzdENvbmZpZy5qdW5pdFJlcG9ydGVyLm91dHB1dERpcikpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbkxpa2UgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aChwcm9qZWN0Um9vdCwgd29ya3NwYWNlUm9vdCk7XG4gICAgICAgIGlmIChwYWNrYWdlSnNvblBhdGgpIHtcbiAgICAgICAgICAgIHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXN0Q29uZmlnSW50ZXJuYWw6IFRlc3RDb25maWdJbnRlcm5hbCA9IHtcbiAgICAgICAgICAgIC4uLnRlc3RDb25maWcsXG4gICAgICAgICAgICBfY29uZmlnOiBwcm9qZWN0Q29uZmlnLl9jb25maWcsXG4gICAgICAgICAgICBfd29ya3NwYWNlUm9vdDogd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICAgIF9wcm9qZWN0Um9vdDogcHJvamVjdFJvb3QsXG4gICAgICAgICAgICBfcHJvamVjdE5hbWU6IHByb2plY3RDb25maWcuX3Byb2plY3ROYW1lLFxuICAgICAgICAgICAgX3BhY2thZ2VKc29uOiBwYWNrYWdlSnNvbixcbiAgICAgICAgICAgIF90ZXN0SW5kZXhGaWxlUGF0aDogdGVzdEluZGV4RmlsZVBhdGgsXG4gICAgICAgICAgICBfdHNDb25maWdQYXRoOiB0c0NvbmZpZ1BhdGgsXG4gICAgICAgICAgICBfa2FybWFDb25maWdQYXRoOiBrYXJtYUNvbmZpZ1BhdGhcbiAgICAgICAgfTtcblxuICAgICAgICB0ZXN0Q29uZmlncy5wdXNoKHRlc3RDb25maWdJbnRlcm5hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlc3RDb25maWdzO1xufVxuIl19