New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

emitter-pubsub-broker

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

emitter-pubsub-broker - npm Package Compare versions

Comparing version 0.3.0 to 0.4.0

15

CHANGELOG.md

@@ -5,2 +5,17 @@ # Change Log

<a name="0.4.0"></a>
# [0.4.0](https://github.com/an-sh/emitter-pubsub-broker/compare/v0.3.0...v0.4.0) (2016-11-29)
### Chores
* use es2015-node4 preset ([5e05222](https://github.com/an-sh/emitter-pubsub-broker/commit/5e05222))
### BREAKING CHANGES
* Possible node 4.x regression due to the preset change.
<a name="0.3.0"></a>

@@ -7,0 +22,0 @@ # [0.3.0](https://github.com/an-sh/emitter-pubsub-broker/compare/v0.2.1...v0.3.0) (2016-10-21)

559

lib/EmitterPubsubBroker.js
'use strict';
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
const Promise = require('bluebird');
const Redis = require('ioredis');
const msgpack = require('msgpack-lite');
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _set = require('babel-runtime/core-js/set');
var _set2 = _interopRequireDefault(_set);
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Promise = require('bluebird');
var Redis = require('ioredis');
var msgpack = require('msgpack-lite');
var _require = require('eventemitter3');
var EventEmitter = _require.EventEmitter;
const EventEmitter = _require.EventEmitter;

@@ -107,85 +71,57 @@ /**

var RedisConnector = function (_EventEmitter) {
(0, _inherits3.default)(RedisConnector, _EventEmitter);
class RedisConnector extends EventEmitter {
constructor(options) {
super();
this.pub = new Redis(options);
this.sub = new Redis(options);
this.sub.subscribe().catchReturn();
this.sub.on('messageBuffer', this._onMessage.bind(this));
this.sub.on('error', this.emit.bind(this));
this.pub.on('error', this.emit.bind(this));
}
function RedisConnector(options) {
(0, _classCallCheck3.default)(this, RedisConnector);
_onMessage(buf, data) {
let ch = buf.toString();
this.emit('message', ch, data);
}
var _this = (0, _possibleConstructorReturn3.default)(this, (RedisConnector.__proto__ || (0, _getPrototypeOf2.default)(RedisConnector)).call(this));
publish(ch, data) {
return this.pub.publish(ch, data);
}
_this.pub = new Redis(options);
_this.sub = new Redis(options);
_this.sub.subscribe().catchReturn();
_this.sub.on('messageBuffer', _this._onMessage.bind(_this));
_this.sub.on('error', _this.emit.bind(_this));
_this.pub.on('error', _this.emit.bind(_this));
return _this;
subscribe(ch) {
return this.sub.subscribe(ch);
}
(0, _createClass3.default)(RedisConnector, [{
key: '_onMessage',
value: function _onMessage(buf, data) {
var ch = buf.toString();
this.emit('message', ch, data);
}
}, {
key: 'publish',
value: function publish(ch, data) {
return this.pub.publish(ch, data);
}
}, {
key: 'subscribe',
value: function subscribe(ch) {
return this.sub.subscribe(ch);
}
}, {
key: 'unsubscribe',
value: function unsubscribe(ch) {
return this.sub.unsubscribe(ch);
}
}, {
key: 'close',
value: function close() {
return Promise.all([this.pub.quit(), this.sub.quit()]);
}
}]);
return RedisConnector;
}(EventEmitter);
unsubscribe(ch) {
return this.sub.unsubscribe(ch);
}
var MemoryConnector = function (_EventEmitter2) {
(0, _inherits3.default)(MemoryConnector, _EventEmitter2);
close() {
return Promise.all([this.pub.quit(), this.sub.quit()]);
}
}
function MemoryConnector(options) {
(0, _classCallCheck3.default)(this, MemoryConnector);
return (0, _possibleConstructorReturn3.default)(this, (MemoryConnector.__proto__ || (0, _getPrototypeOf2.default)(MemoryConnector)).call(this));
class MemoryConnector extends EventEmitter {
constructor(options) {
super();
}
(0, _createClass3.default)(MemoryConnector, [{
key: 'publish',
value: function publish(ch, data) {
var _this3 = this;
publish(ch, data) {
return Promise.resolve().then(() => this.emit('message', ch, data));
}
return Promise.resolve().then(function () {
return _this3.emit('message', ch, data);
});
}
}, {
key: 'subscribe',
value: function subscribe(ch) {
return Promise.resolve();
}
}, {
key: 'unsubscribe',
value: function unsubscribe(ch) {
return Promise.resolve();
}
}, {
key: 'close',
value: function close() {
return Promise.resolve();
}
}]);
return MemoryConnector;
}(EventEmitter);
subscribe(ch) {
return Promise.resolve();
}
unsubscribe(ch) {
return Promise.resolve();
}
close() {
return Promise.resolve();
}
}
/**

@@ -204,7 +140,3 @@ * @typedef {Object} EmitterPubsubBroker.Options

*/
var EmitterPubsubBroker = function (_EventEmitter3) {
(0, _inherits3.default)(EmitterPubsubBroker, _EventEmitter3);
class EmitterPubsubBroker extends EventEmitter {
/**

@@ -217,22 +149,19 @@ * Creates a broker.

*/
function EmitterPubsubBroker(options) {
(0, _classCallCheck3.default)(this, EmitterPubsubBroker);
var _this4 = (0, _possibleConstructorReturn3.default)(this, (EmitterPubsubBroker.__proto__ || (0, _getPrototypeOf2.default)(EmitterPubsubBroker)).call(this));
constructor(options) {
super();
if (options == null || typeof options === 'string') {
options = { connect: options };
}
_this4.prefix = options.prefix || 'emitter-pubsub-broker:';
_this4.includeChannel = options.includeChannel;
_this4.clientChannels = new _map2.default();
_this4.channelClients = new _map2.default();
this.prefix = options.prefix || 'emitter-pubsub-broker:';
this.includeChannel = options.includeChannel;
this.clientChannels = new Map();
this.channelClients = new Map();
if (options.connect || options.connector) {
_this4.connector = options.connector || new RedisConnector(options.connect);
_this4.serialize = true;
this.connector = options.connector || new RedisConnector(options.connect);
this.serialize = true;
} else {
_this4.connector = new MemoryConnector();
_this4.serialize = false;
this.connector = new MemoryConnector();
this.serialize = false;
}
_this4.connector.on('message', _this4._dispatch.bind(_this4));
this.connector.on('message', this._dispatch.bind(this));
/**

@@ -245,247 +174,177 @@ * Connector error. Does not throw if there are no listeners.

*/
_this4.connector.on('error', _this4.emit.bind(_this4));
return _this4;
this.connector.on('error', this.emit.bind(this));
}
(0, _createClass3.default)(EmitterPubsubBroker, [{
key: '_channelAddClient',
value: function _channelAddClient(client, ch) {
var clients = this.channelClients.get(ch);
if (clients == null) {
clients = new _set2.default();
this.channelClients.set(ch, clients);
clients.add(client);
return this.connector.subscribe(ch);
} else {
clients.add(client);
return Promise.resolve();
}
_channelAddClient(client, ch) {
let clients = this.channelClients.get(ch);
if (clients == null) {
clients = new Set();
this.channelClients.set(ch, clients);
clients.add(client);
return this.connector.subscribe(ch);
} else {
clients.add(client);
return Promise.resolve();
}
}, {
key: '_channelRemoveClient',
value: function _channelRemoveClient(client, ch) {
var clients = this.channelClients.get(ch);
var nclients = void 0;
if (clients != null) {
clients.delete(client);
nclients = clients.size;
}
if (nclients === 0) {
return this.connector.unsubscribe(ch);
} else {
return Promise.resolve();
}
}
_channelRemoveClient(client, ch) {
let clients = this.channelClients.get(ch);
let nclients;
if (clients != null) {
clients.delete(client);
nclients = clients.size;
}
}, {
key: '_makeMessage',
value: function _makeMessage(msg) {
return this.serialize ? msgpack.encode(msg) : msg;
if (nclients === 0) {
return this.connector.unsubscribe(ch);
} else {
return Promise.resolve();
}
}
/**
* Subscribes emitter to a channel.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @return {Promise<undefined>}
*/
_makeMessage(msg) {
return this.serialize ? msgpack.encode(msg) : msg;
}
}, {
key: 'subscribe',
value: function subscribe(client, channel) {
var channels = this.clientChannels.get(client);
if (!channels) {
channels = new _set2.default();
this.clientChannels.set(client, channels);
}
var ch = this.prefix + channel;
channels.add(ch);
return this._channelAddClient(client, ch);
/**
* Subscribes emitter to a channel.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @return {Promise<undefined>}
*/
subscribe(client, channel) {
let channels = this.clientChannels.get(client);
if (!channels) {
channels = new Set();
this.clientChannels.set(client, channels);
}
let ch = this.prefix + channel;
channels.add(ch);
return this._channelAddClient(client, ch);
}
/**
* Unsubscribes emitter from a channel.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @return {Promise<undefined>}
*/
/**
* Unsubscribes emitter from a channel.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @return {Promise<undefined>}
*/
unsubscribe(client, channel) {
let channels = this.clientChannels.get(client);
let ch = this.prefix + channel;
if (channels) {
channels.delete(ch);
}
return this._channelRemoveClient(client, ch);
}
}, {
key: 'unsubscribe',
value: function unsubscribe(client, channel) {
var channels = this.clientChannels.get(client);
var ch = this.prefix + channel;
if (channels) {
channels.delete(ch);
}
return this._channelRemoveClient(client, ch);
/**
* Unsubscribes emitter from all channel.
*
* @param {EventEmitter} client Emitter.
* @return {Promise<undefined>}
*/
unsubscribeall(client) {
let channels = this.clientChannels.get(client);
this.clientChannels.delete(client);
if (channels) {
return Promise.each(channels, this._channelRemoveClient.bind(this, client));
} else {
return Promise.resolve();
}
}
/**
* Unsubscribes emitter from all channel.
*
* @param {EventEmitter} client Emitter.
* @return {Promise<undefined>}
*/
}, {
key: 'unsubscribeall',
value: function unsubscribeall(client) {
var channels = this.clientChannels.get(client);
this.clientChannels.delete(client);
if (channels) {
return Promise.each(channels, this._channelRemoveClient.bind(this, client));
} else {
return Promise.resolve();
}
/**
* Publish an event to a channel.
*
* @param {string} channel Channel.
* @param {string} name Event name.
* @param {*} args Arguments.
* @return {Promise<undefined>}
*/
publish(channel, name) {
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
/**
* Publish an event to a channel.
*
* @param {string} channel Channel.
* @param {string} name Event name.
* @param {*} args Arguments.
* @return {Promise<undefined>}
*/
let ch = this.prefix + channel;
let msg = this._makeMessage({ name: name, args: args });
return this.connector.publish(ch, msg);
}
}, {
key: 'publish',
value: function publish(channel, name) {
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
var ch = this.prefix + channel;
var msg = this._makeMessage({ name: name, args: args });
return this.connector.publish(ch, msg);
/**
* Publish an event to a channel, excluding the sender. The client
* object __MUST__ have an unique `id` field.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @param {string} name Event name.
* @param {*} args Arguments.
* @return {Promise<undefined>}
*/
send(client, channel, name) {
for (var _len2 = arguments.length, args = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
args[_key2 - 3] = arguments[_key2];
}
/**
* Publish an event to a channel, excluding the sender. The client
* object __MUST__ have an unique `id` field.
*
* @param {EventEmitter} client Emitter.
* @param {string} channel Channel.
* @param {string} name Event name.
* @param {*} args Arguments.
* @return {Promise<undefined>}
*/
let ch = this.prefix + channel;
let sender = client.id;
let msg = this._makeMessage({ sender: sender, name: name, args: args });
return this.connector.publish(ch, msg);
}
}, {
key: 'send',
value: function send(client, channel, name) {
for (var _len2 = arguments.length, args = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
args[_key2 - 3] = arguments[_key2];
/**
* Returns client subscriptions.
*
* @param {EventEmitter} client Emitter.
* @return {Array<string>}
*/
getSubscriptions(client) {
let channels = this.clientChannels.get(client);
let res = [];
if (channels) {
let plen = this.prefix.length;
for (let channel of channels) {
res.push(channel.slice(plen));
}
var ch = this.prefix + channel;
var sender = client.id;
var msg = this._makeMessage({ sender: sender, name: name, args: args });
return this.connector.publish(ch, msg);
}
return res;
}
/**
* Returns client subscriptions.
*
* @param {EventEmitter} client Emitter.
* @return {Array<string>}
*/
/**
* Closes broker.
*
* @return {Promise<undefined>}
*/
close() {
this.channelClients.clear();
this.clientChannels.clear();
return this.connector.close();
}
}, {
key: 'getSubscriptions',
value: function getSubscriptions(client) {
var channels = this.clientChannels.get(client);
var res = [];
if (channels) {
var plen = this.prefix.length;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(channels), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var channel = _step.value;
res.push(channel.slice(plen));
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
_dispatch(ch, data) {
let channel = ch.slice(this.prefix.length);
let message = this.serialize ? msgpack.decode(data) : data;
let clients = this.channelClients.get(ch);
/* istanbul ignore else */
if (clients) {
let args;
if (this.includeChannel) {
args = [message.name, channel].concat(_toConsumableArray(message.args));
} else {
args = [message.name].concat(_toConsumableArray(message.args));
}
for (let client of clients) {
if (!message.sender || client.id !== message.sender) {
client.emit.apply(client, _toConsumableArray(args));
}
}
return res;
}
}
/**
* Closes broker.
*
* @return {Promise<undefined>}
*/
}
}, {
key: 'close',
value: function close() {
this.channelClients.clear();
this.clientChannels.clear();
return this.connector.close();
}
}, {
key: '_dispatch',
value: function _dispatch(ch, data) {
var channel = ch.slice(this.prefix.length);
var message = this.serialize ? msgpack.decode(data) : data;
var clients = this.channelClients.get(ch);
/* istanbul ignore else */
if (clients) {
var args = void 0;
if (this.includeChannel) {
args = [message.name, channel].concat((0, _toConsumableArray3.default)(message.args));
} else {
args = [message.name].concat((0, _toConsumableArray3.default)(message.args));
}
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = (0, _getIterator3.default)(clients), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var client = _step2.value;
if (!message.sender || client.id !== message.sender) {
client.emit.apply(client, (0, _toConsumableArray3.default)(args));
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
}
}]);
return EmitterPubsubBroker;
}(EventEmitter);
module.exports = EmitterPubsubBroker;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbWl0dGVyUHVic3ViQnJva2VyLmpzIl0sIm5hbWVzIjpbIlByb21pc2UiLCJyZXF1aXJlIiwiUmVkaXMiLCJtc2dwYWNrIiwiRXZlbnRFbWl0dGVyIiwiUmVkaXNDb25uZWN0b3IiLCJvcHRpb25zIiwicHViIiwic3ViIiwic3Vic2NyaWJlIiwiY2F0Y2hSZXR1cm4iLCJvbiIsIl9vbk1lc3NhZ2UiLCJiaW5kIiwiZW1pdCIsImJ1ZiIsImRhdGEiLCJjaCIsInRvU3RyaW5nIiwicHVibGlzaCIsInVuc3Vic2NyaWJlIiwiYWxsIiwicXVpdCIsIk1lbW9yeUNvbm5lY3RvciIsInJlc29sdmUiLCJ0aGVuIiwiRW1pdHRlclB1YnN1YkJyb2tlciIsImNvbm5lY3QiLCJwcmVmaXgiLCJpbmNsdWRlQ2hhbm5lbCIsImNsaWVudENoYW5uZWxzIiwiY2hhbm5lbENsaWVudHMiLCJjb25uZWN0b3IiLCJzZXJpYWxpemUiLCJfZGlzcGF0Y2giLCJjbGllbnQiLCJjbGllbnRzIiwiZ2V0Iiwic2V0IiwiYWRkIiwibmNsaWVudHMiLCJkZWxldGUiLCJzaXplIiwibXNnIiwiZW5jb2RlIiwiY2hhbm5lbCIsImNoYW5uZWxzIiwiX2NoYW5uZWxBZGRDbGllbnQiLCJfY2hhbm5lbFJlbW92ZUNsaWVudCIsImVhY2giLCJuYW1lIiwiYXJncyIsIl9tYWtlTWVzc2FnZSIsInNlbmRlciIsImlkIiwicmVzIiwicGxlbiIsImxlbmd0aCIsInB1c2giLCJzbGljZSIsImNsZWFyIiwiY2xvc2UiLCJtZXNzYWdlIiwiZGVjb2RlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxVQUFVQyxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNQyxRQUFRRCxRQUFRLFNBQVIsQ0FBZDtBQUNBLElBQU1FLFVBQVVGLFFBQVEsY0FBUixDQUFoQjs7ZUFDeUJBLFFBQVEsZUFB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QUFQLEtBQWNRLFFBQVFULE1BQTdDLEVBQXFEO0FBQ25EbEIscUJBQU9yQixJQUFQLGdEQUFlcUMsSUFBZjtBQUNEO0FBQ0Y7QUFYVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWVo7QUFDRjs7O0VBbk0rQi9DLFk7O0FBdU1sQzRELE9BQU9DLE9BQVAsR0FBaUJ2QyxtQkFBakIiLCJmaWxlIjoiRW1pdHRlclB1YnN1YkJyb2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgnYmx1ZWJpcmQnKVxuY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJylcbmNvbnN0IG1zZ3BhY2sgPSByZXF1aXJlKCdtc2dwYWNrLWxpdGUnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY29ubmVjdG9yIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAaW50ZXJmYWNlIENvbm5lY3RvclxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHB1Ymxpc2hcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhLlxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQG1ldGhvZFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBzdWJzY3JpYmVcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHVuc3Vic2NyaWJlXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQG1ldGhvZFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBjbG9zZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQGV2ZW50IG1lc3NhZ2VcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBFdmVudCBuYW1lLlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgRXZlbnQgZGF0YS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHdpbGwgYmUgbGlzdGVuZWQgYnkge0BsaW5rIEVtaXR0ZXJQdWJzdWJCcm9rZXJ9IGluc3RhbmNlLlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgRXJyb3IuXG4gKi9cblxuY2xhc3MgUmVkaXNDb25uZWN0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnB1YiA9IG5ldyBSZWRpcyhvcHRpb25zKVxuICAgIHRoaXMuc3ViID0gbmV3IFJlZGlzKG9wdGlvbnMpXG4gICAgdGhpcy5zdWIuc3Vic2NyaWJlKCkuY2F0Y2hSZXR1cm4oKVxuICAgIHRoaXMuc3ViLm9uKCdtZXNzYWdlQnVmZmVyJywgdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcykpXG4gICAgdGhpcy5zdWIub24oJ2Vycm9yJywgdGhpcy5lbWl0LmJpbmQodGhpcykpXG4gICAgdGhpcy5wdWIub24oJ2Vycm9yJywgdGhpcy5lbWl0LmJpbmQodGhpcykpXG4gIH1cblxuICBfb25NZXNzYWdlIChidWYsIGRhdGEpIHtcbiAgICBsZXQgY2ggPSBidWYudG9TdHJpbmcoKVxuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGNoLCBkYXRhKVxuICB9XG5cbiAgcHVibGlzaCAoY2gsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wdWIucHVibGlzaChjaCwgZGF0YSlcbiAgfVxuXG4gIHN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gdGhpcy5zdWIuc3Vic2NyaWJlKGNoKVxuICB9XG5cbiAgdW5zdWJzY3JpYmUgKGNoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViLnVuc3Vic2NyaWJlKGNoKVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChbdGhpcy5wdWIucXVpdCgpLCB0aGlzLnN1Yi5xdWl0KCldKVxuICB9XG59XG5cbmNsYXNzIE1lbW9yeUNvbm5lY3RvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICB9XG5cbiAgcHVibGlzaCAoY2gsIGRhdGEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZW1pdCgnbWVzc2FnZScsIGNoLCBkYXRhKSlcbiAgfVxuXG4gIHN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxuXG4gIHVuc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRW1pdHRlclB1YnN1YkJyb2tlci5PcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbm5lY3QgQ29ubmVjdCBzdHJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeD0nZW1pdHRlci1wdWJzdWItYnJva2VyOiddIFByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luY2x1ZGVDaGFubmVsPWZhbHNlXSBJbmNsdWRlIGNoYW5uZWwgYXMgdGhlXG4gKiBmaXJzdCBhcmd1bWVudC5cbiAqIEBwcm9wZXJ0eSB7Q29ubmVjdG9yfSBbY29ubmVjdG9yXSBDdXN0b20gY29ubmVjdG9yIGltcGxlbWVudGF0aW9uLlxuICovXG5cbi8qKlxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cbmNsYXNzIEVtaXR0ZXJQdWJzdWJCcm9rZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGJyb2tlci5cbiAgICpcbiAgICogQHBhcmFtIHtFbWl0dGVyUHVic3ViQnJva2VyLk9wdGlvbnN8c3RyaW5nfSBvcHRpb25zIE9wdGlvbnMgb3IgYVxuICAgKiBjb25uZWN0IGlmIGEgc3RyaW5nLiBJZiBjb25uZWN0IHN0cmluZyBpcyBlbXB0eSwgdGhlbiBhblxuICAgKiBpbi1tZW1vcnkgY29ubmVjdG9yIGlzIHVzZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIHN1cGVyKClcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdDogb3B0aW9ucyB9XG4gICAgfVxuICAgIHRoaXMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggfHwgJ2VtaXR0ZXItcHVic3ViLWJyb2tlcjonXG4gICAgdGhpcy5pbmNsdWRlQ2hhbm5lbCA9IG9wdGlvbnMuaW5jbHVkZUNoYW5uZWxcbiAgICB0aGlzLmNsaWVudENoYW5uZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5jaGFubmVsQ2xpZW50cyA9IG5ldyBNYXAoKVxuICAgIGlmIChvcHRpb25zLmNvbm5lY3QgfHwgb3B0aW9ucy5jb25uZWN0b3IpIHtcbiAgICAgIHRoaXMuY29ubmVjdG9yID0gb3B0aW9ucy5jb25uZWN0b3IgfHwgbmV3IFJlZGlzQ29ubmVjdG9yKG9wdGlvbnMuY29ubmVjdClcbiAgICAgIHRoaXMuc2VyaWFsaXplID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbm5lY3RvciA9IG5ldyBNZW1vcnlDb25uZWN0b3IoKVxuICAgICAgdGhpcy5zZXJpYWxpemUgPSBmYWxzZVxuICAgIH1cbiAgICB0aGlzLmNvbm5lY3Rvci5vbignbWVzc2FnZScsIHRoaXMuX2Rpc3BhdGNoLmJpbmQodGhpcykpXG4gICAgLyoqXG4gICAgICogQ29ubmVjdG9yIGVycm9yLiBEb2VzIG5vdCB0aHJvdyBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQGV2ZW50IGVycm9yXG4gICAgICogQG1lbWJlck9mIEVtaXR0ZXJQdWJzdWJCcm9rZXJcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBFcnJvci5cbiAgICAgKi9cbiAgICB0aGlzLmNvbm5lY3Rvci5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIF9jaGFubmVsQWRkQ2xpZW50IChjbGllbnQsIGNoKSB7XG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICBpZiAoY2xpZW50cyA9PSBudWxsKSB7XG4gICAgICBjbGllbnRzID0gbmV3IFNldCgpXG4gICAgICB0aGlzLmNoYW5uZWxDbGllbnRzLnNldChjaCwgY2xpZW50cylcbiAgICAgIGNsaWVudHMuYWRkKGNsaWVudClcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zdWJzY3JpYmUoY2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsaWVudHMuYWRkKGNsaWVudClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cbiAgfVxuXG4gIF9jaGFubmVsUmVtb3ZlQ2xpZW50IChjbGllbnQsIGNoKSB7XG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICBsZXQgbmNsaWVudHNcbiAgICBpZiAoY2xpZW50cyAhPSBudWxsKSB7XG4gICAgICBjbGllbnRzLmRlbGV0ZShjbGllbnQpXG4gICAgICBuY2xpZW50cyA9IGNsaWVudHMuc2l6ZVxuICAgIH1cbiAgICBpZiAobmNsaWVudHMgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci51bnN1YnNjcmliZShjaClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgX21ha2VNZXNzYWdlIChtc2cpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUgPyBtc2dwYWNrLmVuY29kZShtc2cpIDogbXNnXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBlbWl0dGVyIHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGNsaWVudCBFbWl0dGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICBzdWJzY3JpYmUgKGNsaWVudCwgY2hhbm5lbCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBpZiAoIWNoYW5uZWxzKSB7XG4gICAgICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICAgICAgdGhpcy5jbGllbnRDaGFubmVscy5zZXQoY2xpZW50LCBjaGFubmVscylcbiAgICB9XG4gICAgbGV0IGNoID0gdGhpcy5wcmVmaXggKyBjaGFubmVsXG4gICAgY2hhbm5lbHMuYWRkKGNoKVxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQWRkQ2xpZW50KGNsaWVudCwgY2gpXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGVtaXR0ZXIgZnJvbSBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgKGNsaWVudCwgY2hhbm5lbCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBpZiAoY2hhbm5lbHMpIHtcbiAgICAgIGNoYW5uZWxzLmRlbGV0ZShjaClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxSZW1vdmVDbGllbnQoY2xpZW50LCBjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZW1pdHRlciBmcm9tIGFsbCBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHVuc3Vic2NyaWJlYWxsIChjbGllbnQpIHtcbiAgICBsZXQgY2hhbm5lbHMgPSB0aGlzLmNsaWVudENoYW5uZWxzLmdldChjbGllbnQpXG4gICAgdGhpcy5jbGllbnRDaGFubmVscy5kZWxldGUoY2xpZW50KVxuICAgIGlmIChjaGFubmVscykge1xuICAgICAgcmV0dXJuIFByb21pc2UuZWFjaChcbiAgICAgICAgY2hhbm5lbHMsIHRoaXMuX2NoYW5uZWxSZW1vdmVDbGllbnQuYmluZCh0aGlzLCBjbGllbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBldmVudCB0byBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7Kn0gYXJncyBBcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHB1Ymxpc2ggKGNoYW5uZWwsIG5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBsZXQgbXNnID0gdGhpcy5fbWFrZU1lc3NhZ2Uoe25hbWUsIGFyZ3N9KVxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5wdWJsaXNoKGNoLCBtc2cpXG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBldmVudCB0byBhIGNoYW5uZWwsIGV4Y2x1ZGluZyB0aGUgc2VuZGVyLiBUaGUgY2xpZW50XG4gICAqIG9iamVjdCBfX01VU1RfXyBoYXZlIGFuIHVuaXF1ZSBgaWRgIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7Kn0gYXJncyBBcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHNlbmQgKGNsaWVudCwgY2hhbm5lbCwgbmFtZSwgLi4uYXJncykge1xuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGxldCBzZW5kZXIgPSBjbGllbnQuaWRcbiAgICBsZXQgbXNnID0gdGhpcy5fbWFrZU1lc3NhZ2Uoe3NlbmRlciwgbmFtZSwgYXJnc30pXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnB1Ymxpc2goY2gsIG1zZylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNsaWVudCBzdWJzY3JpcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEByZXR1cm4ge0FycmF5PHN0cmluZz59XG4gICAqL1xuICBnZXRTdWJzY3JpcHRpb25zIChjbGllbnQpIHtcbiAgICBsZXQgY2hhbm5lbHMgPSB0aGlzLmNsaWVudENoYW5uZWxzLmdldChjbGllbnQpXG4gICAgbGV0IHJlcyA9IFtdXG4gICAgaWYgKGNoYW5uZWxzKSB7XG4gICAgICBsZXQgcGxlbiA9IHRoaXMucHJlZml4Lmxlbmd0aFxuICAgICAgZm9yIChsZXQgY2hhbm5lbCBvZiBjaGFubmVscykge1xuICAgICAgICByZXMucHVzaChjaGFubmVsLnNsaWNlKHBsZW4pKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGJyb2tlci5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuY2hhbm5lbENsaWVudHMuY2xlYXIoKVxuICAgIHRoaXMuY2xpZW50Q2hhbm5lbHMuY2xlYXIoKVxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jbG9zZSgpXG4gIH1cblxuICBfZGlzcGF0Y2ggKGNoLCBkYXRhKSB7XG4gICAgbGV0IGNoYW5uZWwgPSBjaC5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG4gICAgbGV0IG1lc3NhZ2UgPSB0aGlzLnNlcmlhbGl6ZSA/IG1zZ3BhY2suZGVjb2RlKGRhdGEpIDogZGF0YVxuICAgIGxldCBjbGllbnRzID0gdGhpcy5jaGFubmVsQ2xpZW50cy5nZXQoY2gpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2xpZW50cykge1xuICAgICAgbGV0IGFyZ3NcbiAgICAgIGlmICh0aGlzLmluY2x1ZGVDaGFubmVsKSB7XG4gICAgICAgIGFyZ3MgPSBbbWVzc2FnZS5uYW1lLCBjaGFubmVsLCAuLi5tZXNzYWdlLmFyZ3NdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzID0gW21lc3NhZ2UubmFtZSwgLi4ubWVzc2FnZS5hcmdzXVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnNlbmRlciB8fCBjbGllbnQuaWQgIT09IG1lc3NhZ2Uuc2VuZGVyKSB7XG4gICAgICAgICAgY2xpZW50LmVtaXQoLi4uYXJncylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlclB1YnN1YkJyb2tlclxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbWl0dGVyUHVic3ViQnJva2VyLmpzIl0sIm5hbWVzIjpbIlByb21pc2UiLCJyZXF1aXJlIiwiUmVkaXMiLCJtc2dwYWNrIiwiRXZlbnRFbWl0dGVyIiwiUmVkaXNDb25uZWN0b3IiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJwdWIiLCJzdWIiLCJzdWJzY3JpYmUiLCJjYXRjaFJldHVybiIsIm9uIiwiX29uTWVzc2FnZSIsImJpbmQiLCJlbWl0IiwiYnVmIiwiZGF0YSIsImNoIiwidG9TdHJpbmciLCJwdWJsaXNoIiwidW5zdWJzY3JpYmUiLCJjbG9zZSIsImFsbCIsInF1aXQiLCJNZW1vcnlDb25uZWN0b3IiLCJyZXNvbHZlIiwidGhlbiIsIkVtaXR0ZXJQdWJzdWJCcm9rZXIiLCJjb25uZWN0IiwicHJlZml4IiwiaW5jbHVkZUNoYW5uZWwiLCJjbGllbnRDaGFubmVscyIsIk1hcCIsImNoYW5uZWxDbGllbnRzIiwiY29ubmVjdG9yIiwic2VyaWFsaXplIiwiX2Rpc3BhdGNoIiwiX2NoYW5uZWxBZGRDbGllbnQiLCJjbGllbnQiLCJjbGllbnRzIiwiZ2V0IiwiU2V0Iiwic2V0IiwiYWRkIiwiX2NoYW5uZWxSZW1vdmVDbGllbnQiLCJuY2xpZW50cyIsImRlbGV0ZSIsInNpemUiLCJfbWFrZU1lc3NhZ2UiLCJtc2ciLCJlbmNvZGUiLCJjaGFubmVsIiwiY2hhbm5lbHMiLCJ1bnN1YnNjcmliZWFsbCIsImVhY2giLCJuYW1lIiwiYXJncyIsInNlbmQiLCJzZW5kZXIiLCJpZCIsImdldFN1YnNjcmlwdGlvbnMiLCJyZXMiLCJwbGVuIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwiY2xlYXIiLCJtZXNzYWdlIiwiZGVjb2RlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFFQSxNQUFNQSxVQUFVQyxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxNQUFNQyxRQUFRRCxRQUFRLFNBQVIsQ0FBZDtBQUNBLE1BQU1FLFVBQVVG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LElBQWhCLEVBQXNCSixPQUF0Qiw0QkFBa0NnQixRQUFRWCxJQUExQztBQUNELE9BRkQsTUFFTztBQUNMQSxnQkFBUVcsUUFBUVosSUFBaEIsNEJBQXlCWSxRQUFRWCxJQUFqQztBQUNEO0FBQ0QsV0FBSyxJQUFJbEIsTUFBVCxJQUFtQkMsT0FBbkIsRUFBNEI7QUFDMUIsWUFBSSxDQUFDNEIsUUFBUVQsTUFBVCxJQUFtQnBCLE9BQU9xQixFQUFQLEtBQWNRLFFBQVFULE1BQTdDLEVBQXFEO0FBQ25EcEIsaUJBQU94QixJQUFQLGtDQUFlMEMsSUFBZjtBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQW5NNEM7O0FBdU0vQ2EsT0FBT0MsT0FBUCxHQUFpQjNDLG1CQUFqQiIsImZpbGUiOiJFbWl0dGVyUHVic3ViQnJva2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKCdibHVlYmlyZCcpXG5jb25zdCBSZWRpcyA9IHJlcXVpcmUoJ2lvcmVkaXMnKVxuY29uc3QgbXNncGFjayA9IHJlcXVpcmUoJ21zZ3BhY2stbGl0ZScpXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpXG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjb25uZWN0b3IgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdG9yXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcHVibGlzaFxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIERhdGEuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHN1YnNjcmliZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgdW5zdWJzY3JpYmVcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIGNsb3NlXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgbWVzc2FnZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IEV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBFdmVudCBkYXRhLlxuICovXG5cbi8qKlxuICogRXZlbnQgd2lsbCBiZSBsaXN0ZW5lZCBieSB7QGxpbmsgRW1pdHRlclB1YnN1YkJyb2tlcn0gaW5zdGFuY2UuXG4gKlxuICogQGV2ZW50IGVycm9yXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBFcnJvci5cbiAqL1xuXG5jbGFzcyBSZWRpc0Nvbm5lY3RvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMucHViID0gbmV3IFJlZGlzKG9wdGlvbnMpXG4gICAgdGhpcy5zdWIgPSBuZXcgUmVkaXMob3B0aW9ucylcbiAgICB0aGlzLnN1Yi5zdWJzY3JpYmUoKS5jYXRjaFJldHVybigpXG4gICAgdGhpcy5zdWIub24oJ21lc3NhZ2VCdWZmZXInLCB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKSlcbiAgICB0aGlzLnN1Yi5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLnB1Yi5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIF9vbk1lc3NhZ2UgKGJ1ZiwgZGF0YSkge1xuICAgIGxldCBjaCA9IGJ1Zi50b1N0cmluZygpXG4gICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgY2gsIGRhdGEpXG4gIH1cblxuICBwdWJsaXNoIChjaCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnB1Yi5wdWJsaXNoKGNoLCBkYXRhKVxuICB9XG5cbiAgc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiB0aGlzLnN1Yi5zdWJzY3JpYmUoY2gpXG4gIH1cblxuICB1bnN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gdGhpcy5zdWIudW5zdWJzY3JpYmUoY2gpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLnB1Yi5xdWl0KCksIHRoaXMuc3ViLnF1aXQoKV0pXG4gIH1cbn1cblxuY2xhc3MgTWVtb3J5Q29ubmVjdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpXG4gIH1cblxuICBwdWJsaXNoIChjaCwgZGF0YSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5lbWl0KCdtZXNzYWdlJywgY2gsIGRhdGEpKVxuICB9XG5cbiAgc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAgdW5zdWJzY3JpYmUgKGNoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbWl0dGVyUHVic3ViQnJva2VyLk9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29ubmVjdCBDb25uZWN0IHN0cmluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4PSdlbWl0dGVyLXB1YnN1Yi1icm9rZXI6J10gUHJlZml4LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVkZUNoYW5uZWw9ZmFsc2VdIEluY2x1ZGUgY2hhbm5lbCBhcyB0aGVcbiAqIGZpcnN0IGFyZ3VtZW50LlxuICogQHByb3BlcnR5IHtDb25uZWN0b3J9IFtjb25uZWN0b3JdIEN1c3RvbSBjb25uZWN0b3IgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqL1xuY2xhc3MgRW1pdHRlclB1YnN1YkJyb2tlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnJva2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJQdWJzdWJCcm9rZXIuT3B0aW9uc3xzdHJpbmd9IG9wdGlvbnMgT3B0aW9ucyBvciBhXG4gICAqIGNvbm5lY3QgaWYgYSBzdHJpbmcuIElmIGNvbm5lY3Qgc3RyaW5nIGlzIGVtcHR5LCB0aGVuIGFuXG4gICAqIGluLW1lbW9yeSBjb25uZWN0b3IgaXMgdXNlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICAgIGlmIChvcHRpb25zID09IG51bGwgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0geyBjb25uZWN0OiBvcHRpb25zIH1cbiAgICB9XG4gICAgdGhpcy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCAnZW1pdHRlci1wdWJzdWItYnJva2VyOidcbiAgICB0aGlzLmluY2x1ZGVDaGFubmVsID0gb3B0aW9ucy5pbmNsdWRlQ2hhbm5lbFxuICAgIHRoaXMuY2xpZW50Q2hhbm5lbHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLmNoYW5uZWxDbGllbnRzID0gbmV3IE1hcCgpXG4gICAgaWYgKG9wdGlvbnMuY29ubmVjdCB8fCBvcHRpb25zLmNvbm5lY3Rvcikge1xuICAgICAgdGhpcy5jb25uZWN0b3IgPSBvcHRpb25zLmNvbm5lY3RvciB8fCBuZXcgUmVkaXNDb25uZWN0b3Iob3B0aW9ucy5jb25uZWN0KVxuICAgICAgdGhpcy5zZXJpYWxpemUgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IE1lbW9yeUNvbm5lY3RvcigpXG4gICAgICB0aGlzLnNlcmlhbGl6ZSA9IGZhbHNlXG4gICAgfVxuICAgIHRoaXMuY29ubmVjdG9yLm9uKCdtZXNzYWdlJywgdGhpcy5fZGlzcGF0Y2guYmluZCh0aGlzKSlcbiAgICAvKipcbiAgICAgKiBDb25uZWN0b3IgZXJyb3IuIERvZXMgbm90IHRocm93IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZXJyb3JcbiAgICAgKiBAbWVtYmVyT2YgRW1pdHRlclB1YnN1YkJyb2tlclxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHRoaXMuY29ubmVjdG9yLm9uKCdlcnJvcicsIHRoaXMuZW1pdC5iaW5kKHRoaXMpKVxuICB9XG5cbiAgX2NoYW5uZWxBZGRDbGllbnQgKGNsaWVudCwgY2gpIHtcbiAgICBsZXQgY2xpZW50cyA9IHRoaXMuY2hhbm5lbENsaWVudHMuZ2V0KGNoKVxuICAgIGlmIChjbGllbnRzID09IG51bGwpIHtcbiAgICAgIGNsaWVudHMgPSBuZXcgU2V0KClcbiAgICAgIHRoaXMuY2hhbm5lbENsaWVudHMuc2V0KGNoLCBjbGllbnRzKVxuICAgICAgY2xpZW50cy5hZGQoY2xpZW50KVxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnN1YnNjcmliZShjaClcbiAgICB9IGVsc2Uge1xuICAgICAgY2xpZW50cy5hZGQoY2xpZW50KVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgX2NoYW5uZWxSZW1vdmVDbGllbnQgKGNsaWVudCwgY2gpIHtcbiAgICBsZXQgY2xpZW50cyA9IHRoaXMuY2hhbm5lbENsaWVudHMuZ2V0KGNoKVxuICAgIGxldCBuY2xpZW50c1xuICAgIGlmIChjbGllbnRzICE9IG51bGwpIHtcbiAgICAgIGNsaWVudHMuZGVsZXRlKGNsaWVudClcbiAgICAgIG5jbGllbnRzID0gY2xpZW50cy5zaXplXG4gICAgfVxuICAgIGlmIChuY2xpZW50cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnVuc3Vic2NyaWJlKGNoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cblxuICBfbWFrZU1lc3NhZ2UgKG1zZykge1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSA/IG1zZ3BhY2suZW5jb2RlKG1zZykgOiBtc2dcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGVtaXR0ZXIgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHN1YnNjcmliZSAoY2xpZW50LCBjaGFubmVsKSB7XG4gICAgbGV0IGNoYW5uZWxzID0gdGhpcy5jbGllbnRDaGFubmVscy5nZXQoY2xpZW50KVxuICAgIGlmICghY2hhbm5lbHMpIHtcbiAgICAgIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gICAgICB0aGlzLmNsaWVudENoYW5uZWxzLnNldChjbGllbnQsIGNoYW5uZWxzKVxuICAgIH1cbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBjaGFubmVscy5hZGQoY2gpXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxBZGRDbGllbnQoY2xpZW50LCBjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZW1pdHRlciBmcm9tIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGNsaWVudCBFbWl0dGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICB1bnN1YnNjcmliZSAoY2xpZW50LCBjaGFubmVsKSB7XG4gICAgbGV0IGNoYW5uZWxzID0gdGhpcy5jbGllbnRDaGFubmVscy5nZXQoY2xpZW50KVxuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGlmIChjaGFubmVscykge1xuICAgICAgY2hhbm5lbHMuZGVsZXRlKGNoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbFJlbW92ZUNsaWVudChjbGllbnQsIGNoKVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBlbWl0dGVyIGZyb20gYWxsIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgdW5zdWJzY3JpYmVhbGwgKGNsaWVudCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICB0aGlzLmNsaWVudENoYW5uZWxzLmRlbGV0ZShjbGllbnQpXG4gICAgaWYgKGNoYW5uZWxzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5lYWNoKFxuICAgICAgICBjaGFubmVscywgdGhpcy5fY2hhbm5lbFJlbW92ZUNsaWVudC5iaW5kKHRoaXMsIGNsaWVudCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGFuIGV2ZW50IHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBhcmdzIEFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgcHVibGlzaCAoY2hhbm5lbCwgbmFtZSwgLi4uYXJncykge1xuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGxldCBtc2cgPSB0aGlzLl9tYWtlTWVzc2FnZSh7bmFtZSwgYXJnc30pXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnB1Ymxpc2goY2gsIG1zZylcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGFuIGV2ZW50IHRvIGEgY2hhbm5lbCwgZXhjbHVkaW5nIHRoZSBzZW5kZXIuIFRoZSBjbGllbnRcbiAgICogb2JqZWN0IF9fTVVTVF9fIGhhdmUgYW4gdW5pcXVlIGBpZGAgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBhcmdzIEFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgc2VuZCAoY2xpZW50LCBjaGFubmVsLCBuYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IGNoID0gdGhpcy5wcmVmaXggKyBjaGFubmVsXG4gICAgbGV0IHNlbmRlciA9IGNsaWVudC5pZFxuICAgIGxldCBtc2cgPSB0aGlzLl9tYWtlTWVzc2FnZSh7c2VuZGVyLCBuYW1lLCBhcmdzfSlcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IucHVibGlzaChjaCwgbXNnKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY2xpZW50IHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHJldHVybiB7QXJyYXk8c3RyaW5nPn1cbiAgICovXG4gIGdldFN1YnNjcmlwdGlvbnMgKGNsaWVudCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBsZXQgcmVzID0gW11cbiAgICBpZiAoY2hhbm5lbHMpIHtcbiAgICAgIGxldCBwbGVuID0gdGhpcy5wcmVmaXgubGVuZ3RoXG4gICAgICBmb3IgKGxldCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG4gICAgICAgIHJlcy5wdXNoKGNoYW5uZWwuc2xpY2UocGxlbikpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYnJva2VyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICBjbG9zZSAoKSB7XG4gICAgdGhpcy5jaGFubmVsQ2xpZW50cy5jbGVhcigpXG4gICAgdGhpcy5jbGllbnRDaGFubmVscy5jbGVhcigpXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNsb3NlKClcbiAgfVxuXG4gIF9kaXNwYXRjaCAoY2gsIGRhdGEpIHtcbiAgICBsZXQgY2hhbm5lbCA9IGNoLnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcbiAgICBsZXQgbWVzc2FnZSA9IHRoaXMuc2VyaWFsaXplID8gbXNncGFjay5kZWNvZGUoZGF0YSkgOiBkYXRhXG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChjbGllbnRzKSB7XG4gICAgICBsZXQgYXJnc1xuICAgICAgaWYgKHRoaXMuaW5jbHVkZUNoYW5uZWwpIHtcbiAgICAgICAgYXJncyA9IFttZXNzYWdlLm5hbWUsIGNoYW5uZWwsIC4uLm1lc3NhZ2UuYXJnc11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MgPSBbbWVzc2FnZS5uYW1lLCAuLi5tZXNzYWdlLmFyZ3NdXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBjbGllbnQgb2YgY2xpZW50cykge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc2VuZGVyIHx8IGNsaWVudC5pZCAhPT0gbWVzc2FnZS5zZW5kZXIpIHtcbiAgICAgICAgICBjbGllbnQuZW1pdCguLi5hcmdzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyUHVic3ViQnJva2VyXG4iXX0=
{
"name": "emitter-pubsub-broker",
"version": "0.3.0",
"version": "0.4.0",
"private": false,

@@ -35,3 +35,2 @@ "description": "An utility for connecting EventEmitters via a pubsub.",

"dependencies": {
"babel-runtime": "^6.9.2",
"bluebird": "^3.3.5",

@@ -45,4 +44,3 @@ "eventemitter3": "^2.0.2",

"babel-cli": "^6.11.4",
"babel-plugin-transform-runtime": "^6.9.0",
"babel-preset-es2015": "^6.9.0",
"babel-preset-es2015-node4": "^2.1.0",
"chai": "^3.5.0",

@@ -54,3 +52,3 @@ "codecov": "^1.0.1",

"mocha": "^3.0.0",
"nyc": "^8.1.0",
"nyc": "^10.0.0",
"standard": "^8.0.0"

@@ -57,0 +55,0 @@ },

@@ -49,3 +49,3 @@

[API](https://an-sh.github.io/emitter-pubsub-broker/0.3/index.html)
[API](https://an-sh.github.io/emitter-pubsub-broker/0.4/index.html)
documentation is available online.

@@ -52,0 +52,0 @@

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc