UNPKG

concern

Version:

A library for seperating your application logic into concerns.

235 lines (176 loc) 21.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; var _beof = require('beof'); var _beof2 = _interopRequireDefault(_beof); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _SimpleMailbox = require('./SimpleMailbox'); var _SimpleMailbox2 = _interopRequireDefault(_SimpleMailbox); var _RunningState = require('../state/RunningState'); var _RunningState2 = _interopRequireDefault(_RunningState); var _PausedState = require('../state/PausedState'); var _PausedState2 = _interopRequireDefault(_PausedState); var _StoppedState = require('../state/StoppedState'); var _StoppedState2 = _interopRequireDefault(_StoppedState); var _Context = require('../Context'); var _Context2 = _interopRequireDefault(_Context); var _ConcernFactory = require('../ConcernFactory'); var _ConcernFactory2 = _interopRequireDefault(_ConcernFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } //IE support if (Function.prototype.name === undefined && Object.defineProperty !== undefined) { Object.defineProperty(Function.prototype, 'name', { get: function get() { var funcNameRegex = /function\s([^(]{1,})\(/; var results = funcNameRegex.exec(this.toString()); return results && results.length > 1 ? results[1].trim() : ""; }, set: function set(value) {} }); } var keyify = function keyify(msg) { switch (typeof msg === 'undefined' ? 'undefined' : _typeof(msg)) { case 'function': return msg.name; case 'object': return msg.constructor.name; default: return '' + msg; } }; /** * SimpleDispatcher handles the actual delivery of messages to * Concerns from their Mailbox. * @param {Concern} concern * @implements {EnqueueListener} */ var SimpleDispatcher = function () { function SimpleDispatcher(factory, context) { _classCallCheck(this, SimpleDispatcher); (0, _beof2.default)({ factory: factory }).interface(_ConcernFactory2.default); (0, _beof2.default)({ context: context }).interface(_Context2.default); this._mailboxes = {}; this._factory = factory; this._context = context; this._concern = factory.create(context); } _createClass(SimpleDispatcher, [{ key: '_next', value: function _next(box) { var _this = this; var next; if (this._busy) return; this._busy = true; next = box.dequeue(); if (next === null) { this._busy = false; return; } _bluebird2.default.resolve(this._concern.onReceive(next.message, next.from)).then(function (actions) { var action = null; if (!actions) return null;else if ((typeof actions === 'undefined' ? 'undefined' : _typeof(actions)) === 'object') action = actions[keyify(msg)];else if (typeof actions === 'function') action = actions; if (typeof action === 'function') return _bluebird2.default.resolve(action); }).catch(function (e) { _this.executeChildError(e, next.from); }).then(function () { return _this._busy = false; }).then(function () { return _this._next(box); }); } }, { key: 'onEnqueue', value: function onEnqueue(mailbox) { this._next(mailbox); } }, { key: 'executeChildError', value: function executeChildError(e, child) { var _this2 = this; (0, _beof2.default)({ e: e }).instance(Error); (0, _beof2.default)({ child: child }).interface(Reference); var strategy = this._factory.errorHandlingStrategy(); var sig = strategy.decide(e); if (!(sig instanceof Signal)) return this.parent().dispatcher().executeChildError(e, child); return _bluebird2.default.resolve(function () { return strategy.apply(sig, child, _this2._context); }); } }, { key: 'execute', value: function execute(action, success) { var _this3 = this; (0, _beof2.default)({ action: action }).function(); (0, _beof2.default)({ success: success }).function(); var concern = this._concern; _bluebird2.default.try(function do_execute() { action(concern); }).then(success).catch(function (e) { return _this3.executeChildError(e, _this3._context.self()); }); } }, { key: 'executeOnStart', value: function executeOnStart() { var _this4 = this; _bluebird2.default.resolve(this._concern.onStart()).then(function () { return _this4._context.self().setState(new _RunningState2.default(_this4._context)); }).catch(function (e) { return _this4._context.parent().dispatcher().executeChildError(e, _this4._concern); }); } }, { key: 'executeOnPause', value: function executeOnPause(cb) { var _this5 = this; this._pause = true; _bluebird2.default.resolve(this._concern.onPause()).then(function () { return _this5._context.self().setState(new _PausedState2.default(_this5._context)); }).catch(function (e) { return _this5._context.parent().dispatcher().executeChildError(e, _this5._concern); }); } }, { key: 'executeOnResume', value: function executeOnResume() { var _this6 = this; this._pause = false; _bluebird2.default.resolve(this._concern.onResume()).then(function () { return _this6._context.self().setState(new _RunningState2.default(_this6._context)); }).catch(function (e) { return _this6._context.parent().dispatcher().executeChildError(e, _this6._concern); }); } }, { key: 'executeOnRestart', value: function executeOnRestart() { var _this7 = this; _bluebird2.default.resolve(this._concern.onRestart()).then(function () { return _this7._concern = _this7._factory.create(_this7._context); }).then(function () { return _this7._context.self().setState(new _RunningState2.default(_this7._context)); }).catch(function (e) { return _this7._context.parent().dispatcher().executeChildError(e, _this7._concern); }); } }, { key: 'executeOnStop', value: function executeOnStop() { var _this8 = this; _bluebird2.default.resolve(this._concern.onStop()).then(function () { return _this8._context.self().setState(new _StoppedState2.default(_this8._context)); }).catch(function (e) { return _this8._context.parent().dispatcher().executeChildError(e, _this8._concern); }); } }]); return SimpleDispatcher; }(); exports.default = SimpleDispatcher; module.exports = exports['default']; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXNwYXRjaC9TaW1wbGVEaXNwYXRjaGVyLmpzIl0sIm5hbWVzIjpbIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwibmFtZSIsInVuZGVmaW5lZCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiZnVuY05hbWVSZWdleCIsInJlc3VsdHMiLCJleGVjIiwidG9TdHJpbmciLCJsZW5ndGgiLCJ0cmltIiwic2V0IiwidmFsdWUiLCJrZXlpZnkiLCJtc2ciLCJjb25zdHJ1Y3RvciIsIlNpbXBsZURpc3BhdGNoZXIiLCJmYWN0b3J5IiwiY29udGV4dCIsImludGVyZmFjZSIsIl9tYWlsYm94ZXMiLCJfZmFjdG9yeSIsIl9jb250ZXh0IiwiX2NvbmNlcm4iLCJjcmVhdGUiLCJib3giLCJuZXh0IiwiX2J1c3kiLCJkZXF1ZXVlIiwicmVzb2x2ZSIsIm9uUmVjZWl2ZSIsIm1lc3NhZ2UiLCJmcm9tIiwidGhlbiIsImFjdGlvbiIsImFjdGlvbnMiLCJjYXRjaCIsImV4ZWN1dGVDaGlsZEVycm9yIiwiZSIsIl9uZXh0IiwibWFpbGJveCIsImNoaWxkIiwiaW5zdGFuY2UiLCJFcnJvciIsIlJlZmVyZW5jZSIsInN0cmF0ZWd5IiwiZXJyb3JIYW5kbGluZ1N0cmF0ZWd5Iiwic2lnIiwiZGVjaWRlIiwiU2lnbmFsIiwicGFyZW50IiwiZGlzcGF0Y2hlciIsImFwcGx5Iiwic3VjY2VzcyIsImZ1bmN0aW9uIiwiY29uY2VybiIsInRyeSIsImRvX2V4ZWN1dGUiLCJzZWxmIiwib25TdGFydCIsInNldFN0YXRlIiwiY2IiLCJfcGF1c2UiLCJvblBhdXNlIiwib25SZXN1bWUiLCJvblJlc3RhcnQiLCJvblN0b3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBO0FBQ0EsSUFBSUEsU0FBU0MsU0FBVCxDQUFtQkMsSUFBbkIsS0FB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QWhCLEVBQ0FoQyxJQURBLENBQ0s7QUFBQSx1QkFBTSxPQUFLVixRQUFMLEdBQWdCLE9BQUtGLFFBQUwsQ0FBY0csTUFBZCxDQUFxQixPQUFLRixRQUExQixDQUF0QjtBQUFBLGFBREwsRUFFQVcsSUFGQSxDQUVLO0FBQUEsdUJBQU0sT0FBS1gsUUFBTCxDQUFjb0MsSUFBZCxHQUFxQkUsUUFBckIsQ0FBOEIsMkJBQWlCLE9BQUt0QyxRQUF0QixDQUE5QixDQUFOO0FBQUEsYUFGTCxFQUdBYyxLQUhBLENBR007QUFBQSx1QkFBSyxPQUFLZCxRQUFMLENBQWM0QixNQUFkLEdBQXVCQyxVQUF2QixHQUFvQ2QsaUJBQXBDLENBQXNEQyxDQUF0RCxFQUF5RCxPQUFLZixRQUE5RCxDQUFMO0FBQUEsYUFITjtBQUtIOzs7d0NBRWU7QUFBQTs7QUFFWiwrQkFBUU0sT0FBUixDQUFnQixLQUFLTixRQUFMLENBQWMyQyxNQUFkLEVBQWhCLEVBQ0FqQyxJQURBLENBQ0s7QUFBQSx1QkFBSSxPQUFLWCxRQUFMLENBQWNvQyxJQUFkLEdBQXFCRSxRQUFyQixDQUE4QiwyQkFBaUIsT0FBS3RDLFFBQXRCLENBQTlCLENBQUo7QUFBQSxhQURMLEVBRUFjLEtBRkEsQ0FFTTtBQUFBLHVCQUFLLE9BQUtkLFFBQUwsQ0FBYzRCLE1BQWQsR0FBdUJDLFVBQXZCLEdBQW9DZCxpQkFBcEMsQ0FBc0RDLENBQXRELEVBQXlELE9BQUtmLFFBQTlELENBQUw7QUFBQSxhQUZOO0FBSUg7Ozs7OztrQkFJVVAsZ0IiLCJmaWxlIjoiU2ltcGxlRGlzcGF0Y2hlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiZW9mIGZyb20gJ2Jlb2YnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IFNpbXBsZU1haWxib3ggZnJvbSAnLi9TaW1wbGVNYWlsYm94JztcbmltcG9ydCBSdW5uaW5nU3RhdGUgZnJvbSAnLi4vc3RhdGUvUnVubmluZ1N0YXRlJztcbmltcG9ydCBQYXVzZWRTdGF0ZSBmcm9tICcuLi9zdGF0ZS9QYXVzZWRTdGF0ZSc7XG5pbXBvcnQgU3RvcHBlZFN0YXRlIGZyb20gJy4uL3N0YXRlL1N0b3BwZWRTdGF0ZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuLi9Db250ZXh0JztcbmltcG9ydCBDb25jZXJuRmFjdG9yeSBmcm9tICcuLi9Db25jZXJuRmFjdG9yeSc7XG5cbi8vSUUgc3VwcG9ydFxuaWYgKEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lID09PSB1bmRlZmluZWQgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScsIHtcblxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGZ1bmNOYW1lUmVnZXggPSAvZnVuY3Rpb25cXHMoW14oXXsxLH0pXFwoLztcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gKGZ1bmNOYW1lUmVnZXgpLmV4ZWMoKHRoaXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMSkgPyByZXN1bHRzWzFdLnRyaW0oKSA6IFwiXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHt9XG4gICAgfSk7XG59XG5cbmNvbnN0IGtleWlmeSA9IGZ1bmN0aW9uKG1zZykge1xuXG4gICAgc3dpdGNoICh0eXBlb2YgbXNnKSB7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIG1zZy5uYW1lO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICByZXR1cm4gbXNnLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnJyArIG1zZztcblxuICAgIH1cblxufVxuXG4vKipcbiAqIFNpbXBsZURpc3BhdGNoZXIgaGFuZGxlcyB0aGUgYWN0dWFsIGRlbGl2ZXJ5IG9mIG1lc3NhZ2VzIHRvXG4gKiBDb25jZXJucyBmcm9tIHRoZWlyIE1haWxib3guXG4gKiBAcGFyYW0ge0NvbmNlcm59IGNvbmNlcm5cbiAqIEBpbXBsZW1lbnRzIHtFbnF1ZXVlTGlzdGVuZXJ9XG4gKi9cbmNsYXNzIFNpbXBsZURpc3BhdGNoZXIge1xuXG4gICAgY29uc3RydWN0b3IoZmFjdG9yeSwgY29udGV4dCkge1xuXG4gICAgICAgIGJlb2YoeyBmYWN0b3J5IH0pLmludGVyZmFjZShDb25jZXJuRmFjdG9yeSk7XG4gICAgICAgIGJlb2YoeyBjb250ZXh0IH0pLmludGVyZmFjZShDb250ZXh0KTtcblxuICAgICAgICB0aGlzLl9tYWlsYm94ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9jb25jZXJuID0gZmFjdG9yeS5jcmVhdGUoY29udGV4dCk7XG5cbiAgICB9XG5cbiAgICBfbmV4dChib3gpIHtcblxuICAgICAgICB2YXIgbmV4dDtcblxuICAgICAgICBpZiAodGhpcy5fYnVzeSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLl9idXN5ID0gdHJ1ZTtcblxuICAgICAgICBuZXh0ID0gYm94LmRlcXVldWUoKTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuXG4gICAgICAgICAgICB0aGlzLl9idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25jZXJuLm9uUmVjZWl2ZShuZXh0Lm1lc3NhZ2UsIG5leHQuZnJvbSkpLlxuICAgICAgICB0aGVuKGFjdGlvbnMgPT4ge1xuXG4gICAgICAgICAgICB2YXIgYWN0aW9uID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCFhY3Rpb25zKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYWN0aW9ucyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uc1trZXlpZnkobXNnKV07XG5cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhY3Rpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbnM7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYWN0aW9uKTtcblxuICAgICAgICB9KS5cbiAgICAgICAgY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVDaGlsZEVycm9yKGUsIG5leHQuZnJvbSk7XG4gICAgICAgIH0pLlxuICAgICAgICB0aGVuKCgpID0+IHRoaXMuX2J1c3kgPSBmYWxzZSkuXG4gICAgICAgIHRoZW4oKCkgPT4gdGhpcy5fbmV4dChib3gpKTtcblxuICAgIH1cblxuICAgIG9uRW5xdWV1ZShtYWlsYm94KSB7XG5cbiAgICAgICAgdGhpcy5fbmV4dChtYWlsYm94KTtcblxuICAgIH1cblxuICAgIGV4ZWN1dGVDaGlsZEVycm9yKGUsIGNoaWxkKSB7XG5cbiAgICAgICAgYmVvZih7IGUgfSkuaW5zdGFuY2UoRXJyb3IpO1xuICAgICAgICBiZW9mKHsgY2hpbGQgfSkuaW50ZXJmYWNlKFJlZmVyZW5jZSk7XG5cbiAgICAgICAgdmFyIHN0cmF0ZWd5ID0gdGhpcy5fZmFjdG9yeS5lcnJvckhhbmRsaW5nU3RyYXRlZ3koKTtcbiAgICAgICAgdmFyIHNpZyA9IHN0cmF0ZWd5LmRlY2lkZShlKTtcblxuICAgICAgICBpZiAoIShzaWcgaW5zdGFuY2VvZiBTaWduYWwpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50KCkuZGlzcGF0Y2hlcigpLmV4ZWN1dGVDaGlsZEVycm9yKGUsIGNoaWxkKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCgpID0+IHN0cmF0ZWd5LmFwcGx5KHNpZywgY2hpbGQsIHRoaXMuX2NvbnRleHQpKTtcblxuXG4gICAgfVxuXG4gICAgZXhlY3V0ZShhY3Rpb24sIHN1Y2Nlc3MpIHtcblxuICAgICAgICBiZW9mKHsgYWN0aW9uIH0pLmZ1bmN0aW9uKCk7XG4gICAgICAgIGJlb2YoeyBzdWNjZXNzIH0pLmZ1bmN0aW9uKCk7XG5cbiAgICAgICAgdmFyIGNvbmNlcm4gPSB0aGlzLl9jb25jZXJuO1xuXG4gICAgICAgIFByb21pc2UudHJ5KGZ1bmN0aW9uIGRvX2V4ZWN1dGUoKSB7XG4gICAgICAgICAgICBhY3Rpb24oY29uY2Vybik7XG4gICAgICAgIH0pLlxuICAgICAgICB0aGVuKHN1Y2Nlc3MpLlxuICAgICAgICBjYXRjaChlID0+IHRoaXMuZXhlY3V0ZUNoaWxkRXJyb3IoZSwgdGhpcy5fY29udGV4dC5zZWxmKCkpKTtcblxuICAgIH1cblxuICAgIGV4ZWN1dGVPblN0YXJ0KCkge1xuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25jZXJuLm9uU3RhcnQoKSkuXG4gICAgICAgIHRoZW4oKCk9PnRoaXMuX2NvbnRleHQuc2VsZigpLnNldFN0YXRlKG5ldyBSdW5uaW5nU3RhdGUodGhpcy5fY29udGV4dCkpKS5cbiAgICAgICAgY2F0Y2goZSA9PiB0aGlzLl9jb250ZXh0LnBhcmVudCgpLmRpc3BhdGNoZXIoKS5leGVjdXRlQ2hpbGRFcnJvcihlLCB0aGlzLl9jb25jZXJuKSk7XG5cbiAgICB9XG5cbiAgICBleGVjdXRlT25QYXVzZShjYikge1xuXG4gICAgICAgIHRoaXMuX3BhdXNlID0gdHJ1ZTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NvbmNlcm4ub25QYXVzZSgpKS5cbiAgICAgICAgdGhlbigoKT0+dGhpcy5fY29udGV4dC5zZWxmKCkuc2V0U3RhdGUobmV3IFBhdXNlZFN0YXRlKHRoaXMuX2NvbnRleHQpKSkuXG4gICAgICAgIGNhdGNoKGUgPT4gdGhpcy5fY29udGV4dC5wYXJlbnQoKS5kaXNwYXRjaGVyKCkuZXhlY3V0ZUNoaWxkRXJyb3IoZSwgdGhpcy5fY29uY2VybikpO1xuXG4gICAgfVxuXG4gICAgZXhlY3V0ZU9uUmVzdW1lKCkge1xuXG4gICAgICAgIHRoaXMuX3BhdXNlID0gZmFsc2U7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25jZXJuLm9uUmVzdW1lKCkpLlxuICAgICAgICB0aGVuKCgpID0+IHRoaXMuX2NvbnRleHQuc2VsZigpLnNldFN0YXRlKG5ldyBSdW5uaW5nU3RhdGUodGhpcy5fY29udGV4dCkpKS5cbiAgICAgICAgY2F0Y2goZSA9PiB0aGlzLl9jb250ZXh0LnBhcmVudCgpLmRpc3BhdGNoZXIoKS5leGVjdXRlQ2hpbGRFcnJvcihlLCB0aGlzLl9jb25jZXJuKSk7XG5cbiAgICB9XG5cbiAgICBleGVjdXRlT25SZXN0YXJ0KCkge1xuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25jZXJuLm9uUmVzdGFydCgpKS5cbiAgICAgICAgdGhlbigoKSA9PiB0aGlzLl9jb25jZXJuID0gdGhpcy5fZmFjdG9yeS5jcmVhdGUodGhpcy5fY29udGV4dCkpLlxuICAgICAgICB0aGVuKCgpID0+IHRoaXMuX2NvbnRleHQuc2VsZigpLnNldFN0YXRlKG5ldyBSdW5uaW5nU3RhdGUodGhpcy5fY29udGV4dCkpKS5cbiAgICAgICAgY2F0Y2goZSA9PiB0aGlzLl9jb250ZXh0LnBhcmVudCgpLmRpc3BhdGNoZXIoKS5leGVjdXRlQ2hpbGRFcnJvcihlLCB0aGlzLl9jb25jZXJuKSk7XG5cbiAgICB9XG5cbiAgICBleGVjdXRlT25TdG9wKCkge1xuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb25jZXJuLm9uU3RvcCgpKS5cbiAgICAgICAgdGhlbigoKT0+dGhpcy5fY29udGV4dC5zZWxmKCkuc2V0U3RhdGUobmV3IFN0b3BwZWRTdGF0ZSh0aGlzLl9jb250ZXh0KSkpLlxuICAgICAgICBjYXRjaChlID0+IHRoaXMuX2NvbnRleHQucGFyZW50KCkuZGlzcGF0Y2hlcigpLmV4ZWN1dGVDaGlsZEVycm9yKGUsIHRoaXMuX2NvbmNlcm4pKTtcblxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW1wbGVEaXNwYXRjaGVyXG4iXX0=