UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

529 lines (401 loc) 34.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _bluebird = require('bluebird'); require('colors'); var _fsExtra = require('fs-extra'); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _oraHandler = require('../util/ora-handler'); var _oraHandler2 = _interopRequireDefault(_oraHandler); var _electronHostArch = require('../util/electron-host-arch'); var _electronHostArch2 = _interopRequireDefault(_electronHostArch); var _forgeConfig = require('../util/forge-config'); var _forgeConfig2 = _interopRequireDefault(_forgeConfig); var _hook = require('../util/hook'); var _hook2 = _interopRequireDefault(_hook); var _messages = require('../util/messages'); var _readPackageJson = require('../util/read-package-json'); var _readPackageJson2 = _interopRequireDefault(_readPackageJson); var _requireSearch = require('../util/require-search'); var _resolveDir = require('../util/resolve-dir'); var _resolveDir2 = _interopRequireDefault(_resolveDir); var _package = require('./package'); var _package2 = _interopRequireDefault(_package); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @typedef {Object} MakeOptions * @property {string} [dir=process.cwd()] The path to the app from which distributables are generated * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step * @property {Array<string>} [overrideTargets] An array of make targets to override your forge config * @property {string} [arch=host architecture] The target architecture * @property {string} [platform=process.platform] The target platform. * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables */ /** * Make distributables for an Electron application. * * @param {MakeOptions} providedOptions - Options for the make method * @return {Promise} Will resolve when the make process is complete */ exports.default = function () { var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3() { var providedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _Object$assign, dir, interactive, skipPackage, overrideTargets, arch, platform, outDir, forgeConfig, makers, targets, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, target, maker, declaredArch, targetArchs, packageJSON, appName, outputs, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _loop, _iterator2, _step2, result; return _regenerator2.default.wrap(function _callee3$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: // eslint-disable-next-line prefer-const, no-unused-vars _Object$assign = (0, _assign2.default)({ dir: process.cwd(), interactive: false, skipPackage: false, arch: (0, _electronHostArch2.default)(), platform: process.platform }, providedOptions), dir = _Object$assign.dir, interactive = _Object$assign.interactive, skipPackage = _Object$assign.skipPackage, overrideTargets = _Object$assign.overrideTargets, arch = _Object$assign.arch, platform = _Object$assign.platform; outDir = providedOptions.outDir || _path2.default.resolve(dir, 'out'); _oraHandler2.default.interactive = interactive; forgeConfig = void 0; _context5.next = 6; return (0, _oraHandler2.default)('Resolving Forge Config', (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee() { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _resolveDir2.default)(dir); case 2: dir = _context.sent; if (dir) { _context.next = 5; break; } throw 'Failed to locate makeable Electron application'; case 5: _context.next = 7; return (0, _forgeConfig2.default)(dir); case 7: forgeConfig = _context.sent; case 8: case 'end': return _context.stop(); } } }, _callee, undefined); }))); case 6: if (['darwin', 'win32', 'linux'].includes(platform)) { _context5.next = 8; break; } throw new Error('\'' + platform + '\' is an invalid platform. Choices are \'darwin\', \'win32\' or \'linux\''); case 8: makers = {}; targets = overrideTargets || forgeConfig.make_targets[platform]; _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context5.prev = 13; _iterator = (0, _getIterator3.default)(targets); case 15: if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { _context5.next = 30; break; } target = _step.value; maker = (0, _requireSearch.requireSearchRaw)(__dirname, ['../makers/' + platform + '/' + target + '.js', '../makers/generic/' + target + '.js', 'electron-forge-maker-' + target, target, _path2.default.resolve(dir, target), _path2.default.resolve(dir, 'node_modules', target)]); if (maker) { _context5.next = 20; break; } throw new Error(['Could not find a build target with the name: ', target + ' for the platform: ' + platform].join('')); case 20: if (maker.isSupportedOnCurrentPlatform) { _context5.next = 22; break; } throw new Error(['Maker for target ' + target + ' is incompatible with this version of ', 'electron-forge, please upgrade or contact the maintainer ', '(needs to implement \'isSupportedOnCurrentPlatform)\')'].join('')); case 22: _context5.next = 24; return maker.isSupportedOnCurrentPlatform(); case 24: if (_context5.sent) { _context5.next = 26; break; } throw new Error(['Cannot build for ' + platform + ' target ' + target + ': the maker declared ', 'that it cannot run on ' + process.platform].join('')); case 26: makers[target] = maker.default || maker; case 27: _iteratorNormalCompletion = true; _context5.next = 15; break; case 30: _context5.next = 36; break; case 32: _context5.prev = 32; _context5.t0 = _context5['catch'](13); _didIteratorError = true; _iteratorError = _context5.t0; case 36: _context5.prev = 36; _context5.prev = 37; if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } case 39: _context5.prev = 39; if (!_didIteratorError) { _context5.next = 42; break; } throw _iteratorError; case 42: return _context5.finish(39); case 43: return _context5.finish(36); case 44: if (skipPackage) { _context5.next = 50; break; } (0, _messages.info)(interactive, 'We need to package your application before we can make it'.green); _context5.next = 48; return (0, _package2.default)({ dir: dir, interactive: interactive, arch: arch, platform: platform, outDir: outDir }); case 48: _context5.next = 51; break; case 50: (0, _messages.warn)(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red); case 51: declaredArch = arch; (0, _messages.info)(interactive, 'Making for the following targets:', ('' + targets.join(', ')).cyan); targetArchs = [declaredArch]; if (!(declaredArch === 'all')) { _context5.next = 64; break; } _context5.t1 = platform; _context5.next = _context5.t1 === 'darwin' ? 58 : _context5.t1 === 'linux' ? 60 : _context5.t1 === 'win32' ? 62 : 62; break; case 58: targetArchs = ['x64']; return _context5.abrupt('break', 64); case 60: targetArchs = ['ia32', 'x64', 'armv7l']; return _context5.abrupt('break', 64); case 62: targetArchs = ['ia32', 'x64']; return _context5.abrupt('break', 64); case 64: _context5.next = 66; return (0, _readPackageJson2.default)(dir); case 66: packageJSON = _context5.sent; appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name; outputs = []; _context5.next = 71; return (0, _hook2.default)(forgeConfig, 'preMake'); case 71: _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; _context5.prev = 74; _loop = _regenerator2.default.mark(function _loop() { var targetArch, packageDir, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop2, _iterator3, _step3; return _regenerator2.default.wrap(function _loop$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: targetArch = _step2.value; packageDir = _path2.default.resolve(outDir, appName + '-' + platform + '-' + targetArch); _context4.next = 4; return _fsExtra2.default.pathExists(packageDir); case 4: if (_context4.sent) { _context4.next = 6; break; } throw new Error('Couldn\'t find packaged app at: ' + packageDir); case 6: _iteratorNormalCompletion3 = true; _didIteratorError3 = false; _iteratorError3 = undefined; _context4.prev = 9; _loop2 = _regenerator2.default.mark(function _loop2() { var target, maker; return _regenerator2.default.wrap(function _loop2$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: target = _step3.value; maker = makers[target]; // eslint-disable-next-line no-loop-func _context3.next = 4; return (0, _oraHandler2.default)('Making for target: ' + target.cyan + ' - On platform: ' + platform.cyan + ' - For arch: ' + targetArch.cyan, (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2() { return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.t0 = outputs; _context2.next = 4; return maker({ dir: packageDir, appName: appName, targetPlatform: platform, targetArch: targetArch, forgeConfig: forgeConfig, packageJSON: packageJSON }); case 4: _context2.t1 = _context2.sent; _context2.t0.push.call(_context2.t0, _context2.t1); _context2.next = 15; break; case 8: _context2.prev = 8; _context2.t2 = _context2['catch'](0); if (!_context2.t2) { _context2.next = 14; break; } throw { message: 'An error occured while making for target: ' + target, stack: _context2.t2.message + '\n' + _context2.t2.stack }; case 14: throw new Error('An unknown error occured while making for target: ' + target); case 15: case 'end': return _context2.stop(); } } }, _callee2, undefined, [[0, 8]]); }))); case 4: case 'end': return _context3.stop(); } } }, _loop2, undefined); }); _iterator3 = (0, _getIterator3.default)(targets); case 12: if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) { _context4.next = 17; break; } return _context4.delegateYield(_loop2(), 't0', 14); case 14: _iteratorNormalCompletion3 = true; _context4.next = 12; break; case 17: _context4.next = 23; break; case 19: _context4.prev = 19; _context4.t1 = _context4['catch'](9); _didIteratorError3 = true; _iteratorError3 = _context4.t1; case 23: _context4.prev = 23; _context4.prev = 24; if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } case 26: _context4.prev = 26; if (!_didIteratorError3) { _context4.next = 29; break; } throw _iteratorError3; case 29: return _context4.finish(26); case 30: return _context4.finish(23); case 31: case 'end': return _context4.stop(); } } }, _loop, undefined, [[9, 19, 23, 31], [24,, 26, 30]]); }); _iterator2 = (0, _getIterator3.default)(targetArchs); case 77: if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) { _context5.next = 82; break; } return _context5.delegateYield(_loop(), 't2', 79); case 79: _iteratorNormalCompletion2 = true; _context5.next = 77; break; case 82: _context5.next = 88; break; case 84: _context5.prev = 84; _context5.t3 = _context5['catch'](74); _didIteratorError2 = true; _iteratorError2 = _context5.t3; case 88: _context5.prev = 88; _context5.prev = 89; if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } case 91: _context5.prev = 91; if (!_didIteratorError2) { _context5.next = 94; break; } throw _iteratorError2; case 94: return _context5.finish(91); case 95: return _context5.finish(88); case 96: _context5.next = 98; return (0, _hook2.default)(forgeConfig, 'postMake', outputs); case 98: result = _context5.sent; // If the postMake hooks modifies the locations / names of the outputs it must return // the new locations so that the publish step knows where to look if (Array.isArray(result)) { outputs = result; } return _context5.abrupt('return', outputs); case 101: case 'end': return _context5.stop(); } } }, _callee3, undefined, [[13, 32, 36, 44], [37,, 39, 43], [74, 84, 88, 96], [89,, 91, 95]]); })); return function () { return _ref.apply(this, arguments); }; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9tYWtlLmpzIl0sIm5hbWVzIjpbInByb3ZpZGVkT3B0aW9ucyIsImRpciIsInByb2Nlc3MiLCJjd2QiLCJpbnRlcmFjdGl2ZSIsInNraXBQYWNrYWdlIiwiYXJjaCIsInBsYXRmb3JtIiwib3ZlcnJpZGVUYXJnZXRzIiwib3V0RGlyIiwicmVzb2x2ZSIsImZvcmdlQ29uZmlnIiwiaW5jbHVkZXMiLCJFcnJvciIsIm1ha2VycyIsInRhcmdldHMiLCJtYWtlX3RhcmdldHMiLCJ0YXJnZXQiLCJtYWtlciIsIl9fZGlybmFtZSIsImpvaW4iLCJpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtIiwiZGVmYXVsdCIsImdyZWVuIiwicmVkIiwiZGVjbGFyZWRBcmNoIiwiY3lhbiIsInRhcmdldEFyY2hzIiwicGFja2FnZUpTT04iLCJhcHBOYW1lIiwiZWxlY3Ryb25QYWNrYWdlckNvbmZpZyIsIm5hbWUiLCJwcm9kdWN0TmFtZSIsIm91dHB1dHMiLCJ0YXJnZXRBcmNoIiwicGFja2FnZURpciIsInBhdGhFeGlzdHMiLCJ0YXJnZXRQbGF0Zm9ybSIsInB1c2giLCJtZXNzYWdlIiwic3RhY2siLCJyZXN1bHQiLCJBcnJheSIsImlzQXJyYXkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUVBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7QUFXQTs7Ozs7OztpRUFNZTtBQUFBLFFBQU9BLGVBQVAsdUVBQXlCLEVBQXpCOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2I7QUFEYSw2QkFFNEQsc0JBQWM7QUFDckZDLG1CQUFLQyxRQUFRQyxHQUFSLEVBRGdGO0FBRXJGQywyQkFBYSxLQUZ3RTtBQUdyRkMsMkJBQWEsS0FId0U7QUFJckZDLG9CQUFNLGlDQUorRTtBQUtyRkMsd0JBQVVMLFFBQVFLO0FB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsOERBOEdVRixPQTlHVjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvREF3R1lZLFdBeEdaOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsbUJBMElRLG9CQUFRaEIsV0FBUixFQUFxQixVQUFyQixFQUFpQ3NCLE9BQWpDLENBMUlSOztBQUFBO0FBMElQUSxrQkExSU87O0FBMkliO0FBQ0E7QUFDQSxnQkFBSUMsTUFBTUMsT0FBTixDQUFjRixNQUFkLENBQUosRUFBMkI7QUFDekJSLHdCQUFVUSxNQUFWO0FBQ0Q7O0FBL0lZLDhDQWlKTlIsT0FqSk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRyIsImZpbGUiOiJhcGkvbWFrZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnY29sb3JzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IGFzeW5jT3JhIGZyb20gJy4uL3V0aWwvb3JhLWhhbmRsZXInO1xuaW1wb3J0IGVsZWN0cm9uSG9zdEFyY2ggZnJvbSAnLi4vdXRpbC9lbGVjdHJvbi1ob3N0LWFyY2gnO1xuaW1wb3J0IGdldEZvcmdlQ29uZmlnIGZyb20gJy4uL3V0aWwvZm9yZ2UtY29uZmlnJztcbmltcG9ydCBydW5Ib29rIGZyb20gJy4uL3V0aWwvaG9vayc7XG5pbXBvcnQgeyBpbmZvLCB3YXJuIH0gZnJvbSAnLi4vdXRpbC9tZXNzYWdlcyc7XG5pbXBvcnQgcmVhZFBhY2thZ2VKU09OIGZyb20gJy4uL3V0aWwvcmVhZC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHsgcmVxdWlyZVNlYXJjaFJhdyB9IGZyb20gJy4uL3V0aWwvcmVxdWlyZS1zZWFyY2gnO1xuaW1wb3J0IHJlc29sdmVEaXIgZnJvbSAnLi4vdXRpbC9yZXNvbHZlLWRpcic7XG5cbmltcG9ydCBwYWNrYWdlciBmcm9tICcuL3BhY2thZ2UnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ha2VPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpcj1wcm9jZXNzLmN3ZCgpXSBUaGUgcGF0aCB0byB0aGUgYXBwIGZyb20gd2hpY2ggZGlzdHJpYnV0YWJsZXMgYXJlIGdlbmVyYXRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW50ZXJhY3RpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHNlbnNpYmxlIGRlZmF1bHRzIG9yIHByb21wdCB0aGUgdXNlciB2aXN1YWxseVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFBhY2thZ2U9ZmFsc2VdIFdoZXRoZXIgdG8gc2tpcCB0aGUgcHJlLW1ha2UgcGFja2FnaW5nIHN0ZXBcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gW292ZXJyaWRlVGFyZ2V0c10gQW4gYXJyYXkgb2YgbWFrZSB0YXJnZXRzIHRvIG92ZXJyaWRlIHlvdXIgZm9yZ2UgY29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FyY2g9aG9zdCBhcmNoaXRlY3R1cmVdIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BsYXRmb3JtPXByb2Nlc3MucGxhdGZvcm1dIFRoZSB0YXJnZXQgcGxhdGZvcm0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW291dERpcj1gJHtkaXJ9L291dGBdIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBnZW5lcmF0ZWQgZGlzdHJpYnV0YWJsZXNcbiAqL1xuXG4vKipcbiAqIE1ha2UgZGlzdHJpYnV0YWJsZXMgZm9yIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7TWFrZU9wdGlvbnN9IHByb3ZpZGVkT3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBtYWtlIG1ldGhvZFxuICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIHdoZW4gdGhlIG1ha2UgcHJvY2VzcyBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyAocHJvdmlkZWRPcHRpb25zID0ge30pID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCwgbm8tdW51c2VkLXZhcnNcbiAgbGV0IHsgZGlyLCBpbnRlcmFjdGl2ZSwgc2tpcFBhY2thZ2UsIG92ZXJyaWRlVGFyZ2V0cywgYXJjaCwgcGxhdGZvcm0gfSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGRpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgc2tpcFBhY2thZ2U6IGZhbHNlLFxuICAgIGFyY2g6IGVsZWN0cm9uSG9zdEFyY2goKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgfSwgcHJvdmlkZWRPcHRpb25zKTtcblxuICBjb25zdCBvdXREaXIgPSBwcm92aWRlZE9wdGlvbnMub3V0RGlyIHx8IHBhdGgucmVzb2x2ZShkaXIsICdvdXQnKTtcbiAgYXN5bmNPcmEuaW50ZXJhY3RpdmUgPSBpbnRlcmFjdGl2ZTtcblxuICBsZXQgZm9yZ2VDb25maWc7XG4gIGF3YWl0IGFzeW5jT3JhKCdSZXNvbHZpbmcgRm9yZ2UgQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGRpciA9IGF3YWl0IHJlc29sdmVEaXIoZGlyKTtcbiAgICBpZiAoIWRpcikge1xuICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBsb2NhdGUgbWFrZWFibGUgRWxlY3Ryb24gYXBwbGljYXRpb24nO1xuICAgIH1cblxuICAgIGZvcmdlQ29uZmlnID0gYXdhaXQgZ2V0Rm9yZ2VDb25maWcoZGlyKTtcbiAgfSk7XG5cbiAgaWYgKCFbJ2RhcndpbicsICd3aW4zMicsICdsaW51eCddLmluY2x1ZGVzKHBsYXRmb3JtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7cGxhdGZvcm19JyBpcyBhbiBpbnZhbGlkIHBsYXRmb3JtLiBDaG9pY2VzIGFyZSAnZGFyd2luJywgJ3dpbjMyJyBvciAnbGludXgnYCk7XG4gIH1cblxuICBjb25zdCBtYWtlcnMgPSB7fTtcbiAgY29uc3QgdGFyZ2V0cyA9IG92ZXJyaWRlVGFyZ2V0cyB8fCBmb3JnZUNvbmZpZy5tYWtlX3RhcmdldHNbcGxhdGZvcm1dO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBtYWtlciA9IHJlcXVpcmVTZWFyY2hSYXcoX19kaXJuYW1lLCBbXG4gICAgICBgLi4vbWFrZXJzLyR7cGxhdGZvcm19LyR7dGFyZ2V0fS5qc2AsXG4gICAgICBgLi4vbWFrZXJzL2dlbmVyaWMvJHt0YXJnZXR9LmpzYCxcbiAgICAgIGBlbGVjdHJvbi1mb3JnZS1tYWtlci0ke3RhcmdldH1gLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGF0aC5yZXNvbHZlKGRpciwgdGFyZ2V0KSxcbiAgICAgIHBhdGgucmVzb2x2ZShkaXIsICdub2RlX21vZHVsZXMnLCB0YXJnZXQpLFxuICAgIF0pO1xuXG4gICAgaWYgKCFtYWtlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGEgYnVpbGQgdGFyZ2V0IHdpdGggdGhlIG5hbWU6ICcsXG4gICAgICAgIGAke3RhcmdldH0gZm9yIHRoZSBwbGF0Zm9ybTogJHtwbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgTWFrZXIgZm9yIHRhcmdldCAke3RhcmdldH0gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIGAsXG4gICAgICAgICdlbGVjdHJvbi1mb3JnZSwgcGxlYXNlIHVwZ3JhZGUgb3IgY29udGFjdCB0aGUgbWFpbnRhaW5lciAnLFxuICAgICAgICAnKG5lZWRzIHRvIGltcGxlbWVudCBcXCdpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKVxcJyknLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBDYW5ub3QgYnVpbGQgZm9yICR7cGxhdGZvcm19IHRhcmdldCAke3RhcmdldH06IHRoZSBtYWtlciBkZWNsYXJlZCBgLFxuICAgICAgICBgdGhhdCBpdCBjYW5ub3QgcnVuIG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgbWFrZXJzW3RhcmdldF0gPSBtYWtlci5kZWZhdWx0IHx8IG1ha2VyO1xuICB9XG5cbiAgaWYgKCFza2lwUGFja2FnZSkge1xuICAgIGluZm8oaW50ZXJhY3RpdmUsICdXZSBuZWVkIHRvIHBhY2thZ2UgeW91ciBhcHBsaWNhdGlvbiBiZWZvcmUgd2UgY2FuIG1ha2UgaXQnLmdyZWVuKTtcbiAgICBhd2FpdCBwYWNrYWdlcih7XG4gICAgICBkaXIsXG4gICAgICBpbnRlcmFjdGl2ZSxcbiAgICAgIGFyY2gsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIG91dERpcixcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuKGludGVyYWN0aXZlLCAnV0FSTklORzogU2tpcHBpbmcgdGhlIHBhY2thZ2luZyBzdGVwLCB0aGlzIGNvdWxkIHJlc3VsdCBpbiBhbiBvdXQgb2YgZGF0ZSBidWlsZCcucmVkKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmVkQXJjaCA9IGFyY2g7XG5cbiAgaW5mbyhpbnRlcmFjdGl2ZSwgJ01ha2luZyBmb3IgdGhlIGZvbGxvd2luZyB0YXJnZXRzOicsIGAke3RhcmdldHMuam9pbignLCAnKX1gLmN5YW4pO1xuXG4gIGxldCB0YXJnZXRBcmNocyA9IFtkZWNsYXJlZEFyY2hdO1xuICBpZiAoZGVjbGFyZWRBcmNoID09PSAnYWxsJykge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2Rhcndpbic6XG4gICAgICAgIHRhcmdldEFyY2hzID0gWyd4NjQnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsaW51eCc6XG4gICAgICAgIHRhcmdldEFyY2hzID0gWydpYTMyJywgJ3g2NCcsICdhcm12N2wnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aW4zMic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0YXJnZXRBcmNocyA9IFsnaWEzMicsICd4NjQnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFja2FnZUpTT04gPSBhd2FpdCByZWFkUGFja2FnZUpTT04oZGlyKTtcbiAgY29uc3QgYXBwTmFtZSA9IGZvcmdlQ29uZmlnLmVsZWN0cm9uUGFja2FnZXJDb25maWcubmFtZSB8fCBwYWNrYWdlSlNPTi5wcm9kdWN0TmFtZSB8fCBwYWNrYWdlSlNPTi5uYW1lO1xuICBsZXQgb3V0cHV0cyA9IFtdO1xuXG4gIGF3YWl0IHJ1bkhvb2soZm9yZ2VDb25maWcsICdwcmVNYWtlJyk7XG5cbiAgZm9yIChjb25zdCB0YXJnZXRBcmNoIG9mIHRhcmdldEFyY2hzKSB7XG4gICAgY29uc3QgcGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShvdXREaXIsIGAke2FwcE5hbWV9LSR7cGxhdGZvcm19LSR7dGFyZ2V0QXJjaH1gKTtcbiAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKHBhY2thZ2VEaXIpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHBhY2thZ2VkIGFwcCBhdDogJHtwYWNrYWdlRGlyfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IG1ha2VyID0gbWFrZXJzW3RhcmdldF07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIGF3YWl0IGFzeW5jT3JhKGBNYWtpbmcgZm9yIHRhcmdldDogJHt0YXJnZXQuY3lhbn0gLSBPbiBwbGF0Zm9ybTogJHtwbGF0Zm9ybS5jeWFufSAtIEZvciBhcmNoOiAke3RhcmdldEFyY2guY3lhbn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKGF3YWl0IG1ha2VyKHtcbiAgICAgICAgICAgIGRpcjogcGFja2FnZURpcixcbiAgICAgICAgICAgIGFwcE5hbWUsXG4gICAgICAgICAgICB0YXJnZXRQbGF0Zm9ybTogcGxhdGZvcm0sXG4gICAgICAgICAgICB0YXJnZXRBcmNoLFxuICAgICAgICAgICAgZm9yZ2VDb25maWcsXG4gICAgICAgICAgICBwYWNrYWdlSlNPTixcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbWFraW5nIGZvciB0YXJnZXQ6ICR7dGFyZ2V0fWAsXG4gICAgICAgICAgICAgIHN0YWNrOiBgJHtlcnIubWVzc2FnZX1cXG4ke2Vyci5zdGFja31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiB1bmtub3duIGVycm9yIG9jY3VyZWQgd2hpbGUgbWFraW5nIGZvciB0YXJnZXQ6ICR7dGFyZ2V0fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuSG9vayhmb3JnZUNvbmZpZywgJ3Bvc3RNYWtlJywgb3V0cHV0cyk7XG4gIC8vIElmIHRoZSBwb3N0TWFrZSBob29rcyBtb2RpZmllcyB0aGUgbG9jYXRpb25zIC8gbmFtZXMgb2YgdGhlIG91dHB1dHMgaXQgbXVzdCByZXR1cm5cbiAgLy8gdGhlIG5ldyBsb2NhdGlvbnMgc28gdGhhdCB0aGUgcHVibGlzaCBzdGVwIGtub3dzIHdoZXJlIHRvIGxvb2tcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgIG91dHB1dHMgPSByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0cztcbn07XG4iXX0=