UNPKG

@axway/axway-cli-pm

Version:

Package manager for Axway products

237 lines (193 loc) 24.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _snooplogg = _interopRequireDefault(require("snooplogg")); var _utils = require("../utils.js"); var _amplifyCliUtils = require("@axway/amplify-cli-utils"); var _pm = require("../pm.js"); var _ora = _interopRequireDefault(require("ora")); var _promiseLimit = _interopRequireDefault(require("promise-limit")); var _semver = _interopRequireDefault(require("semver")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _default = { aliases: ['up'], args: [{ name: 'package', desc: 'The package name to update', redact: false }], desc: 'Download updates for installed packages', options: { '--json': { callback: ({ ctx, value }) => ctx.jsonMode = value, desc: 'Outputs updated packages as JSON' }, '-y, --yes': { aliases: ['--no-prompt'], desc: 'Automatic yes to prompts and run non-interactively' } }, skipExtensionUpdateCheck: true, async action({ argv, cli, console, exitCode, terminal }) { const { alert, bold, highlight } = _snooplogg.default.styles; const results = { alreadyActive: [], selected: [], installed: [], failures: [] }; let packages = []; // get installed packages if (argv.package) { const pkg = await (0, _pm.find)(argv.package); if (!pkg) { throw new Error(`Package "${argv.package}" is not installed`); } packages.push(pkg); } else { packages = await (0, _pm.list)(); } if (!packages.length) { if (argv.json) { console.log(JSON.stringify(results, null, 2)); } else { console.log('There are no packages to update.'); } return; } // step 1: check for updates const plimit = (0, _promiseLimit.default)(10); const spinner = (0, _ora.default)({ stream: terminal.stderr }).start('Checking packages for updates'); await Promise.all(packages.map(pkg => { return plimit(async () => { pkg.current = Object.keys(pkg.versions).sort(_semver.default.rcompare)[0]; pkg.latest = (await (0, _pm.view)(pkg.name)).version; }); })); spinner.stop(); const updateTable = (0, _amplifyCliUtils.createTable)(); for (let i = 0; i < packages.length; i++) { const pkg = packages[i]; if (_semver.default.gt(pkg.latest, pkg.version)) { updateTable.push([` ${bold(pkg.name)}`, pkg.version, '→', (0, _amplifyCliUtils.hlVer)(pkg.latest, pkg.version)]); } else { results.alreadyActive.push(`${pkg.name}@${pkg.version}`); packages.splice(i--, 1); } } if (!packages.length) { console.log('All packages are up-to-date'); return; } // step 2: confirm updates console.log(`The following packages have updates available:\n\n${updateTable.toString()}\n`); if (terminal.stdout.isTTY && !argv.yes && !argv.json) { await new Promise(resolve => { terminal.once('keypress', str => { terminal.stderr.cursorTo(0); terminal.stderr.clearLine(); if (str === 'y' || str === 'Y') { return resolve(); } process.exit(0); }); terminal.stderr.write('Do you want to update? (y/N) '); }); } // step 3: create the tasks const tasks = packages.map(pkg => { const versionData = pkg.versions[pkg.latest]; if (versionData) { // select it return { title: `${highlight(`${pkg.name}@${pkg.latest}`)} is installed, setting it as active`, async task(ctx, task) { results.selected.push(`${pkg.name}@${pkg.latest}`); const config = await (0, _amplifyCliUtils.loadConfig)(); await config.set(`extensions.${pkg.name}`, versionData.path); await config.save(); task.title = `${highlight(`${pkg.name}@${pkg.latest}`)} set as active version`; } }; } return { title: `Downloading and installing ${highlight(`${pkg.name}@${pkg.latest}`)}`, async task(ctx, task) { try { await new Promise((resolve, reject) => { (0, _pm.install)(`${pkg.name}@${pkg.latest}`).on('download', ({ name, version }) => { task.title = `Downloading ${highlight(`${name}@${version}`)}`; }).on('install', ({ name, version }) => { task.title = `Installing ${highlight(`${name}@${version}`)}`; }).on('register', ({ name, version }) => { task.title = `Registering ${highlight(`${name}@${version}`)}`; }).on('end', info => { task.title = `${highlight(`${info.name}@${info.version}`)} installed and set as active version`; results.installed.push(info); resolve(); }).on('error', reject); }); } catch (err) { results.failures.push({ error: err.toString(), package: pkg }); task.title = alert(err.toString()); err.message = undefined; // prevent the error from rendering twice exitCode(1); throw err; } } }; }); // step 4: run the tasks try { await (0, _utils.runListr)({ console, json: argv.json, tasks }); } catch (err) {// errors are stored in the results } const cfg = await (0, _amplifyCliUtils.loadConfig)(); await cfg.delete('update.notified'); await cfg.save(); if (argv.json) { console.log(JSON.stringify(results, null, 2)); } else { // step 5: show packages that can be purged const purgable = await (0, _pm.listPurgable)(argv.package); if (Object.keys(purgable).length) { const purgeTable = (0, _amplifyCliUtils.createTable)(); for (const [name, versions] of Object.entries(purgable)) { purgeTable.push([` ${bold(name)}`, versions.map(v => v.version).sort(_semver.default.rcompare).join(', ')]); } console.log(`\nThe following package versions can be purged:\n\n${purgeTable.toString()}\n\nTo purge these unused packages, run: ${highlight('axway pm purge')}`); } } await cli.emitAction('axway:pm:update', results); } }; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMvdXBkYXRlLmpzIiwibmFtZXMiOlsiYWxpYXNlcyIsImFyZ3MiLCJuYW1lIiwiZGVzYyIsInJlZGFjdCIsIm9wdGlvbnMiLCJjYWxsYmFjayIsImN0eCIsInZhbHVlIiwianNvbk1vZGUiLCJza2lwRXh0ZW5zaW9uVXBkYXRlQ2hlY2siLCJhY3Rpb24iLCJhcmd2IiwiY2xpIiwiY29uc29sZSIsImV4aXRDb2RlIiwidGVybWluYWwiLCJhbGVydCIsImJvbGQiLCJoaWdobGlnaHQiLCJzbm9vcGxvZ2ciLCJzdHlsZXMiLCJyZXN1bHRzIiwiYWxyZWFkeUFjdGl2ZSIsInNlbGVjdGVkIiwiaW5zdGFsbGVkIiwiZmFpbHVyZXMiLCJwYWNrYWdlcyIsInBhY2thZ2UiLCJwa2ciLCJFcnJvciIsInB1c2giLCJsZW5ndGgiLCJqc29uIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsaW1pdCIsInNwaW5uZXIiLCJzdHJlYW0iLCJzdGRlcnIiLCJzdGFydCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJjdXJyZW50IiwiT2JqZWN0Iiwia2V5cyIsInZlcnNpb25zIiwic29ydCIsInNlbXZlciIsInJjb21wYXJlIiwibGF0ZXN0IiwidmVyc2lvbiIsInN0b3AiLCJ1cGRhdGVUYWJsZSIsImkiLCJndCIsInNwbGljZSIsInRvU3RyaW5nIiwic3Rkb3V0IiwiaXNUVFkiLCJ5ZXMiLCJyZXNvbHZlIiwib25jZSIsInN0ciIsImN1cnNvclRvIiwiY2xlYXJMaW5lIiwicHJvY2VzcyIsImV4aXQiLCJ3cml0ZSIsInRhc2tzIiwidmVyc2lvbkRhdGEiLCJ0aXRsZSIsInRhc2siLCJjb25maWciLCJzZXQiLCJwYXRoIiwic2F2ZSIsInJlamVjdCIsIm9uIiwiaW5mbyIsImVyciIsImVycm9yIiwibWVzc2FnZSIsInVuZGVmaW5lZCIsImNmZyIsImRlbGV0ZSIsInB1cmdhYmxlIiwicHVyZ2VUYWJsZSIsImVudHJpZXMiLCJ2Iiwiam9pbiIsImVtaXRBY3Rpb24iXSwic291cmNlcyI6WyJjb21tYW5kcy91cGRhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNub29wbG9nZyBmcm9tICdzbm9vcGxvZ2cnO1xuaW1wb3J0IHsgcnVuTGlzdHIgfSBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUYWJsZSwgaGxWZXIsIGxvYWRDb25maWcgfSBmcm9tICdAYXh3YXkvYW1wbGlmeS1jbGktdXRpbHMnO1xuaW1wb3J0IHsgZmluZCwgaW5zdGFsbCwgbGlzdCwgbGlzdFB1cmdhYmxlLCB2aWV3IH0gZnJvbSAnLi4vcG0uanMnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHByb21pc2VMaW1pdCBmcm9tICdwcm9taXNlLWxpbWl0JztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXHRhbGlhc2VzOiBbICd1cCcgXSxcblx0YXJnczogW1xuXHRcdHtcblx0XHRcdG5hbWU6ICdwYWNrYWdlJyxcblx0XHRcdGRlc2M6ICdUaGUgcGFja2FnZSBuYW1lIHRvIHVwZGF0ZScsXG5cdFx0XHRyZWRhY3Q6IGZhbHNlXG5cdFx0fVxuXHRdLFxuXHRkZXNjOiAnRG93bmxvYWQgdXBkYXRlcyBmb3IgaW5zdGFsbGVkIHBhY2thZ2VzJyxcblx0b3B0aW9uczoge1xuXHRcdCctLWpzb24nOiB7XG5cdFx0XHRjYWxsYmFjazogKHsgY3R4LCB2YWx1ZSB9KSA9PiBjdHguanNvbk1vZGUgPSB2YWx1ZSxcblx0XHRcdGRlc2M6ICdPdXRwdXRzIHVwZGF0ZWQgcGFja2FnZXMgYXMgSlNPTidcblx0XHR9LFxuXHRcdCcteSwgLS15ZXMnOiB7XG5cdFx0XHRhbGlhc2VzOiBbICctLW5vLXByb21wdCcgXSxcblx0XHRcdGRlc2M6ICdBdXRvbWF0aWMgeWVzIHRvIHByb21wdHMgYW5kIHJ1biBub24taW50ZXJhY3RpdmVseSdcblx0XHR9XG5cdH0sXG5cdHNraXBFeHRlbnNpb25VcGRhdGVDaGVjazogdHJ1ZSxcblx0YXN5bmMgYWN0aW9uKHsgYXJndiwgY2xpLCBjb25zb2xlLCBleGl0Q29kZSwgdGVybWluYWwgfSkge1xuXHRcdGNvbnN0IHsgYWxlcnQsIGJvbGQsIGhpZ2hsaWdodCB9ID0gc25vb3Bsb2dnLnN0eWxlcztcblx0XHRjb25zdCByZXN1bHRzID0ge1xuXHRcdFx0YWxyZWFkeUFjdGl2ZTogW10sXG5cdFx0XHRzZWxlY3RlZDogW10sXG5cdFx0XHRpbnN0YWxsZWQ6IFtdLFxuXHRcdFx0ZmFpbHVyZXM6IFtdXG5cdFx0fTtcblx0XHRsZXQgcGFja2FnZXMgPSBbXTtcblxuXHRcdC8vIGdldCBpbnN0YWxsZWQgcGFja2FnZXNcblx0XHRpZiAoYXJndi5wYWNrYWdlKSB7XG5cdFx0XHRjb25zdCBwa2cgPSBhd2FpdCBmaW5kKGFyZ3YucGFja2FnZSk7XG5cdFx0XHRpZiAoIXBrZykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFBhY2thZ2UgXCIke2FyZ3YucGFja2FnZX1cIiBpcyBub3QgaW5zdGFsbGVkYCk7XG5cdFx0XHR9XG5cdFx0XHRwYWNrYWdlcy5wdXNoKHBrZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhY2thZ2VzID0gYXdhaXQgbGlzdCgpO1xuXHRcdH1cblxuXHRcdGlmICghcGFja2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRpZiAoYXJndi5qc29uKSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdUaGVyZSBhcmUgbm8gcGFja2FnZXMgdG8gdXBkYXRlLicpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHN0ZXAgMTogY2hlY2sgZm9yIHVwZGF0ZXNcblx0XHRjb25zdCBwbGltaXQgPSBwcm9taXNlTGltaXQoMTApO1xuXHRcdGNvbnN0IHNwaW5uZXIgPSBvcmEoeyBzdHJlYW06IHRlcm1pbmFsLnN0ZGVyciB9KS5zdGFydCgnQ2hlY2tpbmcgcGFja2FnZXMgZm9yIHVwZGF0ZXMnKTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChwYWNrYWdlcy5tYXAocGtnID0+IHtcblx0XHRcdHJldHVybiBwbGltaXQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRwa2cuY3VycmVudCA9IE9iamVjdC5rZXlzKHBrZy52ZXJzaW9ucykuc29ydChzZW12ZXIucmNvbXBhcmUpWzBdO1xuXHRcdFx0XHRwa2cubGF0ZXN0ID0gKGF3YWl0IHZpZXcocGtnLm5hbWUpKS52ZXJzaW9uO1xuXHRcdFx0fSk7XG5cdFx0fSkpO1xuXHRcdHNwaW5uZXIuc3RvcCgpO1xuXG5cdFx0Y29uc3QgdXBkYXRlVGFibGUgPSBjcmVhdGVUYWJsZSgpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHBrZyA9IHBhY2thZ2VzW2ldO1xuXHRcdFx0aWYgKHNlbXZlci5ndChwa2cubGF0ZXN0LCBwa2cudmVyc2lvbikpIHtcblx0XHRcdFx0dXBkYXRlVGFibGUucHVzaChbIGAgICR7Ym9sZChwa2cubmFtZSl9YCwgcGtnLnZlcnNpb24sICfihpInLCBobFZlcihwa2cubGF0ZXN0LCBwa2cudmVyc2lvbikgXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHRzLmFscmVhZHlBY3RpdmUucHVzaChgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gKTtcblx0XHRcdFx0cGFja2FnZXMuc3BsaWNlKGktLSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghcGFja2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnQWxsIHBhY2thZ2VzIGFyZSB1cC10by1kYXRlJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gc3RlcCAyOiBjb25maXJtIHVwZGF0ZXNcblx0XHRjb25zb2xlLmxvZyhgVGhlIGZvbGxvd2luZyBwYWNrYWdlcyBoYXZlIHVwZGF0ZXMgYXZhaWxhYmxlOlxcblxcbiR7dXBkYXRlVGFibGUudG9TdHJpbmcoKX1cXG5gKTtcblxuXHRcdGlmICh0ZXJtaW5hbC5zdGRvdXQuaXNUVFkgJiYgIWFyZ3YueWVzICYmICFhcmd2Lmpzb24pIHtcblx0XHRcdGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0XHR0ZXJtaW5hbC5vbmNlKCdrZXlwcmVzcycsIHN0ciA9PiB7XG5cdFx0XHRcdFx0dGVybWluYWwuc3RkZXJyLmN1cnNvclRvKDApO1xuXHRcdFx0XHRcdHRlcm1pbmFsLnN0ZGVyci5jbGVhckxpbmUoKTtcblx0XHRcdFx0XHRpZiAoc3RyID09PSAneScgfHwgc3RyID09PSAnWScpIHtcblx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRlcm1pbmFsLnN0ZGVyci53cml0ZSgnRG8geW91IHdhbnQgdG8gdXBkYXRlPyAoeS9OKSAnKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHN0ZXAgMzogY3JlYXRlIHRoZSB0YXNrc1xuXHRcdGNvbnN0IHRhc2tzID0gcGFja2FnZXMubWFwKHBrZyA9PiB7XG5cdFx0XHRjb25zdCB2ZXJzaW9uRGF0YSA9IHBrZy52ZXJzaW9uc1twa2cubGF0ZXN0XTtcblx0XHRcdGlmICh2ZXJzaW9uRGF0YSkge1xuXHRcdFx0XHQvLyBzZWxlY3QgaXRcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR0aXRsZTogYCR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9IGlzIGluc3RhbGxlZCwgc2V0dGluZyBpdCBhcyBhY3RpdmVgLFxuXHRcdFx0XHRcdGFzeW5jIHRhc2soY3R4LCB0YXNrKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnNlbGVjdGVkLnB1c2goYCR7cGtnLm5hbWV9QCR7cGtnLmxhdGVzdH1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKTtcblx0XHRcdFx0XHRcdGF3YWl0IGNvbmZpZy5zZXQoYGV4dGVuc2lvbnMuJHtwa2cubmFtZX1gLCB2ZXJzaW9uRGF0YS5wYXRoKTtcblx0XHRcdFx0XHRcdGF3YWl0IGNvbmZpZy5zYXZlKCk7XG5cdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYCR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9IHNldCBhcyBhY3RpdmUgdmVyc2lvbmA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0aXRsZTogYERvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nICR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9YCxcblx0XHRcdFx0YXN5bmMgdGFzayhjdHgsIHRhc2spIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpbnN0YWxsKGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YClcblx0XHRcdFx0XHRcdFx0XHQub24oJ2Rvd25sb2FkJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYERvd25sb2FkaW5nICR7aGlnaGxpZ2h0KGAke25hbWV9QCR7dmVyc2lvbn1gKX1gO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Lm9uKCdpbnN0YWxsJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYEluc3RhbGxpbmcgJHtoaWdobGlnaHQoYCR7bmFtZX1AJHt2ZXJzaW9ufWApfWA7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQub24oJ3JlZ2lzdGVyJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYFJlZ2lzdGVyaW5nICR7aGlnaGxpZ2h0KGAke25hbWV9QCR7dmVyc2lvbn1gKX1gO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Lm9uKCdlbmQnLCBpbmZvID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhc2sudGl0bGUgPSBgJHtoaWdobGlnaHQoYCR7aW5mby5uYW1lfUAke2luZm8udmVyc2lvbn1gKX0gaW5zdGFsbGVkIGFuZCBzZXQgYXMgYWN0aXZlIHZlcnNpb25gO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5pbnN0YWxsZWQucHVzaChpbmZvKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5vbignZXJyb3InLCByZWplY3QpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLmZhaWx1cmVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyLnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdHBhY2thZ2U6IHBrZ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYWxlcnQoZXJyLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0ZXJyLm1lc3NhZ2UgPSB1bmRlZmluZWQ7IC8vIHByZXZlbnQgdGhlIGVycm9yIGZyb20gcmVuZGVyaW5nIHR3aWNlXG5cdFx0XHRcdFx0XHRleGl0Q29kZSgxKTtcblx0XHRcdFx0XHRcdHRocm93IGVycjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHQvLyBzdGVwIDQ6IHJ1biB0aGUgdGFza3Ncblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgcnVuTGlzdHIoeyBjb25zb2xlLCBqc29uOiBhcmd2Lmpzb24sIHRhc2tzIH0pO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Ly8gZXJyb3JzIGFyZSBzdG9yZWQgaW4gdGhlIHJlc3VsdHNcblx0XHR9XG5cblx0XHRjb25zdCBjZmcgPSBhd2FpdCBsb2FkQ29uZmlnKCk7XG5cdFx0YXdhaXQgY2ZnLmRlbGV0ZSgndXBkYXRlLm5vdGlmaWVkJyk7XG5cdFx0YXdhaXQgY2ZnLnNhdmUoKTtcblxuXHRcdGlmIChhcmd2Lmpzb24pIHtcblx0XHRcdGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RlcCA1OiBzaG93IHBhY2thZ2VzIHRoYXQgY2FuIGJlIHB1cmdlZFxuXHRcdFx0Y29uc3QgcHVyZ2FibGUgPSBhd2FpdCBsaXN0UHVyZ2FibGUoYXJndi5wYWNrYWdlKTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhwdXJnYWJsZSkubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHB1cmdlVGFibGUgPSBjcmVhdGVUYWJsZSgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFsgbmFtZSwgdmVyc2lvbnMgXSBvZiBPYmplY3QuZW50cmllcyhwdXJnYWJsZSkpIHtcblx0XHRcdFx0XHRwdXJnZVRhYmxlLnB1c2goWyBgICAke2JvbGQobmFtZSl9YCwgdmVyc2lvbnMubWFwKHYgPT4gdi52ZXJzaW9uKS5zb3J0KHNlbXZlci5yY29tcGFyZSkuam9pbignLCAnKSBdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zb2xlLmxvZyhgXFxuVGhlIGZvbGxvd2luZyBwYWNrYWdlIHZlcnNpb25zIGNhbiBiZSBwdXJnZWQ6XFxuXFxuJHtwdXJnZVRhYmxlLnRvU3RyaW5nKCl9XFxuXFxuVG8gcHVyZ2UgdGhlc2UgdW51c2VkIHBhY2thZ2VzLCBydW46ICR7aGlnaGxpZ2h0KCdheHdheSBwbSBwdXJnZScpfWApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IGNsaS5lbWl0QWN0aW9uKCdheHdheTpwbTp1cGRhdGUnLCByZXN1bHRzKTtcblx0fVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O2VBRWU7RUFDZEEsT0FBTyxFQUFFLENBQUUsSUFBRixDQURLO0VBRWRDLElBQUksRUFBRSxDQUNMO0lBQ0NDLElBQUksRUFBRSxTQURQO0lBRUNDLElBQUksRUFBRSw0QkFGUDtJQUdDQyxNQUFNLEVBQUU7RUFIVCxDQURLLENBRlE7RUFTZEQsSUFBSSxFQUFFLHlDQVRRO0VBVWRFLE9BQU8sRUFBRTtJQUNSLFVBQVU7TUFDVEMsUUFBUSxFQUFFLENBQUM7UUFBRUMsR0FBRjtRQUFPQztNQUFQLENBQUQsS0FBb0JELEdBQUcsQ0FBQ0UsUUFBSixHQUFlRCxLQURwQztNQUVUTCxJQUFJLEVBQUU7SUFGRyxDQURGO0lBS1IsYUFBYTtNQUNaSCxPQUFPLEVBQUUsQ0FBRSxhQUFGLENBREc7TUFFWkcsSUFBSSxFQUFFO0lBRk07RUFMTCxDQVZLO0VBb0JkTyx3QkFBd0IsRUFBRSxJQXBCWjs7RUFxQmQsTUFBTUMsTUFBTixDQUFhO0lBQUVDLElBQUY7SUFBUUMsR0FBUjtJQUFhQyxPQUFiO0lBQXNCQyxRQUF0QjtJQUFnQ0M7RUFBaEMsQ0FBYixFQUF5RDtJQUN4RCxNQUFNO01BQUVDLEtBQUY7TUFBU0MsSUFBVDtNQUFlQztJQUFmLElBQTZCQyxtQkFBVUMsTUFBN0M7SUFDQSxNQUFNQyxPQUFPLEdBQUc7TUFDZkMsYUFBYSxFQUFFLEVBREE7TUFFZkMsUUFBUSxFQUFFLEVBRks7TUFHZkMsU0FBUyxFQUFFLEVBSEk7TUFJZkMsUUFBUSxFQUFFO0lBSkssQ0FBaEI7SUFNQSxJQUFJQyxRQUFRLEdBQUcsRUFBZixDQVJ3RCxDQVV4RDs7SUFDQSxJQUFJZixJQUFJLENBQUNnQixPQUFULEVBQWtCO01BQ2pCLE1BQU1DLEdBQUcsR0FBRyxNQUFNLGNBQUtqQixJQUFJLENBQUNnQixPQUFWLENBQWxCOztNQUNBLElBQUksQ0FBQ0MsR0FBTCxFQUFVO1FBQ1QsTUFBTSxJQUFJQyxLQUFKLENBQVcsWUFBV2xCLElBQUksQ0FBQ2dCLE9BQVEsb0JBQW5DLENBQU47TUFDQTs7TUFDREQsUUFBUSxDQUFDSSxJQUFULENBQWNGLEdBQWQ7SUFDQSxDQU5ELE1BTU87TUFDTkYsUUFBUSxHQUFHLE1BQU0sZUFBakI7SUFDQTs7SUFFRCxJQUFJLENBQUNBLFFBQVEsQ0FBQ0ssTUFBZCxFQUFzQjtNQUNyQixJQUFJcEIsSUFBSSxDQUFDcUIsSUFBVCxFQUFlO1FBQ2RuQixPQUFPLENBQUNvQixHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlZCxPQUFmLEVBQXdCLElBQXhCLEVBQThCLENBQTlCLENBQVo7TUFDQSxDQUZELE1BRU87UUFDTlIsT0FBTyxDQUFDb0IsR0FBUixDQUFZLGtDQUFaO01BQ0E7O01BQ0Q7SUFDQSxDQTVCdUQsQ0E4QnhEOzs7SUFDQSxNQUFNRyxNQUFNLEdBQUcsMkJBQWEsRUFBYixDQUFmO0lBQ0EsTUFBTUMsT0FBTyxHQUFHLGtCQUFJO01BQUVDLE1BQU0sRUFBRXZCLFFBQVEsQ0FBQ3dCO0lBQW5CLENBQUosRUFBaUNDLEtBQWpDLENBQXVDLCtCQUF2QyxDQUFoQjtJQUNBLE1BQU1DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZaEIsUUFBUSxDQUFDaUIsR0FBVCxDQUFhZixHQUFHLElBQUk7TUFDckMsT0FBT1EsTUFBTSxDQUFDLFlBQVk7UUFDekJSLEdBQUcsQ0FBQ2dCLE9BQUosR0FBY0MsTUFBTSxDQUFDQyxJQUFQLENBQVlsQixHQUFHLENBQUNtQixRQUFoQixFQUEwQkMsSUFBMUIsQ0FBK0JDLGdCQUFPQyxRQUF0QyxFQUFnRCxDQUFoRCxDQUFkO1FBQ0F0QixHQUFHLENBQUN1QixNQUFKLEdBQWEsQ0FBQyxNQUFNLGNBQUt2QixHQUFHLENBQUMzQixJQUFULENBQVAsRUFBdUJtRCxPQUFwQztNQUNBLENBSFksQ0FBYjtJQUlBLENBTGlCLENBQVosQ0FBTjtJQU1BZixPQUFPLENBQUNnQixJQUFSO0lBRUEsTUFBTUMsV0FBVyxHQUFHLG1DQUFwQjs7SUFDQSxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUc3QixRQUFRLENBQUNLLE1BQTdCLEVBQXFDd0IsQ0FBQyxFQUF0QyxFQUEwQztNQUN6QyxNQUFNM0IsR0FBRyxHQUFHRixRQUFRLENBQUM2QixDQUFELENBQXBCOztNQUNBLElBQUlOLGdCQUFPTyxFQUFQLENBQVU1QixHQUFHLENBQUN1QixNQUFkLEVBQXNCdkIsR0FBRyxDQUFDd0IsT0FBMUIsQ0FBSixFQUF3QztRQUN2Q0UsV0FBVyxDQUFDeEIsSUFBWixDQUFpQixDQUFHLEtBQUliLElBQUksQ0FBQ1csR0FBRyxDQUFDM0IsSUFBTCxDQUFXLEVBQXRCLEVBQXlCMkIsR0FBRyxDQUFDd0IsT0FBN0IsRUFBc0MsR0FBdEMsRUFBMkMsNEJBQU14QixHQUFHLENBQUN1QixNQUFWLEVBQWtCdkIsR0FBRyxDQUFDd0IsT0FBdEIsQ0FBM0MsQ0FBakI7TUFDQSxDQUZELE1BRU87UUFDTi9CLE9BQU8sQ0FBQ0MsYUFBUixDQUFzQlEsSUFBdEIsQ0FBNEIsR0FBRUYsR0FBRyxDQUFDM0IsSUFBSyxJQUFHMkIsR0FBRyxDQUFDd0IsT0FBUSxFQUF0RDtRQUNBMUIsUUFBUSxDQUFDK0IsTUFBVCxDQUFnQkYsQ0FBQyxFQUFqQixFQUFxQixDQUFyQjtNQUNBO0lBQ0Q7O0lBQ0QsSUFBSSxDQUFDN0IsUUFBUSxDQUFDSyxNQUFkLEVBQXNCO01BQ3JCbEIsT0FBTyxDQUFDb0IsR0FBUixDQUFZLDZCQUFaO01BQ0E7SUFDQSxDQXREdUQsQ0F3RHhEOzs7SUFDQXBCLE9BQU8sQ0FBQ29CLEdBQVIsQ0FBYSxxREFBb0RxQixXQUFXLENBQUNJLFFBQVosRUFBdUIsSUFBeEY7O0lBRUEsSUFBSTNDLFFBQVEsQ0FBQzRDLE1BQVQsQ0FBZ0JDLEtBQWhCLElBQXlCLENBQUNqRCxJQUFJLENBQUNrRCxHQUEvQixJQUFzQyxDQUFDbEQsSUFBSSxDQUFDcUIsSUFBaEQsRUFBc0Q7TUFDckQsTUFBTSxJQUFJUyxPQUFKLENBQVlxQixPQUFPLElBQUk7UUFDNUIvQyxRQUFRLENBQUNnRCxJQUFULENBQWMsVUFBZCxFQUEwQkMsR0FBRyxJQUFJO1VBQ2hDakQsUUFBUSxDQUFDd0IsTUFBVCxDQUFnQjBCLFFBQWhCLENBQXlCLENBQXpCO1VBQ0FsRCxRQUFRLENBQUN3QixNQUFULENBQWdCMkIsU0FBaEI7O1VBQ0EsSUFBSUYsR0FBRyxLQUFLLEdBQVIsSUFBZUEsR0FBRyxLQUFLLEdBQTNCLEVBQWdDO1lBQy9CLE9BQU9GLE9BQU8sRUFBZDtVQUNBOztVQUNESyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO1FBQ0EsQ0FQRDtRQVFBckQsUUFBUSxDQUFDd0IsTUFBVCxDQUFnQjhCLEtBQWhCLENBQXNCLCtCQUF0QjtNQUNBLENBVkssQ0FBTjtJQVdBLENBdkV1RCxDQXlFeEQ7OztJQUNBLE1BQU1DLEtBQUssR0FBRzVDLFFBQVEsQ0FBQ2lCLEdBQVQsQ0FBYWYsR0FBRyxJQUFJO01BQ2pDLE1BQU0yQyxXQUFXLEdBQUczQyxHQUFHLENBQUNtQixRQUFKLENBQWFuQixHQUFHLENBQUN1QixNQUFqQixDQUFwQjs7TUFDQSxJQUFJb0IsV0FBSixFQUFpQjtRQUNoQjtRQUNBLE9BQU87VUFDTkMsS0FBSyxFQUFHLEdBQUV0RCxTQUFTLENBQUUsR0FBRVUsR0FBRyxDQUFDM0IsSUFBSyxJQUFHMkIsR0FBRyxDQUFDdUIsTUFBTyxFQUEzQixDQUE4QixxQ0FEM0M7O1VBRU4sTUFBTXNCLElBQU4sQ0FBV25FLEdBQVgsRUFBZ0JtRSxJQUFoQixFQUFzQjtZQUNyQnBELE9BQU8sQ0FBQ0UsUUFBUixDQUFpQk8sSUFBakIsQ0FBdUIsR0FBRUYsR0FBRyxDQUFDM0IsSUFBSyxJQUFHMkIsR0FBRyxDQUFDdUIsTUFBTyxFQUFoRDtZQUNBLE1BQU11QixNQUFNLEdBQUcsTUFBTSxrQ0FBckI7WUFDQSxNQUFNQSxNQUFNLENBQUNDLEdBQVAsQ0FBWSxjQUFhL0MsR0FBRyxDQUFDM0IsSUFBSyxFQUFsQyxFQUFxQ3NFLFdBQVcsQ0FBQ0ssSUFBakQsQ0FBTjtZQUNBLE1BQU1GLE1BQU0sQ0FBQ0csSUFBUCxFQUFOO1lBQ0FKLElBQUksQ0FBQ0QsS0FBTCxHQUFjLEdBQUV0RCxTQUFTLENBQUUsR0FBRVUsR0FBRyxDQUFDM0IsSUFBSyxJQUFHMkIsR0FBRyxDQUFDdUIsTUFBTyxFQUEzQixDQUE4Qix3QkFBdkQ7VUFDQTs7UUFSSyxDQUFQO01BVUE7O01BRUQsT0FBTztRQUNOcUIsS0FBSyxFQUFHLDhCQUE2QnRELFNBQVMsQ0FBRSxHQUFFVSxHQUFHLENBQUMzQixJQUFLLElBQUcyQixHQUFHLENBQUN1QixNQUFPLEVBQTNCLENBQThCLEVBRHRFOztRQUVOLE1BQU1zQixJQUFOLENBQVduRSxHQUFYLEVBQWdCbUUsSUFBaEIsRUFBc0I7VUFDckIsSUFBSTtZQUNILE1BQU0sSUFBSWhDLE9BQUosQ0FBWSxDQUFDcUIsT0FBRCxFQUFVZ0IsTUFBVixLQUFxQjtjQUN0QyxpQkFBUyxHQUFFbEQsR0FBRyxDQUFDM0IsSUFBSyxJQUFHMkIsR0FBRyxDQUFDdUIsTUFBTyxFQUFsQyxFQUNFNEIsRUFERixDQUNLLFVBREwsRUFDaUIsQ0FBQztnQkFBRTlFLElBQUY7Z0JBQVFtRDtjQUFSLENBQUQsS0FBdUI7Z0JBQ3RDcUIsSUFBSSxDQUFDRCxLQUFMLEdBQWMsZUFBY3RELFNBQVMsQ0FBRSxHQUFFakIsSUFBSyxJQUFHbUQsT0FBUSxFQUFwQixDQUF1QixFQUE1RDtjQUNBLENBSEYsRUFJRTJCLEVBSkYsQ0FJSyxTQUpMLEVBSWdCLENBQUM7Z0JBQUU5RSxJQUFGO2dCQUFRbUQ7Y0FBUixDQUFELEtBQXVCO2dCQUNyQ3FCLElBQUksQ0FBQ0QsS0FBTCxHQUFjLGNBQWF0RCxTQUFTLENBQUUsR0FBRWpCLElBQUssSUFBR21ELE9BQVEsRUFBcEIsQ0FBdUIsRUFBM0Q7Y0FDQSxDQU5GLEVBT0UyQixFQVBGLENBT0ssVUFQTCxFQU9pQixDQUFDO2dCQUFFOUUsSUFBRjtnQkFBUW1EO2NBQVIsQ0FBRCxLQUF1QjtnQkFDdENxQixJQUFJLENBQUNELEtBQUwsR0FBYyxlQUFjdEQsU0FBUyxDQUFFLEdBQUVqQixJQUFLLElBQUdtRCxPQUFRLEVBQXBCLENBQXVCLEVBQTVEO2NBQ0EsQ0FURixFQVVFMkIsRUFWRixDQVVLLEtBVkwsRUFVWUMsSUFBSSxJQUFJO2dCQUNsQlAsSUFBSSxDQUFDRCxLQUFMLEdBQWMsR0FBRXRELFNBQVMsQ0FBRSxHQUFFOEQsSUFBSSxDQUFDL0UsSUFBSyxJQUFHK0UsSUFBSSxDQUFDNUIsT0FBUSxFQUE5QixDQUFpQyxzQ0FBMUQ7Z0JBQ0EvQixPQUFPLENBQUNHLFNBQVIsQ0FBa0JNLElBQWxCLENBQXVCa0QsSUFBdkI7Z0JBQ0FsQixPQUFPO2NBQ1AsQ0FkRixFQWVFaUIsRUFmRixDQWVLLE9BZkwsRUFlY0QsTUFmZDtZQWdCQSxDQWpCSyxDQUFOO1VBa0JBLENBbkJELENBbUJFLE9BQU9HLEdBQVAsRUFBWTtZQUNiNUQsT0FBTyxDQUFDSSxRQUFSLENBQWlCSyxJQUFqQixDQUFzQjtjQUNyQm9ELEtBQUssRUFBRUQsR0FBRyxDQUFDdkIsUUFBSixFQURjO2NBRXJCL0IsT0FBTyxFQUFFQztZQUZZLENBQXRCO1lBSUE2QyxJQUFJLENBQUNELEtBQUwsR0FBYXhELEtBQUssQ0FBQ2lFLEdBQUcsQ0FBQ3ZCLFFBQUosRUFBRCxDQUFsQjtZQUNBdUIsR0FBRyxDQUFDRSxPQUFKLEdBQWNDLFNBQWQsQ0FOYSxDQU1ZOztZQUN6QnRFLFFBQVEsQ0FBQyxDQUFELENBQVI7WUFDQSxNQUFNbUUsR0FBTjtVQUNBO1FBQ0Q7O01BaENLLENBQVA7SUFrQ0EsQ0FsRGEsQ0FBZCxDQTFFd0QsQ0E4SHhEOztJQUNBLElBQUk7TUFDSCxNQUFNLHFCQUFTO1FBQUVwRSxPQUFGO1FBQVdtQixJQUFJLEVBQUVyQixJQUFJLENBQUNxQixJQUF0QjtRQUE0QnNDO01BQTVCLENBQVQsQ0FBTjtJQUNBLENBRkQsQ0FFRSxPQUFPVyxHQUFQLEVBQVksQ0FDYjtJQUNBOztJQUVELE1BQU1JLEdBQUcsR0FBRyxNQUFNLGtDQUFsQjtJQUNBLE1BQU1BLEdBQUcsQ0FBQ0MsTUFBSixDQUFXLGlCQUFYLENBQU47SUFDQSxNQUFNRCxHQUFHLENBQUNSLElBQUosRUFBTjs7SUFFQSxJQUFJbEUsSUFBSSxDQUFDcUIsSUFBVCxFQUFlO01BQ2RuQixPQUFPLENBQUNvQixHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlZCxPQUFmLEVBQXdCLElBQXhCLEVBQThCLENBQTlCLENBQVo7SUFDQSxDQUZELE1BRU87TUFDTjtNQUNBLE1BQU1rRSxRQUFRLEdBQUcsTUFBTSxzQkFBYTVFLElBQUksQ0FBQ2dCLE9BQWxCLENBQXZCOztNQUNBLElBQUlrQixNQUFNLENBQUNDLElBQVAsQ0FBWXlDLFFBQVosRUFBc0J4RCxNQUExQixFQUFrQztRQUNqQyxNQUFNeUQsVUFBVSxHQUFHLG1DQUFuQjs7UUFDQSxLQUFLLE1BQU0sQ0FBRXZGLElBQUYsRUFBUThDLFFBQVIsQ0FBWCxJQUFpQ0YsTUFBTSxDQUFDNEMsT0FBUCxDQUFlRixRQUFmLENBQWpDLEVBQTJEO1VBQzFEQyxVQUFVLENBQUMxRCxJQUFYLENBQWdCLENBQUcsS0FBSWIsSUFBSSxDQUFDaEIsSUFBRCxDQUFPLEVBQWxCLEVBQXFCOEMsUUFBUSxDQUFDSixHQUFULENBQWErQyxDQUFDLElBQUlBLENBQUMsQ0FBQ3RDLE9BQXBCLEVBQTZCSixJQUE3QixDQUFrQ0MsZ0JBQU9DLFFBQXpDLEVBQW1EeUMsSUFBbkQsQ0FBd0QsSUFBeEQsQ0FBckIsQ0FBaEI7UUFDQTs7UUFDRDlFLE9BQU8sQ0FBQ29CLEdBQVIsQ0FBYSxzREFBcUR1RCxVQUFVLENBQUM5QixRQUFYLEVBQXNCLDRDQUEyQ3hDLFNBQVMsQ0FBQyxnQkFBRCxDQUFtQixFQUEvSjtNQUNBO0lBQ0Q7O0lBRUQsTUFBTU4sR0FBRyxDQUFDZ0YsVUFBSixDQUFlLGlCQUFmLEVBQWtDdkUsT0FBbEMsQ0FBTjtFQUNBOztBQTdLYSxDIn0=