electron-forge
Version:
A complete tool for building modern Electron applications
430 lines (334 loc) • 20.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _from = require('babel-runtime/core-js/array/from');
var _from2 = _interopRequireDefault(_from);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _bluebird = require('bluebird');
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _crypto = require('crypto');
var _crypto2 = _interopRequireDefault(_crypto);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var EXTENSION = '.forge.publish';
var PublishState = function () {
(0, _createClass3.default)(PublishState, null, [{
key: 'loadFromDirectory',
value: function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(directory) {
var _this = this;
var publishes, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step;
return _regenerator2.default.wrap(function _callee$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return _fsExtra2.default.exists(directory);
case 2:
if (_context2.sent) {
_context2.next = 4;
break;
}
throw new Error('Attempted to load publish state from a missing directory: ' + directory);
case 4:
publishes = [];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context2.prev = 8;
_loop = _regenerator2.default.mark(function _loop() {
var dirName, subDir, states, filePaths, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, filePath, state;
return _regenerator2.default.wrap(function _loop$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
dirName = _step.value;
subDir = _path2.default.resolve(directory, dirName);
states = [];
_context.next = 5;
return _fsExtra2.default.stat(subDir);
case 5:
if (!_context.sent.isDirectory()) {
_context.next = 39;
break;
}
_context.next = 8;
return _fsExtra2.default.readdir(subDir);
case 8:
_context.t0 = function (fileName) {
return fileName.endsWith(EXTENSION);
};
_context.t1 = function (fileName) {
return _path2.default.resolve(subDir, fileName);
};
filePaths = _context.sent.filter(_context.t0).map(_context.t1);
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context.prev = 14;
_iterator2 = (0, _getIterator3.default)(filePaths);
case 16:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context.next = 25;
break;
}
filePath = _step2.value;
state = new PublishState(filePath);
_context.next = 21;
return state.load();
case 21:
states.push(state);
case 22:
_iteratorNormalCompletion2 = true;
_context.next = 16;
break;
case 25:
_context.next = 31;
break;
case 27:
_context.prev = 27;
_context.t2 = _context['catch'](14);
_didIteratorError2 = true;
_iteratorError2 = _context.t2;
case 31:
_context.prev = 31;
_context.prev = 32;
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
case 34:
_context.prev = 34;
if (!_didIteratorError2) {
_context.next = 37;
break;
}
throw _iteratorError2;
case 37:
return _context.finish(34);
case 38:
return _context.finish(31);
case 39:
publishes.push(states);
case 40:
case 'end':
return _context.stop();
}
}
}, _loop, _this, [[14, 27, 31, 39], [32,, 34, 38]]);
});
_context2.t0 = _getIterator3.default;
_context2.next = 13;
return _fsExtra2.default.readdir(directory);
case 13:
_context2.t1 = _context2.sent;
_iterator = (0, _context2.t0)(_context2.t1);
case 15:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context2.next = 20;
break;
}
return _context2.delegateYield(_loop(), 't2', 17);
case 17:
_iteratorNormalCompletion = true;
_context2.next = 15;
break;
case 20:
_context2.next = 26;
break;
case 22:
_context2.prev = 22;
_context2.t3 = _context2['catch'](8);
_didIteratorError = true;
_iteratorError = _context2.t3;
case 26:
_context2.prev = 26;
_context2.prev = 27;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 29:
_context2.prev = 29;
if (!_didIteratorError) {
_context2.next = 32;
break;
}
throw _iteratorError;
case 32:
return _context2.finish(29);
case 33:
return _context2.finish(26);
case 34:
return _context2.abrupt('return', publishes);
case 35:
case 'end':
return _context2.stop();
}
}
}, _callee, this, [[8, 22, 26, 34], [27,, 29, 33]]);
}));
function loadFromDirectory(_x) {
return _ref.apply(this, arguments);
}
return loadFromDirectory;
}()
}, {
key: 'saveToDirectory',
value: function () {
var _ref2 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(directory, artifacts) {
var id, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, artifact, state;
return _regenerator2.default.wrap(function _callee2$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
id = _crypto2.default.createHash('md5').update((0, _stringify2.default)(artifacts)).digest('hex');
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context3.prev = 4;
_iterator3 = (0, _getIterator3.default)(artifacts);
case 6:
if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {
_context3.next = 15;
break;
}
artifact = _step3.value;
state = new PublishState(_path2.default.resolve(directory, id, 'null'), '', false);
state.setState({
paths: (0, _from2.default)(artifact),
platform: artifact.platform,
arch: artifact.arch,
packageJSON: artifact.packageJSON,
forgeConfig: artifact.forgeConfig
});
_context3.next = 12;
return state.saveToDisk();
case 12:
_iteratorNormalCompletion3 = true;
_context3.next = 6;
break;
case 15:
_context3.next = 21;
break;
case 17:
_context3.prev = 17;
_context3.t0 = _context3['catch'](4);
_didIteratorError3 = true;
_iteratorError3 = _context3.t0;
case 21:
_context3.prev = 21;
_context3.prev = 22;
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
case 24:
_context3.prev = 24;
if (!_didIteratorError3) {
_context3.next = 27;
break;
}
throw _iteratorError3;
case 27:
return _context3.finish(24);
case 28:
return _context3.finish(21);
case 29:
case 'end':
return _context3.stop();
}
}
}, _callee2, this, [[4, 17, 21, 29], [22,, 24, 28]]);
}));
function saveToDirectory(_x2, _x3) {
return _ref2.apply(this, arguments);
}
return saveToDirectory;
}()
}]);
function PublishState(filePath) {
var hasHash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
(0, _classCallCheck3.default)(this, PublishState);
this.dir = _path2.default.dirname(filePath);
this.path = filePath;
this.hasHash = hasHash;
}
(0, _createClass3.default)(PublishState, [{
key: 'generateHash',
value: function generateHash() {
var content = (0, _stringify2.default)(this.state || {});
return _crypto2.default.createHash('md5').update(content).digest('hex');
}
}, {
key: 'setState',
value: function setState(state) {
this.state = state;
}
}, {
key: 'load',
value: function () {
var _ref3 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3() {
return _regenerator2.default.wrap(function _callee3$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _fsExtra2.default.readJson(this.path);
case 2:
this.state = _context4.sent;
case 3:
case 'end':
return _context4.stop();
}
}
}, _callee3, this);
}));
function load() {
return _ref3.apply(this, arguments);
}
return load;
}()
}, {
key: 'saveToDisk',
value: function () {
var _ref4 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee4() {
return _regenerator2.default.wrap(function _callee4$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
if (!this.hasHash) {
this.path = _path2.default.resolve(this.dir, '' + this.generateHash() + EXTENSION);
this.hasHash = true;
}
_context5.next = 3;
return _fsExtra2.default.mkdirs(_path2.default.dirname(this.path));
case 3:
_context5.next = 5;
return _fsExtra2.default.writeJson(this.path, this.state);
case 5:
case 'end':
return _context5.stop();
}
}
}, _callee4, this);
}));
function saveToDisk() {
return _ref4.apply(this, arguments);
}
return saveToDisk;
}()
}]);
return PublishState;
}();
exports.default = PublishState;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWwvcHVibGlzaC1zdGF0ZS5qcyJdLCJuYW1lcyI6WyJFWFRFTlNJT04iLCJQdWJsaXNoU3RhdGUiLCJkaXJlY3RvcnkiLCJleGlzdHMiLCJFcnJvciIsInB1Ymxpc2hlcyIsImRpck5hbWUiLCJzdWJEaXIiLCJyZXNvbHZlIiwic3RhdGVzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwicmVhZGRpciIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJmaWxlUGF0aHMiLCJmaWx0ZXIiLCJtYXAiLCJmaWxlUGF0aCIsInN0YXRlIiwibG9hZCIsInB1c2giLCJhcnRpZmFjdHMiLCJpZCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJhcnRpZmFjdCIsInNldFN0YXRlIiwicGF0aHMiLCJwbGF0Zm9ybSIsImFyY2giLCJwYWNrYWdlSlNPTiIsImZvcmdlQ29uZmlnIiwic2F2ZVRvRGlzayIsImhhc0hhc2giLCJkaXIiLCJkaXJuYW1lIiwicGF0aCIsImNvbnRlbnQiLCJyZWFkSnNvbiIsImdlbmVyYXRlSGFzaCIsIm1rZGlycyIsIndyaXRlSnNvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLFlBQVksZ0JBQWxCOztJQUVxQkMsWTs7OztzRkFDWUMsUzs7Ozs7Ozs7Ozt1QkFDbEIsa0JBQUdDLE1BQUgsQ0FBVUQsU0FBVixDOzs7Ozs7OztzQkFDSCxJQUFJRSxLQUFKLGdFQUF1RUYsU0FBdkUsQzs7O0FBR0ZHLHlCLEdBQVksRTs7Ozs7Ozs7Ozs7O0FBQ1BDLGlDO0FBQ0hDLGdDLEdBQVMsZUFBS0MsT0FBTCxDQUFhTixTQUFiLEVBQXdCSSxPQUF4QixDO0FBQ1RHLGdDLEdBQVMsRTs7aUNBQ0osa0JBQUdDLElBQUgsQ0FBUUgsTUFBUixDOzs7NkNBQWlCSSxXOzs7Ozs7aUNBQ0Qsa0JBQUdDLE9BQUgsQ0FBV0wsTUFBWCxDOzs7d0NBQ2Y7QUFBQSxtQ0FBWU0sU0FBU0MsUUFBVCxDQUFrQmQsU0FBbEIsQ0FBWjtBQUFBLDJCOzt3Q0FDSDtBQUFBLG1DQUFZLGVBQUtRLE9BQUwsQ0FBYUQsTUFBYixFQUFxQk0sUUFBckIsQ0FBWjtBQUFBLDJCOztBQUZERSxtQyxpQkFDSEMsTSxjQUNBQyxHOzs7OztrRUFFb0JGLFM7Ozs7Ozs7O0FBQVpHLGtDO0FBQ0hDLCtCLEdBQVEsSUFBSWxCLFlBQUosQ0FBaUJpQixRQUFqQixDOztpQ0FDUkMsTUFBTUMsSUFBTixFOzs7QUFDTlgsaUNBQU9ZLElBQVAsQ0FBWUYsS0FBWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0pkLG9DQUFVZ0IsSUFBVixDQUFlWixNQUFmOzs7Ozs7Ozs7Ozt1QkFkMEIsa0JBQUdHLE9BQUgsQ0FBV1YsU0FBWCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0RBZ0JyQkcsUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3RkFHb0JILFMsRUFBV29CLFM7Ozs7Ozs7QUFDaENDLGtCLEdBQUssaUJBQU9DLFVBQVAsQ0FBa0IsS0FBbEIsRUFBeUJDLE1BQXpCLENBQWdDLHlCQUFlSCxTQUFmLENBQWhDLEVBQTJESSxNQUEzRCxDQUFrRSxLQUFsRSxDOzs7Ozt3REFDWUosUzs7Ozs7Ozs7QUFBWkssd0I7QUFDSFIscUIsR0FBUSxJQUFJbEIsWUFBSixDQUFpQixlQUFLTyxPQUFMLENBQWFOLFNBQWIsRUFBd0JxQixFQUF4QixFQUE0QixNQUE1QixDQUFqQixFQUFzRCxFQUF0RCxFQUEwRCxLQUExRCxDOztBQUNkSixzQkFBTVMsUUFBTixDQUFlO0FBQ2JDLHlCQUFPLG9CQUFXRixRQUFYLENBRE07QUFFYkcsNEJBQVVILFNBQVNHLFFBRk47QUFHYkMsd0JBQU1KLFNBQVNJLElBSEY7QUFJYkMsK0JBQWFMLFNBQVNLLFdBSlQ7QUFLYkMsK0JBQWFOLFNBQVNNO0FBTFQsaUJBQWY7O3VCQU9NZCxNQUFNZSxVQUFOLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlWLHdCQUFZaEIsUUFBWixFQUFzQztBQUFBLFFBQWhCaUIsT0FBZ0IsdUVBQU4sSUFBTTtBQUFBOztBQUNwQyxTQUFLQyxHQUFMLEdBQVcsZUFBS0MsT0FBTCxDQUFhbkIsUUFBYixDQUFYO0FBQ0EsU0FBS29CLElBQUwsR0FBWXBCLFFBQVo7QUFDQSxTQUFLaUIsT0FBTCxHQUFlQSxPQUFmO0FBQ0Q7Ozs7bUNBRWM7QUFDYixVQUFNSSxVQUFVLHlCQUFlLEtBQUtwQixLQUFMLElBQWMsRUFBN0IsQ0FBaEI7QUFDQSxhQUFPLGlCQUFPSyxVQUFQLENBQWtCLEtBQWxCLEVBQXlCQyxNQUF6QixDQUFnQ2MsT0FBaEMsRUFBeUNiLE1BQXpDLENBQWdELEtBQWhELENBQVA7QUFDRDs7OzZCQUVRUCxLLEVBQU87QUFDZCxXQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDRDs7Ozs7Ozs7Ozt1QkFHb0Isa0JBQUdxQixRQUFILENBQVksS0FBS0YsSUFBakIsQzs7O0FBQW5CLHFCQUFLbkIsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUwsb0JBQUksQ0FBQyxLQUFLZ0IsT0FBVixFQUFtQjtBQUNqQix1QkFBS0csSUFBTCxHQUFZLGVBQUs5QixPQUFMLENBQWEsS0FBSzRCLEdBQWxCLE9BQTBCLEtBQUtLLFlBQUwsRUFBMUIsR0FBZ0R6QyxTQUFoRCxDQUFaO0FBQ0EsdUJBQUttQyxPQUFMLEdBQWUsSUFBZjtBQUNEOzs7dUJBRUssa0JBQUdPLE1BQUgsQ0FBVSxlQUFLTCxPQUFMLENBQWEsS0FBS0MsSUFBbEIsQ0FBVixDOzs7O3VCQUNBLGtCQUFHSyxTQUFILENBQWEsS0FBS0wsSUFBbEIsRUFBd0IsS0FBS25CLEtBQTdCLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQW5FV2xCLFkiLCJmaWxlIjoidXRpbC9wdWJsaXNoLXN0YXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBFWFRFTlNJT04gPSAnLmZvcmdlLnB1Ymxpc2gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdWJsaXNoU3RhdGUge1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21EaXJlY3RvcnkoZGlyZWN0b3J5KSB7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoZGlyZWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0ZWQgdG8gbG9hZCBwdWJsaXNoIHN0YXRlIGZyb20gYSBtaXNzaW5nIGRpcmVjdG9yeTogJHtkaXJlY3Rvcnl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHVibGlzaGVzID0gW107XG4gICAgZm9yIChjb25zdCBkaXJOYW1lIG9mIGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgY29uc3Qgc3ViRGlyID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSwgZGlyTmFtZSk7XG4gICAgICBjb25zdCBzdGF0ZXMgPSBbXTtcbiAgICAgIGlmICgoYXdhaXQgZnMuc3RhdChzdWJEaXIpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRocyA9IChhd2FpdCBmcy5yZWFkZGlyKHN1YkRpcikpXG4gICAgICAgICAgLmZpbHRlcihmaWxlTmFtZSA9PiBmaWxlTmFtZS5lbmRzV2l0aChFWFRFTlNJT04pKVxuICAgICAgICAgIC5tYXAoZmlsZU5hbWUgPT4gcGF0aC5yZXNvbHZlKHN1YkRpciwgZmlsZU5hbWUpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IFB1Ymxpc2hTdGF0ZShmaWxlUGF0aCk7XG4gICAgICAgICAgYXdhaXQgc3RhdGUubG9hZCgpO1xuICAgICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHVibGlzaGVzLnB1c2goc3RhdGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1Ymxpc2hlcztcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzYXZlVG9EaXJlY3RvcnkoZGlyZWN0b3J5LCBhcnRpZmFjdHMpIHtcbiAgICBjb25zdCBpZCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3RzKSkuZGlnZXN0KCdoZXgnKTtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGFydGlmYWN0cykge1xuICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgUHVibGlzaFN0YXRlKHBhdGgucmVzb2x2ZShkaXJlY3RvcnksIGlkLCAnbnVsbCcpLCAnJywgZmFsc2UpO1xuICAgICAgc3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICBwYXRoczogQXJyYXkuZnJvbShhcnRpZmFjdCksXG4gICAgICAgIHBsYXRmb3JtOiBhcnRpZmFjdC5wbGF0Zm9ybSxcbiAgICAgICAgYXJjaDogYXJ0aWZhY3QuYXJjaCxcbiAgICAgICAgcGFja2FnZUpTT046IGFydGlmYWN0LnBhY2thZ2VKU09OLFxuICAgICAgICBmb3JnZUNvbmZpZzogYXJ0aWZhY3QuZm9yZ2VDb25maWcsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHN0YXRlLnNhdmVUb0Rpc2soKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlUGF0aCwgaGFzSGFzaCA9IHRydWUpIHtcbiAgICB0aGlzLmRpciA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gICAgdGhpcy5wYXRoID0gZmlsZVBhdGg7XG4gICAgdGhpcy5oYXNIYXNoID0gaGFzSGFzaDtcbiAgfVxuXG4gIGdlbmVyYXRlSGFzaCgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0ZSB8fCB7fSk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gYXdhaXQgZnMucmVhZEpzb24odGhpcy5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVUb0Rpc2soKSB7XG4gICAgaWYgKCF0aGlzLmhhc0hhc2gpIHtcbiAgICAgIHRoaXMucGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmRpciwgYCR7dGhpcy5nZW5lcmF0ZUhhc2goKX0ke0VYVEVOU0lPTn1gKTtcbiAgICAgIHRoaXMuaGFzSGFzaCA9IHRydWU7XG4gICAgfVxuXG4gICAgYXdhaXQgZnMubWtkaXJzKHBhdGguZGlybmFtZSh0aGlzLnBhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUpzb24odGhpcy5wYXRoLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuIl19