UNPKG

link-type-definitions

Version:
387 lines (304 loc) 47.3 kB
"use strict"; require("core-js/modules/es.array.filter"); require("core-js/modules/es.array.index-of"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.array.map"); require("core-js/modules/es.array.slice"); require("core-js/modules/es.object.get-own-property-descriptors"); require("core-js/modules/es.promise"); require("core-js/modules/es.set"); require("core-js/modules/es.string.replace"); require("core-js/modules/es.string.split"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = linkTypeDefinitions; exports.linkGlob = linkGlob; exports.setup = setup; exports.findDefinitionsPath = findDefinitionsPath; exports.writeLinkedDirectives = writeLinkedDirectives; exports.createLinkedDirectives = createLinkedDirectives; var _execa = _interopRequireDefault(require("execa")); var _fsExtra = _interopRequireDefault(require("fs-extra")); var _globby = _interopRequireDefault(require("globby")); var _newregexp = _interopRequireDefault(require("newregexp")); var _ora = _interopRequireDefault(require("ora")); var _os = _interopRequireDefault(require("os")); var _path = _interopRequireDefault(require("path")); var _pkgDir = _interopRequireDefault(require("pkg-dir")); var _package = _interopRequireDefault(require("../package.json")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } const packageName = _package.default.name; const packageVersion = _package.default.version; function linkTypeDefinitions() { return _linkTypeDefinitions.apply(this, arguments); } function _linkTypeDefinitions() { _linkTypeDefinitions = _asyncToGenerator(function* (partialOptions = {}, spinner = (0, _ora.default)()) { let options = _objectSpread({ copy: true, cwd: process.cwd(), dryRun: false, ns: `_${packageName}`, save: false, unlink: false, verbose: false }, partialOptions); try { var _require; const pkgOptions = (_require = require(_path.default.resolve(options.cwd, 'package.json'))) === null || _require === void 0 ? void 0 : _require.linkTypeDefinitionsOptions; delete pkgOptions.cwd; delete pkgOptions.moduleName; delete pkgOptions.save; delete pkgOptions.unlink; options = _objectSpread(_objectSpread(_objectSpread({}, options), pkgOptions), partialOptions); } catch (err) {} if (options.verbose) { spinner.info(`OPTIONS: ${JSON.stringify(options, null, 2)}`); } const rootPath = (yield (0, _pkgDir.default)(options.cwd)) || options.cwd; const installedFromPath = /\/node_modules\/.*/g.test(options.cwd) ? options.cwd.replace(/\/node_modules\/.*/g, '') : null; const typesLocationPath = installedFromPath ? _path.default.resolve(installedFromPath, 'node_modules/@types', options.ns) : _path.default.resolve(rootPath, 'node_modules/@types', options.ns); const pkgPath = _path.default.resolve(rootPath, 'package.json'); if (!(yield _fsExtra.default.pathExists(pkgPath))) return; let pkg; try { pkg = require(pkgPath); } catch (err) {} if (!pkg) return; let _pkg = pkg, linkTypeDefinitions = _pkg.linkTypeDefinitions; if (options.moduleName) linkTypeDefinitions = [options.moduleName]; if (!linkTypeDefinitions.length) return; yield Promise.all(linkTypeDefinitions.map( /*#__PURE__*/function () { var _ref = _asyncToGenerator(function* (moduleName) { var _pkg2, _pkg3; const dependencies = new Set(pkg ? [...Object.keys(((_pkg2 = pkg) === null || _pkg2 === void 0 ? void 0 : _pkg2.dependencies) || {}), ...Object.keys(((_pkg3 = pkg) === null || _pkg3 === void 0 ? void 0 : _pkg3.devDependencies) || {})] : []); if (moduleName.substr(0, 2) !== './' && !dependencies.has(moduleName) && !options.unlink) { if (options.moduleName) { spinner.stop(); spinner.fail(`cannot link unless '${moduleName}' is saved in dependencies or devDependencies in the package.json file`); process.exit(1); } spinner.stop(); spinner.warn(`'${moduleName}' not saved in dependencies or devDependencies in the package.json file`); return; } if (pkg && options.save && options.moduleName) { if (!options.dryRun) { const linkTypeDefinitionsSet = new Set([...(pkg.linkTypeDefinitions || []), ...linkTypeDefinitions]); if (options.unlink) linkTypeDefinitionsSet.delete(options.moduleName); pkg.linkTypeDefinitions = [...linkTypeDefinitionsSet]; yield _fsExtra.default.writeJson(pkgPath, pkg, { spaces: 2 }); } if (options.dryRun || options.verbose) { spinner.info(`updated ${pkgPath}`); } } if (moduleName.substr(0, 2) === './') { if (installedFromPath) { var _pkg4; yield linkGlob(_path.default.resolve(rootPath, moduleName), options, typesLocationPath, _path.default.resolve(...(pkg ? [(_pkg4 = pkg) === null || _pkg4 === void 0 ? void 0 : _pkg4.name] : []), moduleName).slice(process.cwd().length + 1), spinner); } } else if (!installedFromPath) { const modulePath = _path.default.resolve(rootPath, 'node_modules', moduleName); const definitionsPath = yield findDefinitionsPath(modulePath); yield linkGlob(definitionsPath, options, typesLocationPath, moduleName, spinner); } }); return function (_x10) { return _ref.apply(this, arguments); }; }())); if (!options.dryRun) { yield writeLinkedDirectives(typesLocationPath, options.ns); } }); return _linkTypeDefinitions.apply(this, arguments); } function linkGlob(_x, _x2, _x3, _x4, _x5) { return _linkGlob.apply(this, arguments); } function _linkGlob() { _linkGlob = _asyncToGenerator(function* (rootGlobPath, options, typesLocationPath, moduleName, spinner) { yield Promise.all((yield (0, _globby.default)(_path.default.resolve(rootGlobPath, '**/*.d.ts?(x)'))).map( /*#__PURE__*/function () { var _ref2 = _asyncToGenerator(function* (globPath) { const relativeGlobPath = globPath.slice(rootGlobPath.length + 1); if ((options.ignorePaths || []).reduce((shouldIgnore, ignorePath) => { if (shouldIgnore) return shouldIgnore; if ((0, _newregexp.default)(ignorePath).test(globPath)) return true; return shouldIgnore; }, false)) { if (!options.dryRun) { yield _fsExtra.default.remove(_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)); } if (options.dryRun || options.verbose) { spinner.fail(`${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`); } return true; } if (!options.dryRun) { yield _fsExtra.default.remove(_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)); } if (options.unlink) { if (options.dryRun || options.verbose) { spinner.fail(`${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`); } } else { if (!options.dryRun) { yield _fsExtra.default.mkdirs(_path.default.resolve(typesLocationPath, moduleName)); if (options.copy) { yield _fsExtra.default.copy(_path.default.resolve(rootGlobPath, relativeGlobPath), _path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)); } else { yield _fsExtra.default.symlink(_path.default.resolve(rootGlobPath, relativeGlobPath), _path.default.resolve(typesLocationPath, moduleName, relativeGlobPath), 'file'); } } if (options.dryRun || options.verbose) { spinner.info(`${_path.default.resolve(rootGlobPath, relativeGlobPath)} ${options.copy ? '=>' : '->'} ${_path.default.resolve(typesLocationPath, moduleName, relativeGlobPath)}`); } } }); return function (_x11) { return _ref2.apply(this, arguments); }; }())); }); return _linkGlob.apply(this, arguments); } function setup(_x6) { return _setup.apply(this, arguments); } function _setup() { _setup = _asyncToGenerator(function* (partialOptions, spinner = (0, _ora.default)()) { var _scripts$postinstall; let options = _objectSpread({ cwd: process.cwd(), dryRun: false, install: true, typesLocation: '', verbose: false }, partialOptions); try { var _require2; const pkgOptions = (_require2 = require(_path.default.resolve(options.cwd, 'package.json'))) === null || _require2 === void 0 ? void 0 : _require2.linkTypeDefinitionsOptions; options = _objectSpread(_objectSpread(_objectSpread({}, options), pkgOptions), partialOptions); } catch (err) {} if (options.verbose) { spinner.info(`OPTIONS: ${JSON.stringify(options, null, 2)}`); } const rootPath = (yield (0, _pkgDir.default)(_path.default.resolve(options.cwd))) || options.cwd; const pkgPath = _path.default.resolve(rootPath, 'package.json'); if (!(yield _fsExtra.default.pathExists(pkgPath))) return false; let pkg; try { pkg = require(pkgPath); } catch (err) {} if (!pkg) return false; const _pkg5 = pkg, linkTypeDefinitions = _pkg5.linkTypeDefinitions, scripts = _pkg5.scripts; if (linkTypeDefinitions || pkg.linkTypeDefinitionsOptions) { spinner.warn(`project already setup with ${packageName}`); return false; } pkg.linkTypeDefinitions = []; let postinstall = `${packageName} link`; if (scripts === null || scripts === void 0 ? void 0 : (_scripts$postinstall = scripts.postinstall) === null || _scripts$postinstall === void 0 ? void 0 : _scripts$postinstall.length) { postinstall = `${scripts.postinstall} && ${postinstall}`; } pkg = _objectSpread(_objectSpread({}, pkg), {}, { scripts: _objectSpread(_objectSpread({}, pkg.scripts || {}), {}, { postinstall }), devDependencies: _objectSpread(_objectSpread({}, pkg.devDependencies || {}), {}, { [packageName]: `^${packageVersion}` }) }); if (!options.dryRun) yield _fsExtra.default.writeJson(pkgPath, pkg, { spaces: 2 }); if (options.dryRun || options.verbose) spinner.info(`updated ${pkgPath}`); if (options.install) { const npm = yield getNpm(); yield (0, _execa.default)(npm, ['install'], { stdio: 'inherit' }); } return true; }); return _setup.apply(this, arguments); } function getNpm() { return _getNpm.apply(this, arguments); } function _getNpm() { _getNpm = _asyncToGenerator(function* (npms = ['pnpm', 'yarn', 'npm', 'chipchop']) { const foundNpms = new Set(); yield Promise.all(npms.map( /*#__PURE__*/function () { var _ref3 = _asyncToGenerator(function* (npm) { const isWin = _os.default.platform().indexOf('win') > -1; const where = isWin ? 'where' : 'which'; try { const p = yield (0, _execa.default)(where, [npm]); if (!p.exitCode) foundNpms.add(npm); } catch (err) {} }); return function (_x12) { return _ref3.apply(this, arguments); }; }())); return npms.reduce((foundNpm, npm) => { if (foundNpm) return foundNpm; if (foundNpms.has(npm)) return npm; return foundNpm; }, null) || 'npm'; }); return _getNpm.apply(this, arguments); } function findDefinitionsPath(_x7) { return _findDefinitionsPath.apply(this, arguments); } function _findDefinitionsPath() { _findDefinitionsPath = _asyncToGenerator(function* (modulePath) { const definitionsPathsHashMap = (yield (0, _globby.default)(_path.default.resolve(modulePath, '**/*.d.ts?(x)'))).reduce((definitionsPathsHashMap, globPath) => { const globPathArray = globPath.split('/'); const key = (globPathArray.length - 1).toString(); const definitionsPaths = definitionsPathsHashMap[key] || []; definitionsPaths.push(globPathArray.slice(0, globPathArray.length - 1).join('/')); definitionsPathsHashMap[key] = definitionsPaths; return definitionsPathsHashMap; }, {}); const definitionsPaths = definitionsPathsHashMap[Math.min(...Object.keys(definitionsPathsHashMap).map(key => Number(key))).toString()]; if (definitionsPaths.length === 1) return definitionsPaths[0]; const defintionsPathArray = definitionsPaths[0].split('/'); return defintionsPathArray.slice(0, defintionsPathArray.length - 1).join('/'); }); return _findDefinitionsPath.apply(this, arguments); } function writeLinkedDirectives(_x8, _x9) { return _writeLinkedDirectives.apply(this, arguments); } function _writeLinkedDirectives() { _writeLinkedDirectives = _asyncToGenerator(function* (typesLocationPath, ns) { const relativeTypePathsSet = new Set((yield (0, _globby.default)(_path.default.resolve(typesLocationPath, '**/*.d.ts'))).map(typePath => { return typePath.slice(typesLocationPath.length + 1); })); relativeTypePathsSet.delete('index.d.ts'); const relativeTypePaths = [...relativeTypePathsSet]; const linkedDirectives = createLinkedDirectives(relativeTypePaths, ns); yield _fsExtra.default.mkdirs(typesLocationPath); yield _fsExtra.default.writeFile(_path.default.resolve(typesLocationPath, 'index.d.ts'), linkedDirectives); }); return _writeLinkedDirectives.apply(this, arguments); } function createLinkedDirectives(filePaths, ns = '_') { return [...filePaths.map(filePath => `/// <reference path="${filePath}" />`), `declare module '${ns}' {}`].join('\n'); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJwYWNrYWdlTmFtZSIsInBrZyIsIm5hbWUiLCJwYWNrYWdlVmVyc2lvbiIsInZlcnNpb24iLCJsaW5rVHlwZURlZmluaXRpb25zIiwicGFydGlhbE9wdGlvbnMiLCJzcGlubmVyIiwib3B0aW9ucyIsImNvcHkiLCJjd2QiLCJwcm9jZXNzIiwiZHJ5UnVuIiwibnMiLCJzYXZlIiwidW5saW5rIiwidmVyYm9zZSIsInBrZ09wdGlvbnMiLCJyZXF1aXJlIiwicGF0aCIsInJlc29sdmUiLCJsaW5rVHlwZURlZmluaXRpb25zT3B0aW9ucyIsIm1vZHVsZU5hbWUiLCJlcnIiLCJpbmZvIiwiSlNPTiIsInN0cmluZ2lmeSIsInJvb3RQYXRoIiwiaW5zdGFsbGVkRnJvbVBhdGgiLCJ0ZXN0IiwicmVwbGFjZSIsInR5cGVzTG9jYXRpb25QYXRoIiwicGtnUGF0aCIsImZzIiwicGF0aEV4aXN0cyIsImxlbmd0aCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkZXBlbmRlbmNpZXMiLCJTZXQiLCJPYmplY3QiLCJrZXlzIiwiZGV2RGVwZW5kZW5jaWVzIiwic3Vic3RyIiwiaGFzIiwic3RvcCIsImZhaWwiLCJleGl0Iiwid2FybiIsImxpbmtUeXBlRGVmaW5pdGlvbnNTZXQiLCJkZWxldGUiLCJ3cml0ZUpzb24iLCJzcGFjZXMiLCJsaW5rR2xvYiIsInNsaWNlIiwibW9kdWxlUGF0aCIsImRlZmluaXRpb25zUGF0aCIsImZpbmREZWZpbml0aW9uc1BhdGgiLCJ3cml0ZUxpbmtlZERpcmVjdGl2ZXMiLCJyb290R2xvYlBhdGgiLCJnbG9iUGF0aCIsInJlbGF0aXZlR2xvYlBhdGgiLCJpZ25vcmVQYXRocyIsInJlZHVjZSIsInNob3VsZElnbm9yZSIsImlnbm9yZVBhdGgiLCJyZW1vdmUiLCJta2RpcnMiLCJzeW1saW5rIiwic2V0dXAiLCJpbnN0YWxsIiwidHlwZXNMb2NhdGlvbiIsInNjcmlwdHMiLCJwb3N0aW5zdGFsbCIsIm5wbSIsImdldE5wbSIsInN0ZGlvIiwibnBtcyIsImZvdW5kTnBtcyIsImlzV2luIiwib3MiLCJwbGF0Zm9ybSIsImluZGV4T2YiLCJ3aGVyZSIsInAiLCJleGl0Q29kZSIsImFkZCIsImZvdW5kTnBtIiwiZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXAiLCJnbG9iUGF0aEFycmF5Iiwic3BsaXQiLCJrZXkiLCJ0b1N0cmluZyIsImRlZmluaXRpb25zUGF0aHMiLCJwdXNoIiwiam9pbiIsIk1hdGgiLCJtaW4iLCJOdW1iZXIiLCJkZWZpbnRpb25zUGF0aEFycmF5IiwicmVsYXRpdmVUeXBlUGF0aHNTZXQiLCJ0eXBlUGF0aCIsInJlbGF0aXZlVHlwZVBhdGhzIiwibGlua2VkRGlyZWN0aXZlcyIsImNyZWF0ZUxpbmtlZERpcmVjdGl2ZXMiLCJ3cml0ZUZpbGUiLCJmaWxlUGF0aHMiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLGlCQUFJQyxJQUF4QjtBQUNBLE1BQU1DLGNBQWMsR0FBR0YsaUJBQUlHLE9BQTNCOztTQTZCOEJDLG1COzs7OzsyQ0FBZixXQUNiQyxjQUFtRCxHQUFHLEVBRHpDLEVBRWJDLE9BQU8sR0FBRyxtQkFGRyxFQUdiO0FBQ0EsUUFBSUMsT0FBbUM7QUFDckNDLE1BQUFBLElBQUksRUFBRSxJQUQrQjtBQUVyQ0MsTUFBQUEsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQVIsRUFGZ0M7QUFHckNFLE1BQUFBLE1BQU0sRUFBRSxLQUg2QjtBQUlyQ0MsTUFBQUEsRUFBRSxFQUFHLElBQUdiLFdBQVksRUFKaUI7QUFLckNjLE1BQUFBLElBQUksRUFBRSxLQUwrQjtBQU1yQ0MsTUFBQUEsTUFBTSxFQUFFLEtBTjZCO0FBT3JDQyxNQUFBQSxPQUFPLEVBQUU7QUFQNEIsT0FRbENW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QURJLEVBRUp5RSxnQkFGSSxDQUFOO0FBSUQsRzs7OztBQUVNLFNBQVNDLHNCQUFULENBQWdDRSxTQUFoQyxFQUFxRDlGLEVBQUUsR0FBRyxHQUExRCxFQUF1RTtBQUM1RSxTQUFPLENBQ0wsR0FBRzhGLFNBQVMsQ0FBQ3JFLEdBQVYsQ0FDQXNFLFFBQUQsSUFBdUIsd0JBQXVCQSxRQUFTLE1BRHRELENBREUsRUFJSixtQkFBa0IvRixFQUFHLE1BSmpCLEVBS0xtRixJQUxLLENBS0EsSUFMQSxDQUFQO0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhlY2EgZnJvbSAnZXhlY2EnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBnbG9iYnkgZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCBuZXdSZWdFeHAgZnJvbSAnbmV3cmVnZXhwJztcbmltcG9ydCBvcmEsIHsgT3JhIH0gZnJvbSAnb3JhJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBwa2dEaXIgZnJvbSAncGtnLWRpcic7XG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmNvbnN0IHBhY2thZ2VOYW1lID0gcGtnLm5hbWU7XG5jb25zdCBwYWNrYWdlVmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBrZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGlua1R5cGVEZWZpbml0aW9uczogc3RyaW5nW107XG4gIGxpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zOiBQYXJ0aWFsPExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zPjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zIHtcbiAgY29weTogYm9vbGVhbjtcbiAgY3dkOiBzdHJpbmc7XG4gIGRyeVJ1bjogYm9vbGVhbjtcbiAgaWdub3JlUGF0aHM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgbnM6IHN0cmluZztcbiAgc2F2ZTogYm9vbGVhbjtcbiAgdW5saW5rOiBib29sZWFuO1xuICB2ZXJib3NlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwT3B0aW9ucyB7XG4gIGN3ZDogc3RyaW5nO1xuICBkcnlSdW46IGJvb2xlYW47XG4gIGluc3RhbGw6IGJvb2xlYW47XG4gIHR5cGVzTG9jYXRpb246IHN0cmluZztcbiAgdmVyYm9zZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gbGlua1R5cGVEZWZpbml0aW9ucyhcbiAgcGFydGlhbE9wdGlvbnM6IFBhcnRpYWw8TGlua1R5cGVEZWZpbml0aW9uc09wdGlvbnM+ID0ge30sXG4gIHNwaW5uZXIgPSBvcmEoKVxuKSB7XG4gIGxldCBvcHRpb25zOiBMaW5rVHlwZURlZmluaXRpb25zT3B0aW9ucyA9IHtcbiAgICBjb3B5OiB0cnVlLFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIG5zOiBgXyR7cGFja2FnZU5hbWV9YCxcbiAgICBzYXZlOiBmYWxzZSxcbiAgICB1bmxpbms6IGZhbHNlLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICAgIC4uLnBhcnRpYWxPcHRpb25zXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcGtnT3B0aW9ucyA9IHJlcXVpcmUocGF0aC5yZXNvbHZlKG9wdGlvbnMuY3dkLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/LmxpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zO1xuICAgIGRlbGV0ZSBwa2dPcHRpb25zLmN3ZDtcbiAgICBkZWxldGUgcGtnT3B0aW9ucy5tb2R1bGVOYW1lO1xuICAgIGRlbGV0ZSBwa2dPcHRpb25zLnNhdmU7XG4gICAgZGVsZXRlIHBrZ09wdGlvbnMudW5saW5rO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLi4ucGtnT3B0aW9ucyxcbiAgICAgIC4uLnBhcnRpYWxPcHRpb25zXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgc3Bpbm5lci5pbmZvKGBPUFRJT05TOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMsIG51bGwsIDIpfWApO1xuICB9XG4gIGNvbnN0IHJvb3RQYXRoID0gKGF3YWl0IHBrZ0RpcihvcHRpb25zLmN3ZCkpIHx8IG9wdGlvbnMuY3dkO1xuICBjb25zdCBpbnN0YWxsZWRGcm9tUGF0aCA9IC9cXC9ub2RlX21vZHVsZXNcXC8uKi9nLnRlc3Qob3B0aW9ucy5jd2QpXG4gICAgPyBvcHRpb25zLmN3ZC5yZXBsYWNlKC9cXC9ub2RlX21vZHVsZXNcXC8uKi9nLCAnJylcbiAgICA6IG51bGw7XG4gIGNvbnN0IHR5cGVzTG9jYXRpb25QYXRoID0gaW5zdGFsbGVkRnJvbVBhdGhcbiAgICA/IHBhdGgucmVzb2x2ZShpbnN0YWxsZWRGcm9tUGF0aCwgJ25vZGVfbW9kdWxlcy9AdHlwZXMnLCBvcHRpb25zLm5zKVxuICAgIDogcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAnbm9kZV9tb2R1bGVzL0B0eXBlcycsIG9wdGlvbnMubnMpO1xuICBjb25zdCBwa2dQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMocGtnUGF0aCkpKSByZXR1cm47XG4gIGxldCBwa2c6IFBrZyB8IHZvaWQ7XG4gIHRyeSB7XG4gICAgcGtnID0gcmVxdWlyZShwa2dQYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICBpZiAoIXBrZykgcmV0dXJuO1xuICBsZXQgeyBsaW5rVHlwZURlZmluaXRpb25zIH0gPSBwa2c7XG4gIGlmIChvcHRpb25zLm1vZHVsZU5hbWUpIGxpbmtUeXBlRGVmaW5pdGlvbnMgPSBbb3B0aW9ucy5tb2R1bGVOYW1lXTtcbiAgaWYgKCFsaW5rVHlwZURlZmluaXRpb25zLmxlbmd0aCkgcmV0dXJuO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBsaW5rVHlwZURlZmluaXRpb25zLm1hcChhc3luYyAobW9kdWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFxuICAgICAgICBwa2dcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMocGtnPy5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgICAgICAgICAgICAuLi5PYmplY3Qua2V5cyhwa2c/LmRldkRlcGVuZGVuY2llcyB8fCB7fSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBtb2R1bGVOYW1lLnN1YnN0cigwLCAyKSAhPT0gJy4vJyAmJlxuICAgICAgICAhZGVwZW5kZW5jaWVzLmhhcyhtb2R1bGVOYW1lKSAmJlxuICAgICAgICAhb3B0aW9ucy51bmxpbmtcbiAgICAgICkge1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVOYW1lKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICAgICAgc3Bpbm5lci5mYWlsKFxuICAgICAgICAgICAgYGNhbm5vdCBsaW5rIHVubGVzcyAnJHttb2R1bGVOYW1lfScgaXMgc2F2ZWQgaW4gZGVwZW5kZW5jaWVzIG9yIGRldkRlcGVuZGVuY2llcyBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICBgJyR7bW9kdWxlTmFtZX0nIG5vdCBzYXZlZCBpbiBkZXBlbmRlbmNpZXMgb3IgZGV2RGVwZW5kZW5jaWVzIGluIHRoZSBwYWNrYWdlLmpzb24gZmlsZWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBrZyAmJiBvcHRpb25zLnNhdmUgJiYgb3B0aW9ucy5tb2R1bGVOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICBjb25zdCBsaW5rVHlwZURlZmluaXRpb25zU2V0ID0gbmV3IFNldChbXG4gICAgICAgICAgICAuLi4ocGtnLmxpbmtUeXBlRGVmaW5pdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgLi4ubGlua1R5cGVEZWZpbml0aW9uc1xuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChvcHRpb25zLnVubGluaykgbGlua1R5cGVEZWZpbml0aW9uc1NldC5kZWxldGUob3B0aW9ucy5tb2R1bGVOYW1lKTtcbiAgICAgICAgICBwa2cubGlua1R5cGVEZWZpbml0aW9ucyA9IFsuLi5saW5rVHlwZURlZmluaXRpb25zU2V0XTtcbiAgICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24ocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4gfHwgb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgc3Bpbm5lci5pbmZvKGB1cGRhdGVkICR7cGtnUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1vZHVsZU5hbWUuc3Vic3RyKDAsIDIpID09PSAnLi8nKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRGcm9tUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGxpbmtHbG9iKFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCBtb2R1bGVOYW1lKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlc0xvY2F0aW9uUGF0aCxcbiAgICAgICAgICAgIHBhdGhcbiAgICAgICAgICAgICAgLnJlc29sdmUoLi4uKHBrZyA/IFtwa2c/Lm5hbWVdIDogW10pLCBtb2R1bGVOYW1lKVxuICAgICAgICAgICAgICAuc2xpY2UocHJvY2Vzcy5jd2QoKS5sZW5ndGggKyAxKSxcbiAgICAgICAgICAgIHNwaW5uZXJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbnN0YWxsZWRGcm9tUGF0aCkge1xuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCAnbm9kZV9tb2R1bGVzJywgbW9kdWxlTmFtZSk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb25zUGF0aCA9IGF3YWl0IGZpbmREZWZpbml0aW9uc1BhdGgobW9kdWxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGxpbmtHbG9iKFxuICAgICAgICAgIGRlZmluaXRpb25zUGF0aCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHR5cGVzTG9jYXRpb25QYXRoLFxuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgc3Bpbm5lclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG4gIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICBhd2FpdCB3cml0ZUxpbmtlZERpcmVjdGl2ZXModHlwZXNMb2NhdGlvblBhdGgsIG9wdGlvbnMubnMpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rR2xvYihcbiAgcm9vdEdsb2JQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpbmtUeXBlRGVmaW5pdGlvbnNPcHRpb25zLFxuICB0eXBlc0xvY2F0aW9uUGF0aDogc3RyaW5nLFxuICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gIHNwaW5uZXI6IE9yYVxuKSB7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIChhd2FpdCBnbG9iYnkocGF0aC5yZXNvbHZlKHJvb3RHbG9iUGF0aCwgJyoqLyouZC50cz8oeCknKSkpLm1hcChcbiAgICAgIGFzeW5jIChnbG9iUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlR2xvYlBhdGggPSBnbG9iUGF0aC5zbGljZShyb290R2xvYlBhdGgubGVuZ3RoICsgMSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob3B0aW9ucy5pZ25vcmVQYXRocyB8fCBbXSkucmVkdWNlKFxuICAgICAgICAgICAgKHNob3VsZElnbm9yZTogYm9vbGVhbiwgaWdub3JlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUpIHJldHVybiBzaG91bGRJZ25vcmU7XG4gICAgICAgICAgICAgIGlmIChuZXdSZWdFeHAoaWdub3JlUGF0aCkudGVzdChnbG9iUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkSWdub3JlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5yZW1vdmUoXG4gICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgbW9kdWxlTmFtZSwgcmVsYXRpdmVHbG9iUGF0aClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmRyeVJ1biB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbChcbiAgICAgICAgICAgICAgYCR7cGF0aC5yZXNvbHZlKHR5cGVzTG9jYXRpb25QYXRoLCBtb2R1bGVOYW1lLCByZWxhdGl2ZUdsb2JQYXRoKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgYXdhaXQgZnMucmVtb3ZlKFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKHR5cGVzTG9jYXRpb25QYXRoLCBtb2R1bGVOYW1lLCByZWxhdGl2ZUdsb2JQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudW5saW5rKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgc3Bpbm5lci5mYWlsKFxuICAgICAgICAgICAgICBgJHtwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUsIHJlbGF0aXZlR2xvYlBhdGgpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlycyhwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUpKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvcHkpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZnMuY29weShcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUocm9vdEdsb2JQYXRoLCByZWxhdGl2ZUdsb2JQYXRoKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUodHlwZXNMb2NhdGlvblBhdGgsIG1vZHVsZU5hbWUsIHJlbGF0aXZlR2xvYlBhdGgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBmcy5zeW1saW5rKFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShyb290R2xvYlBhdGgsIHJlbGF0aXZlR2xvYlBhdGgpLFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgbW9kdWxlTmFtZSwgcmVsYXRpdmVHbG9iUGF0aCksXG4gICAgICAgICAgICAgICAgJ2ZpbGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmRyeVJ1biB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIHNwaW5uZXIuaW5mbyhcbiAgICAgICAgICAgICAgYCR7cGF0aC5yZXNvbHZlKHJvb3RHbG9iUGF0aCwgcmVsYXRpdmVHbG9iUGF0aCl9ICR7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb3B5ID8gJz0+JyA6ICctPidcbiAgICAgICAgICAgICAgfSAke3BhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICB0eXBlc0xvY2F0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlR2xvYlBhdGhcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBwYXJ0aWFsT3B0aW9uczogUGFydGlhbDxTZXR1cE9wdGlvbnM+LFxuICBzcGlubmVyID0gb3JhKClcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgb3B0aW9uczogU2V0dXBPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBkcnlSdW46IGZhbHNlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgdHlwZXNMb2NhdGlvbjogJycsXG4gICAgdmVyYm9zZTogZmFsc2UsXG4gICAgLi4ucGFydGlhbE9wdGlvbnNcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa2dPcHRpb25zID0gcmVxdWlyZShwYXRoLnJlc29sdmUob3B0aW9ucy5jd2QsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8ubGlua1R5cGVEZWZpbml0aW9uc09wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAuLi5wa2dPcHRpb25zLFxuICAgICAgLi4ucGFydGlhbE9wdGlvbnNcbiAgICB9O1xuICB9IGNhdGNoIChlcnIpIHt9XG4gIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICBzcGlubmVyLmluZm8oYE9QVElPTlM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMil9YCk7XG4gIH1cbiAgY29uc3Qgcm9vdFBhdGggPSAoYXdhaXQgcGtnRGlyKHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCkpKSB8fCBvcHRpb25zLmN3ZDtcbiAgY29uc3QgcGtnUGF0aCA9IHBhdGgucmVzb2x2ZShyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKHBrZ1BhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgcGtnOiBQa2cgfCB2b2lkO1xuICB0cnkge1xuICAgIHBrZyA9IHJlcXVpcmUocGtnUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge31cbiAgaWYgKCFwa2cpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeyBsaW5rVHlwZURlZmluaXRpb25zLCBzY3JpcHRzIH0gPSBwa2c7XG4gIGlmIChsaW5rVHlwZURlZmluaXRpb25zIHx8IHBrZy5saW5rVHlwZURlZmluaXRpb25zT3B0aW9ucykge1xuICAgIHNwaW5uZXIud2FybihgcHJvamVjdCBhbHJlYWR5IHNldHVwIHdpdGggJHtwYWNrYWdlTmFtZX1gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcGtnLmxpbmtUeXBlRGVmaW5pdGlvbnMgPSBbXTtcbiAgbGV0IHBvc3RpbnN0YWxsID0gYCR7cGFja2FnZU5hbWV9IGxpbmtgO1xuICBpZiAoc2NyaXB0cz8ucG9zdGluc3RhbGw/Lmxlbmd0aCkge1xuICAgIHBvc3RpbnN0YWxsID0gYCR7c2NyaXB0cy5wb3N0aW5zdGFsbH0gJiYgJHtwb3N0aW5zdGFsbH1gO1xuICB9XG4gIHBrZyA9IHtcbiAgICAuLi5wa2csXG4gICAgc2NyaXB0czoge1xuICAgICAgLi4uKHBrZy5zY3JpcHRzIHx8IHt9KSxcbiAgICAgIHBvc3RpbnN0YWxsXG4gICAgfSxcbiAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgIC4uLihwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9KSxcbiAgICAgIFtwYWNrYWdlTmFtZV06IGBeJHtwYWNrYWdlVmVyc2lvbn1gXG4gICAgfVxuICB9O1xuICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSBhd2FpdCBmcy53cml0ZUpzb24ocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuIHx8IG9wdGlvbnMudmVyYm9zZSkgc3Bpbm5lci5pbmZvKGB1cGRhdGVkICR7cGtnUGF0aH1gKTtcbiAgaWYgKG9wdGlvbnMuaW5zdGFsbCkge1xuICAgIGNvbnN0IG5wbSA9IGF3YWl0IGdldE5wbSgpO1xuICAgIGF3YWl0IGV4ZWNhKG5wbSwgWydpbnN0YWxsJ10sIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TnBtKFxuICBucG1zID0gWydwbnBtJywgJ3lhcm4nLCAnbnBtJywgJ2NoaXBjaG9wJ11cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZvdW5kTnBtczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIG5wbXMubWFwKGFzeW5jIChucG06IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaXNXaW4gPSBvcy5wbGF0Zm9ybSgpLmluZGV4T2YoJ3dpbicpID4gLTE7XG4gICAgICBjb25zdCB3aGVyZSA9IGlzV2luID8gJ3doZXJlJyA6ICd3aGljaCc7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwID0gYXdhaXQgZXhlY2Eod2hlcmUsIFtucG1dKTtcbiAgICAgICAgaWYgKCFwLmV4aXRDb2RlKSBmb3VuZE5wbXMuYWRkKG5wbSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIChcbiAgICBucG1zLnJlZHVjZSgoZm91bmROcG06IHN0cmluZyB8IG51bGwsIG5wbTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZm91bmROcG0pIHJldHVybiBmb3VuZE5wbTtcbiAgICAgIGlmIChmb3VuZE5wbXMuaGFzKG5wbSkpIHJldHVybiBucG07XG4gICAgICByZXR1cm4gZm91bmROcG07XG4gICAgfSwgbnVsbCkgfHwgJ25wbSdcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZWZpbml0aW9uc1BhdGgobW9kdWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXAgPSAoXG4gICAgYXdhaXQgZ2xvYmJ5KHBhdGgucmVzb2x2ZShtb2R1bGVQYXRoLCAnKiovKi5kLnRzPyh4KScpKVxuICApLnJlZHVjZShcbiAgICAoZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXA6IERlZmluaXRpb25zUGF0aEhhc2hNYXAsIGdsb2JQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXRoQXJyYXkgPSBnbG9iUGF0aC5zcGxpdCgnLycpO1xuICAgICAgY29uc3Qga2V5ID0gKGdsb2JQYXRoQXJyYXkubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25zUGF0aHMgPSBkZWZpbml0aW9uc1BhdGhzSGFzaE1hcFtrZXldIHx8IFtdO1xuICAgICAgZGVmaW5pdGlvbnNQYXRocy5wdXNoKFxuICAgICAgICBnbG9iUGF0aEFycmF5LnNsaWNlKDAsIGdsb2JQYXRoQXJyYXkubGVuZ3RoIC0gMSkuam9pbignLycpXG4gICAgICApO1xuICAgICAgZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXBba2V5XSA9IGRlZmluaXRpb25zUGF0aHM7XG4gICAgICByZXR1cm4gZGVmaW5pdGlvbnNQYXRoc0hhc2hNYXA7XG4gICAgfSxcbiAgICB7fVxuICApO1xuICBjb25zdCBkZWZpbml0aW9uc1BhdGhzID1cbiAgICBkZWZpbml0aW9uc1BhdGhzSGFzaE1hcFtcbiAgICAgIE1hdGgubWluKFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhkZWZpbml0aW9uc1BhdGhzSGFzaE1hcCkubWFwKChrZXk6IHN0cmluZykgPT5cbiAgICAgICAgICBOdW1iZXIoa2V5KVxuICAgICAgICApXG4gICAgICApLnRvU3RyaW5nKClcbiAgICBdO1xuICBpZiAoZGVmaW5pdGlvbnNQYXRocy5sZW5ndGggPT09IDEpIHJldHVybiBkZWZpbml0aW9uc1BhdGhzWzBdO1xuICBjb25zdCBkZWZpbnRpb25zUGF0aEFycmF5ID0gZGVmaW5pdGlvbnNQYXRoc1swXS5zcGxpdCgnLycpO1xuICByZXR1cm4gZGVmaW50aW9uc1BhdGhBcnJheS5zbGljZSgwLCBkZWZpbnRpb25zUGF0aEFycmF5Lmxlbmd0aCAtIDEpLmpvaW4oJy8nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlTGlua2VkRGlyZWN0aXZlcyhcbiAgdHlwZXNMb2NhdGlvblBhdGg6IHN0cmluZyxcbiAgbnM6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHJlbGF0aXZlVHlwZVBhdGhzU2V0ID0gbmV3IFNldChcbiAgICAoYXdhaXQgZ2xvYmJ5KHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgJyoqLyouZC50cycpKSkubWFwKFxuICAgICAgKHR5cGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVQYXRoLnNsaWNlKHR5cGVzTG9jYXRpb25QYXRoLmxlbmd0aCArIDEpO1xuICAgICAgfVxuICAgIClcbiAgKTtcbiAgcmVsYXRpdmVUeXBlUGF0aHNTZXQuZGVsZXRlKCdpbmRleC5kLnRzJyk7XG4gIGNvbnN0IHJlbGF0aXZlVHlwZVBhdGhzID0gWy4uLnJlbGF0aXZlVHlwZVBhdGhzU2V0XTtcbiAgY29uc3QgbGlua2VkRGlyZWN0aXZlcyA9IGNyZWF0ZUxpbmtlZERpcmVjdGl2ZXMocmVsYXRpdmVUeXBlUGF0aHMsIG5zKTtcbiAgYXdhaXQgZnMubWtkaXJzKHR5cGVzTG9jYXRpb25QYXRoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIHBhdGgucmVzb2x2ZSh0eXBlc0xvY2F0aW9uUGF0aCwgJ2luZGV4LmQudHMnKSxcbiAgICBsaW5rZWREaXJlY3RpdmVzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rZWREaXJlY3RpdmVzKGZpbGVQYXRoczogc3RyaW5nW10sIG5zID0gJ18nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5maWxlUGF0aHMubWFwKFxuICAgICAgKGZpbGVQYXRoOiBzdHJpbmcpID0+IGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtmaWxlUGF0aH1cIiAvPmBcbiAgICApLFxuICAgIGBkZWNsYXJlIG1vZHVsZSAnJHtuc30nIHt9YFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG5pbnRlcmZhY2UgRGVmaW5pdGlvbnNQYXRoSGFzaE1hcCB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xufVxuIl19