kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
151 lines (145 loc) • 23.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ERROR_MSG = void 0;
exports.flattenDeps = flattenDeps;
exports.injector = injector;
exports.provideRecipesToInjector = provideRecipesToInjector;
exports.typeCheckRecipe = typeCheckRecipe;
exports.withState = withState;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _react = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib");
var _redux = require("redux");
var _window = require("global/window");
var _context = _interopRequireDefault(require("./context"));
var _excluded = ["state"]; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var MissingComp = function MissingComp() {
return /*#__PURE__*/_react["default"].createElement("div", null);
};
var ERROR_MSG = exports.ERROR_MSG = {
wrongRecipeType: "injectComponents takes an array of factories replacement pairs as input, " + "each pair be a array as [originalFactory, replacement].",
noDep: function noDep(fac, parent) {
return "".concat(fac.name, " is required as a dependency of ").concat(parent.name, ", ") + "but is not provided to injectComponents. It will not be rendered.";
},
notFunc: 'factory and its replacement should be a function'
};
function injector() {
var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
var cache = new Map(); // map<factory, factory -> ?>
var _get = function get(fac, parent) {
var factory = map.get(fac);
// factory is not injected
if (!factory) {
_window.console.error(ERROR_MSG.noDep(fac, parent));
return MissingComp;
}
// check if custom factory deps is declared
var instances = cache.get(factory) || factory.apply(void 0, (0, _toConsumableArray2["default"])(factory.deps ? factory.deps.map(function (dep) {
return _get(dep, factory);
}) : []));
cache.set(fac, instances);
return instances;
};
// if you have two functions that happen to have the exactly same text
// it will be override: 2018-02-05
return {
provide: function provide(factory, replacement) {
if (!typeCheckRecipe([factory, replacement])) {
return injector(map);
}
return injector(new Map(map).set(factory, replacement));
},
get: _get
};
}
// entryPoint
function flattenDeps(allDeps, factory) {
var addToDeps = allDeps.includes(factory) ? allDeps : allDeps.concat([factory]);
return Array.isArray(factory.deps) && factory.deps.length ? factory.deps.reduce(function (accu, dep) {
return flattenDeps(accu, dep);
}, addToDeps) : addToDeps;
}
function provideRecipesToInjector(recipes, appInjector) {
var provided = new Map();
var injector = recipes.reduce(function (inj, recipe) {
var _inj;
if (!typeCheckRecipe(recipe)) {
return inj;
}
// collect dependencies of custom factories, if there is any.
// Add them to the appInjector
var customDependencies = flattenDeps([], recipe[1]);
inj = customDependencies.reduce(function (ij, factory) {
if (provided.get(factory)) {
_window.console.warn("".concat(factory.name, " already injected from ").concat(provided.get(factory).name, ", injecting ").concat(recipe[0].name, " after ").concat(provided.get(factory).name, " will override it"));
}
return ij.provide(factory, factory);
}, inj);
provided.set(recipe[0], recipe[1]);
return (_inj = inj).provide.apply(_inj, (0, _toConsumableArray2["default"])(recipe));
}, appInjector);
// make sure all component instance are cached
provided.forEach(function (v) {
injector.get(v);
});
return injector;
}
function typeCheckRecipe(recipe) {
if (!Array.isArray(recipe) || recipe.length < 2) {
_window.console.error('Error injecting [factory, replacement]', recipe);
_window.console.error(ERROR_MSG.wrongRecipeType);
return false;
}
var _recipe = (0, _slicedToArray2["default"])(recipe, 2),
factory = _recipe[0],
replacement = _recipe[1];
if (typeof factory !== 'function') {
_window.console.error('Error injecting factory: ', factory);
_window.console.error(ERROR_MSG.notFunc);
return false;
} else if (typeof replacement !== 'function') {
_window.console.error('Error injecting replacement for: ', factory);
_window.console.error(ERROR_MSG.notFunc);
return false;
}
return true;
}
var identity = function identity(state) {
return state;
};
// Helper to add reducer state to custom component
function withState() {
var lenses = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var mapStateToProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;
var actions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
return function (Component) {
var WrappedComponent = function WrappedComponent(_ref) {
var state = _ref.state,
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
return /*#__PURE__*/_react["default"].createElement(_context["default"].Consumer, null, function (context) {
return /*#__PURE__*/_react["default"].createElement(Component, lenses.reduce(function (totalState, lens) {
return _objectSpread(_objectSpread({}, totalState), lens(context.selector(state)));
}, props));
});
};
return (0, _lib.connect)(function (state) {
return _objectSpread(_objectSpread({}, mapStateToProps(state)), {}, {
state: state
});
}, function (dispatch) {
return Object.keys(actions).reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, (0, _redux.bindActionCreators)(actions[key], dispatch)));
}, {});
})(WrappedComponent);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9saWIiLCJfcmVkdXgiLCJfd2luZG93IiwiX2NvbnRleHQiLCJfZXhjbHVkZWQiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIk1pc3NpbmdDb21wIiwiY3JlYXRlRWxlbWVudCIsIkVSUk9SX01TRyIsImV4cG9ydHMiLCJ3cm9uZ1JlY2lwZVR5cGUiLCJub0RlcCIsImZhYyIsInBhcmVudCIsImNvbmNhdCIsIm5hbWUiLCJub3RGdW5jIiwiaW5qZWN0b3IiLCJtYXAiLCJ1bmRlZmluZWQiLCJNYXAiLCJjYWNoZSIsImdldCIsImZhY3RvcnkiLCJDb25zb2xlIiwiZXJyb3IiLCJpbnN0YW5jZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZGVwcyIsImRlcCIsInNldCIsInByb3ZpZGUiLCJyZXBsYWNlbWVudCIsInR5cGVDaGVja1JlY2lwZSIsImZsYXR0ZW5EZXBzIiwiYWxsRGVwcyIsImFkZFRvRGVwcyIsImluY2x1ZGVzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVkdWNlIiwiYWNjdSIsInByb3ZpZGVSZWNpcGVzVG9JbmplY3RvciIsInJlY2lwZXMiLCJhcHBJbmplY3RvciIsInByb3ZpZGVkIiwiaW5qIiwicmVjaXBlIiwiX2luaiIsImN1c3RvbURlcGVuZGVuY2llcyIsImlqIiwid2FybiIsInYiLCJfcmVjaXBlIiwiX3NsaWNlZFRvQXJyYXkyIiwiaWRlbnRpdHkiLCJzdGF0ZSIsIndpdGhTdGF0ZSIsImxlbnNlcyIsIm1hcFN0YXRlVG9Qcm9wcyIsImFjdGlvbnMiLCJDb21wb25lbnQiLCJXcmFwcGVkQ29tcG9uZW50IiwiX3JlZiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsIkNvbnN1bWVyIiwiY29udGV4dCIsInRvdGFsU3RhdGUiLCJsZW5zIiwic2VsZWN0b3IiLCJjb25uZWN0IiwiZGlzcGF0Y2giLCJrZXkiLCJiaW5kQWN0aW9uQ3JlYXRvcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvaW5qZWN0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7YmluZEFjdGlvbkNyZWF0b3JzfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQge1xuICBNYXBTdGF0ZVRvUHJvcHNQYXJhbSxcbiAgTWFwRGlzcGF0Y2hUb1Byb3BzUGFyYW0sXG4gIEluZmVyYWJsZUNvbXBvbmVudEVuaGFuY2VyV2l0aFByb3BzXG59IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBLZXBsZXJHbENvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcblxuZXhwb3J0IHR5cGUgRmFjdG9yeUVsZW1lbnQgPSAoLi4uYXJncykgPT4gUmVhY3QuQ29tcG9uZW50VHlwZTtcbmV4cG9ydCB0eXBlIEZhY3RvcnkgPSBGYWN0b3J5RWxlbWVudCAmIHtcbiAgZGVwczogRmFjdG9yeUVsZW1lbnRbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEluamVjdG9yVHlwZSA9IHtcbiAgcHJvdmlkZTogKGZhY3Rvcnk6IGFueSwgcmVwbGFjZW1lbnQ6IGFueSkgPT4gSW5qZWN0b3JUeXBlO1xuICBnZXQ6IChmYWM6IGFueSwgcGFyZW50PzogYW55KSA9PiBhbnk7XG59O1xuXG5jb25zdCBNaXNzaW5nQ29tcCA9ICgpID0+IDxkaXYgLz47XG5cbmV4cG9ydCBjb25zdCBFUlJPUl9NU0cgPSB7XG4gIHdyb25nUmVjaXBlVHlwZTpcbiAgICBgaW5qZWN0Q29tcG9uZW50cyB0YWtlcyBhbiBhcnJheSBvZiBmYWN0b3JpZXMgcmVwbGFjZW1lbnQgcGFpcnMgYXMgaW5wdXQsIGAgK1xuICAgIGBlYWNoIHBhaXIgYmUgYSBhcnJheSBhcyBbb3JpZ2luYWxGYWN0b3J5LCByZXBsYWNlbWVudF0uYCxcblxuICBub0RlcDogKGZhYywgcGFyZW50KSA9PlxuICAgIGAke2ZhYy5uYW1lfSBpcyByZXF1aXJlZCBhcyBhIGRlcGVuZGVuY3kgb2YgJHtwYXJlbnQubmFtZX0sIGAgK1xuICAgIGBidXQgaXMgbm90IHByb3ZpZGVkIHRvIGluamVjdENvbXBvbmVudHMuIEl0IHdpbGwgbm90IGJlIHJlbmRlcmVkLmAsXG5cbiAgbm90RnVuYzogJ2ZhY3RvcnkgYW5kIGl0cyByZXBsYWNlbWVudCBzaG91bGQgYmUgYSBmdW5jdGlvbidcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RvcihtYXAgPSBuZXcgTWFwKCkpOiBJbmplY3RvclR5cGUge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXAoKTsgLy8gbWFwPGZhY3RvcnksIGZhY3RvcnkgLT4gPz5cbiAgY29uc3QgZ2V0ID0gKGZhYywgcGFyZW50KSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG1hcC5nZXQoZmFjKTtcbiAgICAvLyBmYWN0b3J5IGlzIG5vdCBpbmplY3RlZFxuICAgIGlmICghZmFjdG9yeSkge1xuICAgICAgQ29uc29sZS5lcnJvcihFUlJPUl9NU0cubm9EZXAoZmFjLCBwYXJlbnQpKTtcbiAgICAgIHJldHVybiBNaXNzaW5nQ29tcDtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiBjdXN0b20gZmFjdG9yeSBkZXBzIGlzIGRlY2xhcmVkXG4gICAgY29uc3QgaW5zdGFuY2VzID1cbiAgICAgIGNhY2hlLmdldChmYWN0b3J5KSB8fFxuICAgICAgZmFjdG9yeSguLi4oZmFjdG9yeS5kZXBzID8gZmFjdG9yeS5kZXBzLm1hcChkZXAgPT4gZ2V0KGRlcCwgZmFjdG9yeSkpIDogW10pKTtcblxuICAgIGNhY2hlLnNldChmYWMsIGluc3RhbmNlcyk7XG4gICAgcmV0dXJuIGluc3RhbmNlcztcbiAgfTtcblxuICAvLyBpZiB5b3UgaGF2ZSB0d28gZnVuY3Rpb25zIHRoYXQgaGFwcGVuIHRvIGhhdmUgdGhlIGV4YWN0bHkgc2FtZSB0ZXh0XG4gIC8vIGl0IHdpbGwgYmUgb3ZlcnJpZGU6IDIwMTgtMDItMDVcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiAoZmFjdG9yeSwgcmVwbGFjZW1lbnQpID0+IHtcbiAgICAgIGlmICghdHlwZUNoZWNrUmVjaXBlKFtmYWN0b3J5LCByZXBsYWNlbWVudF0pKSB7XG4gICAgICAgIHJldHVybiBpbmplY3RvcihtYXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluamVjdG9yKG5ldyBNYXAobWFwKS5zZXQoZmFjdG9yeSwgcmVwbGFjZW1lbnQpKTtcbiAgICB9LFxuICAgIGdldFxuICB9O1xufVxuXG4vLyBlbnRyeVBvaW50XG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkRlcHMoYWxsRGVwczogRmFjdG9yeVtdLCBmYWN0b3J5OiBhbnkpOiBGYWN0b3J5W10ge1xuICBjb25zdCBhZGRUb0RlcHMgPSBhbGxEZXBzLmluY2x1ZGVzKGZhY3RvcnkpID8gYWxsRGVwcyA6IGFsbERlcHMuY29uY2F0KFtmYWN0b3J5XSk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGZhY3RvcnkuZGVwcykgJiYgZmFjdG9yeS5kZXBzLmxlbmd0aFxuICAgID8gZmFjdG9yeS5kZXBzLnJlZHVjZSgoYWNjdSwgZGVwKSA9PiBmbGF0dGVuRGVwcyhhY2N1LCBkZXApLCBhZGRUb0RlcHMpXG4gICAgOiBhZGRUb0RlcHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUmVjaXBlc1RvSW5qZWN0b3IocmVjaXBlczogW0ZhY3RvcnksIEZhY3RvcnldW10sIGFwcEluamVjdG9yOiBJbmplY3RvclR5cGUpIHtcbiAgY29uc3QgcHJvdmlkZWQgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgaW5qZWN0b3IgPSByZWNpcGVzLnJlZHVjZSgoaW5qLCByZWNpcGUpID0+IHtcbiAgICBpZiAoIXR5cGVDaGVja1JlY2lwZShyZWNpcGUpKSB7XG4gICAgICByZXR1cm4gaW5qO1xuICAgIH1cblxuICAgIC8vIGNvbGxlY3QgZGVwZW5kZW5jaWVzIG9mIGN1c3RvbSBmYWN0b3JpZXMsIGlmIHRoZXJlIGlzIGFueS5cbiAgICAvLyBBZGQgdGhlbSB0byB0aGUgYXBwSW5qZWN0b3JcbiAgICBjb25zdCBjdXN0b21EZXBlbmRlbmNpZXMgPSBmbGF0dGVuRGVwcyhbXSwgcmVjaXBlWzFdKTtcbiAgICBpbmogPSBjdXN0b21EZXBlbmRlbmNpZXMucmVkdWNlKChpaiwgZmFjdG9yeSkgPT4ge1xuICAgICAgaWYgKHByb3ZpZGVkLmdldChmYWN0b3J5KSkge1xuICAgICAgICBDb25zb2xlLndhcm4oXG4gICAgICAgICAgYCR7ZmFjdG9yeS5uYW1lfSBhbHJlYWR5IGluamVjdGVkIGZyb20gJHtwcm92aWRlZC5nZXQoZmFjdG9yeSkubmFtZX0sIGluamVjdGluZyAke1xuICAgICAgICAgICAgcmVjaXBlWzBdLm5hbWVcbiAgICAgICAgICB9IGFmdGVyICR7cHJvdmlkZWQuZ2V0KGZhY3RvcnkpLm5hbWV9IHdpbGwgb3ZlcnJpZGUgaXRgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWoucHJvdmlkZShmYWN0b3J5LCBmYWN0b3J5KTtcbiAgICB9LCBpbmopO1xuXG4gICAgcHJvdmlkZWQuc2V0KHJlY2lwZVswXSwgcmVjaXBlWzFdKTtcbiAgICByZXR1cm4gaW5qLnByb3ZpZGUoLi4ucmVjaXBlKTtcbiAgfSwgYXBwSW5qZWN0b3IpO1xuXG4gIC8vIG1ha2Ugc3VyZSBhbGwgY29tcG9uZW50IGluc3RhbmNlIGFyZSBjYWNoZWRcbiAgcHJvdmlkZWQuZm9yRWFjaCh2ID0+IHtcbiAgICBpbmplY3Rvci5nZXQodik7XG4gIH0pO1xuXG4gIHJldHVybiBpbmplY3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVDaGVja1JlY2lwZShyZWNpcGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJlY2lwZSkgfHwgcmVjaXBlLmxlbmd0aCA8IDIpIHtcbiAgICBDb25zb2xlLmVycm9yKCdFcnJvciBpbmplY3RpbmcgW2ZhY3RvcnksIHJlcGxhY2VtZW50XScsIHJlY2lwZSk7XG4gICAgQ29uc29sZS5lcnJvcihFUlJPUl9NU0cud3JvbmdSZWNpcGVUeXBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBbZmFjdG9yeSwgcmVwbGFjZW1lbnRdID0gcmVjaXBlO1xuICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICBDb25zb2xlLmVycm9yKCdFcnJvciBpbmplY3RpbmcgZmFjdG9yeTogJywgZmFjdG9yeSk7XG4gICAgQ29uc29sZS5lcnJvcihFUlJPUl9NU0cubm90RnVuYyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZXBsYWNlbWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIENvbnNvbGUuZXJyb3IoJ0Vycm9yIGluamVjdGluZyByZXBsYWNlbWVudCBmb3I6ICcsIGZhY3RvcnkpO1xuICAgIENvbnNvbGUuZXJyb3IoRVJST1JfTVNHLm5vdEZ1bmMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhTdGF0ZTxSb290U3RhdGU+IHtcbiAgPFRTdGF0ZVByb3BzID0gb2JqZWN0LCBURGlzcGF0Y2hQcm9wcyA9IG9iamVjdCwgVE93blByb3BzID0gb2JqZWN0LCBTdGF0ZSA9IFJvb3RTdGF0ZT4oXG4gICAgbGVuc2VzOiBhbnlbXSxcbiAgICBtYXBTdGF0ZVRvUHJvcHM6IE1hcFN0YXRlVG9Qcm9wc1BhcmFtPFRTdGF0ZVByb3BzLCBUT3duUHJvcHMsIFN0YXRlPixcbiAgICBtYXBEaXNwYXRjaFRvUHJvcHM/OiBNYXBEaXNwYXRjaFRvUHJvcHNQYXJhbTxURGlzcGF0Y2hQcm9wcywgVE93blByb3BzPlxuICApOiBJbmZlcmFibGVDb21wb25lbnRFbmhhbmNlcldpdGhQcm9wczxUU3RhdGVQcm9wcyAmIFREaXNwYXRjaFByb3BzLCBUT3duUHJvcHM+O1xufVxuXG5jb25zdCBpZGVudGl0eSA9IHN0YXRlID0+IHN0YXRlO1xuLy8gSGVscGVyIHRvIGFkZCByZWR1Y2VyIHN0YXRlIHRvIGN1c3RvbSBjb21wb25lbnRcbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3RhdGUobGVuc2VzOiBhbnlbXSA9IFtdLCBtYXBTdGF0ZVRvUHJvcHMgPSBpZGVudGl0eSwgYWN0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBDb21wb25lbnQgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSAoe3N0YXRlLCAuLi5wcm9wc30pID0+IChcbiAgICAgIDxLZXBsZXJHbENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIHtjb250ZXh0ID0+IChcbiAgICAgICAgICA8Q29tcG9uZW50XG4gICAgICAgICAgICB7Li4ubGVuc2VzLnJlZHVjZShcbiAgICAgICAgICAgICAgKHRvdGFsU3RhdGUsIGxlbnMpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udG90YWxTdGF0ZSxcbiAgICAgICAgICAgICAgICAuLi5sZW5zKGNvbnRleHQuc2VsZWN0b3Ioc3RhdGUpKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvS2VwbGVyR2xDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG5cbiAgICByZXR1cm4gY29ubmVjdChcbiAgICAgIHN0YXRlID0+ICh7Li4ubWFwU3RhdGVUb1Byb3BzKHN0YXRlKSwgc3RhdGV9KSxcbiAgICAgIGRpc3BhdGNoID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGFjdGlvbnMpLnJlZHVjZShcbiAgICAgICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICAgIFtrZXldOiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uc1trZXldLCBkaXNwYXRjaClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApXG4gICAgKShXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQU1BLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUF3QyxJQUFBSyxTQUFBLGNBWnhDO0FBQ0E7QUFBQSxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEs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
;