UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

224 lines (212 loc) 26.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.DEFAULT_ERROR_MESSAGE = void 0; exports.arrayDifference = arrayDifference; exports.arrayInsert = arrayInsert; exports.camelToTitle = camelToTitle; exports.camelize = void 0; exports.filterObjectByPredicate = filterObjectByPredicate; exports.findById = findById; exports.generateHashIdFromString = generateHashIdFromString; exports.getError = getError; exports.hasMobileWidth = hasMobileWidth; exports.hasPortableWidth = hasPortableWidth; exports.insertValue = void 0; exports.isChrome = isChrome; exports.isFunction = isFunction; exports.isObject = isObject; exports.isPlainObject = isPlainObject; exports.isTest = isTest; exports.set = void 0; var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _window = _interopRequireDefault(require("global/window")); var _strings = require("./strings"); 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Generate a hash string based on string * @param str * @returns */ function generateHashIdFromString(str) { // generate hash string based on string var hash = 0; var i; var chr; var len; if (str.length === 0) return hash.toString(); for (i = 0, len = str.length; i < len; i++) { chr = str.charCodeAt(i); // eslint-disable-next-line no-bitwise hash = (hash << 5) - hash + chr; // eslint-disable-next-line no-bitwise hash |= 0; // Convert to 32bit integer } return hash.toString(36); } /** * Detect chrome * @returns {boolean} - yes or no */ function isChrome() { // Chrome 1+ return _window["default"].chrome && _window["default"].chrome.webstore; } /** * Convert camel style names to title * strokeColor -> Stroke Color * @param {string} str * @returns {string} */ function camelToTitle(str) { var breakWord = str.replace(/([A-Z])/g, ' $1'); return (0, _strings.capitalizeFirstLetter)(breakWord); } /** * Convert names to camel style * Stroke Color -> strokeColor * @param {string} str * @returns {string} */ var camelize = exports.camelize = function camelize(str) { return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) { if (Number(match) === 0) return ''; // or if (/\s+/.test(match)) for white spaces return index === 0 ? match.toLowerCase() : match.toUpperCase(); }); }; /** * immutably insert value to an Array or Object * @param {Array|Object} obj * @param {Number|String} key * @param {*} value * @returns {Array|Object} */ var insertValue = exports.insertValue = function insertValue(obj, key, value) { if (Array.isArray(obj) && typeof key === 'number') { return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length))); } return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value)); }; /** * check if value is a loose object including a plain object, array, function * @param {*} value */ function isObject(value) { return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function'); } /** * whether is an object * @returns {boolean} - yes or no */ function isPlainObject(obj) { return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj); } var _setPath = function setPath(_ref, value, obj) { var _ref2 = (0, _toArray2["default"])(_ref), key = _ref2[0], next = _ref2.slice(1); // is Object allows js object, array and function if (!isObject(obj)) { return obj; } if (next.length === 0) { return insertValue(obj, key, value); } // @ts-ignore return insertValue(obj, key, _setPath(next, value, Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : {})); }; /** * Immutable version of _.set * @param {Array<String|Number>} path * @param {*} value * @param {Object} obj * @returns {Object} */ // @ts-ignore var set = exports.set = function set(path, value, obj) { return obj === null ? obj : _setPath(path, value, obj); }; var DEFAULT_ERROR_MESSAGE = exports.DEFAULT_ERROR_MESSAGE = 'Something went wrong'; /** * Get error information of unknown type * Extracts as much human readable information as possible * Ensure result is an Error object suitable for throw or promise rejection * * @private * @param {*} err - Unknown error * @return {string} - human readable error msg */ function getError(err) { var defaultMessage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_ERROR_MESSAGE; if (!err) { return defaultMessage; } if (typeof err === 'string') { return err; } else if (err instanceof Error) { return err.message; } else if ((0, _typeof2["default"])(err) === 'object') { return Object.prototype.hasOwnProperty.call(err, 'message') ? getError(err.message) : Object.prototype.hasOwnProperty.call(err, 'error') ? getError(err.error) : Object.prototype.hasOwnProperty.call(err, 'err') ? getError(err.err) : JSON.stringify(err); } return defaultMessage; } function arrayInsert(arr, index, val) { if (!Array.isArray(arr)) { return arr; } return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), [val], (0, _toConsumableArray2["default"])(arr.slice(index))); } function hasMobileWidth(breakPointValues) { var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.palm, "px)")); return mobileWidth.matches; } function hasPortableWidth(breakPointValues) { var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.desk, "px)")); return mobileWidth.matches; } function isTest() { var _globalThis$process; return ((_globalThis$process = globalThis.process) === null || _globalThis$process === void 0 || (_globalThis$process = _globalThis$process.env) === null || _globalThis$process === void 0 ? void 0 : _globalThis$process.NODE_ENV) === 'test'; } /** * Filters an object by an arbitrary predicate * Returns a new object containing all elements that match the predicate * @param {Object} obj Object to be filtered * @param {Function} predicate Predicate by which the object will be filtered * @returns {Object} */ function filterObjectByPredicate(obj, predicate) { return Object.entries(obj).reduce(function (acc, entry) { return predicate(entry[0], entry[1]) ? _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], entry[1])) : acc; }, {}); } function isFunction(func) { return typeof func === 'function'; } function findById(id) { return function (arr) { return arr.find(function (a) { return a.id === id; }); }; } /** * Returns array difference from */ function arrayDifference(source) { var initial = []; return function (compare) { return source.reduce(function (acc, element) { var foundElement = findById(element.id)(compare); return foundElement ? [].concat((0, _toConsumableArray2["default"])(acc), [foundElement]) : acc; }, initial); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3RyaW5ncyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJjaHIiLCJsZW4iLCJ0b1N0cmluZyIsImNoYXJDb2RlQXQiLCJpc0Nocm9tZSIsIldpbmRvdyIsImNocm9tZSIsIndlYnN0b3JlIiwiY2FtZWxUb1RpdGxlIiwiYnJlYWtXb3JkIiwicmVwbGFjZSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNhbWVsaXplIiwiZXhwb3J0cyIsIm1hdGNoIiwiaW5kZXgiLCJOdW1iZXIiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaW5zZXJ0VmFsdWUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzbGljZSIsImlzT2JqZWN0IiwiX3R5cGVvZjIiLCJpc1BsYWluT2JqZWN0Iiwic2V0UGF0aCIsIl9yZWYiLCJfcmVmMiIsIl90b0FycmF5MiIsIm5leHQiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzZXQiLCJwYXRoIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFIiwiZ2V0RXJyb3IiLCJlcnIiLCJkZWZhdWx0TWVzc2FnZSIsInVuZGVmaW5lZCIsIkVycm9yIiwibWVzc2FnZSIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImFycmF5SW5zZXJ0IiwiYXJyIiwidmFsIiwiaGFzTW9iaWxlV2lkdGgiLCJicmVha1BvaW50VmFsdWVzIiwibW9iaWxlV2lkdGgiLCJtYXRjaE1lZGlhIiwicGFsbSIsIm1hdGNoZXMiLCJoYXNQb3J0YWJsZVdpZHRoIiwiZGVzayIsImlzVGVzdCIsIl9nbG9iYWxUaGlzJHByb2Nlc3MiLCJnbG9iYWxUaGlzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiZmlsdGVyT2JqZWN0QnlQcmVkaWNhdGUiLCJwcmVkaWNhdGUiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiZW50cnkiLCJpc0Z1bmN0aW9uIiwiZnVuYyIsImZpbmRCeUlkIiwiaWQiLCJmaW5kIiwiYSIsImFycmF5RGlmZmVyZW5jZSIsInNvdXJjZSIsImluaXRpYWwiLCJjb21wYXJlIiwiZWxlbWVudCIsImZvdW5kRWxlbWVudCJdLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgV2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJy4vc3RyaW5ncyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBoYXNoIHN0cmluZyBiYXNlZCBvbiBzdHJpbmdcbiAqIEBwYXJhbSBzdHJcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUhhc2hJZEZyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBnZW5lcmF0ZSBoYXNoIHN0cmluZyBiYXNlZCBvbiBzdHJpbmdcbiAgbGV0IGhhc2ggPSAwO1xuICBsZXQgaTtcbiAgbGV0IGNocjtcbiAgbGV0IGxlbjtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiBoYXNoLnRvU3RyaW5nKCk7XG4gIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNociA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNocjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIGhhc2gudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIERldGVjdCBjaHJvbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaHJvbWUoKTogYm9vbGVhbiB7XG4gIC8vIENocm9tZSAxK1xuICByZXR1cm4gV2luZG93LmNocm9tZSAmJiBXaW5kb3cuY2hyb21lLndlYnN0b3JlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY2FtZWwgc3R5bGUgbmFtZXMgdG8gdGl0bGVcbiAqIHN0cm9rZUNvbG9yIC0+IFN0cm9rZSBDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9UaXRsZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJyZWFrV29yZCA9IHN0ci5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKTtcbiAgcmV0dXJuIGNhcGl0YWxpemVGaXJzdExldHRlcihicmVha1dvcmQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgbmFtZXMgdG8gY2FtZWwgc3R5bGVcbiAqIFN0cm9rZSBDb2xvciAtPiBzdHJva2VDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNhbWVsaXplID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcd3xcXHMrKS9nLCAobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgaWYgKE51bWJlcihtYXRjaCkgPT09IDApIHJldHVybiAnJzsgLy8gb3IgaWYgKC9cXHMrLy50ZXN0KG1hdGNoKSkgZm9yIHdoaXRlIHNwYWNlc1xuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IG1hdGNoLnRvTG93ZXJDYXNlKCkgOiBtYXRjaC50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogaW1tdXRhYmx5IGluc2VydCB2YWx1ZSB0byBhbiBBcnJheSBvciBPYmplY3RcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5XG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fVxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0VmFsdWUgPSA8VCBleHRlbmRzIGFueVtdIHwgb2JqZWN0PihcbiAgb2JqOiBULFxuICBrZXk6IG51bWJlciB8IHN0cmluZyxcbiAgdmFsdWU6IGFueVxuKTogVCA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gWy4uLm9iai5zbGljZSgwLCBrZXkpLCB2YWx1ZSwgLi4ub2JqLnNsaWNlKGtleSArIDEsIG9iai5sZW5ndGgpXSBhcyBUO1xuICB9XG5cbiAgcmV0dXJuIHsuLi5vYmosIFtrZXldOiB2YWx1ZX07XG59O1xuXG4vKipcbiAqIGNoZWNrIGlmIHZhbHVlIGlzIGEgbG9vc2Ugb2JqZWN0IGluY2x1ZGluZyBhIHBsYWluIG9iamVjdCwgYXJyYXksIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiB3aGV0aGVyIGlzIGFuIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0geWVzIG9yIG5vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiBvYmogPT09IE9iamVjdChvYmopICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbn1cblxuY29uc3Qgc2V0UGF0aCA9IDxUIGV4dGVuZHMgYW55W10gfCBvYmplY3Q+KFxuICBba2V5LCAuLi5uZXh0XTogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgdmFsdWU6IGFueSxcbiAgb2JqOiBvYmplY3QgfCBhbnlbXVxuKTogVCA9PiB7XG4gIC8vIGlzIE9iamVjdCBhbGxvd3MganMgb2JqZWN0LCBhcnJheSBhbmQgZnVuY3Rpb25cbiAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIG9iaiBhcyBUO1xuICB9XG5cbiAgaWYgKG5leHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGluc2VydFZhbHVlKG9iaiwga2V5LCB2YWx1ZSkgYXMgVDtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGluc2VydFZhbHVlKFxuICAgIG9iaixcbiAgICBrZXksXG4gICAgc2V0UGF0aChuZXh0LCB2YWx1ZSwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSA/IG9ialtrZXldIDoge30pXG4gICk7XG59O1xuXG4vKipcbiAqIEltbXV0YWJsZSB2ZXJzaW9uIG9mIF8uc2V0XG4gKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3Qgc2V0ID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4ocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgb2JqOiBUKTogVCA9PlxuICBvYmogPT09IG51bGwgPyBvYmogOiBzZXRQYXRoKHBhdGgsIHZhbHVlLCBvYmopO1xuXG50eXBlIEVycm9yT2JqZWN0ID0ge1xuICBlcnJvcj86IGFueTtcbiAgZXJyPzogYW55O1xuICBtZXNzYWdlPzogYW55O1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdTb21ldGhpbmcgd2VudCB3cm9uZyc7XG5cbi8qKlxuICogR2V0IGVycm9yIGluZm9ybWF0aW9uIG9mIHVua25vd24gdHlwZVxuICogRXh0cmFjdHMgYXMgbXVjaCBodW1hbiByZWFkYWJsZSBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZVxuICogRW5zdXJlIHJlc3VsdCBpcyBhbiBFcnJvciBvYmplY3Qgc3VpdGFibGUgZm9yIHRocm93IG9yIHByb21pc2UgcmVqZWN0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gIGVyciAtIFVua25vd24gZXJyb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gLSBodW1hbiByZWFkYWJsZSBlcnJvciBtc2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yKFxuICBlcnI/OiBFcnJvciB8IEVycm9yT2JqZWN0IHwgc3RyaW5nLFxuICBkZWZhdWx0TWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFXG4pOiBzdHJpbmcge1xuICBpZiAoIWVycikge1xuICAgIHJldHVybiBkZWZhdWx0TWVzc2FnZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnI7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVyciwgJ21lc3NhZ2UnKVxuICAgICAgPyBnZXRFcnJvcihlcnIubWVzc2FnZSlcbiAgICAgIDogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVyciwgJ2Vycm9yJylcbiAgICAgID8gZ2V0RXJyb3IoZXJyLmVycm9yKVxuICAgICAgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnZXJyJylcbiAgICAgID8gZ2V0RXJyb3IoZXJyLmVycilcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0TWVzc2FnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5SW5zZXJ0PFQ+KGFycjogVFtdLCBpbmRleDogbnVtYmVyLCB2YWw6IFQpOiBUW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICByZXR1cm4gWy4uLmFyci5zbGljZSgwLCBpbmRleCksIHZhbCwgLi4uYXJyLnNsaWNlKGluZGV4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNNb2JpbGVXaWR0aChicmVha1BvaW50VmFsdWVzOiB7cGFsbTogbnVtYmVyOyBkZXNrOiBudW1iZXJ9KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vYmlsZVdpZHRoID0gV2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7YnJlYWtQb2ludFZhbHVlcy5wYWxtfXB4KWApO1xuICByZXR1cm4gbW9iaWxlV2lkdGgubWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvcnRhYmxlV2lkdGgoYnJlYWtQb2ludFZhbHVlczoge3BhbG06IG51bWJlcjsgZGVzazogbnVtYmVyfSk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2JpbGVXaWR0aCA9IFdpbmRvdy5tYXRjaE1lZGlhKGAobWF4LXdpZHRoOiAke2JyZWFrUG9pbnRWYWx1ZXMuZGVza31weClgKTtcbiAgcmV0dXJuIG1vYmlsZVdpZHRoLm1hdGNoZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3QoKTogYm9vbGVhbiB7XG4gIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3M/LmVudj8uTk9ERV9FTlYgPT09ICd0ZXN0Jztcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIG9iamVjdCBieSBhbiBhcmJpdHJhcnkgcHJlZGljYXRlXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBjb250YWluaW5nIGFsbCBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogT2JqZWN0IHRvIGJlIGZpbHRlcmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgUHJlZGljYXRlIGJ5IHdoaWNoIHRoZSBvYmplY3Qgd2lsbCBiZSBmaWx0ZXJlZFxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlck9iamVjdEJ5UHJlZGljYXRlKG9iaiwgcHJlZGljYXRlKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvYmopLnJlZHVjZShcbiAgICAoYWNjLCBlbnRyeSkgPT4gKHByZWRpY2F0ZShlbnRyeVswXSwgZW50cnlbMV0pID8gey4uLmFjYywgW2VudHJ5WzBdXTogZW50cnlbMV19IDogYWNjKSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRCeUlkKGlkOiBzdHJpbmcpOiA8WCBleHRlbmRzIHtpZDogc3RyaW5nfT4oYXJyOiBYW10pID0+IFggfCB1bmRlZmluZWQge1xuICByZXR1cm4gYXJyID0+IGFyci5maW5kKGEgPT4gYS5pZCA9PT0gaWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgZGlmZmVyZW5jZSBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheURpZmZlcmVuY2U8WCBleHRlbmRzIHtpZDogc3RyaW5nfT4oc291cmNlOiBYW10pOiAoY29tcGFyZTogWFtdKSA9PiBYW10ge1xuICBjb25zdCBpbml0aWFsOiBYW10gPSBbXTtcbiAgcmV0dXJuIGNvbXBhcmUgPT5cbiAgICBzb3VyY2UucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IGZpbmRCeUlkKGVsZW1lbnQuaWQpKGNvbXBhcmUpO1xuICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudCA/IFsuLi5hY2MsIGZvdW5kRWxlbWVudF0gOiBhY2M7XG4gICAgfSwgaW5pdGlhbCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFBZ0QsU0FBQUUsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtB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