electron-forge
Version:
A complete tool for building modern Electron applications
416 lines (309 loc) • 29.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _bluebird = require('bluebird');
require('colors');
var _debug = require('debug');
var _debug2 = _interopRequireDefault(_debug);
var _nodeFetch = require('node-fetch');
var _nodeFetch2 = _interopRequireDefault(_nodeFetch);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _inquirer = require('inquirer');
var _inquirer2 = _interopRequireDefault(_inquirer);
var _nugget = require('nugget');
var _nugget2 = _interopRequireDefault(_nugget);
var _os = require('os');
var _os2 = _interopRequireDefault(_os);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _pify = require('pify');
var _pify2 = _interopRequireDefault(_pify);
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
var _oraHandler = require('../util/ora-handler');
var _oraHandler2 = _interopRequireDefault(_oraHandler);
var _messages = require('../util/messages');
var _dmg = require('../installers/darwin/dmg');
var _dmg2 = _interopRequireDefault(_dmg);
var _zip = require('../installers/darwin/zip');
var _zip2 = _interopRequireDefault(_zip);
var _deb = require('../installers/linux/deb');
var _deb2 = _interopRequireDefault(_deb);
var _rpm = require('../installers/linux/rpm');
var _rpm2 = _interopRequireDefault(_rpm);
var _exe = require('../installers/win32/exe');
var _exe2 = _interopRequireDefault(_exe);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var d = (0, _debug2.default)('electron-forge:install');
var GITHUB_API = 'https://api.github.com';
/**
* @typedef {Object} InstallOptions
* @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually
* @property {boolean} [prerelease=false] Whether to install prerelease versions
* @property {string} repo The GitHub repository to install from, in the format owner/name
* @property {function} chooseAsset A function that must return the asset to use/install from a provided array of compatible GitHub assets
*/
/**
* Install an Electron application from GitHub. If you leave interactive as `false`, you MUST provide a `chooseAsset` function.
*
* @param {InstallOptions} providedOptions - Options for the install method
* @return {Promise} Will resolve when the install 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, interactive, prerelease, repo, chooseAsset, latestRelease, possibleAssets, targetAsset, choices, _ref3, assetID, tmpdir, pathSafeRepo, filename, fullFilePath, nuggetOpts;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
// eslint-disable-next-line prefer-const, no-unused-vars
_Object$assign = (0, _assign2.default)({
interactive: false,
prerelease: false
}, providedOptions), interactive = _Object$assign.interactive, prerelease = _Object$assign.prerelease, repo = _Object$assign.repo, chooseAsset = _Object$assign.chooseAsset;
_oraHandler2.default.interactive = interactive;
latestRelease = void 0;
possibleAssets = [];
_context3.next = 6;
return (0, _oraHandler2.default)('Searching for Application', function () {
var _ref2 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(searchSpinner) {
var releases, sortedReleases, assets, installTargets;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(!repo || repo.indexOf('/') === -1)) {
_context.next = 2;
break;
}
throw 'Invalid repository name, must be in the format owner/name';
case 2:
d('searching for repo:', repo);
releases = void 0;
_context.prev = 4;
_context.next = 7;
return (0, _nodeFetch2.default)(GITHUB_API + '/repos/' + repo + '/releases');
case 7:
_context.next = 9;
return _context.sent.json();
case 9:
releases = _context.sent;
_context.next = 14;
break;
case 12:
_context.prev = 12;
_context.t0 = _context['catch'](4);
case 14:
if (!(!releases || releases.message === 'Not Found' || !Array.isArray(releases))) {
_context.next = 16;
break;
}
throw 'Failed to find releases for repository "' + repo + '". Please check the name and try again.';
case 16:
releases = releases.filter(function (release) {
return !release.prerelease || prerelease;
});
sortedReleases = releases.sort(function (releaseA, releaseB) {
var tagA = releaseA.tag_name;
if (tagA.substr(0, 1) === 'v') tagA = tagA.substr(1);
var tagB = releaseB.tag_name;
if (tagB.substr(0, 1) === 'v') tagB = tagB.substr(1);
return _semver2.default.gt(tagB, tagA) ? 1 : -1;
});
latestRelease = sortedReleases[0];
searchSpinner.text = 'Searching for Releases'; // eslint-disable-line
assets = latestRelease.assets;
if (!(!assets || !Array.isArray(assets))) {
_context.next = 23;
break;
}
throw 'Could not find any assets for the latest release';
case 23:
installTargets = {
win32: [/\.exe$/],
darwin: [/OSX.*\.zip$/, /darwin.*\.zip$/, /macOS.*\.zip$/, /mac.*\.zip$/, /\.dmg$/],
linux: [/\.rpm$/, /\.deb$/]
};
possibleAssets = assets.filter(function (asset) {
var targetSuffixes = installTargets[process.platform];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(targetSuffixes), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var suffix = _step.value;
if (suffix.test(asset.name)) return true;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return false;
});
if (!(possibleAssets.length === 0)) {
_context.next = 27;
break;
}
throw 'Failed to find any installable assets for target platform: ' + ('' + process.platform).cyan;
case 27:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[4, 12]]);
}));
return function (_x2) {
return _ref2.apply(this, arguments);
};
}());
case 6:
(0, _messages.info)(interactive, 'Found latest release' + (prerelease ? ' (including prereleases)' : '') + ': ' + latestRelease.tag_name.cyan);
targetAsset = possibleAssets[0];
if (!(possibleAssets.length > 1)) {
_context3.next = 26;
break;
}
if (!chooseAsset) {
_context3.next = 15;
break;
}
_context3.next = 12;
return _promise2.default.resolve(chooseAsset(possibleAssets));
case 12:
targetAsset = _context3.sent;
_context3.next = 26;
break;
case 15:
if (!interactive) {
_context3.next = 25;
break;
}
choices = [];
possibleAssets.forEach(function (asset) {
choices.push({ name: asset.name, value: asset.id });
});
_context3.next = 20;
return _inquirer2.default.createPromptModule()({
type: 'list',
name: 'assetID',
message: 'Multiple potential assets found, please choose one from the list below:'.cyan,
choices: choices
});
case 20:
_ref3 = _context3.sent;
assetID = _ref3.assetID;
targetAsset = possibleAssets.find(function (asset) {
return asset.id === assetID;
});
_context3.next = 26;
break;
case 25:
throw 'expected a chooseAsset function to be provided but it was not';
case 26:
tmpdir = _path2.default.resolve(_os2.default.tmpdir(), 'forge-install');
pathSafeRepo = repo.replace(/[/\\]/g, '-');
filename = pathSafeRepo + '-' + latestRelease.tag_name + '-' + targetAsset.name;
fullFilePath = _path2.default.resolve(tmpdir, filename);
_context3.next = 32;
return _fsExtra2.default.pathExists(fullFilePath);
case 32:
_context3.t0 = !_context3.sent;
if (_context3.t0) {
_context3.next = 39;
break;
}
_context3.next = 36;
return _fsExtra2.default.stat(fullFilePath);
case 36:
_context3.t1 = _context3.sent.size;
_context3.t2 = targetAsset.size;
_context3.t0 = _context3.t1 !== _context3.t2;
case 39:
if (!_context3.t0) {
_context3.next = 45;
break;
}
_context3.next = 42;
return _fsExtra2.default.mkdirs(tmpdir);
case 42:
nuggetOpts = {
target: filename,
dir: tmpdir,
resume: true,
strictSSL: true
};
_context3.next = 45;
return (0, _pify2.default)(_nugget2.default)(targetAsset.browser_download_url, nuggetOpts);
case 45:
_context3.next = 47;
return (0, _oraHandler2.default)('Installing Application', function () {
var _ref4 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(installSpinner) {
var installActions, suffixFnIdent;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
installActions = {
win32: {
'.exe': _exe2.default
},
darwin: {
'.zip': _zip2.default,
'.dmg': _dmg2.default
},
linux: {
'.deb': _deb2.default,
'.rpm': _rpm2.default
}
};
suffixFnIdent = (0, _keys2.default)(installActions[process.platform]).find(function (suffix) {
return targetAsset.name.endsWith(suffix);
});
_context2.next = 4;
return installActions[process.platform][suffixFnIdent](fullFilePath, installSpinner);
case 4:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined);
}));
return function (_x3) {
return _ref4.apply(this, arguments);
};
}());
case 47:
case 'end':
return _context3.stop();
}
}
}, _callee3, undefined);
}));
return function () {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9pbnN0YWxsLmpzIl0sIm5hbWVzIjpbImQiLCJHSVRIVUJfQVBJIiwicHJvdmlkZWRPcHRpb25zIiwiaW50ZXJhY3RpdmUiLCJwcmVyZWxlYXNlIiwicmVwbyIsImNob29zZUFzc2V0IiwibGF0ZXN0UmVsZWFzZSIsInBvc3NpYmxlQXNzZXRzIiwic2VhcmNoU3Bpbm5lciIsImluZGV4T2YiLCJyZWxlYXNlcyIsImpzb24iLCJtZXNzYWdlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIiwicmVsZWFzZSIsInNvcnRlZFJlbGVhc2VzIiwic29ydCIsInJlbGVhc2VBIiwicmVsZWFzZUIiLCJ0YWdBIiwidGFnX25hbWUiLCJzdWJzdHIiLCJ0YWdCIiwiZ3QiLCJ0ZXh0IiwiYXNzZXRzIiwiaW5zdGFsbFRhcmdldHMiLCJ3aW4zMiIsImRhcndpbiIsImxpbnV4IiwiYXNzZXQiLCJ0YXJnZXRTdWZmaXhlcyIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN1ZmZpeCIsInRlc3QiLCJuYW1lIiwibGVuZ3RoIiwiY3lhbiIsInRhcmdldEFzc2V0IiwicmVzb2x2ZSIsImNob2ljZXMiLCJmb3JFYWNoIiwicHVzaCIsInZhbHVlIiwiaWQiLCJjcmVhdGVQcm9tcHRNb2R1bGUiLCJ0eXBlIiwiYXNzZXRJRCIsImZpbmQiLCJ0bXBkaXIiLCJwYXRoU2FmZVJlcG8iLCJyZXBsYWNlIiwiZmlsZW5hbWUiLCJmdWxsRmlsZVBhdGgiLCJwYXRoRXhpc3RzIiwic3RhdCIsInNpemUiLCJta2RpcnMiLCJudWdnZXRPcHRzIiwidGFyZ2V0IiwiZGlyIiwicmVzdW1lIiwic3RyaWN0U1NMIiwiYnJvd3Nlcl9kb3dubG9hZF91cmwiLCJpbnN0YWxsU3Bpbm5lciIsImluc3RhbGxBY3Rpb25zIiwic3VmZml4Rm5JZGVudCIsImVuZHNXaXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7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bnRlbnQiOlsiaW1wb3J0ICdjb2xvcnMnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInO1xuaW1wb3J0IG51Z2dldCBmcm9tICdudWdnZXQnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHBpZnkgZnJvbSAncGlmeSc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCBhc3luY09yYSBmcm9tICcuLi91dGlsL29yYS1oYW5kbGVyJztcbmltcG9ydCB7IGluZm8gfSBmcm9tICcuLi91dGlsL21lc3NhZ2VzJztcblxuaW1wb3J0IGRhcndpbkRNR0luc3RhbGxlciBmcm9tICcuLi9pbnN0YWxsZXJzL2Rhcndpbi9kbWcnO1xuaW1wb3J0IGRhcndpblppcEluc3RhbGxlciBmcm9tICcuLi9pbnN0YWxsZXJzL2Rhcndpbi96aXAnO1xuaW1wb3J0IGxpbnV4RGViSW5zdGFsbGVyIGZyb20gJy4uL2luc3RhbGxlcnMvbGludXgvZGViJztcbmltcG9ydCBsaW51eFJQTUluc3RhbGxlciBmcm9tICcuLi9pbnN0YWxsZXJzL2xpbnV4L3JwbSc7XG5pbXBvcnQgd2luMzJFeGVJbnN0YWxsZXIgZnJvbSAnLi4vaW5zdGFsbGVycy93aW4zMi9leGUnO1xuXG5jb25zdCBkID0gZGVidWcoJ2VsZWN0cm9uLWZvcmdlOmluc3RhbGwnKTtcblxuY29uc3QgR0lUSFVCX0FQSSA9ICdodHRwczovL2FwaS5naXRodWIuY29tJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW50ZXJhY3RpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHNlbnNpYmxlIGRlZmF1bHRzIG9yIHByb21wdCB0aGUgdXNlciB2aXN1YWxseVxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJlcmVsZWFzZT1mYWxzZV0gV2hldGhlciB0byBpbnN0YWxsIHByZXJlbGVhc2UgdmVyc2lvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXBvIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSB0byBpbnN0YWxsIGZyb20sIGluIHRoZSBmb3JtYXQgb3duZXIvbmFtZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gY2hvb3NlQXNzZXQgQSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIHRoZSBhc3NldCB0byB1c2UvaW5zdGFsbCBmcm9tIGEgcHJvdmlkZWQgYXJyYXkgb2YgY29tcGF0aWJsZSBHaXRIdWIgYXNzZXRzXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxsIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uIGZyb20gR2l0SHViLiBJZiB5b3UgbGVhdmUgaW50ZXJhY3RpdmUgYXMgYGZhbHNlYCwgeW91IE1VU1QgcHJvdmlkZSBhIGBjaG9vc2VBc3NldGAgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJbnN0YWxsT3B0aW9uc30gcHJvdmlkZWRPcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGluc3RhbGwgbWV0aG9kXG4gKiBAcmV0dXJuIHtQcm9taXNlfSBXaWxsIHJlc29sdmUgd2hlbiB0aGUgaW5zdGFsbCBwcm9jZXNzIGlzIGNvbXBsZXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChwcm92aWRlZE9wdGlvbnMgPSB7fSkgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0LCBuby11bnVzZWQtdmFyc1xuICBsZXQgeyBpbnRlcmFjdGl2ZSwgcHJlcmVsZWFzZSwgcmVwbywgY2hvb3NlQXNzZXQgfSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgICBwcmVyZWxlYXNlOiBmYWxzZSxcbiAgfSwgcHJvdmlkZWRPcHRpb25zKTtcbiAgYXN5bmNPcmEuaW50ZXJhY3RpdmUgPSBpbnRlcmFjdGl2ZTtcblxuICBsZXQgbGF0ZXN0UmVsZWFzZTtcbiAgbGV0IHBvc3NpYmxlQXNzZXRzID0gW107XG5cbiAgYXdhaXQgYXN5bmNPcmEoJ1NlYXJjaGluZyBmb3IgQXBwbGljYXRpb24nLCBhc3luYyAoc2VhcmNoU3Bpbm5lcikgPT4ge1xuICAgIGlmICghcmVwbyB8fCByZXBvLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgIHRocm93ICdJbnZhbGlkIHJlcG9zaXRvcnkgbmFtZSwgbXVzdCBiZSBpbiB0aGUgZm9ybWF0IG93bmVyL25hbWUnO1xuICAgIH1cblxuICAgIGQoJ3NlYXJjaGluZyBmb3IgcmVwbzonLCByZXBvKTtcbiAgICBsZXQgcmVsZWFzZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlbGVhc2VzID0gYXdhaXQgKGF3YWl0IGZldGNoKGAke0dJVEhVQl9BUEl9L3JlcG9zLyR7cmVwb30vcmVsZWFzZXNgKSkuanNvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gSWdub3JlIGVycm9yXG4gICAgfVxuXG4gICAgaWYgKCFyZWxlYXNlcyB8fCByZWxlYXNlcy5tZXNzYWdlID09PSAnTm90IEZvdW5kJyB8fCAhQXJyYXkuaXNBcnJheShyZWxlYXNlcykpIHtcbiAgICAgIHRocm93IGBGYWlsZWQgdG8gZmluZCByZWxlYXNlcyBmb3IgcmVwb3NpdG9yeSBcIiR7cmVwb31cIi4gIFBsZWFzZSBjaGVjayB0aGUgbmFtZSBhbmQgdHJ5IGFnYWluLmA7XG4gICAgfVxuXG4gICAgcmVsZWFzZXMgPSByZWxlYXNlcy5maWx0ZXIocmVsZWFzZSA9PiAhcmVsZWFzZS5wcmVyZWxlYXNlIHx8IHByZXJlbGVhc2UpO1xuXG4gICAgY29uc3Qgc29ydGVkUmVsZWFzZXMgPSByZWxlYXNlcy5zb3J0KChyZWxlYXNlQSwgcmVsZWFzZUIpID0+IHtcbiAgICAgIGxldCB0YWdBID0gcmVsZWFzZUEudGFnX25hbWU7XG4gICAgICBpZiAodGFnQS5zdWJzdHIoMCwgMSkgPT09ICd2JykgdGFnQSA9IHRhZ0Euc3Vic3RyKDEpO1xuICAgICAgbGV0IHRhZ0IgPSByZWxlYXNlQi50YWdfbmFtZTtcbiAgICAgIGlmICh0YWdCLnN1YnN0cigwLCAxKSA9PT0gJ3YnKSB0YWdCID0gdGFnQi5zdWJzdHIoMSk7XG4gICAgICByZXR1cm4gKHNlbXZlci5ndCh0YWdCLCB0YWdBKSA/IDEgOiAtMSk7XG4gICAgfSk7XG4gICAgbGF0ZXN0UmVsZWFzZSA9IHNvcnRlZFJlbGVhc2VzWzBdO1xuXG4gICAgc2VhcmNoU3Bpbm5lci50ZXh0ID0gJ1NlYXJjaGluZyBmb3IgUmVsZWFzZXMnOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBjb25zdCBhc3NldHMgPSBsYXRlc3RSZWxlYXNlLmFzc2V0cztcbiAgICBpZiAoIWFzc2V0cyB8fCAhQXJyYXkuaXNBcnJheShhc3NldHMpKSB7XG4gICAgICB0aHJvdyAnQ291bGQgbm90IGZpbmQgYW55IGFzc2V0cyBmb3IgdGhlIGxhdGVzdCByZWxlYXNlJztcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YWxsVGFyZ2V0cyA9IHtcbiAgICAgIHdpbjMyOiBbL1xcLmV4ZSQvXSxcbiAgICAgIGRhcndpbjogWy9PU1guKlxcLnppcCQvLCAvZGFyd2luLipcXC56aXAkLywgL21hY09TLipcXC56aXAkLywgL21hYy4qXFwuemlwJC8sIC9cXC5kbWckL10sXG4gICAgICBsaW51eDogWy9cXC5ycG0kLywgL1xcLmRlYiQvXSxcbiAgICB9O1xuXG4gICAgcG9zc2libGVBc3NldHMgPSBhc3NldHMuZmlsdGVyKChhc3NldCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0U3VmZml4ZXMgPSBpbnN0YWxsVGFyZ2V0c1twcm9jZXNzLnBsYXRmb3JtXTtcbiAgICAgIGZvciAoY29uc3Qgc3VmZml4IG9mIHRhcmdldFN1ZmZpeGVzKSB7XG4gICAgICAgIGlmIChzdWZmaXgudGVzdChhc3NldC5uYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpZiAocG9zc2libGVBc3NldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBgRmFpbGVkIHRvIGZpbmQgYW55IGluc3RhbGxhYmxlIGFzc2V0cyBmb3IgdGFyZ2V0IHBsYXRmb3JtOiAke2Ake3Byb2Nlc3MucGxhdGZvcm19YC5jeWFufWA7XG4gICAgfVxuICB9KTtcblxuICBpbmZvKGludGVyYWN0aXZlLCBgRm91bmQgbGF0ZXN0IHJlbGVhc2Uke3ByZXJlbGVhc2UgPyAnIChpbmNsdWRpbmcgcHJlcmVsZWFzZXMpJyA6ICcnfTogJHtsYXRlc3RSZWxlYXNlLnRhZ19uYW1lLmN5YW59YCk7XG5cbiAgbGV0IHRhcmdldEFzc2V0ID0gcG9zc2libGVBc3NldHNbMF07XG4gIGlmIChwb3NzaWJsZUFzc2V0cy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKGNob29zZUFzc2V0KSB7XG4gICAgICB0YXJnZXRBc3NldCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShjaG9vc2VBc3NldChwb3NzaWJsZUFzc2V0cykpO1xuICAgIH0gZWxzZSBpZiAoaW50ZXJhY3RpdmUpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBbXTtcbiAgICAgIHBvc3NpYmxlQXNzZXRzLmZvckVhY2goKGFzc2V0KSA9PiB7XG4gICAgICAgIGNob2ljZXMucHVzaCh7IG5hbWU6IGFzc2V0Lm5hbWUsIHZhbHVlOiBhc3NldC5pZCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBhc3NldElEIH0gPSBhd2FpdCBpbnF1aXJlci5jcmVhdGVQcm9tcHRNb2R1bGUoKSh7XG4gICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgbmFtZTogJ2Fzc2V0SUQnLFxuICAgICAgICBtZXNzYWdlOiAnTXVsdGlwbGUgcG90ZW50aWFsIGFzc2V0cyBmb3VuZCwgcGxlYXNlIGNob29zZSBvbmUgZnJvbSB0aGUgbGlzdCBiZWxvdzonLmN5YW4sXG4gICAgICAgIGNob2ljZXMsXG4gICAgICB9KTtcblxuICAgICAgdGFyZ2V0QXNzZXQgPSBwb3NzaWJsZUFzc2V0cy5maW5kKGFzc2V0ID0+IGFzc2V0LmlkID09PSBhc3NldElEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgJ2V4cGVjdGVkIGEgY2hvb3NlQXNzZXQgZnVuY3Rpb24gdG8gYmUgcHJvdmlkZWQgYnV0IGl0IHdhcyBub3QnO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRtcGRpciA9IHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2ZvcmdlLWluc3RhbGwnKTtcbiAgY29uc3QgcGF0aFNhZmVSZXBvID0gcmVwby5yZXBsYWNlKC9bL1xcXFxdL2csICctJyk7XG4gIGNvbnN0IGZpbGVuYW1lID0gYCR7cGF0aFNhZmVSZXBvfS0ke2xhdGVzdFJlbGVhc2UudGFnX25hbWV9LSR7dGFyZ2V0QXNzZXQubmFtZX1gO1xuXG4gIGNvbnN0IGZ1bGxGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBkaXIsIGZpbGVuYW1lKTtcbiAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGZ1bGxGaWxlUGF0aCkgfHwgKGF3YWl0IGZzLnN0YXQoZnVsbEZpbGVQYXRoKSkuc2l6ZSAhPT0gdGFyZ2V0QXNzZXQuc2l6ZSkge1xuICAgIGF3YWl0IGZzLm1rZGlycyh0bXBkaXIpO1xuXG4gICAgY29uc3QgbnVnZ2V0T3B0cyA9IHtcbiAgICAgIHRhcmdldDogZmlsZW5hbWUsXG4gICAgICBkaXI6IHRtcGRpcixcbiAgICAgIHJlc3VtZTogdHJ1ZSxcbiAgICAgIHN0cmljdFNTTDogdHJ1ZSxcbiAgICB9O1xuICAgIGF3YWl0IHBpZnkobnVnZ2V0KSh0YXJnZXRBc3NldC5icm93c2VyX2Rvd25sb2FkX3VybCwgbnVnZ2V0T3B0cyk7XG4gIH1cblxuICBhd2FpdCBhc3luY09yYSgnSW5zdGFsbGluZyBBcHBsaWNhdGlvbicsIGFzeW5jIChpbnN0YWxsU3Bpbm5lcikgPT4ge1xuICAgIGNvbnN0IGluc3RhbGxBY3Rpb25zID0ge1xuICAgICAgd2luMzI6IHtcbiAgICAgICAgJy5leGUnOiB3aW4zMkV4ZUluc3RhbGxlcixcbiAgICAgIH0sXG4gICAgICBkYXJ3aW46IHtcbiAgICAgICAgJy56aXAnOiBkYXJ3aW5aaXBJbnN0YWxsZXIsXG4gICAgICAgICcuZG1nJzogZGFyd2luRE1HSW5zdGFsbGVyLFxuICAgICAgfSxcbiAgICAgIGxpbnV4OiB7XG4gICAgICAgICcuZGViJzogbGludXhEZWJJbnN0YWxsZXIsXG4gICAgICAgICcucnBtJzogbGludXhSUE1JbnN0YWxsZXIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBzdWZmaXhGbklkZW50ID0gT2JqZWN0LmtleXMoaW5zdGFsbEFjdGlvbnNbcHJvY2Vzcy5wbGF0Zm9ybV0pLmZpbmQoc3VmZml4ID0+IHRhcmdldEFzc2V0Lm5hbWUuZW5kc1dpdGgoc3VmZml4KSk7XG4gICAgYXdhaXQgaW5zdGFsbEFjdGlvbnNbcHJvY2Vzcy5wbGF0Zm9ybV1bc3VmZml4Rm5JZGVudF0oZnVsbEZpbGVQYXRoLCBpbnN0YWxsU3Bpbm5lcik7XG4gIH0pO1xufTtcbiJdfQ==