@kanaries/graphic-walker 0.2.15 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +2 -0
- package/dist/assets/explainer.worker-8428eb12.js.map +1 -1
- package/dist/assets/transform.worker-5d54ff09.js.map +1 -0
- package/dist/assets/viewQuery.worker-ffefc111.js.map +1 -0
- package/dist/components/codeExport/index.d.ts +3 -0
- package/dist/components/loadingLayer.d.ts +2 -0
- package/dist/components/tabs/defaultTab.d.ts +1 -0
- package/dist/components/tabs/editableTab.d.ts +1 -2
- package/dist/dataSource/dataSelection/config.d.ts +1 -0
- package/dist/dataSource/dataSelection/utils.d.ts +2 -0
- package/dist/datasets/tmp/test.json +1 -0
- package/dist/graphic-walker.es.js +23081 -22577
- package/dist/graphic-walker.es.js.map +1 -1
- package/dist/graphic-walker.umd.js +130 -130
- package/dist/graphic-walker.umd.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/interfaces.d.ts +21 -1
- package/dist/lib/execExp.d.ts +8 -0
- package/dist/lib/interfaces.d.ts +22 -0
- package/dist/lib/op/aggregate.d.ts +3 -0
- package/dist/lib/op/bin.d.ts +3 -0
- package/dist/lib/op/fold.d.ts +3 -0
- package/dist/lib/op/stat.d.ts +8 -0
- package/dist/lib/viewQuery.d.ts +5 -0
- package/dist/models/visSpecHistory.d.ts +2 -0
- package/dist/renderer/index.d.ts +8 -7
- package/dist/renderer/specRenderer.d.ts +13 -0
- package/dist/services.d.ts +4 -1
- package/dist/store/commonStore.d.ts +6 -0
- package/dist/store/index.d.ts +3 -2
- package/dist/store/visualSpecStore.d.ts +11 -4
- package/dist/utils/dataPrep.d.ts +2 -0
- package/dist/utils/index.d.ts +3 -5
- package/dist/utils/save.d.ts +1 -2
- package/dist/vis/react-vega.d.ts +1 -22
- package/dist/vis/spec/aggregate.d.ts +4 -0
- package/dist/vis/spec/encode.d.ts +19 -0
- package/dist/vis/spec/field.d.ts +2 -0
- package/dist/vis/spec/mark.d.ts +7 -0
- package/dist/vis/spec/stack.d.ts +4 -0
- package/dist/vis/spec/view.d.ts +67 -0
- package/dist/workers/transform.d.ts +2 -0
- package/package.json +4 -3
- package/src/App.tsx +5 -2
- package/src/components/codeExport/index.tsx +114 -0
- package/src/components/dataTable/index.tsx +10 -10
- package/src/components/loadingLayer.tsx +7 -0
- package/src/components/tabs/defaultTab.tsx +4 -2
- package/src/components/tabs/editableTab.tsx +74 -39
- package/src/dataSource/dataSelection/config.ts +11 -0
- package/src/dataSource/dataSelection/csvData.tsx +71 -39
- package/src/dataSource/dataSelection/gwFile.tsx +2 -2
- package/src/dataSource/dataSelection/utils.ts +28 -0
- package/src/dataSource/utils.ts +8 -3
- package/src/fields/datasetFields/meaFields.tsx +12 -4
- package/src/index.css +4 -4
- package/src/index.tsx +22 -22
- package/src/interfaces.ts +26 -2
- package/src/lib/execExp.ts +147 -0
- package/src/lib/interfaces.ts +39 -0
- package/src/lib/op/aggregate.ts +49 -0
- package/src/lib/op/bin.ts +25 -0
- package/src/lib/op/fold.ts +17 -0
- package/src/lib/op/stat.ts +46 -0
- package/src/lib/viewQuery.ts +23 -0
- package/src/locales/en-US.json +4 -2
- package/src/locales/i18n.ts +0 -1
- package/src/locales/ja-JP.json +4 -2
- package/src/locales/zh-CN.json +4 -2
- package/src/main.tsx +1 -1
- package/src/models/visSpecHistory.ts +14 -0
- package/src/renderer/index.tsx +58 -126
- package/src/renderer/specRenderer.tsx +119 -0
- package/src/segments/segmentNav.tsx +3 -16
- package/src/segments/visNav.tsx +17 -6
- package/src/services.ts +37 -1
- package/src/store/commonStore.ts +14 -9
- package/src/store/index.tsx +11 -4
- package/src/store/visualSpecStore.ts +89 -50
- package/src/utils/dataPrep.ts +24 -0
- package/src/utils/index.ts +16 -17
- package/src/utils/normalization.ts +3 -1
- package/src/utils/save.ts +1 -2
- package/src/vis/react-vega.tsx +4 -340
- package/src/vis/spec/aggregate.ts +13 -0
- package/src/vis/spec/encode.ts +69 -0
- package/src/vis/spec/field.ts +10 -0
- package/src/vis/spec/mark.ts +30 -0
- package/src/vis/spec/stack.ts +11 -0
- package/src/vis/spec/view.ts +138 -0
- package/src/vis/theme.ts +12 -0
- package/src/visualSettings/index.tsx +10 -1
- package/src/workers/transform.ts +12 -0
- package/src/workers/transform.worker.js +13 -0
- package/src/workers/viewQuery.worker.js +16 -0
- package/dist/dataSource/pannel.d.ts +0 -5
- package/src/dataSource/pannel.tsx +0 -71
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainer.worker-8428eb12.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/createClass.js","../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/inherits.js","../../../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../../../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../../../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../../../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../../../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../../../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../../../node_modules/@babel/runtime/helpers/esm/toArray.js","../../../node_modules/i18next/dist/esm/i18next.js","../src/utils/index.ts","../../../node_modules/visual-insights/build/esm/utils/common.js","../../../node_modules/visual-insights/build/esm/statistics/correlation.js","../../../node_modules/visual-insights/build/esm/statistics/utils.js","../../../node_modules/visual-insights/build/esm/statistics/linearRegression.js","../../../node_modules/simple-statistics/dist/simple-statistics.mjs","../../../node_modules/visual-insights/build/esm/constant.js","../../../node_modules/visual-insights/build/esm/statistics/aggregators.js","../../../node_modules/visual-insights/build/esm/statistics/aggregation.js","../../../node_modules/visual-insights/build/esm/insights/config.js","../../../node_modules/visual-insights/build/esm/ml/cluster/kruskal.js","../../../node_modules/visual-insights/build/esm/sampling/index.js","../../../node_modules/visual-insights/build/esm/ml/outlier/isolationForest.js","../../../node_modules/visual-insights/build/esm/ml/index.js","../../../node_modules/visual-insights/build/esm/insights/subspaces.js","../../../node_modules/cube-core/built/core/periodCube.js","../../../node_modules/cube-core/built/core/momentCube.js","../../../node_modules/cube-core/built/core/index.js","../../../node_modules/cube-core/built/utils/transform.js","../../../node_modules/cube-core/built/utils/aggregation.js","../../../node_modules/cube-core/built/index.js","../../../node_modules/visual-insights/build/esm/insights/dev.js","../../../node_modules/visual-insights/build/esm/univariateSummary/index.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/fieldSummary.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/dataGraph.js","../../../node_modules/visual-insights/build/esm/cube/cuboid.js","../../../node_modules/visual-insights/build/esm/cube/index.js","../../../node_modules/visual-insights/build/esm/insights/workers/IForestOutlier.js","../../../node_modules/visual-insights/build/esm/insights/workers/LRTrend.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/workerCollection.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/specification/encoding.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/select.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/patterns/general.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/engine.js","../../../node_modules/axios/lib/helpers/bind.js","../../../node_modules/axios/lib/utils.js","../../../node_modules/axios/lib/helpers/buildURL.js","../../../node_modules/axios/lib/core/InterceptorManager.js","../../../node_modules/axios/lib/helpers/normalizeHeaderName.js","../../../node_modules/axios/lib/core/enhanceError.js","../../../node_modules/axios/lib/core/createError.js","../../../node_modules/axios/lib/core/settle.js","../../../node_modules/axios/lib/helpers/cookies.js","../../../node_modules/axios/lib/helpers/isAbsoluteURL.js","../../../node_modules/axios/lib/helpers/combineURLs.js","../../../node_modules/axios/lib/core/buildFullPath.js","../../../node_modules/axios/lib/helpers/parseHeaders.js","../../../node_modules/axios/lib/helpers/isURLSameOrigin.js","../../../node_modules/axios/lib/cancel/Cancel.js","../../../node_modules/axios/lib/adapters/xhr.js","../../../node_modules/axios/lib/defaults.js","../../../node_modules/axios/lib/core/transformData.js","../../../node_modules/axios/lib/cancel/isCancel.js","../../../node_modules/axios/lib/core/dispatchRequest.js","../../../node_modules/axios/lib/core/mergeConfig.js","../../../node_modules/axios/lib/env/data.js","../../../node_modules/axios/lib/helpers/validator.js","../../../node_modules/axios/lib/core/Axios.js","../../../node_modules/axios/lib/cancel/CancelToken.js","../../../node_modules/axios/lib/helpers/spread.js","../../../node_modules/axios/lib/helpers/isAxiosError.js","../../../node_modules/axios/lib/axios.js","../../../node_modules/axios/index.js","../../../node_modules/visual-insights/build/esm/index.js","../src/utils/normalization.ts","../src/insights.ts","../src/workers/explainer.worker.js"],"sourcesContent":["export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n}","import _typeof from '@babel/runtime/helpers/esm/typeof';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/esm/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/esm/getPrototypeOf';\nimport _defineProperty from '@babel/runtime/helpers/esm/defineProperty';\nimport _toArray from '@babel/runtime/helpers/esm/toArray';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar consoleLogger = {\n type: 'logger',\n log: function log(args) {\n this.output('log', args);\n },\n warn: function warn(args) {\n this.output('warn', args);\n },\n error: function error(args) {\n this.output('error', args);\n },\n output: function output(type, args) {\n if (console && console[type]) console[type].apply(console, args);\n }\n};\n\nvar Logger = function () {\n function Logger(concreteLogger) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Logger);\n\n this.init(concreteLogger, options);\n }\n\n _createClass(Logger, [{\n key: \"init\",\n value: function init(concreteLogger) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.prefix = options.prefix || 'i18next:';\n this.logger = concreteLogger || consoleLogger;\n this.options = options;\n this.debug = options.debug;\n }\n }, {\n key: \"setDebug\",\n value: function setDebug(bool) {\n this.debug = bool;\n }\n }, {\n key: \"log\",\n value: function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return this.forward(args, 'log', '', true);\n }\n }, {\n key: \"warn\",\n value: function warn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return this.forward(args, 'warn', '', true);\n }\n }, {\n key: \"error\",\n value: function error() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return this.forward(args, 'error', '');\n }\n }, {\n key: \"deprecate\",\n value: function deprecate() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n }\n }, {\n key: \"forward\",\n value: function forward(args, lvl, prefix, debugOnly) {\n if (debugOnly && !this.debug) return null;\n if (typeof args[0] === 'string') args[0] = \"\".concat(prefix).concat(this.prefix, \" \").concat(args[0]);\n return this.logger[lvl](args);\n }\n }, {\n key: \"create\",\n value: function create(moduleName) {\n return new Logger(this.logger, _objectSpread(_objectSpread({}, {\n prefix: \"\".concat(this.prefix, \":\").concat(moduleName, \":\")\n }), this.options));\n }\n }, {\n key: \"clone\",\n value: function clone(options) {\n options = options || this.options;\n options.prefix = options.prefix || this.prefix;\n return new Logger(this.logger, options);\n }\n }]);\n\n return Logger;\n}();\n\nvar baseLogger = new Logger();\n\nvar EventEmitter = function () {\n function EventEmitter() {\n _classCallCheck(this, EventEmitter);\n\n this.observers = {};\n }\n\n _createClass(EventEmitter, [{\n key: \"on\",\n value: function on(events, listener) {\n var _this = this;\n\n events.split(' ').forEach(function (event) {\n _this.observers[event] = _this.observers[event] || [];\n\n _this.observers[event].push(listener);\n });\n return this;\n }\n }, {\n key: \"off\",\n value: function off(event, listener) {\n if (!this.observers[event]) return;\n\n if (!listener) {\n delete this.observers[event];\n return;\n }\n\n this.observers[event] = this.observers[event].filter(function (l) {\n return l !== listener;\n });\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (this.observers[event]) {\n var cloned = [].concat(this.observers[event]);\n cloned.forEach(function (observer) {\n observer.apply(void 0, args);\n });\n }\n\n if (this.observers['*']) {\n var _cloned = [].concat(this.observers['*']);\n\n _cloned.forEach(function (observer) {\n observer.apply(observer, [event].concat(args));\n });\n }\n }\n }]);\n\n return EventEmitter;\n}();\n\nfunction defer() {\n var res;\n var rej;\n var promise = new Promise(function (resolve, reject) {\n res = resolve;\n rej = reject;\n });\n promise.resolve = res;\n promise.reject = rej;\n return promise;\n}\nfunction makeString(object) {\n if (object == null) return '';\n return '' + object;\n}\nfunction copy(a, s, t) {\n a.forEach(function (m) {\n if (s[m]) t[m] = s[m];\n });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n function cleanKey(key) {\n return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n }\n\n function canNotTraverseDeeper() {\n return !object || typeof object === 'string';\n }\n\n var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n\n while (stack.length > 1) {\n if (canNotTraverseDeeper()) return {};\n var key = cleanKey(stack.shift());\n if (!object[key] && Empty) object[key] = new Empty();\n\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n object = object[key];\n } else {\n object = {};\n }\n }\n\n if (canNotTraverseDeeper()) return {};\n return {\n obj: object,\n k: cleanKey(stack.shift())\n };\n}\n\nfunction setPath(object, path, newValue) {\n var _getLastOfPath = getLastOfPath(object, path, Object),\n obj = _getLastOfPath.obj,\n k = _getLastOfPath.k;\n\n obj[k] = newValue;\n}\nfunction pushPath(object, path, newValue, concat) {\n var _getLastOfPath2 = getLastOfPath(object, path, Object),\n obj = _getLastOfPath2.obj,\n k = _getLastOfPath2.k;\n\n obj[k] = obj[k] || [];\n if (concat) obj[k] = obj[k].concat(newValue);\n if (!concat) obj[k].push(newValue);\n}\nfunction getPath(object, path) {\n var _getLastOfPath3 = getLastOfPath(object, path),\n obj = _getLastOfPath3.obj,\n k = _getLastOfPath3.k;\n\n if (!obj) return undefined;\n return obj[k];\n}\nfunction getPathWithDefaults(data, defaultData, key) {\n var value = getPath(data, key);\n\n if (value !== undefined) {\n return value;\n }\n\n return getPath(defaultData, key);\n}\nfunction deepExtend(target, source, overwrite) {\n for (var prop in source) {\n if (prop !== '__proto__' && prop !== 'constructor') {\n if (prop in target) {\n if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n if (overwrite) target[prop] = source[prop];\n } else {\n deepExtend(target[prop], source[prop], overwrite);\n }\n } else {\n target[prop] = source[prop];\n }\n }\n }\n\n return target;\n}\nfunction regexEscape(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\nvar _entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n};\nfunction escape(data) {\n if (typeof data === 'string') {\n return data.replace(/[&<>\"'\\/]/g, function (s) {\n return _entityMap[s];\n });\n }\n\n return data;\n}\nvar isIE10 = typeof window !== 'undefined' && window.navigator && typeof window.navigator.userAgentData === 'undefined' && window.navigator.userAgent && window.navigator.userAgent.indexOf('MSIE') > -1;\nvar chars = [' ', ',', '?', '!', ';'];\nfunction looksLikeObjectPath(key, nsSeparator, keySeparator) {\n nsSeparator = nsSeparator || '';\n keySeparator = keySeparator || '';\n var possibleChars = chars.filter(function (c) {\n return nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0;\n });\n if (possibleChars.length === 0) return true;\n var r = new RegExp(\"(\".concat(possibleChars.map(function (c) {\n return c === '?' ? '\\\\?' : c;\n }).join('|'), \")\"));\n var matched = !r.test(key);\n\n if (!matched) {\n var ki = key.indexOf(keySeparator);\n\n if (ki > 0 && !r.test(key.substring(0, ki))) {\n matched = true;\n }\n }\n\n return matched;\n}\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction deepFind(obj, path) {\n var keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n if (!obj) return undefined;\n if (obj[path]) return obj[path];\n var paths = path.split(keySeparator);\n var current = obj;\n\n for (var i = 0; i < paths.length; ++i) {\n if (!current) return undefined;\n\n if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) {\n return undefined;\n }\n\n if (current[paths[i]] === undefined) {\n var j = 2;\n var p = paths.slice(i, i + j).join(keySeparator);\n var mix = current[p];\n\n while (mix === undefined && paths.length > i + j) {\n j++;\n p = paths.slice(i, i + j).join(keySeparator);\n mix = current[p];\n }\n\n if (mix === undefined) return undefined;\n if (mix === null) return null;\n\n if (path.endsWith(p)) {\n if (typeof mix === 'string') return mix;\n if (p && typeof mix[p] === 'string') return mix[p];\n }\n\n var joinedPath = paths.slice(i + j).join(keySeparator);\n if (joinedPath) return deepFind(mix, joinedPath, keySeparator);\n return undefined;\n }\n\n current = current[paths[i]];\n }\n\n return current;\n}\n\nvar ResourceStore = function (_EventEmitter) {\n _inherits(ResourceStore, _EventEmitter);\n\n var _super = _createSuper(ResourceStore);\n\n function ResourceStore(data) {\n var _this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n ns: ['translation'],\n defaultNS: 'translation'\n };\n\n _classCallCheck(this, ResourceStore);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.data = data || {};\n _this.options = options;\n\n if (_this.options.keySeparator === undefined) {\n _this.options.keySeparator = '.';\n }\n\n if (_this.options.ignoreJSONStructure === undefined) {\n _this.options.ignoreJSONStructure = true;\n }\n\n return _this;\n }\n\n _createClass(ResourceStore, [{\n key: \"addNamespaces\",\n value: function addNamespaces(ns) {\n if (this.options.ns.indexOf(ns) < 0) {\n this.options.ns.push(ns);\n }\n }\n }, {\n key: \"removeNamespaces\",\n value: function removeNamespaces(ns) {\n var index = this.options.ns.indexOf(ns);\n\n if (index > -1) {\n this.options.ns.splice(index, 1);\n }\n }\n }, {\n key: \"getResource\",\n value: function getResource(lng, ns, key) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n var ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n var path = [lng, ns];\n if (key && typeof key !== 'string') path = path.concat(key);\n if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n }\n\n var result = getPath(this.data, path);\n if (result || !ignoreJSONStructure || typeof key !== 'string') return result;\n return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n }\n }, {\n key: \"addResource\",\n value: function addResource(lng, ns, key, value) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n silent: false\n };\n var keySeparator = this.options.keySeparator;\n if (keySeparator === undefined) keySeparator = '.';\n var path = [lng, ns];\n if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n value = ns;\n ns = path[1];\n }\n\n this.addNamespaces(ns);\n setPath(this.data, path, value);\n if (!options.silent) this.emit('added', lng, ns, key, value);\n }\n }, {\n key: \"addResources\",\n value: function addResources(lng, ns, resources) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n silent: false\n };\n\n for (var m in resources) {\n if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], {\n silent: true\n });\n }\n\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n }, {\n key: \"addResourceBundle\",\n value: function addResourceBundle(lng, ns, resources, deep, overwrite) {\n var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n silent: false\n };\n var path = [lng, ns];\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n deep = resources;\n resources = ns;\n ns = path[1];\n }\n\n this.addNamespaces(ns);\n var pack = getPath(this.data, path) || {};\n\n if (deep) {\n deepExtend(pack, resources, overwrite);\n } else {\n pack = _objectSpread$1(_objectSpread$1({}, pack), resources);\n }\n\n setPath(this.data, path, pack);\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n }, {\n key: \"removeResourceBundle\",\n value: function removeResourceBundle(lng, ns) {\n if (this.hasResourceBundle(lng, ns)) {\n delete this.data[lng][ns];\n }\n\n this.removeNamespaces(ns);\n this.emit('removed', lng, ns);\n }\n }, {\n key: \"hasResourceBundle\",\n value: function hasResourceBundle(lng, ns) {\n return this.getResource(lng, ns) !== undefined;\n }\n }, {\n key: \"getResourceBundle\",\n value: function getResourceBundle(lng, ns) {\n if (!ns) ns = this.options.defaultNS;\n if (this.options.compatibilityAPI === 'v1') return _objectSpread$1(_objectSpread$1({}, {}), this.getResource(lng, ns));\n return this.getResource(lng, ns);\n }\n }, {\n key: \"getDataByLanguage\",\n value: function getDataByLanguage(lng) {\n return this.data[lng];\n }\n }, {\n key: \"hasLanguageSomeTranslations\",\n value: function hasLanguageSomeTranslations(lng) {\n var data = this.getDataByLanguage(lng);\n var n = data && Object.keys(data) || [];\n return !!n.find(function (v) {\n return data[v] && Object.keys(data[v]).length > 0;\n });\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return this.data;\n }\n }]);\n\n return ResourceStore;\n}(EventEmitter);\n\nvar postProcessor = {\n processors: {},\n addPostProcessor: function addPostProcessor(module) {\n this.processors[module.name] = module;\n },\n handle: function handle(processors, value, key, options, translator) {\n var _this = this;\n\n processors.forEach(function (processor) {\n if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n });\n return value;\n }\n};\n\nfunction ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$1() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nvar checkedLoadedFor = {};\n\nvar Translator = function (_EventEmitter) {\n _inherits(Translator, _EventEmitter);\n\n var _super = _createSuper$1(Translator);\n\n function Translator(services) {\n var _this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Translator);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, _assertThisInitialized(_this));\n _this.options = options;\n\n if (_this.options.keySeparator === undefined) {\n _this.options.keySeparator = '.';\n }\n\n _this.logger = baseLogger.create('translator');\n return _this;\n }\n\n _createClass(Translator, [{\n key: \"changeLanguage\",\n value: function changeLanguage(lng) {\n if (lng) this.language = lng;\n }\n }, {\n key: \"exists\",\n value: function exists(key) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n\n if (key === undefined || key === null) {\n return false;\n }\n\n var resolved = this.resolve(key, options);\n return resolved && resolved.res !== undefined;\n }\n }, {\n key: \"extractFromKey\",\n value: function extractFromKey(key, options) {\n var nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n if (nsSeparator === undefined) nsSeparator = ':';\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n var namespaces = options.ns || this.options.defaultNS || [];\n var wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n var seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n\n if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n var m = key.match(this.interpolator.nestingRegexp);\n\n if (m && m.length > 0) {\n return {\n key: key,\n namespaces: namespaces\n };\n }\n\n var parts = key.split(nsSeparator);\n if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n key = parts.join(keySeparator);\n }\n\n if (typeof namespaces === 'string') namespaces = [namespaces];\n return {\n key: key,\n namespaces: namespaces\n };\n }\n }, {\n key: \"translate\",\n value: function translate(keys, options, lastKey) {\n var _this2 = this;\n\n if (_typeof(options) !== 'object' && this.options.overloadTranslationOptionHandler) {\n options = this.options.overloadTranslationOptionHandler(arguments);\n }\n\n if (!options) options = {};\n if (keys === undefined || keys === null) return '';\n if (!Array.isArray(keys)) keys = [String(keys)];\n var returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n\n var _this$extractFromKey = this.extractFromKey(keys[keys.length - 1], options),\n key = _this$extractFromKey.key,\n namespaces = _this$extractFromKey.namespaces;\n\n var namespace = namespaces[namespaces.length - 1];\n var lng = options.lng || this.language;\n var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n\n if (lng && lng.toLowerCase() === 'cimode') {\n if (appendNamespaceToCIMode) {\n var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n\n if (returnDetails) {\n resolved.res = \"\".concat(namespace).concat(nsSeparator).concat(key);\n return resolved;\n }\n\n return \"\".concat(namespace).concat(nsSeparator).concat(key);\n }\n\n if (returnDetails) {\n resolved.res = key;\n return resolved;\n }\n\n return key;\n }\n\n var resolved = this.resolve(keys, options);\n var res = resolved && resolved.res;\n var resUsedKey = resolved && resolved.usedKey || key;\n var resExactUsedKey = resolved && resolved.exactUsedKey || key;\n var resType = Object.prototype.toString.apply(res);\n var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n var handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n var handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number';\n\n if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) {\n if (!options.returnObjects && !this.options.returnObjects) {\n if (!this.options.returnedObjectHandler) {\n this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n }\n\n var r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, _objectSpread$2(_objectSpread$2({}, options), {}, {\n ns: namespaces\n })) : \"key '\".concat(key, \" (\").concat(this.language, \")' returned an object instead of string.\");\n\n if (returnDetails) {\n resolved.res = r;\n return resolved;\n }\n\n return r;\n }\n\n if (keySeparator) {\n var resTypeIsArray = resType === '[object Array]';\n var copy = resTypeIsArray ? [] : {};\n var newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n\n for (var m in res) {\n if (Object.prototype.hasOwnProperty.call(res, m)) {\n var deepKey = \"\".concat(newKeyToUse).concat(keySeparator).concat(m);\n copy[m] = this.translate(deepKey, _objectSpread$2(_objectSpread$2({}, options), {\n joinArrays: false,\n ns: namespaces\n }));\n if (copy[m] === deepKey) copy[m] = res[m];\n }\n }\n\n res = copy;\n }\n } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') {\n res = res.join(joinArrays);\n if (res) res = this.extendTranslation(res, keys, options, lastKey);\n } else {\n var usedDefault = false;\n var usedKey = false;\n var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n var hasDefaultValue = Translator.hasDefaultValue(options);\n var defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n var defaultValue = options[\"defaultValue\".concat(defaultValueSuffix)] || options.defaultValue;\n\n if (!this.isValidLookup(res) && hasDefaultValue) {\n usedDefault = true;\n res = defaultValue;\n }\n\n if (!this.isValidLookup(res)) {\n usedKey = true;\n res = key;\n }\n\n var missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n var resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n var updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n\n if (usedKey || usedDefault || updateMissing) {\n this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n\n if (keySeparator) {\n var fk = this.resolve(key, _objectSpread$2(_objectSpread$2({}, options), {}, {\n keySeparator: false\n }));\n if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n }\n\n var lngs = [];\n var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n\n if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n for (var i = 0; i < fallbackLngs.length; i++) {\n lngs.push(fallbackLngs[i]);\n }\n } else if (this.options.saveMissingTo === 'all') {\n lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n } else {\n lngs.push(options.lng || this.language);\n }\n\n var send = function send(l, k, specificDefaultValue) {\n var defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n\n if (_this2.options.missingKeyHandler) {\n _this2.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n } else if (_this2.backendConnector && _this2.backendConnector.saveMissing) {\n _this2.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n }\n\n _this2.emit('missingKey', l, namespace, k, res);\n };\n\n if (this.options.saveMissing) {\n if (this.options.saveMissingPlurals && needsPluralHandling) {\n lngs.forEach(function (language) {\n _this2.pluralResolver.getSuffixes(language, options).forEach(function (suffix) {\n send([language], key + suffix, options[\"defaultValue\".concat(suffix)] || defaultValue);\n });\n });\n } else {\n send(lngs, key, defaultValue);\n }\n }\n }\n\n res = this.extendTranslation(res, keys, options, resolved, lastKey);\n if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = \"\".concat(namespace, \":\").concat(key);\n\n if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n if (this.options.compatibilityAPI !== 'v1') {\n res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? \"\".concat(namespace, \":\").concat(key) : key, usedDefault ? res : undefined);\n } else {\n res = this.options.parseMissingKeyHandler(res);\n }\n }\n }\n\n if (returnDetails) {\n resolved.res = res;\n return resolved;\n }\n\n return res;\n }\n }, {\n key: \"extendTranslation\",\n value: function extendTranslation(res, key, options, resolved, lastKey) {\n var _this3 = this;\n\n if (this.i18nFormat && this.i18nFormat.parse) {\n res = this.i18nFormat.parse(res, _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), options), resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n resolved: resolved\n });\n } else if (!options.skipInterpolation) {\n if (options.interpolation) this.interpolator.init(_objectSpread$2(_objectSpread$2({}, options), {\n interpolation: _objectSpread$2(_objectSpread$2({}, this.options.interpolation), options.interpolation)\n }));\n var skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n var nestBef;\n\n if (skipOnVariables) {\n var nb = res.match(this.interpolator.nestingRegexp);\n nestBef = nb && nb.length;\n }\n\n var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n if (this.options.interpolation.defaultVariables) data = _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), data);\n res = this.interpolator.interpolate(res, data, options.lng || this.language, options);\n\n if (skipOnVariables) {\n var na = res.match(this.interpolator.nestingRegexp);\n var nestAft = na && na.length;\n if (nestBef < nestAft) options.nest = false;\n }\n\n if (options.nest !== false) res = this.interpolator.nest(res, function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (lastKey && lastKey[0] === args[0] && !options.context) {\n _this3.logger.warn(\"It seems you are nesting recursively key: \".concat(args[0], \" in key: \").concat(key[0]));\n\n return null;\n }\n\n return _this3.translate.apply(_this3, args.concat([key]));\n }, options);\n if (options.interpolation) this.interpolator.reset();\n }\n\n var postProcess = options.postProcess || this.options.postProcess;\n var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? _objectSpread$2({\n i18nResolved: resolved\n }, options) : options, this);\n }\n\n return res;\n }\n }, {\n key: \"resolve\",\n value: function resolve(keys) {\n var _this4 = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var found;\n var usedKey;\n var exactUsedKey;\n var usedLng;\n var usedNS;\n if (typeof keys === 'string') keys = [keys];\n keys.forEach(function (k) {\n if (_this4.isValidLookup(found)) return;\n\n var extracted = _this4.extractFromKey(k, options);\n\n var key = extracted.key;\n usedKey = key;\n var namespaces = extracted.namespaces;\n if (_this4.options.fallbackNS) namespaces = namespaces.concat(_this4.options.fallbackNS);\n var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n\n var needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && _this4.pluralResolver.shouldUseIntlApi();\n\n var needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== '';\n var codes = options.lngs ? options.lngs : _this4.languageUtils.toResolveHierarchy(options.lng || _this4.language, options.fallbackLng);\n namespaces.forEach(function (ns) {\n if (_this4.isValidLookup(found)) return;\n usedNS = ns;\n\n if (!checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] && _this4.utils && _this4.utils.hasLoadedNamespace && !_this4.utils.hasLoadedNamespace(usedNS)) {\n checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] = true;\n\n _this4.logger.warn(\"key \\\"\".concat(usedKey, \"\\\" for languages \\\"\").concat(codes.join(', '), \"\\\" won't get resolved as namespace \\\"\").concat(usedNS, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n }\n\n codes.forEach(function (code) {\n if (_this4.isValidLookup(found)) return;\n usedLng = code;\n var finalKeys = [key];\n\n if (_this4.i18nFormat && _this4.i18nFormat.addLookupKeys) {\n _this4.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n } else {\n var pluralSuffix;\n if (needsPluralHandling) pluralSuffix = _this4.pluralResolver.getSuffix(code, options.count, options);\n var zeroSuffix = \"\".concat(_this4.options.pluralSeparator, \"zero\");\n\n if (needsPluralHandling) {\n finalKeys.push(key + pluralSuffix);\n\n if (needsZeroSuffixLookup) {\n finalKeys.push(key + zeroSuffix);\n }\n }\n\n if (needsContextHandling) {\n var contextKey = \"\".concat(key).concat(_this4.options.contextSeparator).concat(options.context);\n finalKeys.push(contextKey);\n\n if (needsPluralHandling) {\n finalKeys.push(contextKey + pluralSuffix);\n\n if (needsZeroSuffixLookup) {\n finalKeys.push(contextKey + zeroSuffix);\n }\n }\n }\n }\n\n var possibleKey;\n\n while (possibleKey = finalKeys.pop()) {\n if (!_this4.isValidLookup(found)) {\n exactUsedKey = possibleKey;\n found = _this4.getResource(code, ns, possibleKey, options);\n }\n }\n });\n });\n });\n return {\n res: found,\n usedKey: usedKey,\n exactUsedKey: exactUsedKey,\n usedLng: usedLng,\n usedNS: usedNS\n };\n }\n }, {\n key: \"isValidLookup\",\n value: function isValidLookup(res) {\n return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n }\n }, {\n key: \"getResource\",\n value: function getResource(code, ns, key) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n return this.resourceStore.getResource(code, ns, key, options);\n }\n }], [{\n key: \"hasDefaultValue\",\n value: function hasDefaultValue(options) {\n var prefix = 'defaultValue';\n\n for (var option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n return true;\n }\n }\n\n return false;\n }\n }]);\n\n return Translator;\n}(EventEmitter);\n\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n function LanguageUtil(options) {\n _classCallCheck(this, LanguageUtil);\n\n this.options = options;\n this.supportedLngs = this.options.supportedLngs || false;\n this.logger = baseLogger.create('languageUtils');\n }\n\n _createClass(LanguageUtil, [{\n key: \"getScriptPartFromCode\",\n value: function getScriptPartFromCode(code) {\n if (!code || code.indexOf('-') < 0) return null;\n var p = code.split('-');\n if (p.length === 2) return null;\n p.pop();\n if (p[p.length - 1].toLowerCase() === 'x') return null;\n return this.formatLanguageCode(p.join('-'));\n }\n }, {\n key: \"getLanguagePartFromCode\",\n value: function getLanguagePartFromCode(code) {\n if (!code || code.indexOf('-') < 0) return code;\n var p = code.split('-');\n return this.formatLanguageCode(p[0]);\n }\n }, {\n key: \"formatLanguageCode\",\n value: function formatLanguageCode(code) {\n if (typeof code === 'string' && code.indexOf('-') > -1) {\n var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n var p = code.split('-');\n\n if (this.options.lowerCaseLng) {\n p = p.map(function (part) {\n return part.toLowerCase();\n });\n } else if (p.length === 2) {\n p[0] = p[0].toLowerCase();\n p[1] = p[1].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n } else if (p.length === 3) {\n p[0] = p[0].toLowerCase();\n if (p[1].length === 2) p[1] = p[1].toUpperCase();\n if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n }\n\n return p.join('-');\n }\n\n return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n }\n }, {\n key: \"isSupportedCode\",\n value: function isSupportedCode(code) {\n if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n code = this.getLanguagePartFromCode(code);\n }\n\n return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n }\n }, {\n key: \"getBestMatchFromCodes\",\n value: function getBestMatchFromCodes(codes) {\n var _this = this;\n\n if (!codes) return null;\n var found;\n codes.forEach(function (code) {\n if (found) return;\n\n var cleanedLng = _this.formatLanguageCode(code);\n\n if (!_this.options.supportedLngs || _this.isSupportedCode(cleanedLng)) found = cleanedLng;\n });\n\n if (!found && this.options.supportedLngs) {\n codes.forEach(function (code) {\n if (found) return;\n\n var lngOnly = _this.getLanguagePartFromCode(code);\n\n if (_this.isSupportedCode(lngOnly)) return found = lngOnly;\n found = _this.options.supportedLngs.find(function (supportedLng) {\n if (supportedLng.indexOf(lngOnly) === 0) return supportedLng;\n });\n });\n }\n\n if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n return found;\n }\n }, {\n key: \"getFallbackCodes\",\n value: function getFallbackCodes(fallbacks, code) {\n if (!fallbacks) return [];\n if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n if (typeof fallbacks === 'string') fallbacks = [fallbacks];\n if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks;\n if (!code) return fallbacks[\"default\"] || [];\n var found = fallbacks[code];\n if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n if (!found) found = fallbacks[this.formatLanguageCode(code)];\n if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n if (!found) found = fallbacks[\"default\"];\n return found || [];\n }\n }, {\n key: \"toResolveHierarchy\",\n value: function toResolveHierarchy(code, fallbackCode) {\n var _this2 = this;\n\n var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n var codes = [];\n\n var addCode = function addCode(c) {\n if (!c) return;\n\n if (_this2.isSupportedCode(c)) {\n codes.push(c);\n } else {\n _this2.logger.warn(\"rejecting language code not found in supportedLngs: \".concat(c));\n }\n };\n\n if (typeof code === 'string' && code.indexOf('-') > -1) {\n if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n } else if (typeof code === 'string') {\n addCode(this.formatLanguageCode(code));\n }\n\n fallbackCodes.forEach(function (fc) {\n if (codes.indexOf(fc) < 0) addCode(_this2.formatLanguageCode(fc));\n });\n return codes;\n }\n }]);\n\n return LanguageUtil;\n}();\n\nvar sets = [{\n lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n nr: [1, 2],\n fc: 1\n}, {\n lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n nr: [1, 2],\n fc: 2\n}, {\n lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n nr: [1],\n fc: 3\n}, {\n lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n nr: [1, 2, 5],\n fc: 4\n}, {\n lngs: ['ar'],\n nr: [0, 1, 2, 3, 11, 100],\n fc: 5\n}, {\n lngs: ['cs', 'sk'],\n nr: [1, 2, 5],\n fc: 6\n}, {\n lngs: ['csb', 'pl'],\n nr: [1, 2, 5],\n fc: 7\n}, {\n lngs: ['cy'],\n nr: [1, 2, 3, 8],\n fc: 8\n}, {\n lngs: ['fr'],\n nr: [1, 2],\n fc: 9\n}, {\n lngs: ['ga'],\n nr: [1, 2, 3, 7, 11],\n fc: 10\n}, {\n lngs: ['gd'],\n nr: [1, 2, 3, 20],\n fc: 11\n}, {\n lngs: ['is'],\n nr: [1, 2],\n fc: 12\n}, {\n lngs: ['jv'],\n nr: [0, 1],\n fc: 13\n}, {\n lngs: ['kw'],\n nr: [1, 2, 3, 4],\n fc: 14\n}, {\n lngs: ['lt'],\n nr: [1, 2, 10],\n fc: 15\n}, {\n lngs: ['lv'],\n nr: [1, 2, 0],\n fc: 16\n}, {\n lngs: ['mk'],\n nr: [1, 2],\n fc: 17\n}, {\n lngs: ['mnk'],\n nr: [0, 1, 2],\n fc: 18\n}, {\n lngs: ['mt'],\n nr: [1, 2, 11, 20],\n fc: 19\n}, {\n lngs: ['or'],\n nr: [2, 1],\n fc: 2\n}, {\n lngs: ['ro'],\n nr: [1, 2, 20],\n fc: 20\n}, {\n lngs: ['sl'],\n nr: [5, 1, 2, 3],\n fc: 21\n}, {\n lngs: ['he', 'iw'],\n nr: [1, 2, 20, 21],\n fc: 22\n}];\nvar _rulesPluralsTypes = {\n 1: function _(n) {\n return Number(n > 1);\n },\n 2: function _(n) {\n return Number(n != 1);\n },\n 3: function _(n) {\n return 0;\n },\n 4: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 5: function _(n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n },\n 6: function _(n) {\n return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n },\n 7: function _(n) {\n return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 8: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n },\n 9: function _(n) {\n return Number(n >= 2);\n },\n 10: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n },\n 11: function _(n) {\n return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n },\n 12: function _(n) {\n return Number(n % 10 != 1 || n % 100 == 11);\n },\n 13: function _(n) {\n return Number(n !== 0);\n },\n 14: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n },\n 15: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 16: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n },\n 17: function _(n) {\n return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1);\n },\n 18: function _(n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n },\n 19: function _(n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n },\n 20: function _(n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n },\n 21: function _(n) {\n return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n },\n 22: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);\n }\n};\nvar deprecatedJsonVersions = ['v1', 'v2', 'v3'];\nvar suffixesOrder = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 4,\n other: 5\n};\n\nfunction createRules() {\n var rules = {};\n sets.forEach(function (set) {\n set.lngs.forEach(function (l) {\n rules[l] = {\n numbers: set.nr,\n plurals: _rulesPluralsTypes[set.fc]\n };\n });\n });\n return rules;\n}\n\nvar PluralResolver = function () {\n function PluralResolver(languageUtils) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, PluralResolver);\n\n this.languageUtils = languageUtils;\n this.options = options;\n this.logger = baseLogger.create('pluralResolver');\n\n if ((!this.options.compatibilityJSON || this.options.compatibilityJSON === 'v4') && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n this.options.compatibilityJSON = 'v3';\n this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n }\n\n this.rules = createRules();\n }\n\n _createClass(PluralResolver, [{\n key: \"addRule\",\n value: function addRule(lng, obj) {\n this.rules[lng] = obj;\n }\n }, {\n key: \"getRule\",\n value: function getRule(code) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (this.shouldUseIntlApi()) {\n try {\n return new Intl.PluralRules(code, {\n type: options.ordinal ? 'ordinal' : 'cardinal'\n });\n } catch (_unused) {\n return;\n }\n }\n\n return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n }\n }, {\n key: \"needsPlural\",\n value: function needsPlural(code) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var rule = this.getRule(code, options);\n\n if (this.shouldUseIntlApi()) {\n return rule && rule.resolvedOptions().pluralCategories.length > 1;\n }\n\n return rule && rule.numbers.length > 1;\n }\n }, {\n key: \"getPluralFormsOfKey\",\n value: function getPluralFormsOfKey(code, key) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return this.getSuffixes(code, options).map(function (suffix) {\n return \"\".concat(key).concat(suffix);\n });\n }\n }, {\n key: \"getSuffixes\",\n value: function getSuffixes(code) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var rule = this.getRule(code, options);\n\n if (!rule) {\n return [];\n }\n\n if (this.shouldUseIntlApi()) {\n return rule.resolvedOptions().pluralCategories.sort(function (pluralCategory1, pluralCategory2) {\n return suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2];\n }).map(function (pluralCategory) {\n return \"\".concat(_this.options.prepend).concat(pluralCategory);\n });\n }\n\n return rule.numbers.map(function (number) {\n return _this.getSuffix(code, number, options);\n });\n }\n }, {\n key: \"getSuffix\",\n value: function getSuffix(code, count) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var rule = this.getRule(code, options);\n\n if (rule) {\n if (this.shouldUseIntlApi()) {\n return \"\".concat(this.options.prepend).concat(rule.select(count));\n }\n\n return this.getSuffixRetroCompatible(rule, count);\n }\n\n this.logger.warn(\"no plural rule found for: \".concat(code));\n return '';\n }\n }, {\n key: \"getSuffixRetroCompatible\",\n value: function getSuffixRetroCompatible(rule, count) {\n var _this2 = this;\n\n var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n var suffix = rule.numbers[idx];\n\n if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n if (suffix === 2) {\n suffix = 'plural';\n } else if (suffix === 1) {\n suffix = '';\n }\n }\n\n var returnSuffix = function returnSuffix() {\n return _this2.options.prepend && suffix.toString() ? _this2.options.prepend + suffix.toString() : suffix.toString();\n };\n\n if (this.options.compatibilityJSON === 'v1') {\n if (suffix === 1) return '';\n if (typeof suffix === 'number') return \"_plural_\".concat(suffix.toString());\n return returnSuffix();\n } else if (this.options.compatibilityJSON === 'v2') {\n return returnSuffix();\n } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n return returnSuffix();\n }\n\n return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n }\n }, {\n key: \"shouldUseIntlApi\",\n value: function shouldUseIntlApi() {\n return !deprecatedJsonVersions.includes(this.options.compatibilityJSON);\n }\n }]);\n\n return PluralResolver;\n}();\n\nfunction ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar Interpolator = function () {\n function Interpolator() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Interpolator);\n\n this.logger = baseLogger.create('interpolator');\n this.options = options;\n\n this.format = options.interpolation && options.interpolation.format || function (value) {\n return value;\n };\n\n this.init(options);\n }\n\n _createClass(Interpolator, [{\n key: \"init\",\n value: function init() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!options.interpolation) options.interpolation = {\n escapeValue: true\n };\n var iOpts = options.interpolation;\n this.escape = iOpts.escape !== undefined ? iOpts.escape : escape;\n this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true;\n this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false;\n this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape('$t(');\n this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(')');\n this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ',';\n this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000;\n this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false;\n this.resetRegExp();\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (this.options) this.init(this.options);\n }\n }, {\n key: \"resetRegExp\",\n value: function resetRegExp() {\n var regexpStr = \"\".concat(this.prefix, \"(.+?)\").concat(this.suffix);\n this.regexp = new RegExp(regexpStr, 'g');\n var regexpUnescapeStr = \"\".concat(this.prefix).concat(this.unescapePrefix, \"(.+?)\").concat(this.unescapeSuffix).concat(this.suffix);\n this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n var nestingRegexpStr = \"\".concat(this.nestingPrefix, \"(.+?)\").concat(this.nestingSuffix);\n this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n }\n }, {\n key: \"interpolate\",\n value: function interpolate(str, data, lng, options) {\n var _this = this;\n\n var match;\n var value;\n var replaces;\n var defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n\n function regexSafe(val) {\n return val.replace(/\\$/g, '$$$$');\n }\n\n var handleFormat = function handleFormat(key) {\n if (key.indexOf(_this.formatSeparator) < 0) {\n var path = getPathWithDefaults(data, defaultData, key);\n return _this.alwaysFormat ? _this.format(path, undefined, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n interpolationkey: key\n })) : path;\n }\n\n var p = key.split(_this.formatSeparator);\n var k = p.shift().trim();\n var f = p.join(_this.formatSeparator).trim();\n return _this.format(getPathWithDefaults(data, defaultData, k), f, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n interpolationkey: k\n }));\n };\n\n this.resetRegExp();\n var missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n var skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n var todos = [{\n regex: this.regexpUnescape,\n safeValue: function safeValue(val) {\n return regexSafe(val);\n }\n }, {\n regex: this.regexp,\n safeValue: function safeValue(val) {\n return _this.escapeValue ? regexSafe(_this.escape(val)) : regexSafe(val);\n }\n }];\n todos.forEach(function (todo) {\n replaces = 0;\n\n while (match = todo.regex.exec(str)) {\n var matchedVar = match[1].trim();\n value = handleFormat(matchedVar);\n\n if (value === undefined) {\n if (typeof missingInterpolationHandler === 'function') {\n var temp = missingInterpolationHandler(str, match, options);\n value = typeof temp === 'string' ? temp : '';\n } else if (options && options.hasOwnProperty(matchedVar)) {\n value = '';\n } else if (skipOnVariables) {\n value = match[0];\n continue;\n } else {\n _this.logger.warn(\"missed to pass in variable \".concat(matchedVar, \" for interpolating \").concat(str));\n\n value = '';\n }\n } else if (typeof value !== 'string' && !_this.useRawValueToEscape) {\n value = makeString(value);\n }\n\n var safeValue = todo.safeValue(value);\n str = str.replace(match[0], safeValue);\n\n if (skipOnVariables) {\n todo.regex.lastIndex += value.length;\n todo.regex.lastIndex -= match[0].length;\n } else {\n todo.regex.lastIndex = 0;\n }\n\n replaces++;\n\n if (replaces >= _this.maxReplaces) {\n break;\n }\n }\n });\n return str;\n }\n }, {\n key: \"nest\",\n value: function nest(str, fc) {\n var _this2 = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var match;\n var value;\n\n var clonedOptions = _objectSpread$3({}, options);\n\n clonedOptions.applyPostProcessor = false;\n delete clonedOptions.defaultValue;\n\n function handleHasOptions(key, inheritedOptions) {\n var sep = this.nestingOptionsSeparator;\n if (key.indexOf(sep) < 0) return key;\n var c = key.split(new RegExp(\"\".concat(sep, \"[ ]*{\")));\n var optionsString = \"{\".concat(c[1]);\n key = c[0];\n optionsString = this.interpolate(optionsString, clonedOptions);\n var matchedSingleQuotes = optionsString.match(/'/g);\n var matchedDoubleQuotes = optionsString.match(/\"/g);\n\n if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n optionsString = optionsString.replace(/'/g, '\"');\n }\n\n try {\n clonedOptions = JSON.parse(optionsString);\n if (inheritedOptions) clonedOptions = _objectSpread$3(_objectSpread$3({}, inheritedOptions), clonedOptions);\n } catch (e) {\n this.logger.warn(\"failed parsing options string in nesting for key \".concat(key), e);\n return \"\".concat(key).concat(sep).concat(optionsString);\n }\n\n delete clonedOptions.defaultValue;\n return key;\n }\n\n while (match = this.nestingRegexp.exec(str)) {\n var formatters = [];\n var doReduce = false;\n\n if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n var r = match[1].split(this.formatSeparator).map(function (elem) {\n return elem.trim();\n });\n match[1] = r.shift();\n formatters = r;\n doReduce = true;\n }\n\n value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n if (value && match[0] === str && typeof value !== 'string') return value;\n if (typeof value !== 'string') value = makeString(value);\n\n if (!value) {\n this.logger.warn(\"missed to resolve \".concat(match[1], \" for nesting \").concat(str));\n value = '';\n }\n\n if (doReduce) {\n value = formatters.reduce(function (v, f) {\n return _this2.format(v, f, options.lng, _objectSpread$3(_objectSpread$3({}, options), {}, {\n interpolationkey: match[1].trim()\n }));\n }, value.trim());\n }\n\n str = str.replace(match[0], value);\n this.regexp.lastIndex = 0;\n }\n\n return str;\n }\n }]);\n\n return Interpolator;\n}();\n\nfunction ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction parseFormatStr(formatStr) {\n var formatName = formatStr.toLowerCase().trim();\n var formatOptions = {};\n\n if (formatStr.indexOf('(') > -1) {\n var p = formatStr.split('(');\n formatName = p[0].toLowerCase().trim();\n var optStr = p[1].substring(0, p[1].length - 1);\n\n if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n if (!formatOptions.range) formatOptions.range = optStr.trim();\n } else {\n var opts = optStr.split(';');\n opts.forEach(function (opt) {\n if (!opt) return;\n\n var _opt$split = opt.split(':'),\n _opt$split2 = _toArray(_opt$split),\n key = _opt$split2[0],\n rest = _opt$split2.slice(1);\n\n var val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val;\n if (val === 'false') formatOptions[key.trim()] = false;\n if (val === 'true') formatOptions[key.trim()] = true;\n if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10);\n });\n }\n }\n\n return {\n formatName: formatName,\n formatOptions: formatOptions\n };\n}\n\nfunction createCachedFormatter(fn) {\n var cache = {};\n return function invokeFormatter(val, lng, options) {\n var key = lng + JSON.stringify(options);\n var formatter = cache[key];\n\n if (!formatter) {\n formatter = fn(lng, options);\n cache[key] = formatter;\n }\n\n return formatter(val);\n };\n}\n\nvar Formatter = function () {\n function Formatter() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Formatter);\n\n this.logger = baseLogger.create('formatter');\n this.options = options;\n this.formats = {\n number: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.NumberFormat(lng, options);\n return function (val) {\n return formatter.format(val);\n };\n }),\n currency: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.NumberFormat(lng, _objectSpread$4(_objectSpread$4({}, options), {}, {\n style: 'currency'\n }));\n return function (val) {\n return formatter.format(val);\n };\n }),\n datetime: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.DateTimeFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val);\n };\n }),\n relativetime: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.RelativeTimeFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val, options.range || 'day');\n };\n }),\n list: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.ListFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val);\n };\n })\n };\n this.init(options);\n }\n\n _createClass(Formatter, [{\n key: \"init\",\n value: function init(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n var iOpts = options.interpolation;\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n }\n }, {\n key: \"add\",\n value: function add(name, fc) {\n this.formats[name.toLowerCase().trim()] = fc;\n }\n }, {\n key: \"addCached\",\n value: function addCached(name, fc) {\n this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n }\n }, {\n key: \"format\",\n value: function format(value, _format, lng, options) {\n var _this = this;\n\n var formats = _format.split(this.formatSeparator);\n\n var result = formats.reduce(function (mem, f) {\n var _parseFormatStr = parseFormatStr(f),\n formatName = _parseFormatStr.formatName,\n formatOptions = _parseFormatStr.formatOptions;\n\n if (_this.formats[formatName]) {\n var formatted = mem;\n\n try {\n var valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n var l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n formatted = _this.formats[formatName](mem, l, _objectSpread$4(_objectSpread$4(_objectSpread$4({}, formatOptions), options), valOptions));\n } catch (error) {\n _this.logger.warn(error);\n }\n\n return formatted;\n } else {\n _this.logger.warn(\"there was no format function for \".concat(formatName));\n }\n\n return mem;\n }, value);\n return result;\n }\n }]);\n\n return Formatter;\n}();\n\nfunction ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$2() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction removePending(q, name) {\n if (q.pending[name] !== undefined) {\n delete q.pending[name];\n q.pendingCount--;\n }\n}\n\nvar Connector = function (_EventEmitter) {\n _inherits(Connector, _EventEmitter);\n\n var _super = _createSuper$2(Connector);\n\n function Connector(backend, store, services) {\n var _this;\n\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n _classCallCheck(this, Connector);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.backend = backend;\n _this.store = store;\n _this.services = services;\n _this.languageUtils = services.languageUtils;\n _this.options = options;\n _this.logger = baseLogger.create('backendConnector');\n _this.waitingReads = [];\n _this.maxParallelReads = options.maxParallelReads || 10;\n _this.readingCalls = 0;\n _this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n _this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n _this.state = {};\n _this.queue = [];\n\n if (_this.backend && _this.backend.init) {\n _this.backend.init(services, options.backend, options);\n }\n\n return _this;\n }\n\n _createClass(Connector, [{\n key: \"queueLoad\",\n value: function queueLoad(languages, namespaces, options, callback) {\n var _this2 = this;\n\n var toLoad = {};\n var pending = {};\n var toLoadLanguages = {};\n var toLoadNamespaces = {};\n languages.forEach(function (lng) {\n var hasAllNamespaces = true;\n namespaces.forEach(function (ns) {\n var name = \"\".concat(lng, \"|\").concat(ns);\n\n if (!options.reload && _this2.store.hasResourceBundle(lng, ns)) {\n _this2.state[name] = 2;\n } else if (_this2.state[name] < 0) ; else if (_this2.state[name] === 1) {\n if (pending[name] === undefined) pending[name] = true;\n } else {\n _this2.state[name] = 1;\n hasAllNamespaces = false;\n if (pending[name] === undefined) pending[name] = true;\n if (toLoad[name] === undefined) toLoad[name] = true;\n if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n }\n });\n if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n });\n\n if (Object.keys(toLoad).length || Object.keys(pending).length) {\n this.queue.push({\n pending: pending,\n pendingCount: Object.keys(pending).length,\n loaded: {},\n errors: [],\n callback: callback\n });\n }\n\n return {\n toLoad: Object.keys(toLoad),\n pending: Object.keys(pending),\n toLoadLanguages: Object.keys(toLoadLanguages),\n toLoadNamespaces: Object.keys(toLoadNamespaces)\n };\n }\n }, {\n key: \"loaded\",\n value: function loaded(name, err, data) {\n var s = name.split('|');\n var lng = s[0];\n var ns = s[1];\n if (err) this.emit('failedLoading', lng, ns, err);\n\n if (data) {\n this.store.addResourceBundle(lng, ns, data);\n }\n\n this.state[name] = err ? -1 : 2;\n var loaded = {};\n this.queue.forEach(function (q) {\n pushPath(q.loaded, [lng], ns);\n removePending(q, name);\n if (err) q.errors.push(err);\n\n if (q.pendingCount === 0 && !q.done) {\n Object.keys(q.loaded).forEach(function (l) {\n if (!loaded[l]) loaded[l] = {};\n var loadedKeys = q.loaded[l];\n\n if (loadedKeys.length) {\n loadedKeys.forEach(function (ns) {\n if (loaded[l][ns] === undefined) loaded[l][ns] = true;\n });\n }\n });\n q.done = true;\n\n if (q.errors.length) {\n q.callback(q.errors);\n } else {\n q.callback();\n }\n }\n });\n this.emit('loaded', loaded);\n this.queue = this.queue.filter(function (q) {\n return !q.done;\n });\n }\n }, {\n key: \"read\",\n value: function read(lng, ns, fcName) {\n var _this3 = this;\n\n var tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n var callback = arguments.length > 5 ? arguments[5] : undefined;\n if (!lng.length) return callback(null, {});\n\n if (this.readingCalls >= this.maxParallelReads) {\n this.waitingReads.push({\n lng: lng,\n ns: ns,\n fcName: fcName,\n tried: tried,\n wait: wait,\n callback: callback\n });\n return;\n }\n\n this.readingCalls++;\n return this.backend[fcName](lng, ns, function (err, data) {\n _this3.readingCalls--;\n\n if (_this3.waitingReads.length > 0) {\n var next = _this3.waitingReads.shift();\n\n _this3.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n }\n\n if (err && data && tried < _this3.maxRetries) {\n setTimeout(function () {\n _this3.read.call(_this3, lng, ns, fcName, tried + 1, wait * 2, callback);\n }, wait);\n return;\n }\n\n callback(err, data);\n });\n }\n }, {\n key: \"prepareLoading\",\n value: function prepareLoading(languages, namespaces) {\n var _this4 = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = arguments.length > 3 ? arguments[3] : undefined;\n\n if (!this.backend) {\n this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n return callback && callback();\n }\n\n if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages);\n if (typeof namespaces === 'string') namespaces = [namespaces];\n var toLoad = this.queueLoad(languages, namespaces, options, callback);\n\n if (!toLoad.toLoad.length) {\n if (!toLoad.pending.length) callback();\n return null;\n }\n\n toLoad.toLoad.forEach(function (name) {\n _this4.loadOne(name);\n });\n }\n }, {\n key: \"load\",\n value: function load(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {}, callback);\n }\n }, {\n key: \"reload\",\n value: function reload(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {\n reload: true\n }, callback);\n }\n }, {\n key: \"loadOne\",\n value: function loadOne(name) {\n var _this5 = this;\n\n var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var s = name.split('|');\n var lng = s[0];\n var ns = s[1];\n this.read(lng, ns, 'read', undefined, undefined, function (err, data) {\n if (err) _this5.logger.warn(\"\".concat(prefix, \"loading namespace \").concat(ns, \" for language \").concat(lng, \" failed\"), err);\n if (!err && data) _this5.logger.log(\"\".concat(prefix, \"loaded namespace \").concat(ns, \" for language \").concat(lng), data);\n\n _this5.loaded(name, err, data);\n });\n }\n }, {\n key: \"saveMissing\",\n value: function saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n\n if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n this.logger.warn(\"did not save key \\\"\".concat(key, \"\\\" as the namespace \\\"\").concat(namespace, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n return;\n }\n\n if (key === undefined || key === null || key === '') return;\n\n if (this.backend && this.backend.create) {\n this.backend.create(languages, namespace, key, fallbackValue, null, _objectSpread$5(_objectSpread$5({}, options), {}, {\n isUpdate: isUpdate\n }));\n }\n\n if (!languages || !languages[0]) return;\n this.store.addResource(languages[0], namespace, key, fallbackValue);\n }\n }]);\n\n return Connector;\n}(EventEmitter);\n\nfunction get() {\n return {\n debug: false,\n initImmediate: true,\n ns: ['translation'],\n defaultNS: ['translation'],\n fallbackLng: ['dev'],\n fallbackNS: false,\n supportedLngs: false,\n nonExplicitSupportedLngs: false,\n load: 'all',\n preload: false,\n simplifyPluralSuffix: true,\n keySeparator: '.',\n nsSeparator: ':',\n pluralSeparator: '_',\n contextSeparator: '_',\n partialBundledLanguages: false,\n saveMissing: false,\n updateMissing: false,\n saveMissingTo: 'fallback',\n saveMissingPlurals: true,\n missingKeyHandler: false,\n missingInterpolationHandler: false,\n postProcess: false,\n postProcessPassResolved: false,\n returnNull: true,\n returnEmptyString: true,\n returnObjects: false,\n joinArrays: false,\n returnedObjectHandler: false,\n parseMissingKeyHandler: false,\n appendNamespaceToMissingKey: false,\n appendNamespaceToCIMode: false,\n overloadTranslationOptionHandler: function handle(args) {\n var ret = {};\n if (_typeof(args[1]) === 'object') ret = args[1];\n if (typeof args[1] === 'string') ret.defaultValue = args[1];\n if (typeof args[2] === 'string') ret.tDescription = args[2];\n\n if (_typeof(args[2]) === 'object' || _typeof(args[3]) === 'object') {\n var options = args[3] || args[2];\n Object.keys(options).forEach(function (key) {\n ret[key] = options[key];\n });\n }\n\n return ret;\n },\n interpolation: {\n escapeValue: true,\n format: function format(value, _format, lng, options) {\n return value;\n },\n prefix: '{{',\n suffix: '}}',\n formatSeparator: ',',\n unescapePrefix: '-',\n nestingPrefix: '$t(',\n nestingSuffix: ')',\n nestingOptionsSeparator: ',',\n maxReplaces: 1000,\n skipOnVariables: true\n }\n };\n}\nfunction transformOptions(options) {\n if (typeof options.ns === 'string') options.ns = [options.ns];\n if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n options.supportedLngs = options.supportedLngs.concat(['cimode']);\n }\n\n return options;\n}\n\nfunction ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$3(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$3() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction noop() {}\n\nfunction bindMemberFunctions(inst) {\n var mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n mems.forEach(function (mem) {\n if (typeof inst[mem] === 'function') {\n inst[mem] = inst[mem].bind(inst);\n }\n });\n}\n\nvar I18n = function (_EventEmitter) {\n _inherits(I18n, _EventEmitter);\n\n var _super = _createSuper$3(I18n);\n\n function I18n() {\n var _this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n _classCallCheck(this, I18n);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.options = transformOptions(options);\n _this.services = {};\n _this.logger = baseLogger;\n _this.modules = {\n external: []\n };\n bindMemberFunctions(_assertThisInitialized(_this));\n\n if (callback && !_this.isInitialized && !options.isClone) {\n if (!_this.options.initImmediate) {\n _this.init(options, callback);\n\n return _possibleConstructorReturn(_this, _assertThisInitialized(_this));\n }\n\n setTimeout(function () {\n _this.init(options, callback);\n }, 0);\n }\n\n return _this;\n }\n\n _createClass(I18n, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n if (typeof options.ns === 'string') {\n options.defaultNS = options.ns;\n } else if (options.ns.indexOf('translation') < 0) {\n options.defaultNS = options.ns[0];\n }\n }\n\n var defOpts = get();\n this.options = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, defOpts), this.options), transformOptions(options));\n\n if (this.options.compatibilityAPI !== 'v1') {\n this.options.interpolation = _objectSpread$6(_objectSpread$6({}, defOpts.interpolation), this.options.interpolation);\n }\n\n if (options.keySeparator !== undefined) {\n this.options.userDefinedKeySeparator = options.keySeparator;\n }\n\n if (options.nsSeparator !== undefined) {\n this.options.userDefinedNsSeparator = options.nsSeparator;\n }\n\n function createClassOnDemand(ClassOrObject) {\n if (!ClassOrObject) return null;\n if (typeof ClassOrObject === 'function') return new ClassOrObject();\n return ClassOrObject;\n }\n\n if (!this.options.isClone) {\n if (this.modules.logger) {\n baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n } else {\n baseLogger.init(null, this.options);\n }\n\n var formatter;\n\n if (this.modules.formatter) {\n formatter = this.modules.formatter;\n } else if (typeof Intl !== 'undefined') {\n formatter = Formatter;\n }\n\n var lu = new LanguageUtil(this.options);\n this.store = new ResourceStore(this.options.resources, this.options);\n var s = this.services;\n s.logger = baseLogger;\n s.resourceStore = this.store;\n s.languageUtils = lu;\n s.pluralResolver = new PluralResolver(lu, {\n prepend: this.options.pluralSeparator,\n compatibilityJSON: this.options.compatibilityJSON,\n simplifyPluralSuffix: this.options.simplifyPluralSuffix\n });\n\n if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n s.formatter = createClassOnDemand(formatter);\n s.formatter.init(s, this.options);\n this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n }\n\n s.interpolator = new Interpolator(this.options);\n s.utils = {\n hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n };\n s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n s.backendConnector.on('*', function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n _this2.emit.apply(_this2, [event].concat(args));\n });\n\n if (this.modules.languageDetector) {\n s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n s.languageDetector.init(s, this.options.detection, this.options);\n }\n\n if (this.modules.i18nFormat) {\n s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n if (s.i18nFormat.init) s.i18nFormat.init(this);\n }\n\n this.translator = new Translator(this.services, this.options);\n this.translator.on('*', function (event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n _this2.emit.apply(_this2, [event].concat(args));\n });\n this.modules.external.forEach(function (m) {\n if (m.init) m.init(_this2);\n });\n }\n\n this.format = this.options.interpolation.format;\n if (!callback) callback = noop;\n\n if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n var codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n }\n\n if (!this.services.languageDetector && !this.options.lng) {\n this.logger.warn('init: no languageDetector is used and no lng is defined');\n }\n\n var storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n storeApi.forEach(function (fcName) {\n _this2[fcName] = function () {\n var _this2$store;\n\n return (_this2$store = _this2.store)[fcName].apply(_this2$store, arguments);\n };\n });\n var storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n storeApiChained.forEach(function (fcName) {\n _this2[fcName] = function () {\n var _this2$store2;\n\n (_this2$store2 = _this2.store)[fcName].apply(_this2$store2, arguments);\n\n return _this2;\n };\n });\n var deferred = defer();\n\n var load = function load() {\n var finish = function finish(err, t) {\n if (_this2.isInitialized && !_this2.initializedStoreOnce) _this2.logger.warn('init: i18next is already initialized. You should call init just once!');\n _this2.isInitialized = true;\n if (!_this2.options.isClone) _this2.logger.log('initialized', _this2.options);\n\n _this2.emit('initialized', _this2.options);\n\n deferred.resolve(t);\n callback(err, t);\n };\n\n if (_this2.languages && _this2.options.compatibilityAPI !== 'v1' && !_this2.isInitialized) return finish(null, _this2.t.bind(_this2));\n\n _this2.changeLanguage(_this2.options.lng, finish);\n };\n\n if (this.options.resources || !this.options.initImmediate) {\n load();\n } else {\n setTimeout(load, 0);\n }\n\n return deferred;\n }\n }, {\n key: \"loadResources\",\n value: function loadResources(language) {\n var _this3 = this;\n\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n var usedCallback = callback;\n var usedLng = typeof language === 'string' ? language : this.language;\n if (typeof language === 'function') usedCallback = language;\n\n if (!this.options.resources || this.options.partialBundledLanguages) {\n if (usedLng && usedLng.toLowerCase() === 'cimode') return usedCallback();\n var toLoad = [];\n\n var append = function append(lng) {\n if (!lng) return;\n\n var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n\n lngs.forEach(function (l) {\n if (toLoad.indexOf(l) < 0) toLoad.push(l);\n });\n };\n\n if (!usedLng) {\n var fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n fallbacks.forEach(function (l) {\n return append(l);\n });\n } else {\n append(usedLng);\n }\n\n if (this.options.preload) {\n this.options.preload.forEach(function (l) {\n return append(l);\n });\n }\n\n this.services.backendConnector.load(toLoad, this.options.ns, function (e) {\n if (!e && !_this3.resolvedLanguage && _this3.language) _this3.setResolvedLanguage(_this3.language);\n usedCallback(e);\n });\n } else {\n usedCallback(null);\n }\n }\n }, {\n key: \"reloadResources\",\n value: function reloadResources(lngs, ns, callback) {\n var deferred = defer();\n if (!lngs) lngs = this.languages;\n if (!ns) ns = this.options.ns;\n if (!callback) callback = noop;\n this.services.backendConnector.reload(lngs, ns, function (err) {\n deferred.resolve();\n callback(err);\n });\n return deferred;\n }\n }, {\n key: \"use\",\n value: function use(module) {\n if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n\n if (module.type === 'backend') {\n this.modules.backend = module;\n }\n\n if (module.type === 'logger' || module.log && module.warn && module.error) {\n this.modules.logger = module;\n }\n\n if (module.type === 'languageDetector') {\n this.modules.languageDetector = module;\n }\n\n if (module.type === 'i18nFormat') {\n this.modules.i18nFormat = module;\n }\n\n if (module.type === 'postProcessor') {\n postProcessor.addPostProcessor(module);\n }\n\n if (module.type === 'formatter') {\n this.modules.formatter = module;\n }\n\n if (module.type === '3rdParty') {\n this.modules.external.push(module);\n }\n\n return this;\n }\n }, {\n key: \"setResolvedLanguage\",\n value: function setResolvedLanguage(l) {\n if (!l || !this.languages) return;\n if (['cimode', 'dev'].indexOf(l) > -1) return;\n\n for (var li = 0; li < this.languages.length; li++) {\n var lngInLngs = this.languages[li];\n if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n\n if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n this.resolvedLanguage = lngInLngs;\n break;\n }\n }\n }\n }, {\n key: \"changeLanguage\",\n value: function changeLanguage(lng, callback) {\n var _this4 = this;\n\n this.isLanguageChangingTo = lng;\n var deferred = defer();\n this.emit('languageChanging', lng);\n\n var setLngProps = function setLngProps(l) {\n _this4.language = l;\n _this4.languages = _this4.services.languageUtils.toResolveHierarchy(l);\n _this4.resolvedLanguage = undefined;\n\n _this4.setResolvedLanguage(l);\n };\n\n var done = function done(err, l) {\n if (l) {\n setLngProps(l);\n\n _this4.translator.changeLanguage(l);\n\n _this4.isLanguageChangingTo = undefined;\n\n _this4.emit('languageChanged', l);\n\n _this4.logger.log('languageChanged', l);\n } else {\n _this4.isLanguageChangingTo = undefined;\n }\n\n deferred.resolve(function () {\n return _this4.t.apply(_this4, arguments);\n });\n if (callback) callback(err, function () {\n return _this4.t.apply(_this4, arguments);\n });\n };\n\n var setLng = function setLng(lngs) {\n if (!lng && !lngs && _this4.services.languageDetector) lngs = [];\n var l = typeof lngs === 'string' ? lngs : _this4.services.languageUtils.getBestMatchFromCodes(lngs);\n\n if (l) {\n if (!_this4.language) {\n setLngProps(l);\n }\n\n if (!_this4.translator.language) _this4.translator.changeLanguage(l);\n if (_this4.services.languageDetector) _this4.services.languageDetector.cacheUserLanguage(l);\n }\n\n _this4.loadResources(l, function (err) {\n done(err, l);\n });\n };\n\n if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n setLng(this.services.languageDetector.detect());\n } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n this.services.languageDetector.detect(setLng);\n } else {\n setLng(lng);\n }\n\n return deferred;\n }\n }, {\n key: \"getFixedT\",\n value: function getFixedT(lng, ns, keyPrefix) {\n var _this5 = this;\n\n var fixedT = function fixedT(key, opts) {\n var options;\n\n if (_typeof(opts) !== 'object') {\n for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n rest[_key3 - 2] = arguments[_key3];\n }\n\n options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n } else {\n options = _objectSpread$6({}, opts);\n }\n\n options.lng = options.lng || fixedT.lng;\n options.lngs = options.lngs || fixedT.lngs;\n options.ns = options.ns || fixedT.ns;\n options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n var keySeparator = _this5.options.keySeparator || '.';\n var resultKey = options.keyPrefix ? \"\".concat(options.keyPrefix).concat(keySeparator).concat(key) : key;\n return _this5.t(resultKey, options);\n };\n\n if (typeof lng === 'string') {\n fixedT.lng = lng;\n } else {\n fixedT.lngs = lng;\n }\n\n fixedT.ns = ns;\n fixedT.keyPrefix = keyPrefix;\n return fixedT;\n }\n }, {\n key: \"t\",\n value: function t() {\n var _this$translator;\n\n return this.translator && (_this$translator = this.translator).translate.apply(_this$translator, arguments);\n }\n }, {\n key: \"exists\",\n value: function exists() {\n var _this$translator2;\n\n return this.translator && (_this$translator2 = this.translator).exists.apply(_this$translator2, arguments);\n }\n }, {\n key: \"setDefaultNamespace\",\n value: function setDefaultNamespace(ns) {\n this.options.defaultNS = ns;\n }\n }, {\n key: \"hasLoadedNamespace\",\n value: function hasLoadedNamespace(ns) {\n var _this6 = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!this.isInitialized) {\n this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n return false;\n }\n\n if (!this.languages || !this.languages.length) {\n this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n return false;\n }\n\n var lng = this.resolvedLanguage || this.languages[0];\n var fallbackLng = this.options ? this.options.fallbackLng : false;\n var lastLng = this.languages[this.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n\n var loadNotPending = function loadNotPending(l, n) {\n var loadState = _this6.services.backendConnector.state[\"\".concat(l, \"|\").concat(n)];\n\n return loadState === -1 || loadState === 2;\n };\n\n if (options.precheck) {\n var preResult = options.precheck(this, loadNotPending);\n if (preResult !== undefined) return preResult;\n }\n\n if (this.hasResourceBundle(lng, ns)) return true;\n if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n }\n }, {\n key: \"loadNamespaces\",\n value: function loadNamespaces(ns, callback) {\n var _this7 = this;\n\n var deferred = defer();\n\n if (!this.options.ns) {\n callback && callback();\n return Promise.resolve();\n }\n\n if (typeof ns === 'string') ns = [ns];\n ns.forEach(function (n) {\n if (_this7.options.ns.indexOf(n) < 0) _this7.options.ns.push(n);\n });\n this.loadResources(function (err) {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n }, {\n key: \"loadLanguages\",\n value: function loadLanguages(lngs, callback) {\n var deferred = defer();\n if (typeof lngs === 'string') lngs = [lngs];\n var preloaded = this.options.preload || [];\n var newLngs = lngs.filter(function (lng) {\n return preloaded.indexOf(lng) < 0;\n });\n\n if (!newLngs.length) {\n if (callback) callback();\n return Promise.resolve();\n }\n\n this.options.preload = preloaded.concat(newLngs);\n this.loadResources(function (err) {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n }, {\n key: \"dir\",\n value: function dir(lng) {\n if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n if (!lng) return 'rtl';\n var rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n }\n }, {\n key: \"cloneInstance\",\n value: function cloneInstance() {\n var _this8 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n\n var mergedOptions = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, this.options), options), {\n isClone: true\n });\n\n var clone = new I18n(mergedOptions);\n\n if (options.debug !== undefined || options.prefix !== undefined) {\n clone.logger = clone.logger.clone(options);\n }\n\n var membersToCopy = ['store', 'services', 'language'];\n membersToCopy.forEach(function (m) {\n clone[m] = _this8[m];\n });\n clone.services = _objectSpread$6({}, this.services);\n clone.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n clone.translator = new Translator(clone.services, clone.options);\n clone.translator.on('*', function (event) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n clone.emit.apply(clone, [event].concat(args));\n });\n clone.init(mergedOptions, callback);\n clone.translator.options = clone.options;\n clone.translator.backendConnector.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n return clone;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return {\n options: this.options,\n store: this.store,\n language: this.language,\n languages: this.languages,\n resolvedLanguage: this.resolvedLanguage\n };\n }\n }]);\n\n return I18n;\n}(EventEmitter);\n\n_defineProperty(I18n, \"createInstance\", function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n return new I18n(options, callback);\n});\n\nvar instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nvar createInstance = instance.createInstance;\nvar init = instance.init;\nvar loadResources = instance.loadResources;\nvar reloadResources = instance.reloadResources;\nvar use = instance.use;\nvar changeLanguage = instance.changeLanguage;\nvar getFixedT = instance.getFixedT;\nvar t = instance.t;\nvar exists = instance.exists;\nvar setDefaultNamespace = instance.setDefaultNamespace;\nvar hasLoadedNamespace = instance.hasLoadedNamespace;\nvar loadNamespaces = instance.loadNamespaces;\nvar loadLanguages = instance.loadLanguages;\n\nexport default instance;\nexport { changeLanguage, createInstance, exists, getFixedT, hasLoadedNamespace, init, loadLanguages, loadNamespaces, loadResources, reloadResources, setDefaultNamespace, t, use };\n","import i18next from \"i18next\";\nimport { COUNT_FIELD_ID } from \"../constants\";\nimport { IRow, Filters, IMutField } from \"../interfaces\";\ninterface NRReturns {\n normalizedData: IRow[];\n maxMeasures: IRow;\n minMeasures: IRow;\n totalMeasures: IRow;\n}\nfunction normalizeRecords(dataSource: IRow[], measures: string[]): NRReturns {\n const maxMeasures: IRow = {};\n const minMeasures: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n maxMeasures[mea] = -Infinity;\n minMeasures[mea] = Infinity;\n totalMeasures[mea] = 0;\n });\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n maxMeasures[mea] = Math.max(record[mea], maxMeasures[mea]);\n minMeasures[mea] = Math.min(record[mea], minMeasures[mea]);\n });\n });\n const newData: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n totalMeasures[mea] += Math.abs(norRecord[mea]);\n });\n newData.push(norRecord);\n });\n newData.forEach((record) => {\n measures.forEach((mea) => {\n record[mea] /= totalMeasures[mea];\n });\n });\n return {\n normalizedData: newData,\n maxMeasures,\n minMeasures,\n totalMeasures,\n };\n}\n\nfunction normalize2PositiveRecords(dataSource: IRow[], measures: string[]): NRReturns {\n const maxMeasures: IRow = {};\n const minMeasures: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n maxMeasures[mea] = -Infinity;\n minMeasures[mea] = Infinity;\n totalMeasures[mea] = 0;\n });\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n maxMeasures[mea] = Math.max(record[mea], maxMeasures[mea]);\n minMeasures[mea] = Math.min(record[mea], minMeasures[mea]);\n });\n });\n const newData: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n norRecord[mea] = norRecord[mea] - minMeasures[mea];\n totalMeasures[mea] += norRecord[mea];\n });\n newData.push(norRecord);\n });\n newData.forEach((record) => {\n measures.forEach((mea) => {\n record[mea] /= totalMeasures[mea];\n });\n });\n return {\n normalizedData: newData,\n maxMeasures,\n minMeasures,\n totalMeasures,\n };\n}\n\nexport function checkMajorFactor(\n data: IRow[],\n childrenData: Map<any, IRow[]>,\n dimensions: string[],\n measures: string[]\n): { majorKey: string; majorSum: number } {\n const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalizeRecords(data, measures);\n let majorSum = Infinity;\n let majorKey = \"\";\n for (let [key, childData] of childrenData) {\n let sum = 0;\n for (let record of normalizedData) {\n let target = childData.find((childRecord) => {\n return dimensions.every((dim) => record[dim] === childRecord[dim]);\n });\n if (target) {\n measures.forEach((mea) => {\n let targetValue = typeof target![mea] === \"number\" && !isNaN(target![mea]) ? target![mea] : 0;\n targetValue = targetValue / totalMeasures[mea];\n sum += Math.abs(record[mea] - targetValue);\n });\n } else {\n measures.forEach((mea) => {\n sum += Math.abs(record[mea]);\n });\n }\n }\n if (sum < majorSum) {\n majorSum = sum;\n majorKey = key;\n }\n }\n majorSum /= measures.length * 2;\n return { majorKey, majorSum };\n}\n\nexport function checkChildOutlier(\n data: IRow[],\n childrenData: Map<any, IRow[]>,\n dimensions: string[],\n measures: string[]\n): { outlierKey: string; outlierSum: number } {\n // const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalize2PositiveRecords(data, measures);\n const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalizeRecords(data, measures);\n let outlierSum = -Infinity;\n let outlierKey = \"\";\n for (let [key, childData] of childrenData) {\n // const { normalizedData: normalizedChildData } = normalize2PositiveRecords(childData, measures);\n const { normalizedData: normalizedChildData } = normalizeRecords(childData, measures);\n let sum = 0;\n for (let record of normalizedData) {\n let target = normalizedChildData.find((childRecord) => {\n return dimensions.every((dim) => record[dim] === childRecord[dim]);\n });\n if (target) {\n measures.forEach((mea) => {\n let targetValue = typeof target![mea] === \"number\" && !isNaN(target![mea]) ? target![mea] : 0;\n sum += Math.abs(record[mea] - targetValue);\n });\n } else {\n measures.forEach((mea) => {\n sum += Math.abs(record[mea]);\n });\n }\n }\n if (sum > outlierSum) {\n outlierSum = sum;\n outlierKey = key;\n }\n }\n outlierSum /= measures.length * 2;\n return { outlierKey, outlierSum };\n}\nexport interface IPredicate {\n key: string;\n type: \"discrete\" | \"continuous\";\n range: Set<any> | [number, number];\n}\nexport function getPredicates(selection: IRow[], dimensions: string[], measures: string[]): IPredicate[] {\n const predicates: IPredicate[] = [];\n dimensions.forEach((dim) => {\n predicates.push({\n key: dim,\n type: \"discrete\",\n range: new Set(),\n });\n });\n measures.forEach((mea) => {\n predicates.push({\n key: mea,\n type: \"continuous\",\n range: [Infinity, -Infinity],\n });\n });\n selection.forEach((record) => {\n dimensions.forEach((dim, index) => {\n (predicates[index].range as Set<any>).add(record[dim]);\n });\n measures.forEach((mea, index) => {\n (predicates[index].range as [number, number])[0] = Math.min(\n (predicates[index].range as [number, number])[0],\n record[mea]\n );\n (predicates[index].range as [number, number])[1] = Math.max(\n (predicates[index].range as [number, number])[1],\n record[mea]\n );\n });\n });\n return predicates;\n}\n\nexport function getPredicatesFromVegaSignals(signals: Filters, dimensions: string[], measures: string[]): IPredicate[] {\n const predicates: IPredicate[] = [];\n dimensions.forEach((dim) => {\n predicates.push({\n type: \"discrete\",\n range: new Set(signals[dim]),\n key: dim,\n });\n });\n return predicates;\n}\n\nexport function filterByPredicates(data: IRow[], predicates: IPredicate[]): IRow[] {\n const filterData = data.filter((record) => {\n return predicates.every((pre) => {\n if (pre.type === \"continuous\") {\n return (\n record[pre.key] >= (pre.range as [number, number])[0] &&\n record[pre.key] <= (pre.range as [number, number])[1]\n );\n } else {\n return (pre.range as Set<any>).has(record[pre.key]);\n }\n });\n });\n return filterData;\n}\n\nexport function applyFilters(dataSource: IRow[], filters: Filters): IRow[] {\n let filterKeys = Object.keys(filters);\n return dataSource.filter((record) => {\n let keep = true;\n for (let filterKey of filterKeys) {\n if (filters[filterKey].length > 0) {\n if (!filters[filterKey].includes(record[filterKey])) {\n keep = false;\n break;\n }\n }\n }\n return keep;\n });\n}\n\nexport function extendCountField(\n dataSource: IRow[],\n fields: IMutField[]\n): {\n dataSource: IRow[];\n fields: IMutField[];\n} {\n const nextData = dataSource.map((r) => ({\n ...r,\n [COUNT_FIELD_ID]: 1,\n }));\n const nextFields = fields.concat({\n fid: COUNT_FIELD_ID,\n name: i18next.t(\"constant.row_count\"),\n analyticType: \"measure\",\n semanticType: \"quantitative\",\n });\n return {\n dataSource: nextData,\n fields: nextFields,\n };\n}\n\nexport function getRange (nums: number[]): [number, number] {\n let _min = Infinity;\n let _max = -Infinity;\n for (let i = 0; i < nums.length; i++) {\n _min = Math.min(_min, nums[i]);\n _max = Math.max(_max, nums[i]);\n }\n return [_min, _max];\n}\n\nexport function makeNumbersBeautiful (nums: number[]): number[] {\n const [min, max] = getRange(nums);\n const range = max - min;\n const step = Math.pow(10, Math.floor(Math.log10(range)));\n return nums.map((num) => {\n return Math.round(num / step) * step;\n })\n}","const JOIN_SYMBOL = '_';\nconst MAGIC_NUMBER = 5;\nfunction deepcopy(data) {\n return JSON.parse(JSON.stringify(data));\n}\nfunction copyData(data) {\n return data.map(r => ({\n ...r\n }));\n}\nfunction isFieldCategory(dataSource, fieldName) {\n return dataSource.every(record => {\n return typeof record[fieldName] === 'string'\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction isFieldContinous(dataSource, fieldName) {\n return dataSource.every(record => {\n return !isNaN(+record[fieldName])\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction isFieldNumeric(dataSource, fieldName) {\n return dataSource.every(record => {\n return !isNaN(record[fieldName])\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nconst TIME_RULES = [\n /^[0-9]{2,4}[-/][0-9]{1,2}([-/][0-9]{1,2})?$/,\n /^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{2,4}$/,\n /^[0-9]{4}[0-9]{2}[0-9]{2}$/,\n /^[0-9]{2,4}[-/][0-9]{1,2}[-/][0-9]{1,2} [0-9]{1,2}:[0-9]{1-2}:[0-9]{1-2}$/ // YYYY-MM-DD HH:mm:ss\n];\nfunction isFieldTime(dataSource, fieldName) {\n return dataSource.every(record => {\n // todo: tmp solotion here.\n if (!isNaN(Number(record[fieldName])) && Number(record[fieldName]) >= 1800 && Number(record[fieldName]) <= 2200) {\n return true;\n }\n return (typeof record[fieldName] === 'string'\n // && /^[0-9]{0,4}[-/][0-9]{0,2}([-/][0-9]{0,2}$)?/.test(record[fieldName]))\n && TIME_RULES.some(rule => rule.test(record[fieldName])))\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction aggregate({ dataSource, fields, bys, method = 'sum' }) {\n let tmp = [];\n for (let by of bys) {\n let map = new Map();\n for (let record of dataSource) {\n let key = JSON.stringify(fields.map(field => record[field]));\n if (!map.has(key)) {\n map.set(key, 0);\n }\n map.set(key, map.get(key) + record[by]);\n }\n for (let [key, value] of map) {\n let row = {\n index: key,\n [by]: value\n };\n let dims = JSON.parse(key);\n for (let i = 0; i < fields.length; i++) {\n row[fields[i]] = dims[i];\n }\n tmp.push(row);\n }\n }\n let ans = new Map();\n for (let record of tmp) {\n if (!ans.has(record.index)) {\n ans.set(record.index, {});\n }\n ans.set(record.index, { ...ans.get(record.index), ...record });\n }\n return [...ans.values()];\n}\nfunction memberCount(dataSource, field) {\n const counter = new Map();\n for (let row of dataSource) {\n let member = row[field];\n if (!counter.has(member)) {\n counter.set(member, 0);\n }\n counter.set(member, counter.get(member) + 1);\n }\n return [...counter.entries()];\n}\nfunction groupContinousField({ dataSource, field, newField = `${field}(con-group)`, groupNumber }) {\n // const members = memberCount(dataSource, field);\n // todo: outlier detection\n const values = dataSource.map(item => item[field]);\n const max = Math.max(...values); // Number.EPSILON * ;\n const min = Math.min(...values);\n const segWidth = (max - min) / groupNumber;\n let ranges = [];\n for (let i = 0; i < groupNumber; i++) {\n let left = min + i * segWidth;\n let right = min + (i + 1) * segWidth;\n ranges.push([left, right]);\n }\n ranges[0][0] = -Infinity;\n ranges[ranges.length - 1][1] = Infinity;\n let precision = Math.max(1, Math.log10(Math.abs(min)) - Math.log10(segWidth)) + 1;\n for (let i = 0; i < dataSource.length; i++) {\n let record = dataSource[i];\n let rangeIndex = ranges.findIndex(r => (r[0] <= record[field] && record[field] < r[1]));\n let range = ranges[rangeIndex];\n if (typeof range !== 'undefined') {\n record[newField] = `${rangeIndex + 1}:[${Number(range[0].toPrecision(precision))}, ${Number(range[1].toPrecision(precision))})`;\n }\n else {\n record[newField] = 'null';\n }\n }\n return dataSource;\n}\nfunction groupCategoryField({ dataSource, field, newField = `${field}(cat-group)`, groupNumber }) {\n // auto category should obey Power law distrubution.\n let members = memberCount(dataSource, field);\n members.sort((a, b) => b[1] - a[1]);\n let sum = members.map(v => v[1]);\n groupNumber = members.length;\n for (let i = sum.length - 2; i >= 0; i--) {\n sum[i] = sum[i + 1] + sum[i];\n }\n for (let i = 0; i < members.length - 2; i++) {\n // strict mode\n // if (members[i][1] >= sum[i + 1] && members[i + 1][1] < sum[i + 2]) {\n if (members[i][1] * MAGIC_NUMBER >= sum[i + 1] && members[i + 1][1] / MAGIC_NUMBER < sum[i + 2]) {\n groupNumber = i + 2;\n break;\n }\n }\n // groupNumber = Math.max(Math.round(Math.sqrt(members.length)), groupNumber)\n if (groupNumber === members.length) {\n return dataSource.map(record => {\n return {\n ...record,\n [newField]: record[field]\n };\n });\n }\n let set = new Set();\n for (let i = groupNumber - 1; i < members.length; i++) {\n set.add(members[i][0]);\n }\n for (let record of dataSource) {\n if (set.has(record[field])) {\n record[newField] = 'others';\n }\n else {\n record[newField] = record[field];\n }\n }\n return dataSource;\n}\n/**\n * Kullback–Leibler divergence\n * @param p1List\n * @param p2List\n *\n */\nfunction DKL(p1List, p2List) {\n let sum = 0;\n const len = Math.max(p1List.length, p2List.length);\n for (let i = 0; i < len; i++) {\n let p1 = p1List[i] || 0;\n let p2 = p2List[i] || 0;\n sum += p1 * Math.log2(p1 / p2);\n }\n return sum;\n}\nfunction isFieldUnique(dataSource, field) {\n let set = new Set();\n let validCount = 0;\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n if (dataSource[i][field] !== undefined && dataSource[i][field] !== null && dataSource[i][field] !== '') {\n validCount++;\n set.add(dataSource[i][field]);\n }\n }\n if (set.size === validCount)\n return true;\n return false;\n}\nexport { deepcopy, copyData, memberCount, groupCategoryField, groupContinousField, aggregate, isFieldCategory, isFieldContinous, isFieldTime, isFieldNumeric, JOIN_SYMBOL, DKL, isFieldUnique };\n","/**\n * chiSquared implementation using adjacency list(spare graph), which is ableto handle fields with large cardinality.\n * @param nestTree hash tree with depth = 2, represents the relationship between var x and var y.\n * @param xSet value set of var x.\n * @param ySet value set of var y.\n */\nexport function chiSquared(nestTree, xSet, ySet) {\n if (typeof nestTree === 'undefined' || typeof xSet === 'undefined' || typeof ySet === 'undefined') {\n return 0;\n }\n let rowSums = new Map();\n let colSums = new Map();\n let totalSum = 0;\n for (let x of xSet) {\n rowSums.set(x, 0);\n }\n for (let y of ySet) {\n colSums.set(y, 0);\n }\n for (let [x, node] of nestTree) {\n for (let [y, counter] of node) {\n rowSums.set(x, rowSums.get(x) + counter);\n colSums.set(y, colSums.get(y) + counter);\n totalSum += counter;\n }\n }\n let chis = 0;\n for (let [x, node] of nestTree) {\n for (let [y, observed] of node) {\n let expected = rowSums.get(x) * colSums.get(y) / totalSum;\n chis += (observed - expected) ** 2 / expected;\n }\n }\n return chis;\n}\n/**\n * crammersV implementation using adjacency list(spare graph), which is ableto handle fields with large cardinality.\n * @param dataSource array of records.\n * @param fieldX field key of var X.\n * @param fieldY field key of varY.\n */\nexport const crammersV = (dataSource, fieldX, fieldY) => {\n const xSet = new Set();\n const ySet = new Set();\n const nestTree = new Map();\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n let record = dataSource[i];\n xSet.add(record[fieldX]);\n ySet.add(record[fieldY]);\n if (!nestTree.has(record[fieldX])) {\n nestTree.set(record[fieldX], new Map());\n }\n let node = nestTree.get(record[fieldX]);\n if (!node.has(record[fieldY])) {\n node.set(record[fieldY], 0);\n }\n node.set(record[fieldY], node.get(record[fieldY]) + 1);\n }\n const chis = chiSquared(nestTree, xSet, ySet);\n const V = Math.sqrt(chis / (dataSource.length * Math.min(xSet.size - 1, ySet.size - 1)));\n return V;\n};\nexport function chiSquaredFromDataSource(dataSource, fieldX, fieldY) {\n const xSet = new Set();\n const ySet = new Set();\n const nestTree = new Map();\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n let record = dataSource[i];\n xSet.add(record[fieldX]);\n ySet.add(record[fieldY]);\n if (!nestTree.has(record[fieldX])) {\n nestTree.set(record[fieldX], new Map());\n }\n let node = nestTree.get(record[fieldX]);\n if (!node.has(record[fieldY])) {\n node.set(record[fieldY], 0);\n }\n node.set(record[fieldY], node.get(record[fieldY]) + 1);\n }\n const chis = chiSquared(nestTree, xSet, ySet);\n return chis;\n}\n/**\n * Pearson correlation coefficient\n * @param dataSource array of records\n * @param fieldX field key of var X.\n * @param fieldY field key of var Y.\n */\nexport const pearsonCC = (dataSource, fieldX, fieldY) => {\n let r = 0;\n let xBar = sum(dataSource.map(row => row[fieldX])) / dataSource.length;\n let yBar = sum(dataSource.map(row => row[fieldY])) / dataSource.length;\n r = sum(dataSource.map(row => (row[fieldX] - xBar) * (row[fieldY] - yBar))) /\n Math.sqrt(sum(dataSource.map(row => Math.pow(row[fieldX] - xBar, 2))) * sum(dataSource.map(row => Math.pow(row[fieldY] - yBar, 2))));\n return r;\n};\nfunction sum(arr) {\n let s = 0;\n for (let i = 0, len = arr.length; i < len; i++) {\n // if (typeof dataSource[i][field])\n s += arr[i];\n }\n return s;\n}\n// can be used for test. do not delete these code. it is implementation with adj matrix. can be faster in dense graph cases.\n// export function crammersV(dataSource: DataSource, fieldX: string, fieldY: string): number {\n// const xSet = new Set(dataSource.map(d => d[fieldX]))\n// const ySet = new Set(dataSource.map(d => d[fieldY]))\n// const xMembers = [...xSet];\n// const yMembers = [...ySet];\n// let xDict = {};\n// let yDict = {};\n// for (let i = 0; i < xMembers.length; i++) {\n// xDict[xMembers[i]] = i;\n// }\n// for (let i = 0; i < yMembers.length; i++) {\n// yDict[yMembers[i]] = i;\n// }\n// // let matrix: number[][] = xMembers.map(x => yMembers.map(y => 0));\n// let matrix: number[][] = [];\n// for (let i = 0; i < xMembers.length; i++) {\n// matrix.push([]);\n// for (let j = 0; j < yMembers.length; j++) {\n// matrix[i].push(0);\n// }\n// }\n// for (let record of dataSource) {\n// matrix[xDict[record[fieldX]]][yDict[record[fieldY]]]++;\n// }\n// const chis = chiSquared(matrix);\n// const V = Math.sqrt(chis / (dataSource.length * Math.min(xMembers.length - 1, yMembers.length - 1)))\n// return V;\n// }\n// export function chiSquared(matrix: number[][] = [[]]): number {\n// let rowSums = matrix.map(m => 0);\n// let colSums = matrix[0].map(m => 0);\n// let totalSum = 0;\n// for (let i = 0; i < matrix.length; i++) {\n// for (let j = 0; j < matrix[i].length; j++) {\n// rowSums[i] += matrix[i][j];\n// colSums[j] += matrix[i][j];\n// totalSum += matrix[i][j];\n// }\n// }\n// let chis = 0;\n// for (let i = 0; i < matrix.length; i++) {\n// for (let j = 0; j < matrix[i].length; j++) {\n// let observed = matrix[i][j];\n// let expected = rowSums[i] * colSums[j] / totalSum;\n// chis += (observed - expected) ** 2 / expected;\n// }\n// }\n// return chis;\n// }\n","export function linearMapPositive(arr) {\n let min = Math.min(...arr);\n return arr.map(a => a - min + 1);\n}\nexport function mapPositive(arr) {\n return arr.map(a => Math.abs(a)).filter(a => a !== 0);\n}\nexport function getCombination(elements, start = 1, end = elements.length) {\n let ans = [];\n const combine = (step, set, size) => {\n if (set.length === size) {\n ans.push([...set]);\n return;\n }\n if (step >= elements.length) {\n return;\n }\n combine(step + 1, [...set, elements[step]], size);\n combine(step + 1, set, size);\n };\n for (let i = start; i <= end; i++) {\n combine(0, [], i);\n }\n return ans;\n}\nexport function normalize(frequencyList) {\n let sum = 0;\n for (let f of frequencyList) {\n sum += f;\n }\n return frequencyList.map(f => f / sum);\n}\nexport const entropy = (probabilityList) => {\n let sum = 0;\n for (let p of probabilityList) {\n sum += p * Math.log2(p);\n }\n return -sum;\n};\nexport const gini = (probabilityList) => {\n let sum = 0;\n for (let p of probabilityList) {\n sum += p * (1 - p);\n }\n return sum;\n};\nexport function getRangeBy(dataSource, by) {\n let maxValue = -Infinity;\n let minValue = Infinity;\n for (let row of dataSource) {\n maxValue = Math.max(row[by], maxValue);\n minValue = Math.min(row[by], minValue);\n }\n return [minValue, maxValue];\n}\n","export class oneDLinearRegression {\n constructor(dataSource, X, Y) {\n this.dataSource = dataSource;\n this.X = X;\n this.Y = Y;\n this.normalizedDataSource = dataSource;\n }\n normalizeDimensions(dimensions) {\n this.normalizedDataSource = [];\n this.valueSets = [];\n dimensions.forEach(() => {\n this.valueSets.push(new Map());\n });\n this.dataSource.forEach(record => {\n dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n if (!this.valueSets[index].has(value)) {\n this.valueSets[index].set(value, this.valueSets[index].size);\n }\n });\n });\n this.dataSource.forEach(record => {\n let normalizedRecord = this.normalizeRecord(record, dimensions);\n this.normalizedDataSource.push(normalizedRecord);\n });\n return this.normalizedDataSource;\n }\n normalizeRecord(record, dimensions) {\n let normalizedRecord = {};\n Object.keys(record).forEach(mea => {\n normalizedRecord[mea] = record[mea];\n });\n dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n normalizedRecord[dim] = this.valueSets[index].get(value);\n });\n return normalizedRecord;\n }\n mean() {\n let meanX = 0;\n let meanY = 0;\n if (this.normalizedDataSource.length === 0)\n return [meanX, meanY];\n this.normalizedDataSource.forEach((record, index) => {\n meanX += record[this.X];\n meanY += record[this.Y];\n });\n meanX /= this.normalizedDataSource.length;\n meanY /= this.normalizedDataSource.length;\n return [meanX, meanY];\n }\n getRegressionEquation() {\n if (this.normalizedDataSource.length === 0)\n return [0, 0];\n const [meanX, meanY] = this.mean();\n let beta = 0;\n let alpha = 0;\n let numerator = 0;\n let denominator = 0;\n this.normalizedDataSource.forEach(record => {\n numerator += (record[this.X] - meanX) * (record[this.Y] - meanY);\n denominator += (record[this.X] - meanX) ** 2;\n });\n beta = numerator / denominator;\n alpha = meanY - meanX * beta;\n return [alpha, beta];\n }\n r_squared() {\n const [, meanY] = this.mean();\n const [alpha, beta] = this.getRegressionEquation();\n let SSR = 0;\n let SST = 0;\n this.normalizedDataSource.forEach(record => {\n let x = record[this.X];\n let y = record[this.Y];\n let yHat = x * beta + alpha;\n SSR += (yHat - meanY) ** 2;\n SST += (y - meanY) ** 2;\n });\n return SSR / SST;\n }\n cumulativeLogisticDistribution(x) {\n const lambda = 2;\n const mu = 0.2;\n return 1 / (1 + Math.pow(Math.E, -(x - mu) / lambda));\n }\n pValue() {\n const [, beta] = this.getRegressionEquation();\n const value = this.cumulativeLogisticDistribution(Math.abs(beta));\n if (value > 0.5) {\n return 2 * (1 - value);\n }\n else {\n return 2 * value;\n }\n }\n significance() {\n let r_squared = this.r_squared();\n let p_value = this.pValue();\n return r_squared * (1 - p_value);\n }\n}\n","/**\n * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression)\n * is a simple way to find a fitted line\n * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line\n * using the least sum of squares.\n *\n * @param {Array<Array<number>>} data an array of two-element of arrays,\n * like `[[0, 1], [2, 3]]`\n * @returns {Object} object containing slope and intersect of regression line\n * @example\n * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 }\n */\nfunction linearRegression(data) {\n var m, b;\n\n // Store data length in a local variable to reduce\n // repeated object property lookups\n var dataLength = data.length;\n\n //if there's only one point, arbitrarily choose a slope of 0\n //and a y-intercept of whatever the y of the initial point is\n if (dataLength === 1) {\n m = 0;\n b = data[0][1];\n } else {\n // Initialize our sums and scope the `m` and `b`\n // variables that define the line.\n var sumX = 0,\n sumY = 0,\n sumXX = 0,\n sumXY = 0;\n\n // Use local variables to grab point values\n // with minimal object property lookups\n var point, x, y;\n\n // Gather the sum of all x values, the sum of all\n // y values, and the sum of x^2 and (x*y) for each\n // value.\n //\n // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy\n for (var i = 0; i < dataLength; i++) {\n point = data[i];\n x = point[0];\n y = point[1];\n\n sumX += x;\n sumY += y;\n\n sumXX += x * x;\n sumXY += x * y;\n }\n\n // `m` is the slope of the regression line\n m =\n (dataLength * sumXY - sumX * sumY) /\n (dataLength * sumXX - sumX * sumX);\n\n // `b` is the y-intercept of the line.\n b = sumY / dataLength - (m * sumX) / dataLength;\n }\n\n // Return both values as an object.\n return {\n m: m,\n b: b\n };\n}\n\n/**\n * Given the output of `linearRegression`: an object\n * with `m` and `b` values indicating slope and intercept,\n * respectively, generate a line function that translates\n * x values into y values.\n *\n * @param {Object} mb object with `m` and `b` members, representing\n * slope and intersect of desired line\n * @returns {Function} method that computes y-value at any given\n * x-value on the line.\n * @example\n * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]]));\n * l(0) // = 0\n * l(2) // = 2\n * linearRegressionLine({ b: 0, m: 1 })(1); // => 1\n * linearRegressionLine({ b: 1, m: 1 })(1); // => 2\n */\nfunction linearRegressionLine(mb /*: { b: number, m: number }*/) {\n // Return a function that computes a `y` value for each\n // x value it is given, based on the values of `b` and `a`\n // that we just computed.\n return function (x) {\n return mb.b + mb.m * x;\n };\n}\n\n/**\n * Our default sum is the [Kahan-Babuska algorithm](https://pdfs.semanticscholar.org/1760/7d467cda1d0277ad272deb2113533131dc09.pdf).\n * This method is an improvement over the classical\n * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm).\n * It aims at computing the sum of a list of numbers while correcting for\n * floating-point errors. Traditionally, sums are calculated as many\n * successive additions, each one with its own floating-point roundoff. These\n * losses in precision add up as the number of numbers increases. This alternative\n * algorithm is more accurate than the simple way of calculating sums by simple\n * addition.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sum([1, 2, 3]); // => 6\n */\nfunction sum(x) {\n // If the array is empty, we needn't bother computing its sum\n if (x.length === 0) {\n return 0;\n }\n\n // Initializing the sum as the first number in the array\n var sum = x[0];\n\n // Keeping track of the floating-point error correction\n var correction = 0;\n\n var transition;\n\n if (typeof sum !== \"number\") {\n return NaN;\n }\n\n for (var i = 1; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return NaN;\n }\n transition = sum + x[i];\n\n // Here we need to update the correction in a different fashion\n // if the new absolute value is greater than the absolute sum\n if (Math.abs(sum) >= Math.abs(x[i])) {\n correction += sum - transition + x[i];\n } else {\n correction += x[i] - transition + sum;\n }\n\n sum = transition;\n }\n\n // Returning the corrected sum\n return sum + correction;\n}\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction mean(x) {\n if (x.length === 0) {\n throw new Error(\"mean requires at least one data point\");\n }\n\n return sum(x) / x.length;\n}\n\n/**\n * The sum of deviations to the Nth power.\n * When n=2 it's the sum of squared deviations.\n * When n=3 it's the sum of cubed deviations.\n *\n * @param {Array<number>} x\n * @param {number} n power\n * @returns {number} sum of nth power deviations\n *\n * @example\n * var input = [1, 2, 3];\n * // since the variance of a set is the mean squared\n * // deviations, we can calculate that with sumNthPowerDeviations:\n * sumNthPowerDeviations(input, 2) / input.length;\n */\nfunction sumNthPowerDeviations(x, n) {\n var meanValue = mean(x);\n var sum = 0;\n var tempValue;\n var i;\n\n // This is an optimization: when n is 2 (we're computing a number squared),\n // multiplying the number by itself is significantly faster than using\n // the Math.pow method.\n if (n === 2) {\n for (i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sum += tempValue * tempValue;\n }\n } else {\n for (i = 0; i < x.length; i++) {\n sum += Math.pow(x[i] - meanValue, n);\n }\n }\n\n return sum;\n}\n\n/**\n * The [variance](http://en.wikipedia.org/wiki/Variance)\n * is the sum of squared deviations from the mean.\n *\n * This is an implementation of variance, not sample variance:\n * see the `sampleVariance` method if you want a sample measure.\n *\n * @param {Array<number>} x a population of one or more data points\n * @returns {number} variance: a value greater than or equal to zero.\n * zero indicates that all values are identical.\n * @throws {Error} if x's length is 0\n * @example\n * variance([1, 2, 3, 4, 5, 6]); // => 2.9166666666666665\n */\nfunction variance(x) {\n if (x.length === 0) {\n throw new Error(\"variance requires at least one data point\");\n }\n\n // Find the mean of squared deviations between the\n // mean value and each value.\n return sumNthPowerDeviations(x, 2) / x.length;\n}\n\n/**\n * The [standard deviation](http://en.wikipedia.org/wiki/Standard_deviation)\n * is the square root of the variance. This is also known as the population\n * standard deviation. It's useful for measuring the amount\n * of variation or dispersion in a set of values.\n *\n * Standard deviation is only appropriate for full-population knowledge: for\n * samples of a population, {@link sampleStandardDeviation} is\n * more appropriate.\n *\n * @param {Array<number>} x input\n * @returns {number} standard deviation\n * @example\n * variance([2, 4, 4, 4, 5, 5, 7, 9]); // => 4\n * standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]); // => 2\n */\nfunction standardDeviation(x) {\n if (x.length === 1) {\n return 0;\n }\n var v = variance(x);\n return Math.sqrt(v);\n}\n\n/**\n * The [R Squared](http://en.wikipedia.org/wiki/Coefficient_of_determination)\n * value of data compared with a function `f`\n * is the sum of the squared differences between the prediction\n * and the actual value.\n *\n * @param {Array<Array<number>>} x input data: this should be doubly-nested\n * @param {Function} func function called on `[i][0]` values within the dataset\n * @returns {number} r-squared value\n * @example\n * var samples = [[0, 0], [1, 1]];\n * var regressionLine = linearRegressionLine(linearRegression(samples));\n * rSquared(samples, regressionLine); // = 1 this line is a perfect fit\n */\nfunction rSquared(x, func) {\n if (x.length < 2) {\n return 1;\n }\n\n // Compute the average y value for the actual\n // data set in order to compute the\n // _total sum of squares_\n var sum = 0;\n for (var i = 0; i < x.length; i++) {\n sum += x[i][1];\n }\n var average = sum / x.length;\n\n // Compute the total sum of squares - the\n // squared difference between each point\n // and the average of all points.\n var sumOfSquares = 0;\n for (var j = 0; j < x.length; j++) {\n sumOfSquares += Math.pow(average - x[j][1], 2);\n }\n\n // Finally estimate the error: the squared\n // difference between the estimate and the actual data\n // value at each point.\n var err = 0;\n for (var k = 0; k < x.length; k++) {\n err += Math.pow(x[k][1] - func(x[k][0]), 2);\n }\n\n // As the error grows larger, its ratio to the\n // sum of squares increases and the r squared\n // value grows lower.\n return 1 - err / sumOfSquares;\n}\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)` because the input is sorted.\n *\n * @param {Array<number>} sorted a sample of one or more data points\n * @returns {number} mode\n * @throws {Error} if sorted is empty\n * @example\n * modeSorted([0, 0, 1]); // => 0\n */\nfunction modeSorted(sorted) {\n // Handle edge cases:\n // The mode of an empty list is undefined\n if (sorted.length === 0) {\n throw new Error(\"mode requires at least one data point\");\n } else if (sorted.length === 1) {\n return sorted[0];\n }\n\n // This assumes it is dealing with an array of size > 1, since size\n // 0 and 1 are handled immediately. Hence it starts at index 1 in the\n // array.\n var last = sorted[0],\n // store the mode as we find new modes\n value = NaN,\n // store how many times we've seen the mode\n maxSeen = 0,\n // how many times the current candidate for the mode\n // has been seen\n seenThis = 1;\n\n // end at sorted.length + 1 to fix the case in which the mode is\n // the highest number that occurs in the sequence. the last iteration\n // compares sorted[i], which is undefined, to the highest number\n // in the series\n for (var i = 1; i < sorted.length + 1; i++) {\n // we're seeing a new number pass by\n if (sorted[i] !== last) {\n // the last number is the new mode since we saw it more\n // often than the old one\n if (seenThis > maxSeen) {\n maxSeen = seenThis;\n value = last;\n }\n seenThis = 1;\n last = sorted[i];\n // if this isn't a new number, it's one more occurrence of\n // the potential mode\n } else {\n seenThis++;\n }\n }\n return value;\n}\n\n/**\n * Sort an array of numbers by their numeric value, ensuring that the\n * array is not changed in place.\n *\n * This is necessary because the default behavior of .sort\n * in JavaScript is to sort arrays as string values\n *\n * [1, 10, 12, 102, 20].sort()\n * // output\n * [1, 10, 102, 12, 20]\n *\n * @param {Array<number>} x input array\n * @return {Array<number>} sorted array\n * @private\n * @example\n * numericSort([3, 2, 1]) // => [1, 2, 3]\n */\nfunction numericSort(x) {\n return (\n x\n // ensure the array is not changed in-place\n .slice()\n // comparator function that treats input as numeric\n .sort(function (a, b) {\n return a - b;\n })\n );\n}\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n log(n))` because it needs to sort the array internally\n * before running an `O(n)` search to find the mode.\n *\n * @param {Array<number>} x input\n * @returns {number} mode\n * @example\n * mode([0, 0, 1]); // => 0\n */\nfunction mode(x) {\n // Sorting the array lets us iterate through it below and be sure\n // that every time we see a new number it's new and we'll never\n // see the same number twice\n return modeSorted(numericSort(x));\n}\n\n/* globals Map: false */\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * modeFast uses a Map object to keep track of the mode, instead of the approach\n * used with `mode`, a sorted array. As a result, it is faster\n * than `mode` and supports any data type that can be compared with `==`.\n * It also requires a\n * [JavaScript environment with support for Map](https://kangax.github.io/compat-table/es6/#test-Map),\n * and will throw an error if Map is not available.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * @param {Array<*>} x a sample of one or more data points\n * @returns {?*} mode\n * @throws {ReferenceError} if the JavaScript environment doesn't support Map\n * @throws {Error} if x is empty\n * @example\n * modeFast(['rabbits', 'rabbits', 'squirrels']); // => 'rabbits'\n */\nfunction modeFast(x) {\n // This index will reflect the incidence of different values, indexing\n // them like\n // { value: count }\n var index = new Map();\n\n // A running `mode` and the number of times it has been encountered.\n var mode;\n var modeCount = 0;\n\n for (var i = 0; i < x.length; i++) {\n var newCount = index.get(x[i]);\n if (newCount === undefined) {\n newCount = 1;\n } else {\n newCount++;\n }\n if (newCount > modeCount) {\n mode = x[i];\n modeCount = newCount;\n }\n index.set(x[i], newCount);\n }\n\n if (modeCount === 0) {\n throw new Error(\"mode requires at last one data point\");\n }\n\n return mode;\n}\n\n/**\n * The min is the lowest number in the array.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} minimum value\n * @example\n * min([1, 5, -10, 100, 2]); // => -10\n */\nfunction min(x) {\n if (x.length === 0) {\n throw new Error(\"min requires at least one data point\");\n }\n\n var value = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] < value) {\n value = x[i];\n }\n }\n return value;\n}\n\n/**\n * This computes the maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * max([1, 2, 3, 4]);\n * // => 4\n */\nfunction max(x) {\n if (x.length === 0) {\n throw new Error(\"max requires at least one data point\");\n }\n\n var value = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] > value) {\n value = x[i];\n }\n }\n return value;\n}\n\n/**\n * This computes the minimum & maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {Array<number>} minimum & maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * extent([1, 2, 3, 4]);\n * // => [1, 4]\n */\nfunction extent(x) {\n if (x.length === 0) {\n throw new Error(\"extent requires at least one data point\");\n }\n\n var min = x[0];\n var max = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] > max) {\n max = x[i];\n }\n if (x[i] < min) {\n min = x[i];\n }\n }\n return [min, max];\n}\n\n/**\n * The minimum is the lowest number in the array. With a sorted array,\n * the first element in the array is always the smallest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} minimum value\n * @example\n * minSorted([-100, -10, 1, 2, 5]); // => -100\n */\nfunction minSorted(x) {\n return x[0];\n}\n\n/**\n * The maximum is the highest number in the array. With a sorted array,\n * the last element in the array is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} maximum value\n * @example\n * maxSorted([-100, -10, 1, 2, 5]); // => 5\n */\nfunction maxSorted(x) {\n return x[x.length - 1];\n}\n\n/**\n * The extent is the lowest & highest number in the array. With a sorted array,\n * the first element in the array is always the lowest while the last element is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {Array<number>} minimum & maximum value\n * @example\n * extentSorted([-100, -10, 1, 2, 5]); // => [-100, 5]\n */\nfunction extentSorted(x) {\n return [x[0], x[x.length - 1]];\n}\n\n/**\n * The simple [sum](https://en.wikipedia.org/wiki/Summation) of an array\n * is the result of adding all numbers together, starting from zero.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sumSimple([1, 2, 3]); // => 6\n */\nfunction sumSimple(x) {\n var value = 0;\n for (var i = 0; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return NaN;\n }\n value += x[i];\n }\n return value;\n}\n\n/**\n * The [product](https://en.wikipedia.org/wiki/Product_(mathematics)) of an array\n * is the result of multiplying all numbers together, starting using one as the multiplicative identity.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} product of all input numbers\n * @example\n * product([1, 2, 3, 4]); // => 24\n */\nfunction product(x) {\n var value = 1;\n for (var i = 0; i < x.length; i++) {\n value *= x[i];\n }\n return value;\n}\n\n/**\n * This is the internal implementation of quantiles: when you know\n * that the order is sorted, you don't need to re-sort it, and the computations\n * are faster.\n *\n * @param {Array<number>} x sample of one or more data points\n * @param {number} p desired quantile: a number between 0 to 1, inclusive\n * @returns {number} quantile value\n * @throws {Error} if p ix outside of the range from 0 to 1\n * @throws {Error} if x is empty\n * @example\n * quantileSorted([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantileSorted(x, p) {\n var idx = x.length * p;\n if (x.length === 0) {\n throw new Error(\"quantile requires at least one data point.\");\n } else if (p < 0 || p > 1) {\n throw new Error(\"quantiles must be between 0 and 1\");\n } else if (p === 1) {\n // If p is 1, directly return the last element\n return x[x.length - 1];\n } else if (p === 0) {\n // If p is 0, directly return the first element\n return x[0];\n } else if (idx % 1 !== 0) {\n // If p is not integer, return the next element in array\n return x[Math.ceil(idx) - 1];\n } else if (x.length % 2 === 0) {\n // If the list has even-length, we'll take the average of this number\n // and the next value, if there is one\n return (x[idx - 1] + x[idx]) / 2;\n } else {\n // Finally, in the simple case of an integer value\n // with an odd-length list, return the x value at the index.\n return x[idx];\n }\n}\n\n/**\n * Rearrange items in `arr` so that all items in `[left, k]` range are the smallest.\n * The `k`-th element will have the `(k - left + 1)`-th smallest value in `[left, right]`.\n *\n * Implements Floyd-Rivest selection algorithm https://en.wikipedia.org/wiki/Floyd-Rivest_algorithm\n *\n * @param {Array<number>} arr input array\n * @param {number} k pivot index\n * @param {number} [left] left index\n * @param {number} [right] right index\n * @returns {void} mutates input array\n * @example\n * var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];\n * quickselect(arr, 8);\n * // = [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]\n */\nfunction quickselect(arr, k, left, right) {\n left = left || 0;\n right = right || arr.length - 1;\n\n while (right > left) {\n // 600 and 0.5 are arbitrary constants chosen in the original paper to minimize execution time\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp((2 * z) / 3);\n var sd = 0.5 * Math.sqrt((z * s * (n - s)) / n);\n if (m - n / 2 < 0) { sd *= -1; }\n var newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd));\n var newRight = Math.min(\n right,\n Math.floor(k + ((n - m) * s) / n + sd)\n );\n quickselect(arr, k, newLeft, newRight);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (arr[right] > t) { swap(arr, left, right); }\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (arr[i] < t) { i++; }\n while (arr[j] > t) { j--; }\n }\n\n if (arr[left] === t) { swap(arr, left, j); }\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) { left = j + 1; }\n if (k <= j) { right = j - 1; }\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n/**\n * The [quantile](https://en.wikipedia.org/wiki/Quantile):\n * this is a population quantile, since we assume to know the entire\n * dataset in this library. This is an implementation of the\n * [Quantiles of a Population](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population)\n * algorithm from wikipedia.\n *\n * Sample is a one-dimensional array of numbers,\n * and p is either a decimal number from 0 to 1 or an array of decimal\n * numbers from 0 to 1.\n * In terms of a k/q quantile, p = k/q - it's just dealing with fractions or dealing\n * with decimal values.\n * When p is an array, the result of the function is also an array containing the appropriate\n * quantiles in input order\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {Array<number> | number} p the desired quantile, as a number between 0 and 1\n * @returns {number} quantile\n * @example\n * quantile([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantile(x, p) {\n var copy = x.slice();\n\n if (Array.isArray(p)) {\n // rearrange elements so that each element corresponding to a requested\n // quantile is on a place it would be if the array was fully sorted\n multiQuantileSelect(copy, p);\n // Initialize the result array\n var results = [];\n // For each requested quantile\n for (var i = 0; i < p.length; i++) {\n results[i] = quantileSorted(copy, p[i]);\n }\n return results;\n } else {\n var idx = quantileIndex(copy.length, p);\n quantileSelect(copy, idx, 0, copy.length - 1);\n return quantileSorted(copy, p);\n }\n}\n\nfunction quantileSelect(arr, k, left, right) {\n if (k % 1 === 0) {\n quickselect(arr, k, left, right);\n } else {\n k = Math.floor(k);\n quickselect(arr, k, left, right);\n quickselect(arr, k + 1, k + 1, right);\n }\n}\n\nfunction multiQuantileSelect(arr, p) {\n var indices = [0];\n for (var i = 0; i < p.length; i++) {\n indices.push(quantileIndex(arr.length, p[i]));\n }\n indices.push(arr.length - 1);\n indices.sort(compare);\n\n var stack = [0, indices.length - 1];\n\n while (stack.length) {\n var r = Math.ceil(stack.pop());\n var l = Math.floor(stack.pop());\n if (r - l <= 1) { continue; }\n\n var m = Math.floor((l + r) / 2);\n quantileSelect(\n arr,\n indices[m],\n Math.floor(indices[l]),\n Math.ceil(indices[r])\n );\n\n stack.push(l, m, m, r);\n }\n}\n\nfunction compare(a, b) {\n return a - b;\n}\n\nfunction quantileIndex(len, p) {\n var idx = len * p;\n if (p === 1) {\n // If p is 1, directly return the last index\n return len - 1;\n } else if (p === 0) {\n // If p is 0, directly return the first index\n return 0;\n } else if (idx % 1 !== 0) {\n // If index is not integer, return the next index in array\n return Math.ceil(idx) - 1;\n } else if (len % 2 === 0) {\n // If the list has even-length, we'll return the middle of two indices\n // around quantile to indicate that we need an average value of the two\n return idx - 0.5;\n } else {\n // Finally, in the simple case of an integer index\n // with an odd-length list, return the index\n return idx;\n }\n}\n\n/* eslint no-bitwise: 0 */\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. With a sorted array, leveraging binary search, we can find\n * this information in logarithmic time.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRankSorted([1, 2, 3, 4], 3); // => 0.75\n * quantileRankSorted([1, 2, 3, 3, 4], 3); // => 0.7\n * quantileRankSorted([1, 2, 3, 4], 6); // => 1\n * quantileRankSorted([1, 2, 3, 3, 5], 4); // => 0.8\n */\nfunction quantileRankSorted(x, value) {\n // Value is lesser than any value in the array\n if (value < x[0]) {\n return 0;\n }\n\n // Value is greater than any value in the array\n if (value > x[x.length - 1]) {\n return 1;\n }\n\n var l = lowerBound(x, value);\n\n // Value is not in the array\n if (x[l] !== value) {\n return l / x.length;\n }\n\n l++;\n\n var u = upperBound(x, value);\n\n // The value exists only once in the array\n if (u === l) {\n return l / x.length;\n }\n\n // Here, we are basically computing the mean of the range of indices\n // containing our searched value. But, instead, of initializing an\n // array and looping over it, there is a dedicated math formula that\n // we apply below to get the result.\n var r = u - l + 1;\n var sum = (r * (u + l)) / 2;\n var mean = sum / r;\n\n return mean / x.length;\n}\n\nfunction lowerBound(x, value) {\n var mid = 0;\n var lo = 0;\n var hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value <= x[mid]) {\n hi = mid;\n } else {\n lo = -~mid;\n }\n }\n\n return lo;\n}\n\nfunction upperBound(x, value) {\n var mid = 0;\n var lo = 0;\n var hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value >= x[mid]) {\n lo = -~mid;\n } else {\n hi = mid;\n }\n }\n\n return lo;\n}\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. It will copy and sort your array before each run, so\n * if you know your array is already sorted, you should use `quantileRankSorted`\n * instead.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRank([4, 3, 1, 2], 3); // => 0.75\n * quantileRank([4, 3, 2, 3, 1], 3); // => 0.7\n * quantileRank([2, 4, 1, 3], 6); // => 1\n * quantileRank([5, 3, 1, 2, 3], 4); // => 0.8\n */\nfunction quantileRank(x, value) {\n // Cloning and sorting the array\n var sortedCopy = numericSort(x);\n\n return quantileRankSorted(sortedCopy, value);\n}\n\n/**\n * The [Interquartile range](http://en.wikipedia.org/wiki/Interquartile_range) is\n * a measure of statistical dispersion, or how scattered, spread, or\n * concentrated a distribution is. It's computed as the difference between\n * the third quartile and first quartile.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @returns {number} interquartile range: the span between lower and upper quartile,\n * 0.25 and 0.75\n * @example\n * interquartileRange([0, 1, 2, 3]); // => 2\n */\nfunction interquartileRange(x) {\n // Interquartile range is the span between the upper quartile,\n // at `0.75`, and lower quartile, `0.25`\n var q1 = quantile(x, 0.75);\n var q2 = quantile(x, 0.25);\n\n if (typeof q1 === \"number\" && typeof q2 === \"number\") {\n return q1 - q2;\n }\n}\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} x input\n * @returns {number} median value\n * @example\n * median([10, 2, 5, 100, 2, 1]); // => 3.5\n */\nfunction median(x) {\n return +quantile(x, 0.5);\n}\n\n/**\n * The [Median Absolute Deviation](http://en.wikipedia.org/wiki/Median_absolute_deviation) is\n * a robust measure of statistical\n * dispersion. It is more resilient to outliers than the standard deviation.\n *\n * @param {Array<number>} x input array\n * @returns {number} median absolute deviation\n * @example\n * medianAbsoluteDeviation([1, 1, 2, 2, 4, 6, 9]); // => 1\n */\nfunction medianAbsoluteDeviation(x) {\n var medianValue = median(x);\n var medianAbsoluteDeviations = [];\n\n // Make a list of absolute deviations from the median\n for (var i = 0; i < x.length; i++) {\n medianAbsoluteDeviations.push(Math.abs(x[i] - medianValue));\n }\n\n // Find the median value of that list\n return median(medianAbsoluteDeviations);\n}\n\n/**\n * Split an array into chunks of a specified size. This function\n * has the same behavior as [PHP's array_chunk](http://php.net/manual/en/function.array-chunk.php)\n * function, and thus will insert smaller-sized chunks at the end if\n * the input size is not divisible by the chunk size.\n *\n * `x` is expected to be an array, and `chunkSize` a number.\n * The `x` array can contain any kind of data.\n *\n * @param {Array} x a sample\n * @param {number} chunkSize size of each output array. must be a positive integer\n * @returns {Array<Array>} a chunked array\n * @throws {Error} if chunk size is less than 1 or not an integer\n * @example\n * chunk([1, 2, 3, 4, 5, 6], 2);\n * // => [[1, 2], [3, 4], [5, 6]]\n */\nfunction chunk(x, chunkSize) {\n // a list of result chunks, as arrays in an array\n var output = [];\n\n // `chunkSize` must be zero or higher - otherwise the loop below,\n // in which we call `start += chunkSize`, will loop infinitely.\n // So, we'll detect and throw in that case to indicate\n // invalid input.\n if (chunkSize < 1) {\n throw new Error(\"chunk size must be a positive number\");\n }\n\n if (Math.floor(chunkSize) !== chunkSize) {\n throw new Error(\"chunk size must be an integer\");\n }\n\n // `start` is the index at which `.slice` will start selecting\n // new array elements\n for (var start = 0; start < x.length; start += chunkSize) {\n // for each chunk, slice that part of the array and add it\n // to the output. The `.slice` function does not change\n // the original array.\n output.push(x.slice(start, start + chunkSize));\n }\n return output;\n}\n\n/**\n * Sampling with replacement is a type of sampling that allows the same\n * item to be picked out of a population more than once.\n *\n * @param {Array<*>} x an array of any kind of value\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} n sampled items from the population\n * @example\n * var values = [1, 2, 3, 4];\n * sampleWithReplacement(values, 2); // returns 2 random values, like [2, 4];\n */\nfunction sampleWithReplacement(x, n, randomSource) {\n if (x.length === 0) {\n return [];\n }\n\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n var length = x.length;\n var sample = [];\n\n for (var i = 0; i < n; i++) {\n var index = Math.floor(randomSource() * length);\n\n sample.push(x[index]);\n }\n\n return sample;\n}\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * in-place - which means that it **will change the order of the original\n * array by reference**.\n *\n * This is an algorithm that generates a random [permutation](https://en.wikipedia.org/wiki/Permutation)\n * of a set.\n *\n * @param {Array} x sample of one or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @returns {Array} x\n * @example\n * var x = [1, 2, 3, 4];\n * shuffleInPlace(x);\n * // x is shuffled to a value like [2, 1, 4, 3]\n */\nfunction shuffleInPlace(x, randomSource) {\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n // store the current length of the x to determine\n // when no elements remain to shuffle.\n var length = x.length;\n\n // temporary is used to hold an item when it is being\n // swapped between indices.\n var temporary;\n\n // The index to swap at each stage.\n var index;\n\n // While there are still items to shuffle\n while (length > 0) {\n // choose a random index within the subset of the array\n // that is not yet shuffled\n index = Math.floor(randomSource() * length--);\n\n // store the value that we'll move temporarily\n temporary = x[length];\n\n // swap the value at `x[length]` with `x[index]`\n x[length] = x[index];\n x[index] = temporary;\n }\n\n return x;\n}\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * is a fast way to create a random permutation of a finite set. This is\n * a function around `shuffle_in_place` that adds the guarantee that\n * it will not modify its input.\n *\n * @param {Array} x sample of 0 or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} shuffled version of input\n * @example\n * var shuffled = shuffle([1, 2, 3, 4]);\n * shuffled; // = [2, 3, 1, 4] or any other random permutation\n */\nfunction shuffle(x, randomSource) {\n // slice the original array so that it is not modified\n var sample = x.slice();\n\n // and then shuffle that shallow-copied array, in place\n return shuffleInPlace(sample, randomSource);\n}\n\n/**\n * Create a [simple random sample](http://en.wikipedia.org/wiki/Simple_random_sample)\n * from a given array of `n` elements.\n *\n * The sampled values will be in any order, not necessarily the order\n * they appear in the input.\n *\n * @param {Array<any>} x input array. can contain any type\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} subset of n elements in original array\n *\n * @example\n * var values = [1, 2, 4, 5, 6, 7, 8, 9];\n * sample(values, 3); // returns 3 random values, like [2, 5, 8];\n */\nfunction sample(x, n, randomSource) {\n // shuffle the original array using a fisher-yates shuffle\n var shuffled = shuffle(x, randomSource);\n\n // and then return a subset of it - the first `n` elements.\n return shuffled.slice(0, n);\n}\n\n/**\n * Create a new column x row matrix.\n *\n * @private\n * @param {number} columns\n * @param {number} rows\n * @return {Array<Array<number>>} matrix\n * @example\n * makeMatrix(10, 10);\n */\nfunction makeMatrix(columns, rows) {\n var matrix = [];\n for (var i = 0; i < columns; i++) {\n var column = [];\n for (var j = 0; j < rows; j++) {\n column.push(0);\n }\n matrix.push(column);\n }\n return matrix;\n}\n\n/**\n * For a sorted input, counting the number of unique values\n * is possible in constant time and constant memory. This is\n * a simple implementation of the algorithm.\n *\n * Values are compared with `===`, so objects and non-primitive objects\n * are not handled in any special way.\n *\n * @param {Array<*>} x an array of any kind of value\n * @returns {number} count of unique values\n * @example\n * uniqueCountSorted([1, 2, 3]); // => 3\n * uniqueCountSorted([1, 1, 1]); // => 1\n */\nfunction uniqueCountSorted(x) {\n var uniqueValueCount = 0,\n lastSeenValue;\n for (var i = 0; i < x.length; i++) {\n if (i === 0 || x[i] !== lastSeenValue) {\n lastSeenValue = x[i];\n uniqueValueCount++;\n }\n }\n return uniqueValueCount;\n}\n\n/**\n * Generates incrementally computed values based on the sums and sums of\n * squares for the data array\n *\n * @private\n * @param {number} j\n * @param {number} i\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n * @return {number}\n * @example\n * ssq(0, 1, [-1, 0, 2], [1, 1, 5]);\n */\nfunction ssq(j, i, sums, sumsOfSquares) {\n var sji; // s(j, i)\n if (j > 0) {\n var muji = (sums[i] - sums[j - 1]) / (i - j + 1); // mu(j, i)\n sji =\n sumsOfSquares[i] - sumsOfSquares[j - 1] - (i - j + 1) * muji * muji;\n } else {\n sji = sumsOfSquares[i] - (sums[i] * sums[i]) / (i + 1);\n }\n if (sji < 0) {\n return 0;\n }\n return sji;\n}\n\n/**\n * Function that recursively divides and conquers computations\n * for cluster j\n *\n * @private\n * @param {number} iMin Minimum index in cluster to be computed\n * @param {number} iMax Maximum index in cluster to be computed\n * @param {number} cluster Index of the cluster currently being computed\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n */\nfunction fillMatrixColumn(\n iMin,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n) {\n if (iMin > iMax) {\n return;\n }\n\n // Start at midpoint between iMin and iMax\n var i = Math.floor((iMin + iMax) / 2);\n\n matrix[cluster][i] = matrix[cluster - 1][i - 1];\n backtrackMatrix[cluster][i] = i;\n\n var jlow = cluster; // the lower end for j\n\n if (iMin > cluster) {\n jlow = Math.max(jlow, backtrackMatrix[cluster][iMin - 1] || 0);\n }\n jlow = Math.max(jlow, backtrackMatrix[cluster - 1][i] || 0);\n\n var jhigh = i - 1; // the upper end for j\n if (iMax < matrix[0].length - 1) {\n jhigh = Math.min(jhigh, backtrackMatrix[cluster][iMax + 1] || 0);\n }\n\n var sji;\n var sjlowi;\n var ssqjlow;\n var ssqj;\n for (var j = jhigh; j >= jlow; --j) {\n sji = ssq(j, i, sums, sumsOfSquares);\n\n if (sji + matrix[cluster - 1][jlow - 1] >= matrix[cluster][i]) {\n break;\n }\n\n // Examine the lower bound of the cluster border\n sjlowi = ssq(jlow, i, sums, sumsOfSquares);\n\n ssqjlow = sjlowi + matrix[cluster - 1][jlow - 1];\n\n if (ssqjlow < matrix[cluster][i]) {\n // Shrink the lower bound\n matrix[cluster][i] = ssqjlow;\n backtrackMatrix[cluster][i] = jlow;\n }\n jlow++;\n\n ssqj = sji + matrix[cluster - 1][j - 1];\n if (ssqj < matrix[cluster][i]) {\n matrix[cluster][i] = ssqj;\n backtrackMatrix[cluster][i] = j;\n }\n }\n\n fillMatrixColumn(\n iMin,\n i - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n fillMatrixColumn(\n i + 1,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n}\n\n/**\n * Initializes the main matrices used in Ckmeans and kicks\n * off the divide and conquer cluster computation strategy\n *\n * @private\n * @param {Array<number>} data sorted array of values\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n */\nfunction fillMatrices(data, matrix, backtrackMatrix) {\n var nValues = matrix[0].length;\n\n // Shift values by the median to improve numeric stability\n var shift = data[Math.floor(nValues / 2)];\n\n // Cumulative sum and cumulative sum of squares for all values in data array\n var sums = [];\n var sumsOfSquares = [];\n\n // Initialize first column in matrix & backtrackMatrix\n for (var i = 0, shiftedValue = (void 0); i < nValues; ++i) {\n shiftedValue = data[i] - shift;\n if (i === 0) {\n sums.push(shiftedValue);\n sumsOfSquares.push(shiftedValue * shiftedValue);\n } else {\n sums.push(sums[i - 1] + shiftedValue);\n sumsOfSquares.push(\n sumsOfSquares[i - 1] + shiftedValue * shiftedValue\n );\n }\n\n // Initialize for cluster = 0\n matrix[0][i] = ssq(0, i, sums, sumsOfSquares);\n backtrackMatrix[0][i] = 0;\n }\n\n // Initialize the rest of the columns\n var iMin;\n for (var cluster = 1; cluster < matrix.length; ++cluster) {\n if (cluster < matrix.length - 1) {\n iMin = cluster;\n } else {\n // No need to compute matrix[K-1][0] ... matrix[K-1][N-2]\n iMin = nValues - 1;\n }\n\n fillMatrixColumn(\n iMin,\n nValues - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n }\n}\n\n/**\n * Ckmeans clustering is an improvement on heuristic-based clustering\n * approaches like Jenks. The algorithm was developed in\n * [Haizhou Wang and Mingzhou Song](http://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf)\n * as a [dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming) approach\n * to the problem of clustering numeric data into groups with the least\n * within-group sum-of-squared-deviations.\n *\n * Minimizing the difference within groups - what Wang & Song refer to as\n * `withinss`, or within sum-of-squares, means that groups are optimally\n * homogenous within and the data is split into representative groups.\n * This is very useful for visualization, where you may want to represent\n * a continuous variable in discrete color or style groups. This function\n * can provide groups that emphasize differences between data.\n *\n * Being a dynamic approach, this algorithm is based on two matrices that\n * store incrementally-computed values for squared deviations and backtracking\n * indexes.\n *\n * This implementation is based on Ckmeans 3.4.6, which introduced a new divide\n * and conquer approach that improved runtime from O(kn^2) to O(kn log(n)).\n *\n * Unlike the [original implementation](https://cran.r-project.org/web/packages/Ckmeans.1d.dp/index.html),\n * this implementation does not include any code to automatically determine\n * the optimal number of clusters: this information needs to be explicitly\n * provided.\n *\n * ### References\n * _Ckmeans.1d.dp: Optimal k-means Clustering in One Dimension by Dynamic\n * Programming_ Haizhou Wang and Mingzhou Song ISSN 2073-4859\n *\n * from The R Journal Vol. 3/2, December 2011\n * @param {Array<number>} x input data, as an array of number values\n * @param {number} nClusters number of desired classes. This cannot be\n * greater than the number of values in the data array.\n * @returns {Array<Array<number>>} clustered input\n * @throws {Error} if the number of requested clusters is higher than the size of the data\n * @example\n * ckmeans([-1, 2, -1, 2, 4, 5, 6, -1, 2, -1], 3);\n * // The input, clustered into groups of similar numbers.\n * //= [[-1, -1, -1, -1], [2, 2, 2], [4, 5, 6]]);\n */\nfunction ckmeans(x, nClusters) {\n if (nClusters > x.length) {\n throw new Error(\n \"cannot generate more classes than there are data values\"\n );\n }\n\n var sorted = numericSort(x);\n // we'll use this as the maximum number of clusters\n var uniqueCount = uniqueCountSorted(sorted);\n\n // if all of the input values are identical, there's one cluster\n // with all of the input in it.\n if (uniqueCount === 1) {\n return [sorted];\n }\n\n // named 'S' originally\n var matrix = makeMatrix(nClusters, sorted.length);\n // named 'J' originally\n var backtrackMatrix = makeMatrix(nClusters, sorted.length);\n\n // This is a dynamic programming way to solve the problem of minimizing\n // within-cluster sum of squares. It's similar to linear regression\n // in this way, and this calculation incrementally computes the\n // sum of squares that are later read.\n fillMatrices(sorted, matrix, backtrackMatrix);\n\n // The real work of Ckmeans clustering happens in the matrix generation:\n // the generated matrices encode all possible clustering combinations, and\n // once they're generated we can solve for the best clustering groups\n // very quickly.\n var clusters = [];\n var clusterRight = backtrackMatrix[0].length - 1;\n\n // Backtrack the clusters from the dynamic programming matrix. This\n // starts at the bottom-right corner of the matrix (if the top-left is 0, 0),\n // and moves the cluster target with the loop.\n for (var cluster = backtrackMatrix.length - 1; cluster >= 0; cluster--) {\n var clusterLeft = backtrackMatrix[cluster][clusterRight];\n\n // fill the cluster from the sorted input by taking a slice of the\n // array. the backtrack matrix makes this easy - it stores the\n // indexes where the cluster should start and end.\n clusters[cluster] = sorted.slice(clusterLeft, clusterRight + 1);\n\n if (cluster > 0) {\n clusterRight = clusterLeft - 1;\n }\n }\n\n return clusters;\n}\n\n/*\n * Pull Breaks Values for Jenks\n *\n * the second part of the jenks recipe: take the calculated matrices\n * and derive an array of n breaks.\n *\n * @private\n */\nfunction jenksBreaks(data, lowerClassLimits, nClasses) {\n var k = data.length;\n var kclass = [];\n var countNum = nClasses;\n\n // the calculation of classes will never include the upper\n // bound, so we need to explicitly set it\n kclass[nClasses] = data[data.length - 1];\n\n // the lowerClassLimits matrix is used as indices into itself\n // here: the `k` variable is reused in each iteration.\n while (countNum > 0) {\n kclass[countNum - 1] = data[lowerClassLimits[k][countNum] - 1];\n k = lowerClassLimits[k][countNum] - 1;\n countNum--;\n }\n\n return kclass;\n}\n\n/*\n * Compute Matrices for Jenks\n *\n * Compute the matrices required for Jenks breaks. These matrices\n * can be used for any classing of data with `classes <= nClasses`\n *\n * @private\n */\nfunction jenksMatrices(data, nClasses) {\n // in the original implementation, these matrices are referred to\n // as `LC` and `OP`\n //\n // * lowerClassLimits (LC): optimal lower class limits\n // * varianceCombinations (OP): optimal variance combinations for all classes\n var lowerClassLimits = [];\n var varianceCombinations = [];\n // loop counters\n var i, j;\n // the variance, as computed at each step in the calculation\n var variance = 0;\n\n // Initialize and fill each matrix with zeroes\n for (i = 0; i < data.length + 1; i++) {\n var tmp1 = [];\n var tmp2 = [];\n // despite these arrays having the same values, we need\n // to keep them separate so that changing one does not change\n // the other\n for (j = 0; j < nClasses + 1; j++) {\n tmp1.push(0);\n tmp2.push(0);\n }\n lowerClassLimits.push(tmp1);\n varianceCombinations.push(tmp2);\n }\n\n for (i = 1; i < nClasses + 1; i++) {\n lowerClassLimits[1][i] = 1;\n varianceCombinations[1][i] = 0;\n // in the original implementation, 9999999 is used but\n // since Javascript has `Infinity`, we use that.\n for (j = 2; j < data.length + 1; j++) {\n varianceCombinations[j][i] = Infinity;\n }\n }\n\n for (var l = 2; l < data.length + 1; l++) {\n // `SZ` originally. this is the sum of the values seen thus\n // far when calculating variance.\n var sum = 0;\n // `ZSQ` originally. the sum of squares of values seen\n // thus far\n var sumSquares = 0;\n // `WT` originally. This is the number of\n var w = 0;\n // `IV` originally\n var i4 = 0;\n\n // in several instances, you could say `Math.pow(x, 2)`\n // instead of `x * x`, but this is slower in some browsers\n // introduces an unnecessary concept.\n for (var m = 1; m < l + 1; m++) {\n // `III` originally\n var lowerClassLimit = l - m + 1;\n var val = data[lowerClassLimit - 1];\n\n // here we're estimating variance for each potential classing\n // of the data, for each potential number of classes. `w`\n // is the number of data points considered so far.\n w++;\n\n // increase the current sum and sum-of-squares\n sum += val;\n sumSquares += val * val;\n\n // the variance at this point in the sequence is the difference\n // between the sum of squares and the total x 2, over the number\n // of samples.\n variance = sumSquares - (sum * sum) / w;\n\n i4 = lowerClassLimit - 1;\n\n if (i4 !== 0) {\n for (j = 2; j < nClasses + 1; j++) {\n // if adding this element to an existing class\n // will increase its variance beyond the limit, break\n // the class at this point, setting the `lowerClassLimit`\n // at this point.\n if (\n varianceCombinations[l][j] >=\n variance + varianceCombinations[i4][j - 1]\n ) {\n lowerClassLimits[l][j] = lowerClassLimit;\n varianceCombinations[l][j] =\n variance + varianceCombinations[i4][j - 1];\n }\n }\n }\n }\n\n lowerClassLimits[l][1] = 1;\n varianceCombinations[l][1] = variance;\n }\n\n // return the two matrices. for just providing breaks, only\n // `lowerClassLimits` is needed, but variances can be useful to\n // evaluate goodness of fit.\n return {\n lowerClassLimits: lowerClassLimits,\n varianceCombinations: varianceCombinations\n };\n}\n\n/**\n * The **[jenks natural breaks optimization](http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization)**\n * is an algorithm commonly used in cartography and visualization to decide\n * upon groupings of data values that minimize variance within themselves\n * and maximize variation between themselves.\n *\n * For instance, cartographers often use jenks in order to choose which\n * values are assigned to which colors in a [choropleth](https://en.wikipedia.org/wiki/Choropleth_map)\n * map.\n *\n * @param {Array<number>} data input data, as an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * // split data into 3 break points\n * jenks([1, 2, 4, 5, 7, 9, 10, 20], 3) // = [1, 7, 20, 20]\n */\nfunction jenks(data, nClasses) {\n if (nClasses > data.length) {\n return null;\n }\n\n // sort data in numerical order, since this is expected\n // by the matrices function\n data = data.slice().sort(function (a, b) {\n return a - b;\n });\n\n // get our basic matrices\n var matrices = jenksMatrices(data, nClasses);\n // we only need lower class limits here\n var lowerClassLimits = matrices.lowerClassLimits;\n\n // extract nClasses out of the computed matrices\n return jenksBreaks(data, lowerClassLimits, nClasses);\n}\n\n/**\n * Given an array of x, this will find the extent of the\n * x and return an array of breaks that can be used\n * to categorize the x into a number of classes. The\n * returned array will always be 1 longer than the number of\n * classes because it includes the minimum value.\n *\n * @param {Array<number>} x an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * @example\n * equalIntervalBreaks([1, 2, 3, 4, 5, 6], 4); // => [1, 2.25, 3.5, 4.75, 6]\n */\nfunction equalIntervalBreaks(x, nClasses) {\n if (x.length < 2) {\n return x;\n }\n\n var theMin = min(x);\n var theMax = max(x);\n\n // the first break will always be the minimum value\n // in the xset\n var breaks = [theMin];\n\n // The size of each break is the full range of the x\n // divided by the number of classes requested\n var breakSize = (theMax - theMin) / nClasses;\n\n // In the case of nClasses = 1, this loop won't run\n // and the returned breaks will be [min, max]\n for (var i = 1; i < nClasses; i++) {\n breaks.push(breaks[0] + breakSize * i);\n }\n\n // the last break will always be the\n // maximum.\n breaks.push(theMax);\n\n return breaks;\n}\n\n/**\n * [Sample covariance](https://en.wikipedia.org/wiki/Sample_mean_and_covariance) of two datasets:\n * how much do the two datasets move together?\n * x and y are two datasets, represented as arrays of numbers.\n *\n * @param {Array<number>} x a sample of two or more data points\n * @param {Array<number>} y a sample of two or more data points\n * @throws {Error} if x and y do not have equal lengths\n * @throws {Error} if x or y have length of one or less\n * @returns {number} sample covariance\n * @example\n * sampleCovariance([1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1]); // => -3.5\n */\nfunction sampleCovariance(x, y) {\n // The two datasets must have the same length which must be more than 1\n if (x.length !== y.length) {\n throw new Error(\"sampleCovariance requires samples with equal lengths\");\n }\n\n if (x.length < 2) {\n throw new Error(\n \"sampleCovariance requires at least two data points in each sample\"\n );\n }\n\n // determine the mean of each dataset so that we can judge each\n // value of the dataset fairly as the difference from the mean. this\n // way, if one dataset is [1, 2, 3] and [2, 3, 4], their covariance\n // does not suffer because of the difference in absolute values\n var xmean = mean(x);\n var ymean = mean(y);\n var sum = 0;\n\n // for each pair of values, the covariance increases when their\n // difference from the mean is associated - if both are well above\n // or if both are well below\n // the mean, the covariance increases significantly.\n for (var i = 0; i < x.length; i++) {\n sum += (x[i] - xmean) * (y[i] - ymean);\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // the covariance is weighted by the length of the datasets.\n return sum / besselsCorrection;\n}\n\n/**\n * The [sample variance](https://en.wikipedia.org/wiki/Variance#Sample_variance)\n * is the sum of squared deviations from the mean. The sample variance\n * is distinguished from the variance by the usage of [Bessel's Correction](https://en.wikipedia.org/wiki/Bessel's_correction):\n * instead of dividing the sum of squared deviations by the length of the input,\n * it is divided by the length minus one. This corrects the bias in estimating\n * a value from a set that you don't know if full.\n *\n * References:\n * * [Wolfram MathWorld on Sample Variance](http://mathworld.wolfram.com/SampleVariance.html)\n *\n * @param {Array<number>} x a sample of two or more data points\n * @throws {Error} if the length of x is less than 2\n * @return {number} sample variance\n * @example\n * sampleVariance([1, 2, 3, 4, 5]); // => 2.5\n */\nfunction sampleVariance(x) {\n if (x.length < 2) {\n throw new Error(\"sampleVariance requires at least two data points\");\n }\n\n var sumSquaredDeviationsValue = sumNthPowerDeviations(x, 2);\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n return sumSquaredDeviationsValue / besselsCorrection;\n}\n\n/**\n * The [sample standard deviation](http://en.wikipedia.org/wiki/Standard_deviation#Sample_standard_deviation)\n * is the square root of the sample variance.\n *\n * @param {Array<number>} x input array\n * @returns {number} sample standard deviation\n * @example\n * sampleStandardDeviation([2, 4, 4, 4, 5, 5, 7, 9]).toFixed(2);\n * // => '2.14'\n */\nfunction sampleStandardDeviation(x) {\n var sampleVarianceX = sampleVariance(x);\n return Math.sqrt(sampleVarianceX);\n}\n\n/**\n * The [correlation](http://en.wikipedia.org/wiki/Correlation_and_dependence) is\n * a measure of how correlated two datasets are, between -1 and 1\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample correlation\n * @example\n * sampleCorrelation([1, 2, 3, 4, 5, 6], [2, 2, 3, 4, 5, 60]).toFixed(2);\n * // => '0.69'\n */\nfunction sampleCorrelation(x, y) {\n var cov = sampleCovariance(x, y);\n var xstd = sampleStandardDeviation(x);\n var ystd = sampleStandardDeviation(y);\n\n return cov / xstd / ystd;\n}\n\n/**\n * The [rank correlation](https://en.wikipedia.org/wiki/Rank_correlation) is\n * a measure of the strength of monotonic relationship between two arrays\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample rank correlation\n */\nfunction sampleRankCorrelation(x, y) {\n var xIndexes = x\n .map(function (value, index) { return [value, index]; })\n .sort(function (a, b) { return a[0] - b[0]; })\n .map(function (pair) { return pair[1]; });\n var yIndexes = y\n .map(function (value, index) { return [value, index]; })\n .sort(function (a, b) { return a[0] - b[0]; })\n .map(function (pair) { return pair[1]; });\n\n // At this step, we have an array of indexes\n // that map from sorted numbers to their original indexes. We reverse\n // that so that it is an array of the sorted destination index.\n var xRanks = Array(xIndexes.length);\n var yRanks = Array(xIndexes.length);\n for (var i = 0; i < xIndexes.length; i++) {\n xRanks[xIndexes[i]] = i;\n yRanks[yIndexes[i]] = i;\n }\n\n return sampleCorrelation(xRanks, yRanks);\n}\n\n/**\n * [Skewness](http://en.wikipedia.org/wiki/Skewness) is\n * a measure of the extent to which a probability distribution of a\n * real-valued random variable \"leans\" to one side of the mean.\n * The skewness value can be positive or negative, or even undefined.\n *\n * Implementation is based on the adjusted Fisher-Pearson standardized\n * moment coefficient, which is the version found in Excel and several\n * statistical packages including Minitab, SAS and SPSS.\n *\n * @since 4.1.0\n * @param {Array<number>} x a sample of 3 or more data points\n * @returns {number} sample skewness\n * @throws {Error} if x has length less than 3\n * @example\n * sampleSkewness([2, 4, 6, 3, 1]); // => 0.590128656384365\n */\nfunction sampleSkewness(x) {\n if (x.length < 3) {\n throw new Error(\"sampleSkewness requires at least three data points\");\n }\n\n var meanValue = mean(x);\n var tempValue;\n var sumSquaredDeviations = 0;\n var sumCubedDeviations = 0;\n\n for (var i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sumSquaredDeviations += tempValue * tempValue;\n sumCubedDeviations += tempValue * tempValue * tempValue;\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n var theSampleStandardDeviation = Math.sqrt(\n sumSquaredDeviations / besselsCorrection\n );\n\n var n = x.length;\n var cubedS = Math.pow(theSampleStandardDeviation, 3);\n\n return (n * sumCubedDeviations) / ((n - 1) * (n - 2) * cubedS);\n}\n\n/**\n * [Kurtosis](http://en.wikipedia.org/wiki/Kurtosis) is\n * a measure of the heaviness of a distribution's tails relative to its\n * variance. The kurtosis value can be positive or negative, or even undefined.\n *\n * Implementation is based on Fisher's excess kurtosis definition and uses\n * unbiased moment estimators. This is the version found in Excel and available\n * in several statistical packages, including SAS and SciPy.\n *\n * @param {Array<number>} x a sample of 4 or more data points\n * @returns {number} sample kurtosis\n * @throws {Error} if x has length less than 4\n * @example\n * sampleKurtosis([1, 2, 2, 3, 5]); // => 1.4555765595463122\n */\nfunction sampleKurtosis(x) {\n var n = x.length;\n\n if (n < 4) {\n throw new Error(\"sampleKurtosis requires at least four data points\");\n }\n\n var meanValue = mean(x);\n var tempValue;\n var secondCentralMoment = 0;\n var fourthCentralMoment = 0;\n\n for (var i = 0; i < n; i++) {\n tempValue = x[i] - meanValue;\n secondCentralMoment += tempValue * tempValue;\n fourthCentralMoment += tempValue * tempValue * tempValue * tempValue;\n }\n\n return (\n ((n - 1) / ((n - 2) * (n - 3))) *\n ((n * (n + 1) * fourthCentralMoment) /\n (secondCentralMoment * secondCentralMoment) -\n 3 * (n - 1))\n );\n}\n\n/**\n * Implementation of [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)\n * for generating permutations.\n *\n * @param {Array} elements any type of data\n * @returns {Array<Array>} array of permutations\n */\nfunction permutationsHeap(elements) {\n var indexes = new Array(elements.length);\n var permutations = [elements.slice()];\n\n for (var i = 0; i < elements.length; i++) {\n indexes[i] = 0;\n }\n\n for (var i$1 = 0; i$1 < elements.length; ) {\n if (indexes[i$1] < i$1) {\n // At odd indexes, swap from indexes[i] instead\n // of from the beginning of the array\n var swapFrom = 0;\n if (i$1 % 2 !== 0) {\n swapFrom = indexes[i$1];\n }\n\n // swap between swapFrom and i, using\n // a temporary variable as storage.\n var temp = elements[swapFrom];\n elements[swapFrom] = elements[i$1];\n elements[i$1] = temp;\n\n permutations.push(elements.slice());\n indexes[i$1]++;\n i$1 = 0;\n } else {\n indexes[i$1] = 0;\n i$1++;\n }\n }\n\n return permutations;\n}\n\n/**\n * Implementation of Combinations\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * https://en.wikipedia.org/wiki/Combination\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinations([1, 2, 3], 2); // => [[1,2], [1,3], [2,3]]\n */\n\nfunction combinations(x, k) {\n var i;\n var subI;\n var combinationList = [];\n var subsetCombinations;\n var next;\n\n for (i = 0; i < x.length; i++) {\n if (k === 1) {\n combinationList.push([x[i]]);\n } else {\n subsetCombinations = combinations(x.slice(i + 1, x.length), k - 1);\n for (subI = 0; subI < subsetCombinations.length; subI++) {\n next = subsetCombinations[subI];\n next.unshift(x[i]);\n combinationList.push(next);\n }\n }\n }\n return combinationList;\n}\n\n/**\n * Implementation of [Combinations](https://en.wikipedia.org/wiki/Combination) with replacement\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * 'With replacement' means that a given element can be chosen multiple times.\n * Unlike permutation, order doesn't matter for combinations.\n *\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinationsReplacement([1, 2], 2); // => [[1, 1], [1, 2], [2, 2]]\n */\nfunction combinationsReplacement(x, k) {\n var combinationList = [];\n\n for (var i = 0; i < x.length; i++) {\n if (k === 1) {\n // If we're requested to find only one element, we don't need\n // to recurse: just push `x[i]` onto the list of combinations.\n combinationList.push([x[i]]);\n } else {\n // Otherwise, recursively find combinations, given `k - 1`. Note that\n // we request `k - 1`, so if you were looking for k=3 combinations, we're\n // requesting k=2. This -1 gets reversed in the for loop right after this\n // code, since we concatenate `x[i]` onto the selected combinations,\n // bringing `k` back up to your requested level.\n // This recursion may go many levels deep, since it only stops once\n // k=1.\n var subsetCombinations = combinationsReplacement(\n x.slice(i, x.length),\n k - 1\n );\n\n for (var j = 0; j < subsetCombinations.length; j++) {\n combinationList.push([x[i]].concat(subsetCombinations[j]));\n }\n }\n }\n\n return combinationList;\n}\n\n/**\n * When adding a new value to a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the new\n * value to add.\n *\n * @since 2.5.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} newValue the added value\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean, n, newValue) {\n return mean + (newValue - mean) / (n + 1);\n}\n\n/**\n * When combining two lists of values for which one already knows the means,\n * one does not have to necessary recompute the mean of the combined lists in\n * linear time. They can instead use this function to compute the combined\n * mean by providing the mean & number of values of the first list and the mean\n * & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineMeans(5, 3, 4, 3); // => 4.5\n */\nfunction combineMeans(mean1, n1, mean2, n2) {\n return (mean1 * n1 + mean2 * n2) / (n1 + n2);\n}\n\n/**\n * When combining two lists of values for which one already knows the variances,\n * one does not have to necessary recompute the variance of the combined lists\n * in linear time. They can instead use this function to compute the combined\n * variance by providing the variance, mean & number of values of the first list\n * and the variance, mean & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} variance1 variance of the first list\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} variance2 variance of the second list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineVariances(14 / 3, 5, 3, 8 / 3, 4, 3); // => 47 / 12\n */\nfunction combineVariances(variance1, mean1, n1, variance2, mean2, n2) {\n var newMean = combineMeans(mean1, n1, mean2, n2);\n\n return (\n (n1 * (variance1 + Math.pow(mean1 - newMean, 2)) +\n n2 * (variance2 + Math.pow(mean2 - newMean, 2))) /\n (n1 + n2)\n );\n}\n\n/**\n * The [Geometric Mean](https://en.wikipedia.org/wiki/Geometric_mean) is\n * a mean function that is more useful for numbers in different\n * ranges.\n *\n * This is the nth root of the input numbers multiplied by each other.\n *\n * The geometric mean is often useful for\n * **[proportional growth](https://en.wikipedia.org/wiki/Geometric_mean#Proportional_growth)**: given\n * growth rates for multiple years, like _80%, 16.66% and 42.85%_, a simple\n * mean will incorrectly estimate an average growth rate, whereas a geometric\n * mean will correctly estimate a growth rate that, over those years,\n * will yield the same end value.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * var growthRates = [1.80, 1.166666, 1.428571];\n * var averageGrowth = ss.geometricMean(growthRates);\n * var averageGrowthRates = [averageGrowth, averageGrowth, averageGrowth];\n * var startingValue = 10;\n * var startingValueMean = 10;\n * growthRates.forEach(function(rate) {\n * startingValue *= rate;\n * });\n * averageGrowthRates.forEach(function(rate) {\n * startingValueMean *= rate;\n * });\n * startingValueMean === startingValue;\n */\nfunction geometricMean(x) {\n if (x.length === 0) {\n throw new Error(\"geometricMean requires at least one data point\");\n }\n\n // the starting value.\n var value = 1;\n\n for (var i = 0; i < x.length; i++) {\n // the geometric mean is only valid for positive numbers\n if (x[i] < 0) {\n throw new Error(\n \"geometricMean requires only non-negative numbers as input\"\n );\n }\n\n // repeatedly multiply the value by each number\n value *= x[i];\n }\n\n return Math.pow(value, 1 / x.length);\n}\n\n/**\n * The [log average](https://en.wikipedia.org/wiki/https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_logarithms)\n * is an equivalent way of computing the geometric mean of an array suitable for large or small products.\n *\n * It's found by calculating the average logarithm of the elements and exponentiating.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n */\nfunction logAverage(x) {\n if (x.length === 0) {\n throw new Error(\"logAverage requires at least one data point\");\n }\n\n var value = 0;\n for (var i = 0; i < x.length; i++) {\n if (x[i] < 0) {\n throw new Error(\n \"logAverage requires only non-negative numbers as input\"\n );\n }\n value += Math.log(x[i]);\n }\n\n return Math.exp(value / x.length);\n}\n\n/**\n * The [Harmonic Mean](https://en.wikipedia.org/wiki/Harmonic_mean) is\n * a mean function typically used to find the average of rates.\n * This mean is calculated by taking the reciprocal of the arithmetic mean\n * of the reciprocals of the input numbers.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} harmonic mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * harmonicMean([2, 3]).toFixed(2) // => '2.40'\n */\nfunction harmonicMean(x) {\n if (x.length === 0) {\n throw new Error(\"harmonicMean requires at least one data point\");\n }\n\n var reciprocalSum = 0;\n\n for (var i = 0; i < x.length; i++) {\n // the harmonic mean is only valid for positive numbers\n if (x[i] <= 0) {\n throw new Error(\n \"harmonicMean requires only positive numbers as input\"\n );\n }\n\n reciprocalSum += 1 / x[i];\n }\n\n // divide n by the reciprocal sum\n return x.length / reciprocalSum;\n}\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The simple mean uses the successive addition method internally\n * to calculate it's result. Errors in floating-point addition are\n * not accounted for, so if precision is required, the standard {@link mean}\n * method should be used instead.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction meanSimple(x) {\n if (x.length === 0) {\n throw new Error(\"meanSimple requires at least one data point\");\n }\n\n return sumSimple(x) / x.length;\n}\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} sorted input\n * @returns {number} median value\n * @example\n * medianSorted([10, 2, 5, 100, 2, 1]); // => 52.5\n */\nfunction medianSorted(sorted) {\n return quantileSorted(sorted, 0.5);\n}\n\n/**\n * When removing a value from a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the value to remove.\n *\n * @since 3.0.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} value the value to remove\n * @returns {number} the new mean\n *\n * @example\n * subtractFromMean(20.5, 6, 53); // => 14\n */\nfunction subtractFromMean(mean, n, value) {\n return (mean * n - value) / (n - 1);\n}\n\n/**\n * The Root Mean Square (RMS) is\n * a mean function used as a measure of the magnitude of a set\n * of numbers, regardless of their sign.\n * This is the square root of the mean of the squares of the\n * input numbers.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x a sample of one or more data points\n * @returns {number} root mean square\n * @throws {Error} if x is empty\n * @example\n * rootMeanSquare([-1, 1, -1, 1]); // => 1\n */\nfunction rootMeanSquare(x) {\n if (x.length === 0) {\n throw new Error(\"rootMeanSquare requires at least one data point\");\n }\n\n var sumOfSquares = 0;\n for (var i = 0; i < x.length; i++) {\n sumOfSquares += Math.pow(x[i], 2);\n }\n\n return Math.sqrt(sumOfSquares / x.length);\n}\n\n/**\n * The`coefficient of variation`_ is the ratio of the standard deviation to the mean.\n * .._`coefficient of variation`: https://en.wikipedia.org/wiki/Coefficient_of_variation\n *\n *\n * @param {Array} x input\n * @returns {number} coefficient of variation\n * @example\n * coefficientOfVariation([1, 2, 3, 4]).toFixed(3); // => 0.516\n * coefficientOfVariation([1, 2, 3, 4, 5]).toFixed(3); // => 0.527\n * coefficientOfVariation([-1, 0, 1, 2, 3, 4]).toFixed(3); // => 1.247\n */\nfunction coefficientOfVariation(x) {\n return sampleStandardDeviation(x) / mean(x);\n}\n\n/**\n * This is to compute [a one-sample t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#One-sample_t-test), comparing the mean\n * of a sample to a known value, x.\n *\n * in this case, we're trying to determine whether the\n * population mean is equal to the value that we know, which is `x`\n * here. Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {number} expectedValue expected value of the population mean\n * @returns {number} value\n * @example\n * tTest([1, 2, 3, 4, 5, 6], 3.385).toFixed(2); // => '0.16'\n */\nfunction tTest(x, expectedValue) {\n // The mean of the sample\n var sampleMean = mean(x);\n\n // The standard deviation of the sample\n var sd = standardDeviation(x);\n\n // Square root the length of the sample\n var rootN = Math.sqrt(x.length);\n\n // returning the t value\n return (sampleMean - expectedValue) / (sd / rootN);\n}\n\n/**\n * This is to compute [two sample t-test](http://en.wikipedia.org/wiki/Student's_t-test).\n * Tests whether \"mean(X)-mean(Y) = difference\", (\n * in the most common case, we often have `difference == 0` to test if two samples\n * are likely to be taken from populations with the same mean value) with\n * no prior knowledge on standard deviations of both samples\n * other than the fact that they have the same standard deviation.\n *\n * Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * `diff` can be omitted if it equals 0.\n *\n * [This is used to reject](https://en.wikipedia.org/wiki/Exclusion_of_the_null_hypothesis)\n * a null hypothesis that the two populations that have been sampled into\n * `sampleX` and `sampleY` are equal to each other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @param {number} [difference=0]\n * @returns {number|null} test result\n *\n * @example\n * tTestTwoSample([1, 2, 3, 4], [3, 4, 5, 6], 0); // => -2.1908902300206643\n */\nfunction tTestTwoSample(sampleX, sampleY, difference) {\n var n = sampleX.length;\n var m = sampleY.length;\n\n // If either sample doesn't actually have any values, we can't\n // compute this at all, so we return `null`.\n if (!n || !m) {\n return null;\n }\n\n // default difference (mu) is zero\n if (!difference) {\n difference = 0;\n }\n\n var meanX = mean(sampleX);\n var meanY = mean(sampleY);\n var sampleVarianceX = sampleVariance(sampleX);\n var sampleVarianceY = sampleVariance(sampleY);\n\n if (\n typeof meanX === \"number\" &&\n typeof meanY === \"number\" &&\n typeof sampleVarianceX === \"number\" &&\n typeof sampleVarianceY === \"number\"\n ) {\n var weightedVariance =\n ((n - 1) * sampleVarianceX + (m - 1) * sampleVarianceY) /\n (n + m - 2);\n\n return (\n (meanX - meanY - difference) /\n Math.sqrt(weightedVariance * (1 / n + 1 / m))\n );\n }\n}\n\n/**\n * This function calculates the Wilcoxon rank sum statistic for the first sample\n * with respect to the second. The Wilcoxon rank sum test is a non-parametric\n * alternative to the t-test which is equivalent to the\n * [Mann-Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test).\n * The statistic is calculated by pooling all the observations together, ranking them,\n * and then summing the ranks associated with one of the samples. If this rank sum is\n * sufficiently large or small we reject the hypothesis that the two samples come\n * from the same distribution in favor of the alternative that one is shifted with\n * respect to the other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @returns {number} rank sum for sampleX\n *\n * @example\n * wilcoxonRankSum([1, 4, 8], [9, 12, 15]); // => 6\n */\nfunction wilcoxonRankSum(sampleX, sampleY) {\n if (!sampleX.length || !sampleY.length) {\n throw new Error(\"Neither sample can be empty\");\n }\n\n var pooledSamples = sampleX\n .map(function (x) { return ({ label: \"x\", value: x }); })\n .concat(sampleY.map(function (y) { return ({ label: \"y\", value: y }); }))\n .sort(function (a, b) { return a.value - b.value; });\n\n for (var rank = 0; rank < pooledSamples.length; rank++) {\n pooledSamples[rank].rank = rank;\n }\n\n var tiedRanks = [pooledSamples[0].rank];\n for (var i = 1; i < pooledSamples.length; i++) {\n if (pooledSamples[i].value === pooledSamples[i - 1].value) {\n tiedRanks.push(pooledSamples[i].rank);\n if (i === pooledSamples.length - 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n }\n } else if (tiedRanks.length > 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n } else {\n tiedRanks = [pooledSamples[i].rank];\n }\n }\n\n function replaceRanksInPlace(pooledSamples, tiedRanks) {\n var average = (tiedRanks[0] + tiedRanks[tiedRanks.length - 1]) / 2;\n for (var i = 0; i < tiedRanks.length; i++) {\n pooledSamples[tiedRanks[i]].rank = average;\n }\n }\n\n var rankSum = 0;\n\n for (var i$1 = 0; i$1 < pooledSamples.length; i$1++) {\n var sample = pooledSamples[i$1];\n if (sample.label === \"x\") {\n rankSum += sample.rank + 1;\n }\n }\n\n return rankSum;\n}\n\n/**\n * [Bayesian Classifier](http://en.wikipedia.org/wiki/Naive_Bayes_classifier)\n *\n * This is a naïve bayesian classifier that takes\n * singly-nested objects.\n *\n * @class\n * @example\n * var bayes = new BayesianClassifier();\n * bayes.train({\n * species: 'Cat'\n * }, 'animal');\n * var result = bayes.score({\n * species: 'Cat'\n * })\n * // result\n * // {\n * // animal: 1\n * // }\n */\nvar BayesianClassifier = function BayesianClassifier() {\n // The number of items that are currently\n // classified in the model\n this.totalCount = 0;\n // Every item classified in the model\n this.data = {};\n};\n\n/**\n * Train the classifier with a new item, which has a single\n * dimension of Javascript literal keys and values.\n *\n * @param {Object} item an object with singly-deep properties\n * @param {string} category the category this item belongs to\n * @return {undefined} adds the item to the classifier\n */\nBayesianClassifier.prototype.train = function train (item, category) {\n // If the data object doesn't have any values\n // for this category, create a new object for it.\n if (!this.data[category]) {\n this.data[category] = {};\n }\n\n // Iterate through each key in the item.\n for (var k in item) {\n var v = item[k];\n // Initialize the nested object `data[category][k][item[k]]`\n // with an object of keys that equal 0.\n if (this.data[category][k] === undefined) {\n this.data[category][k] = {};\n }\n if (this.data[category][k][v] === undefined) {\n this.data[category][k][v] = 0;\n }\n\n // And increment the key for this key/value combination.\n this.data[category][k][v]++;\n }\n\n // Increment the number of items classified\n this.totalCount++;\n};\n\n/**\n * Generate a score of how well this item matches all\n * possible categories based on its attributes\n *\n * @param {Object} item an item in the same format as with train\n * @returns {Object} of probabilities that this item belongs to a\n * given category.\n */\nBayesianClassifier.prototype.score = function score (item) {\n // Initialize an empty array of odds per category.\n var odds = {};\n var category;\n // Iterate through each key in the item,\n // then iterate through each category that has been used\n // in previous calls to `.train()`\n for (var k in item) {\n var v = item[k];\n for (category in this.data) {\n // Create an empty object for storing key - value combinations\n // for this category.\n odds[category] = {};\n\n // If this item doesn't even have a property, it counts for nothing,\n // but if it does have the property that we're looking for from\n // the item to categorize, it counts based on how popular it is\n // versus the whole population.\n if (this.data[category][k]) {\n odds[category][k + \"_\" + v] =\n (this.data[category][k][v] || 0) / this.totalCount;\n } else {\n odds[category][k + \"_\" + v] = 0;\n }\n }\n }\n\n // Set up a new object that will contain sums of these odds by category\n var oddsSums = {};\n\n for (category in odds) {\n // Tally all of the odds for each category-combination pair -\n // the non-existence of a category does not add anything to the\n // score.\n oddsSums[category] = 0;\n for (var combination in odds[category]) {\n oddsSums[category] += odds[category][combination];\n }\n }\n\n return oddsSums;\n};\n\n/**\n * This is a single-layer [Perceptron Classifier](http://en.wikipedia.org/wiki/Perceptron) that takes\n * arrays of numbers and predicts whether they should be classified\n * as either 0 or 1 (negative or positive examples).\n * @class\n * @example\n * // Create the model\n * var p = new PerceptronModel();\n * // Train the model with input with a diagonal boundary.\n * for (var i = 0; i < 5; i++) {\n * p.train([1, 1], 1);\n * p.train([0, 1], 0);\n * p.train([1, 0], 0);\n * p.train([0, 0], 0);\n * }\n * p.predict([0, 0]); // 0\n * p.predict([0, 1]); // 0\n * p.predict([1, 0]); // 0\n * p.predict([1, 1]); // 1\n */\nvar PerceptronModel = function PerceptronModel() {\n // The weights, or coefficients of the model;\n // weights are only populated when training with data.\n this.weights = [];\n // The bias term, or intercept; it is also a weight but\n // it's stored separately for convenience as it is always\n // multiplied by one.\n this.bias = 0;\n};\n/**\n * **Predict**: Use an array of features with the weight array and bias\n * to predict whether an example is labeled 0 or 1.\n *\n * @param {Array<number>} features an array of features as numbers\n * @returns {number} 1 if the score is over 0, otherwise 0\n */\nPerceptronModel.prototype.predict = function predict (features) {\n // Only predict if previously trained\n // on the same size feature array(s).\n if (features.length !== this.weights.length) {\n return null;\n }\n\n // Calculate the sum of features times weights,\n // with the bias added (implicitly times one).\n var score = 0;\n for (var i = 0; i < this.weights.length; i++) {\n score += this.weights[i] * features[i];\n }\n score += this.bias;\n\n // Classify as 1 if the score is over 0, otherwise 0.\n if (score > 0) {\n return 1;\n } else {\n return 0;\n }\n};\n\n/**\n * **Train** the classifier with a new example, which is\n * a numeric array of features and a 0 or 1 label.\n *\n * @param {Array<number>} features an array of features as numbers\n * @param {number} label either 0 or 1\n * @returns {PerceptronModel} this\n */\nPerceptronModel.prototype.train = function train (features, label) {\n // Require that only labels of 0 or 1 are considered.\n if (label !== 0 && label !== 1) {\n return null;\n }\n // The length of the feature array determines\n // the length of the weight array.\n // The perceptron will continue learning as long as\n // it keeps seeing feature arrays of the same length.\n // When it sees a new data shape, it initializes.\n if (features.length !== this.weights.length) {\n this.weights = features;\n this.bias = 1;\n }\n // Make a prediction based on current weights.\n var prediction = this.predict(features);\n // Update the weights if the prediction is wrong.\n if (typeof prediction === \"number\" && prediction !== label) {\n var gradient = label - prediction;\n for (var i = 0; i < this.weights.length; i++) {\n this.weights[i] += gradient * features[i];\n }\n this.bias += gradient;\n }\n return this;\n};\n\n/**\n * We use `ε`, epsilon, as a stopping criterion when we want to iterate\n * until we're \"close enough\". Epsilon is a very small number: for\n * simple statistics, that number is **0.0001**\n *\n * This is used in calculations like the binomialDistribution, in which\n * the process of finding a value is [iterative](https://en.wikipedia.org/wiki/Iterative_method):\n * it progresses until it is close enough.\n *\n * Below is an example of using epsilon in [gradient descent](https://en.wikipedia.org/wiki/Gradient_descent),\n * where we're trying to find a local minimum of a function's derivative,\n * given by the `fDerivative` method.\n *\n * @example\n * // From calculation, we expect that the local minimum occurs at x=9/4\n * var x_old = 0;\n * // The algorithm starts at x=6\n * var x_new = 6;\n * var stepSize = 0.01;\n *\n * function fDerivative(x) {\n * return 4 * Math.pow(x, 3) - 9 * Math.pow(x, 2);\n * }\n *\n * // The loop runs until the difference between the previous\n * // value and the current value is smaller than epsilon - a rough\n * // meaure of 'close enough'\n * while (Math.abs(x_new - x_old) > ss.epsilon) {\n * x_old = x_new;\n * x_new = x_old - stepSize * fDerivative(x_old);\n * }\n *\n * console.log('Local minimum occurs at', x_new);\n */\nvar epsilon = 0.0001;\n\n/**\n * A [Factorial](https://en.wikipedia.org/wiki/Factorial), usually written n!, is the product of all positive\n * integers less than or equal to n. Often factorial is implemented\n * recursively, but this iterative approach is significantly faster\n * and simpler.\n *\n * @param {number} n input, must be an integer number 1 or greater\n * @returns {number} factorial: n!\n * @throws {Error} if n is less than 0 or not an integer\n * @example\n * factorial(5); // => 120\n */\nfunction factorial(n) {\n // factorial is mathematically undefined for negative numbers\n if (n < 0) {\n throw new Error(\"factorial requires a non-negative value\");\n }\n\n if (Math.floor(n) !== n) {\n throw new Error(\"factorial requires an integer input\");\n }\n\n // typically you'll expand the factorial function going down, like\n // 5! = 5 * 4 * 3 * 2 * 1. This is going in the opposite direction,\n // counting from 2 up to the number in question, and since anything\n // multiplied by 1 is itself, the loop only needs to start at 2.\n var accumulator = 1;\n for (var i = 2; i <= n; i++) {\n // for each number up to and including the number `n`, multiply\n // the accumulator my that number.\n accumulator *= i;\n }\n return accumulator;\n}\n\n/**\n * Compute the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Nemes' approximation.\n * The gamma of n is equivalent to (n-1)!, but unlike the factorial function, gamma is defined for all real n except zero\n * and negative integers (where NaN is returned). Note, the gamma function is also well-defined for complex numbers,\n * though this implementation currently does not handle complex numbers as input values.\n * Nemes' approximation is defined [here](https://arxiv.org/abs/1003.6020) as Theorem 2.2.\n * Negative values use [Euler's reflection formula](https://en.wikipedia.org/wiki/Gamma_function#Properties) for computation.\n *\n * @param {number} n Any real number except for zero and negative integers.\n * @returns {number} The gamma of the input value.\n *\n * @example\n * gamma(11.5); // 11899423.084037038\n * gamma(-11.5); // 2.29575810481609e-8\n * gamma(5); // 24\n */\nfunction gamma(n) {\n if (Number.isInteger(n)) {\n if (n <= 0) {\n // gamma not defined for zero or negative integers\n return NaN;\n } else {\n // use factorial for integer inputs\n return factorial(n - 1);\n }\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n if (n < 0) {\n // Use Euler's reflection formula for negative inputs\n // see: https://en.wikipedia.org/wiki/Gamma_function#Properties\n return Math.PI / (Math.sin(Math.PI * -n) * gamma(-n));\n } else {\n // Nemes' expansion approximation\n var seriesCoefficient =\n Math.pow(n / Math.E, n) * Math.sqrt(2 * Math.PI * (n + 1 / 6));\n\n var seriesDenom = n + 1 / 4;\n\n var seriesExpansion =\n 1 +\n 1 / 144 / Math.pow(seriesDenom, 2) -\n 1 / 12960 / Math.pow(seriesDenom, 3) -\n 257 / 207360 / Math.pow(seriesDenom, 4) -\n 52 / 2612736 / Math.pow(seriesDenom, 5) +\n 5741173 / 9405849600 / Math.pow(seriesDenom, 6) +\n 37529 / 18811699200 / Math.pow(seriesDenom, 7);\n\n return seriesCoefficient * seriesExpansion;\n }\n}\n\n// Define series coefficients\nvar COEFFICIENTS = [\n 0.99999999999999709182, 57.156235665862923517, -59.597960355475491248,\n 14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4,\n 0.46523628927048575665e-4, -0.98374475304879564677e-4,\n 0.15808870322491248884e-3, -0.21026444172410488319e-3,\n 0.2174396181152126432e-3, -0.16431810653676389022e-3,\n 0.84418223983852743293e-4, -0.2619083840158140867e-4,\n 0.36899182659531622704e-5\n];\n\nvar g = 607 / 128;\nvar LOGSQRT2PI = Math.log(Math.sqrt(2 * Math.PI));\n\n/**\n * Compute the logarithm of the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Lanczos' approximation.\n * This function takes as input any real-value n greater than 0.\n * This function is useful for values of n too large for the normal gamma function (n > 165).\n * The code is based on Lanczo's Gamma approximation, defined [here](http://my.fit.edu/~gabdo/gamma.txt).\n *\n * @param {number} n Any real number greater than zero.\n * @returns {number} The logarithm of gamma of the input value.\n *\n * @example\n * gammaln(500); // 2605.1158503617335\n * gammaln(2.4); // 0.21685932244884043\n */\nfunction gammaln(n) {\n // Return infinity if value not in domain\n if (n <= 0) {\n return Infinity;\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n // Create series approximation\n var a = COEFFICIENTS[0];\n\n for (var i = 1; i < 15; i++) {\n a += COEFFICIENTS[i] / (n + i);\n }\n\n var tmp = g + 0.5 + n;\n\n // Return natural logarithm of gamma(n)\n return LOGSQRT2PI + Math.log(a) - tmp + (n + 0.5) * Math.log(tmp);\n}\n\n/**\n * The [Bernoulli distribution](http://en.wikipedia.org/wiki/Bernoulli_distribution)\n * is the probability discrete\n * distribution of a random variable which takes value 1 with success\n * probability `p` and value 0 with failure\n * probability `q` = 1 - `p`. It can be used, for example, to represent the\n * toss of a coin, where \"1\" is defined to mean \"heads\" and \"0\" is defined\n * to mean \"tails\" (or vice versa). It is\n * a special case of a Binomial Distribution\n * where `n` = 1.\n *\n * @param {number} p input value, between 0 and 1 inclusive\n * @returns {number[]} values of bernoulli distribution at this point\n * @throws {Error} if p is outside 0 and 1\n * @example\n * bernoulliDistribution(0.3); // => [0.7, 0.3]\n */\nfunction bernoulliDistribution(p) /*: number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1)\n if (p < 0 || p > 1) {\n throw new Error(\n \"bernoulliDistribution requires probability to be between 0 and 1 inclusive\"\n );\n }\n\n return [1 - p, p];\n}\n\n/**\n * The [Binomial Distribution](http://en.wikipedia.org/wiki/Binomial_distribution) is the discrete probability\n * distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields\n * success with probability `probability`. Such a success/failure experiment is also called a Bernoulli experiment or\n * Bernoulli trial; when trials = 1, the Binomial Distribution is a Bernoulli Distribution.\n *\n * @param {number} trials number of trials to simulate\n * @param {number} probability\n * @returns {number[]} output\n */\nfunction binomialDistribution(trials, probability) /*: ?number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1),\n // that `n` is an integer, strictly positive.\n if (probability < 0 || probability > 1 || trials <= 0 || trials % 1 !== 0) {\n return undefined;\n }\n\n // We initialize `x`, the random variable, and `accumulator`, an accumulator\n // for the cumulative distribution function to 0. `distribution_functions`\n // is the object we'll return with the `probability_of_x` and the\n // `cumulativeProbability_of_x`, as well as the calculated mean &\n // variance. We iterate until the `cumulativeProbability_of_x` is\n // within `epsilon` of 1.0.\n var x = 0;\n var cumulativeProbability = 0;\n var cells = [];\n var binomialCoefficient = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] =\n binomialCoefficient *\n Math.pow(probability, x) *\n Math.pow(1 - probability, trials - x);\n cumulativeProbability += cells[x];\n x++;\n binomialCoefficient = (binomialCoefficient * (trials - x + 1)) / x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\n/**\n * The [Poisson Distribution](http://en.wikipedia.org/wiki/Poisson_distribution)\n * is a discrete probability distribution that expresses the probability\n * of a given number of events occurring in a fixed interval of time\n * and/or space if these events occur with a known average rate and\n * independently of the time since the last event.\n *\n * The Poisson Distribution is characterized by the strictly positive\n * mean arrival or occurrence rate, `λ`.\n *\n * @param {number} lambda location poisson distribution\n * @returns {number[]} values of poisson distribution at that point\n */\nfunction poissonDistribution(lambda) /*: ?number[] */ {\n // Check that lambda is strictly positive\n if (lambda <= 0) {\n return undefined;\n }\n\n // our current place in the distribution\n var x = 0;\n // and we keep track of the current cumulative probability, in\n // order to know when to stop calculating chances.\n var cumulativeProbability = 0;\n // the calculated cells to be returned\n var cells = [];\n var factorialX = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;\n cumulativeProbability += cells[x];\n x++;\n factorialX *= x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\n/**\n * **Percentage Points of the χ2 (Chi-Squared) Distribution**\n *\n * The [χ2 (Chi-Squared) Distribution](http://en.wikipedia.org/wiki/Chi-squared_distribution) is used in the common\n * chi-squared tests for goodness of fit of an observed distribution to a theoretical one, the independence of two\n * criteria of classification of qualitative data, and in confidence interval estimation for a population standard\n * deviation of a normal distribution from a sample standard deviation.\n *\n * Values from Appendix 1, Table III of William W. Hines & Douglas C. Montgomery, \"Probability and Statistics in\n * Engineering and Management Science\", Wiley (1980).\n */\nvar chiSquaredDistributionTable = {\n 1: {\n 0.995: 0,\n 0.99: 0,\n 0.975: 0,\n 0.95: 0,\n 0.9: 0.02,\n 0.5: 0.45,\n 0.1: 2.71,\n 0.05: 3.84,\n 0.025: 5.02,\n 0.01: 6.63,\n 0.005: 7.88\n },\n 2: {\n 0.995: 0.01,\n 0.99: 0.02,\n 0.975: 0.05,\n 0.95: 0.1,\n 0.9: 0.21,\n 0.5: 1.39,\n 0.1: 4.61,\n 0.05: 5.99,\n 0.025: 7.38,\n 0.01: 9.21,\n 0.005: 10.6\n },\n 3: {\n 0.995: 0.07,\n 0.99: 0.11,\n 0.975: 0.22,\n 0.95: 0.35,\n 0.9: 0.58,\n 0.5: 2.37,\n 0.1: 6.25,\n 0.05: 7.81,\n 0.025: 9.35,\n 0.01: 11.34,\n 0.005: 12.84\n },\n 4: {\n 0.995: 0.21,\n 0.99: 0.3,\n 0.975: 0.48,\n 0.95: 0.71,\n 0.9: 1.06,\n 0.5: 3.36,\n 0.1: 7.78,\n 0.05: 9.49,\n 0.025: 11.14,\n 0.01: 13.28,\n 0.005: 14.86\n },\n 5: {\n 0.995: 0.41,\n 0.99: 0.55,\n 0.975: 0.83,\n 0.95: 1.15,\n 0.9: 1.61,\n 0.5: 4.35,\n 0.1: 9.24,\n 0.05: 11.07,\n 0.025: 12.83,\n 0.01: 15.09,\n 0.005: 16.75\n },\n 6: {\n 0.995: 0.68,\n 0.99: 0.87,\n 0.975: 1.24,\n 0.95: 1.64,\n 0.9: 2.2,\n 0.5: 5.35,\n 0.1: 10.65,\n 0.05: 12.59,\n 0.025: 14.45,\n 0.01: 16.81,\n 0.005: 18.55\n },\n 7: {\n 0.995: 0.99,\n 0.99: 1.25,\n 0.975: 1.69,\n 0.95: 2.17,\n 0.9: 2.83,\n 0.5: 6.35,\n 0.1: 12.02,\n 0.05: 14.07,\n 0.025: 16.01,\n 0.01: 18.48,\n 0.005: 20.28\n },\n 8: {\n 0.995: 1.34,\n 0.99: 1.65,\n 0.975: 2.18,\n 0.95: 2.73,\n 0.9: 3.49,\n 0.5: 7.34,\n 0.1: 13.36,\n 0.05: 15.51,\n 0.025: 17.53,\n 0.01: 20.09,\n 0.005: 21.96\n },\n 9: {\n 0.995: 1.73,\n 0.99: 2.09,\n 0.975: 2.7,\n 0.95: 3.33,\n 0.9: 4.17,\n 0.5: 8.34,\n 0.1: 14.68,\n 0.05: 16.92,\n 0.025: 19.02,\n 0.01: 21.67,\n 0.005: 23.59\n },\n 10: {\n 0.995: 2.16,\n 0.99: 2.56,\n 0.975: 3.25,\n 0.95: 3.94,\n 0.9: 4.87,\n 0.5: 9.34,\n 0.1: 15.99,\n 0.05: 18.31,\n 0.025: 20.48,\n 0.01: 23.21,\n 0.005: 25.19\n },\n 11: {\n 0.995: 2.6,\n 0.99: 3.05,\n 0.975: 3.82,\n 0.95: 4.57,\n 0.9: 5.58,\n 0.5: 10.34,\n 0.1: 17.28,\n 0.05: 19.68,\n 0.025: 21.92,\n 0.01: 24.72,\n 0.005: 26.76\n },\n 12: {\n 0.995: 3.07,\n 0.99: 3.57,\n 0.975: 4.4,\n 0.95: 5.23,\n 0.9: 6.3,\n 0.5: 11.34,\n 0.1: 18.55,\n 0.05: 21.03,\n 0.025: 23.34,\n 0.01: 26.22,\n 0.005: 28.3\n },\n 13: {\n 0.995: 3.57,\n 0.99: 4.11,\n 0.975: 5.01,\n 0.95: 5.89,\n 0.9: 7.04,\n 0.5: 12.34,\n 0.1: 19.81,\n 0.05: 22.36,\n 0.025: 24.74,\n 0.01: 27.69,\n 0.005: 29.82\n },\n 14: {\n 0.995: 4.07,\n 0.99: 4.66,\n 0.975: 5.63,\n 0.95: 6.57,\n 0.9: 7.79,\n 0.5: 13.34,\n 0.1: 21.06,\n 0.05: 23.68,\n 0.025: 26.12,\n 0.01: 29.14,\n 0.005: 31.32\n },\n 15: {\n 0.995: 4.6,\n 0.99: 5.23,\n 0.975: 6.27,\n 0.95: 7.26,\n 0.9: 8.55,\n 0.5: 14.34,\n 0.1: 22.31,\n 0.05: 25,\n 0.025: 27.49,\n 0.01: 30.58,\n 0.005: 32.8\n },\n 16: {\n 0.995: 5.14,\n 0.99: 5.81,\n 0.975: 6.91,\n 0.95: 7.96,\n 0.9: 9.31,\n 0.5: 15.34,\n 0.1: 23.54,\n 0.05: 26.3,\n 0.025: 28.85,\n 0.01: 32,\n 0.005: 34.27\n },\n 17: {\n 0.995: 5.7,\n 0.99: 6.41,\n 0.975: 7.56,\n 0.95: 8.67,\n 0.9: 10.09,\n 0.5: 16.34,\n 0.1: 24.77,\n 0.05: 27.59,\n 0.025: 30.19,\n 0.01: 33.41,\n 0.005: 35.72\n },\n 18: {\n 0.995: 6.26,\n 0.99: 7.01,\n 0.975: 8.23,\n 0.95: 9.39,\n 0.9: 10.87,\n 0.5: 17.34,\n 0.1: 25.99,\n 0.05: 28.87,\n 0.025: 31.53,\n 0.01: 34.81,\n 0.005: 37.16\n },\n 19: {\n 0.995: 6.84,\n 0.99: 7.63,\n 0.975: 8.91,\n 0.95: 10.12,\n 0.9: 11.65,\n 0.5: 18.34,\n 0.1: 27.2,\n 0.05: 30.14,\n 0.025: 32.85,\n 0.01: 36.19,\n 0.005: 38.58\n },\n 20: {\n 0.995: 7.43,\n 0.99: 8.26,\n 0.975: 9.59,\n 0.95: 10.85,\n 0.9: 12.44,\n 0.5: 19.34,\n 0.1: 28.41,\n 0.05: 31.41,\n 0.025: 34.17,\n 0.01: 37.57,\n 0.005: 40\n },\n 21: {\n 0.995: 8.03,\n 0.99: 8.9,\n 0.975: 10.28,\n 0.95: 11.59,\n 0.9: 13.24,\n 0.5: 20.34,\n 0.1: 29.62,\n 0.05: 32.67,\n 0.025: 35.48,\n 0.01: 38.93,\n 0.005: 41.4\n },\n 22: {\n 0.995: 8.64,\n 0.99: 9.54,\n 0.975: 10.98,\n 0.95: 12.34,\n 0.9: 14.04,\n 0.5: 21.34,\n 0.1: 30.81,\n 0.05: 33.92,\n 0.025: 36.78,\n 0.01: 40.29,\n 0.005: 42.8\n },\n 23: {\n 0.995: 9.26,\n 0.99: 10.2,\n 0.975: 11.69,\n 0.95: 13.09,\n 0.9: 14.85,\n 0.5: 22.34,\n 0.1: 32.01,\n 0.05: 35.17,\n 0.025: 38.08,\n 0.01: 41.64,\n 0.005: 44.18\n },\n 24: {\n 0.995: 9.89,\n 0.99: 10.86,\n 0.975: 12.4,\n 0.95: 13.85,\n 0.9: 15.66,\n 0.5: 23.34,\n 0.1: 33.2,\n 0.05: 36.42,\n 0.025: 39.36,\n 0.01: 42.98,\n 0.005: 45.56\n },\n 25: {\n 0.995: 10.52,\n 0.99: 11.52,\n 0.975: 13.12,\n 0.95: 14.61,\n 0.9: 16.47,\n 0.5: 24.34,\n 0.1: 34.28,\n 0.05: 37.65,\n 0.025: 40.65,\n 0.01: 44.31,\n 0.005: 46.93\n },\n 26: {\n 0.995: 11.16,\n 0.99: 12.2,\n 0.975: 13.84,\n 0.95: 15.38,\n 0.9: 17.29,\n 0.5: 25.34,\n 0.1: 35.56,\n 0.05: 38.89,\n 0.025: 41.92,\n 0.01: 45.64,\n 0.005: 48.29\n },\n 27: {\n 0.995: 11.81,\n 0.99: 12.88,\n 0.975: 14.57,\n 0.95: 16.15,\n 0.9: 18.11,\n 0.5: 26.34,\n 0.1: 36.74,\n 0.05: 40.11,\n 0.025: 43.19,\n 0.01: 46.96,\n 0.005: 49.65\n },\n 28: {\n 0.995: 12.46,\n 0.99: 13.57,\n 0.975: 15.31,\n 0.95: 16.93,\n 0.9: 18.94,\n 0.5: 27.34,\n 0.1: 37.92,\n 0.05: 41.34,\n 0.025: 44.46,\n 0.01: 48.28,\n 0.005: 50.99\n },\n 29: {\n 0.995: 13.12,\n 0.99: 14.26,\n 0.975: 16.05,\n 0.95: 17.71,\n 0.9: 19.77,\n 0.5: 28.34,\n 0.1: 39.09,\n 0.05: 42.56,\n 0.025: 45.72,\n 0.01: 49.59,\n 0.005: 52.34\n },\n 30: {\n 0.995: 13.79,\n 0.99: 14.95,\n 0.975: 16.79,\n 0.95: 18.49,\n 0.9: 20.6,\n 0.5: 29.34,\n 0.1: 40.26,\n 0.05: 43.77,\n 0.025: 46.98,\n 0.01: 50.89,\n 0.005: 53.67\n },\n 40: {\n 0.995: 20.71,\n 0.99: 22.16,\n 0.975: 24.43,\n 0.95: 26.51,\n 0.9: 29.05,\n 0.5: 39.34,\n 0.1: 51.81,\n 0.05: 55.76,\n 0.025: 59.34,\n 0.01: 63.69,\n 0.005: 66.77\n },\n 50: {\n 0.995: 27.99,\n 0.99: 29.71,\n 0.975: 32.36,\n 0.95: 34.76,\n 0.9: 37.69,\n 0.5: 49.33,\n 0.1: 63.17,\n 0.05: 67.5,\n 0.025: 71.42,\n 0.01: 76.15,\n 0.005: 79.49\n },\n 60: {\n 0.995: 35.53,\n 0.99: 37.48,\n 0.975: 40.48,\n 0.95: 43.19,\n 0.9: 46.46,\n 0.5: 59.33,\n 0.1: 74.4,\n 0.05: 79.08,\n 0.025: 83.3,\n 0.01: 88.38,\n 0.005: 91.95\n },\n 70: {\n 0.995: 43.28,\n 0.99: 45.44,\n 0.975: 48.76,\n 0.95: 51.74,\n 0.9: 55.33,\n 0.5: 69.33,\n 0.1: 85.53,\n 0.05: 90.53,\n 0.025: 95.02,\n 0.01: 100.42,\n 0.005: 104.22\n },\n 80: {\n 0.995: 51.17,\n 0.99: 53.54,\n 0.975: 57.15,\n 0.95: 60.39,\n 0.9: 64.28,\n 0.5: 79.33,\n 0.1: 96.58,\n 0.05: 101.88,\n 0.025: 106.63,\n 0.01: 112.33,\n 0.005: 116.32\n },\n 90: {\n 0.995: 59.2,\n 0.99: 61.75,\n 0.975: 65.65,\n 0.95: 69.13,\n 0.9: 73.29,\n 0.5: 89.33,\n 0.1: 107.57,\n 0.05: 113.14,\n 0.025: 118.14,\n 0.01: 124.12,\n 0.005: 128.3\n },\n 100: {\n 0.995: 67.33,\n 0.99: 70.06,\n 0.975: 74.22,\n 0.95: 77.93,\n 0.9: 82.36,\n 0.5: 99.33,\n 0.1: 118.5,\n 0.05: 124.34,\n 0.025: 129.56,\n 0.01: 135.81,\n 0.005: 140.17\n }\n};\n\n/**\n * The [χ2 (Chi-Squared) Goodness-of-Fit Test](http://en.wikipedia.org/wiki/Goodness_of_fit#Pearson.27s_chi-squared_test)\n * uses a measure of goodness of fit which is the sum of differences between observed and expected outcome frequencies\n * (that is, counts of observations), each squared and divided by the number of observations expected given the\n * hypothesized distribution. The resulting χ2 statistic, `chiSquared`, can be compared to the chi-squared distribution\n * to determine the goodness of fit. In order to determine the degrees of freedom of the chi-squared distribution, one\n * takes the total number of observed frequencies and subtracts the number of estimated parameters. The test statistic\n * follows, approximately, a chi-square distribution with (k − c) degrees of freedom where `k` is the number of non-empty\n * cells and `c` is the number of estimated parameters for the distribution.\n *\n * @param {Array<number>} data\n * @param {Function} distributionType a function that returns a point in a distribution:\n * for instance, binomial, bernoulli, or poisson\n * @param {number} significance\n * @returns {number} chi squared goodness of fit\n * @example\n * // Data from Poisson goodness-of-fit example 10-19 in William W. Hines & Douglas C. Montgomery,\n * // \"Probability and Statistics in Engineering and Management Science\", Wiley (1980).\n * var data1019 = [\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n * 2, 2, 2, 2, 2, 2, 2, 2, 2,\n * 3, 3, 3, 3\n * ];\n * ss.chiSquaredGoodnessOfFit(data1019, ss.poissonDistribution, 0.05); //= false\n */\nfunction chiSquaredGoodnessOfFit(data, distributionType, significance) {\n // Estimate from the sample data, a weighted mean.\n var inputMean = mean(data);\n // Calculated value of the χ2 statistic.\n var chiSquared = 0;\n // Number of hypothesized distribution parameters estimated, expected to be supplied in the distribution test.\n // Lose one degree of freedom for estimating `lambda` from the sample data.\n var c = 1;\n // The hypothesized distribution.\n // Generate the hypothesized distribution.\n var hypothesizedDistribution = distributionType(inputMean);\n var observedFrequencies = [];\n var expectedFrequencies = [];\n\n // Create an array holding a histogram from the sample data, of\n // the form `{ value: numberOfOcurrences }`\n for (var i = 0; i < data.length; i++) {\n if (observedFrequencies[data[i]] === undefined) {\n observedFrequencies[data[i]] = 0;\n }\n observedFrequencies[data[i]]++;\n }\n\n // The histogram we created might be sparse - there might be gaps\n // between values. So we iterate through the histogram, making\n // sure that instead of undefined, gaps have 0 values.\n for (var i$1 = 0; i$1 < observedFrequencies.length; i$1++) {\n if (observedFrequencies[i$1] === undefined) {\n observedFrequencies[i$1] = 0;\n }\n }\n\n // Create an array holding a histogram of expected data given the\n // sample size and hypothesized distribution.\n for (var k in hypothesizedDistribution) {\n if (k in observedFrequencies) {\n expectedFrequencies[+k] = hypothesizedDistribution[k] * data.length;\n }\n }\n\n // Working backward through the expected frequencies, collapse classes\n // if less than three observations are expected for a class.\n // This transformation is applied to the observed frequencies as well.\n for (var k$1 = expectedFrequencies.length - 1; k$1 >= 0; k$1--) {\n if (expectedFrequencies[k$1] < 3) {\n expectedFrequencies[k$1 - 1] += expectedFrequencies[k$1];\n expectedFrequencies.pop();\n\n observedFrequencies[k$1 - 1] += observedFrequencies[k$1];\n observedFrequencies.pop();\n }\n }\n\n // Iterate through the squared differences between observed & expected\n // frequencies, accumulating the `chiSquared` statistic.\n for (var k$2 = 0; k$2 < observedFrequencies.length; k$2++) {\n chiSquared +=\n Math.pow(observedFrequencies[k$2] - expectedFrequencies[k$2], 2) /\n expectedFrequencies[k$2];\n }\n\n // Calculate degrees of freedom for this test and look it up in the\n // `chiSquaredDistributionTable` in order to\n // accept or reject the goodness-of-fit of the hypothesized distribution.\n // Degrees of freedom, calculated as (number of class intervals -\n // number of hypothesized distribution parameters estimated - 1)\n var degreesOfFreedom = observedFrequencies.length - c - 1;\n return (\n chiSquaredDistributionTable[degreesOfFreedom][significance] < chiSquared\n );\n}\n\nvar SQRT_2PI$1 = Math.sqrt(2 * Math.PI);\n\n/**\n * [Well-known kernels](https://en.wikipedia.org/wiki/Kernel_(statistics)#Kernel_functions_in_common_use)\n * @private\n */\nvar kernels = {\n /**\n * The gaussian kernel.\n * @private\n */\n gaussian: function (u) {\n return Math.exp(-0.5 * u * u) / SQRT_2PI$1;\n }\n};\n\n/**\n * Well known bandwidth selection methods\n * @private\n */\nvar bandwidthMethods = {\n /**\n * The [\"normal reference distribution\"\n * rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html),\n * a commonly used version of [Silverman's\n * rule-of-thumb](https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator).\n * @private\n */\n nrd: function (x) {\n var s = sampleStandardDeviation(x);\n var iqr = interquartileRange(x);\n if (typeof iqr === \"number\") {\n s = Math.min(s, iqr / 1.34);\n }\n return 1.06 * s * Math.pow(x.length, -0.2);\n }\n};\n\n/**\n * [Kernel density estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation)\n * is a useful tool for, among other things, estimating the shape of the\n * underlying probability distribution from a sample.\n *\n * @name kernelDensityEstimation\n * @param X sample values\n * @param kernel The kernel function to use. If a function is provided, it should return non-negative values and integrate to 1. Defaults to 'gaussian'.\n * @param bandwidthMethod The \"bandwidth selection\" method to use, or a fixed bandwidth value. Defaults to \"nrd\", the commonly-used [\"normal reference distribution\" rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html).\n * @returns {Function} An estimated [probability density function](https://en.wikipedia.org/wiki/Probability_density_function) for the given sample. The returned function runs in `O(X.length)`.\n */\nfunction kernelDensityEstimation(X, kernel, bandwidthMethod) {\n var kernelFn;\n if (kernel === undefined) {\n kernelFn = kernels.gaussian;\n } else if (typeof kernel === \"string\") {\n if (!kernels[kernel]) {\n throw new Error('Unknown kernel \"' + kernel + '\"');\n }\n kernelFn = kernels[kernel];\n } else {\n kernelFn = kernel;\n }\n\n var bandwidth;\n if (typeof bandwidthMethod === \"undefined\") {\n bandwidth = bandwidthMethods.nrd(X);\n } else if (typeof bandwidthMethod === \"string\") {\n if (!bandwidthMethods[bandwidthMethod]) {\n throw new Error(\n 'Unknown bandwidth method \"' + bandwidthMethod + '\"'\n );\n }\n bandwidth = bandwidthMethods[bandwidthMethod](X);\n } else {\n bandwidth = bandwidthMethod;\n }\n\n return function (x) {\n var i = 0;\n var sum = 0;\n for (i = 0; i < X.length; i++) {\n sum += kernelFn((x - X[i]) / bandwidth);\n }\n return sum / bandwidth / X.length;\n };\n}\n\n/**\n * The [Z-Score, or Standard Score](http://en.wikipedia.org/wiki/Standard_score).\n *\n * The standard score is the number of standard deviations an observation\n * or datum is above or below the mean. Thus, a positive standard score\n * represents a datum above the mean, while a negative standard score\n * represents a datum below the mean. It is a dimensionless quantity\n * obtained by subtracting the population mean from an individual raw\n * score and then dividing the difference by the population standard\n * deviation.\n *\n * The z-score is only defined if one knows the population parameters;\n * if one only has a sample set, then the analogous computation with\n * sample mean and sample standard deviation yields the\n * Student's t-statistic.\n *\n * @param {number} x\n * @param {number} mean\n * @param {number} standardDeviation\n * @return {number} z score\n * @example\n * zScore(78, 80, 5); // => -0.4\n */\nfunction zScore(x, mean, standardDeviation) {\n return (x - mean) / standardDeviation;\n}\n\nvar SQRT_2PI = Math.sqrt(2 * Math.PI);\n\nfunction cumulativeDistribution(z) {\n var sum = z,\n tmp = z;\n\n // 15 iterations are enough for 4-digit precision\n for (var i = 1; i < 15; i++) {\n tmp *= (z * z) / (2 * i + 1);\n sum += tmp;\n }\n return (\n Math.round((0.5 + (sum / SQRT_2PI) * Math.exp((-z * z) / 2)) * 1e4) /\n 1e4\n );\n}\n\n/**\n * A standard normal table, also called the unit normal table or Z table,\n * is a mathematical table for the values of Φ (phi), which are the values of\n * the [cumulative distribution function](https://en.wikipedia.org/wiki/Normal_distribution#Cumulative_distribution_function)\n * of the normal distribution. It is used to find the probability that a\n * statistic is observed below, above, or between values on the standard\n * normal distribution, and by extension, any normal distribution.\n */\nvar standardNormalTable = [];\n\nfor (var z = 0; z <= 3.09; z += 0.01) {\n standardNormalTable.push(cumulativeDistribution(z));\n}\n\n/**\n * **[Cumulative Standard Normal Probability](http://en.wikipedia.org/wiki/Standard_normal_table)**\n *\n * Since probability tables cannot be\n * printed for every normal distribution, as there are an infinite variety\n * of normal distributions, it is common practice to convert a normal to a\n * standard normal and then use the standard normal table to find probabilities.\n *\n * You can use `.5 + .5 * errorFunction(x / Math.sqrt(2))` to calculate the probability\n * instead of looking it up in a table.\n *\n * @param {number} z\n * @returns {number} cumulative standard normal probability\n */\nfunction cumulativeStdNormalProbability(z) {\n // Calculate the position of this value.\n var absZ = Math.abs(z);\n // Each row begins with a different\n // significant digit: 0.5, 0.6, 0.7, and so on. Each value in the table\n // corresponds to a range of 0.01 in the input values, so the value is\n // multiplied by 100.\n var index = Math.min(\n Math.round(absZ * 100),\n standardNormalTable.length - 1\n );\n\n // The index we calculate must be in the table as a positive value,\n // but we still pay attention to whether the input is positive\n // or negative, and flip the output value as a last step.\n if (z >= 0) {\n return standardNormalTable[index];\n } else {\n // due to floating-point arithmetic, values in the table with\n // 4 significant figures can nevertheless end up as repeating\n // fractions when they're computed here.\n return +(1 - standardNormalTable[index]).toFixed(4);\n }\n}\n\n/**\n * **[Logistic Cumulative Distribution Function](https://en.wikipedia.org/wiki/Logistic_distribution)**\n *\n * @param {number} x\n * @returns {number} cumulative standard logistic probability\n */\nfunction cumulativeStdLogisticProbability(x) {\n return 1 / (Math.exp(-x) + 1);\n}\n\n/**\n * **[Gaussian error function](http://en.wikipedia.org/wiki/Error_function)**\n *\n * The `errorFunction(x/(sd * Math.sqrt(2)))` is the probability that a value in a\n * normal distribution with standard deviation sd is within x of the mean.\n *\n * This function returns a numerical approximation to the exact value.\n * It uses Horner's method to evaluate the polynomial of τ (tau).\n *\n * @param {number} x input\n * @return {number} error estimation\n * @example\n * errorFunction(1).toFixed(2); // => '0.84'\n */\nfunction errorFunction(x) {\n var t = 1 / (1 + 0.5 * Math.abs(x));\n var tau =\n t *\n Math.exp(\n -x * x +\n ((((((((0.17087277 * t - 0.82215223) * t + 1.48851587) * t -\n 1.13520398) *\n t +\n 0.27886807) *\n t -\n 0.18628806) *\n t +\n 0.09678418) *\n t +\n 0.37409196) *\n t +\n 1.00002368) *\n t -\n 1.26551223\n );\n if (x >= 0) {\n return 1 - tau;\n } else {\n return tau - 1;\n }\n}\n\n/**\n * The Inverse [Gaussian error function](http://en.wikipedia.org/wiki/Error_function)\n * returns a numerical approximation to the value that would have caused\n * `errorFunction()` to return x.\n *\n * @param {number} x value of error function\n * @returns {number} estimated inverted value\n */\nfunction inverseErrorFunction(x) {\n var a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4 - Math.PI));\n\n var inv = Math.sqrt(\n Math.sqrt(\n Math.pow(2 / (Math.PI * a) + Math.log(1 - x * x) / 2, 2) -\n Math.log(1 - x * x) / a\n ) -\n (2 / (Math.PI * a) + Math.log(1 - x * x) / 2)\n );\n\n if (x >= 0) {\n return inv;\n } else {\n return -inv;\n }\n}\n\n/**\n * The [Probit](http://en.wikipedia.org/wiki/Probit)\n * is the inverse of cumulativeStdNormalProbability(),\n * and is also known as the normal quantile function.\n *\n * It returns the number of standard deviations from the mean\n * where the p'th quantile of values can be found in a normal distribution.\n * So, for example, probit(0.5 + 0.6827/2) ≈ 1 because 68.27% of values are\n * normally found within 1 standard deviation above or below the mean.\n *\n * @param {number} p\n * @returns {number} probit\n */\nfunction probit(p) {\n if (p === 0) {\n p = epsilon;\n } else if (p >= 1) {\n p = 1 - epsilon;\n }\n return Math.sqrt(2) * inverseErrorFunction(2 * p - 1);\n}\n\n/**\n * The [Logit](https://en.wikipedia.org/wiki/Logit)\n * is the inverse of cumulativeStdLogisticProbability,\n * and is also known as the logistic quantile function.\n *\n * @param {number} p\n * @returns {number} logit\n */\nfunction logit(p) {\n if (p <= 0 || p >= 1) {\n throw new Error(\"p must be strictly between zero and one\");\n }\n return Math.log(p / (1 - p));\n}\n\n/**\n * Conducts a [permutation test](https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests)\n * to determine if two data sets are *significantly* different from each other, using\n * the difference of means between the groups as the test statistic.\n * The function allows for the following hypotheses:\n * - two_tail = Null hypothesis: the two distributions are equal.\n * - greater = Null hypothesis: observations from sampleX tend to be smaller than those from sampleY.\n * - less = Null hypothesis: observations from sampleX tend to be greater than those from sampleY.\n * [Learn more about one-tail vs two-tail tests.](https://en.wikipedia.org/wiki/One-_and_two-tailed_tests)\n *\n * @param {Array<number>} sampleX first dataset (e.g. treatment data)\n * @param {Array<number>} sampleY second dataset (e.g. control data)\n * @param {string} alternative alternative hypothesis, either 'two_sided' (default), 'greater', or 'less'\n * @param {number} k number of values in permutation distribution.\n * @param {Function} [randomSource=Math.random] an optional entropy source\n * @returns {number} p-value The probability of observing the difference between groups (as or more extreme than what we did), assuming the null hypothesis.\n *\n * @example\n * var control = [2, 5, 3, 6, 7, 2, 5];\n * var treatment = [20, 5, 13, 12, 7, 2, 2];\n * permutationTest(control, treatment); // ~0.1324\n */\nfunction permutationTest(sampleX, sampleY, alternative, k, randomSource) {\n // Set default arguments\n if (k === undefined) {\n k = 10000;\n }\n if (alternative === undefined) {\n alternative = \"two_side\";\n }\n if (\n alternative !== \"two_side\" &&\n alternative !== \"greater\" &&\n alternative !== \"less\"\n ) {\n throw new Error(\n \"`alternative` must be either 'two_side', 'greater', or 'less'.\"\n );\n }\n\n // get means for each sample\n var meanX = mean(sampleX);\n var meanY = mean(sampleY);\n\n // calculate initial test statistic. This will be our point of comparison with\n // the generated test statistics.\n var testStatistic = meanX - meanY;\n\n // create test-statistic distribution\n var testStatDsn = new Array(k);\n\n // combine datsets so we can easily shuffle later\n var allData = sampleX.concat(sampleY);\n var midIndex = Math.floor(allData.length / 2);\n\n for (var i = 0; i < k; i++) {\n // 1. shuffle data assignments\n shuffleInPlace(allData, randomSource);\n var permLeft = allData.slice(0, midIndex);\n var permRight = allData.slice(midIndex, allData.length);\n\n // 2.re-calculate test statistic\n var permTestStatistic = mean(permLeft) - mean(permRight);\n\n // 3. store test statistic to build test statistic distribution\n testStatDsn[i] = permTestStatistic;\n }\n\n // Calculate p-value depending on alternative\n // For this test, we calculate the percentage of 'extreme' test statistics (subject to our hypothesis)\n // more info on permutation test p-value calculations: https://onlinecourses.science.psu.edu/stat464/node/35\n var numExtremeTStats = 0;\n if (alternative === \"two_side\") {\n for (var i$1 = 0; i$1 <= k; i$1++) {\n if (Math.abs(testStatDsn[i$1]) >= Math.abs(testStatistic)) {\n numExtremeTStats += 1;\n }\n }\n } else if (alternative === \"greater\") {\n for (var i$2 = 0; i$2 <= k; i$2++) {\n if (testStatDsn[i$2] >= testStatistic) {\n numExtremeTStats += 1;\n }\n }\n } else {\n // alternative === 'less'\n for (var i$3 = 0; i$3 <= k; i$3++) {\n if (testStatDsn[i$3] <= testStatistic) {\n numExtremeTStats += 1;\n }\n }\n }\n\n return numExtremeTStats / k;\n}\n\n/**\n * [Sign](https://en.wikipedia.org/wiki/Sign_function) is a function\n * that extracts the sign of a real number\n *\n * @param {number} x input value\n * @returns {number} sign value either 1, 0 or -1\n * @throws {TypeError} if the input argument x is not a number\n * @private\n *\n * @example\n * sign(2); // => 1\n */\nfunction sign(x) {\n if (typeof x === \"number\") {\n if (x < 0) {\n return -1;\n } else if (x === 0) {\n return 0;\n } else {\n return 1;\n }\n } else {\n throw new TypeError(\"not a number\");\n }\n}\n\n/**\n * [Bisection method](https://en.wikipedia.org/wiki/Bisection_method) is a root-finding\n * method that repeatedly bisects an interval to find the root.\n *\n * This function returns a numerical approximation to the exact value.\n *\n * @param {Function} func input function\n * @param {number} start - start of interval\n * @param {number} end - end of interval\n * @param {number} maxIterations - the maximum number of iterations\n * @param {number} errorTolerance - the error tolerance\n * @returns {number} estimated root value\n * @throws {TypeError} Argument func must be a function\n *\n * @example\n * bisect(Math.cos,0,4,100,0.003); // => 1.572265625\n */\nfunction bisect(func, start, end, maxIterations, errorTolerance) {\n if (typeof func !== \"function\")\n { throw new TypeError(\"func must be a function\"); }\n\n for (var i = 0; i < maxIterations; i++) {\n var output = (start + end) / 2;\n\n if (\n func(output) === 0 ||\n Math.abs((end - start) / 2) < errorTolerance\n ) {\n return output;\n }\n\n if (sign(func(output)) === sign(func(start))) {\n start = output;\n } else {\n end = output;\n }\n }\n\n throw new Error(\"maximum number of iterations exceeded\");\n}\n\n/**\n * Calculate Euclidean distance between two points.\n * @param {Array<number>} left First N-dimensional point.\n * @param {Array<number>} right Second N-dimensional point.\n * @returns {number} Distance.\n */\nfunction euclideanDistance(left, right) {\n var sum = 0;\n for (var i = 0; i < left.length; i++) {\n var diff = left[i] - right[i];\n sum += diff * diff;\n }\n return Math.sqrt(sum);\n}\n\n/**\n * @typedef {Object} kMeansReturn\n * @property {Array<number>} labels The labels.\n * @property {Array<Array<number>>} centroids The cluster centroids.\n */\n\n/**\n * Perform k-means clustering.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points to be clustered.\n * @param {number} numCluster How many clusters to create.\n * @param {Function} randomSource An optional entropy source that generates uniform values in [0, 1).\n * @return {kMeansReturn} Labels (same length as data) and centroids (same length as numCluster).\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n *\n * @example\n * kMeansCluster([[0.0, 0.5], [1.0, 0.5]], 2); // => {labels: [0, 1], centroids: [[0.0, 0.5], [1.0 0.5]]}\n */\nfunction kMeansCluster(points, numCluster, randomSource) {\n if ( randomSource === void 0 ) randomSource = Math.random;\n\n var oldCentroids = null;\n var newCentroids = sample(points, numCluster, randomSource);\n var labels = null;\n var change = Number.MAX_VALUE;\n while (change !== 0) {\n labels = labelPoints(points, newCentroids);\n oldCentroids = newCentroids;\n newCentroids = calculateCentroids(points, labels, numCluster);\n change = calculateChange(newCentroids, oldCentroids);\n }\n return {\n labels: labels,\n centroids: newCentroids\n };\n}\n\n/**\n * Label each point according to which centroid it is closest to.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<Array<number>>} centroids Current centroids.\n * @return {Array<number>} Group labels.\n */\nfunction labelPoints(points, centroids) {\n return points.map(function (p) {\n var minDist = Number.MAX_VALUE;\n var label = -1;\n for (var i = 0; i < centroids.length; i++) {\n var dist = euclideanDistance(p, centroids[i]);\n if (dist < minDist) {\n minDist = dist;\n label = i;\n }\n }\n return label;\n });\n}\n\n/**\n * Calculate centroids for points given labels.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<number>} labels Which groups points belong to.\n * @param {number} numCluster Number of clusters being created.\n * @return {Array<Array<number>>} Centroid for each group.\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n */\nfunction calculateCentroids(points, labels, numCluster) {\n // Initialize accumulators.\n var dimension = points[0].length;\n var centroids = makeMatrix(numCluster, dimension);\n var counts = Array(numCluster).fill(0);\n\n // Add points to centroids' accumulators and count points per centroid.\n var numPoints = points.length;\n for (var i = 0; i < numPoints; i++) {\n var point = points[i];\n var label = labels[i];\n var current = centroids[label];\n for (var j = 0; j < dimension; j++) {\n current[j] += point[j];\n }\n counts[label] += 1;\n }\n\n // Rescale centroids, checking for any that have no points.\n for (var i$1 = 0; i$1 < numCluster; i$1++) {\n if (counts[i$1] === 0) {\n throw new Error((\"Centroid \" + i$1 + \" has no friends\"));\n }\n var centroid = centroids[i$1];\n for (var j$1 = 0; j$1 < dimension; j$1++) {\n centroid[j$1] /= counts[i$1];\n }\n }\n\n return centroids;\n}\n\n/**\n * Calculate the difference between old centroids and new centroids.\n *\n * @private\n * @param {Array<Array<number>>} left One list of centroids.\n * @param {Array<Array<number>>} right Another list of centroids.\n * @return {number} Distance between centroids.\n */\nfunction calculateChange(left, right) {\n var total = 0;\n for (var i = 0; i < left.length; i++) {\n total += euclideanDistance(left[i], right[i]);\n }\n return total;\n}\n\n/**\n * Calculate the [silhouette values](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for clustered data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<number>} The silhouette value for each point.\n *\n * @example\n * silhouette([[0.25], [0.75]], [0, 0]); // => [1.0, 1.0]\n */\nfunction silhouette(points, labels) {\n if (points.length !== labels.length) {\n throw new Error(\"must have exactly as many labels as points\");\n }\n var groupings = createGroups(labels);\n var distances = calculateAllDistances(points);\n var result = [];\n for (var i = 0; i < points.length; i++) {\n var s = 0;\n if (groupings[labels[i]].length > 1) {\n var a = meanDistanceFromPointToGroup(\n i,\n groupings[labels[i]],\n distances\n );\n var b = meanDistanceToNearestGroup(\n i,\n labels,\n groupings,\n distances\n );\n s = (b - a) / Math.max(a, b);\n }\n result.push(s);\n }\n return result;\n}\n\n/**\n * Create a lookup table mapping group IDs to point IDs.\n *\n * @private\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<Array<number>>} An array of length G, each of whose entries is an array\n * containing the indices of the points in that group.\n */\nfunction createGroups(labels) {\n var numGroups = 1 + max(labels);\n var result = Array(numGroups);\n for (var i = 0; i < labels.length; i++) {\n var label = labels[i];\n if (result[label] === undefined) {\n result[label] = [];\n }\n result[label].push(i);\n }\n return result;\n}\n\n/**\n * Create a lookup table of all inter-point distances.\n *\n * @private\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @return {Array<Array<number>>} A symmetric square array of inter-point distances\n * (zero on the diagonal).\n */\nfunction calculateAllDistances(points) {\n var numPoints = points.length;\n var result = makeMatrix(numPoints, numPoints);\n for (var i = 0; i < numPoints; i++) {\n for (var j = 0; j < i; j++) {\n result[i][j] = euclideanDistance(points[i], points[j]);\n result[j][i] = result[i][j];\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between this point and all the points in the\n * nearest group (as determined by which point in another group is closest).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} labels Labels of points.\n * @param {Array<Array<number>>} groupings An array whose entries are arrays\n * containing the indices of the points in that group.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the nearest\n * group.\n */\nfunction meanDistanceToNearestGroup(which, labels, groupings, distances) {\n var label = labels[which];\n var result = Number.MAX_VALUE;\n for (var i = 0; i < groupings.length; i++) {\n if (i !== label) {\n var d = meanDistanceFromPointToGroup(\n which,\n groupings[i],\n distances\n );\n if (d < result) {\n result = d;\n }\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between a point and all the points in a group\n * (possibly its own).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} group The indices of all the points in the group in\n * question.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the\n * specified group.\n */\nfunction meanDistanceFromPointToGroup(which, group, distances) {\n var total = 0;\n for (var i = 0; i < group.length; i++) {\n total += distances[which][group[i]];\n }\n return total / group.length;\n}\n\n/**\n * Calculate the [silhouette metric](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for a set of N-dimensional points arranged in groups. The metric is the largest\n * individual silhouette value for the data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {number} The silhouette metric for the groupings.\n *\n * @example\n * silhouetteMetric([[0.25], [0.75]], [0, 0]); // => 1.0\n */\nfunction silhouetteMetric(points, labels) {\n var values = silhouette(points, labels);\n return max(values);\n}\n\n/**\n * Relative error.\n *\n * This is more difficult to calculate than it first appears [1,2]. The usual\n * formula for the relative error between an actual value A and an expected\n * value E is `|(A-E)/E|`, but:\n *\n * 1. If the expected value is 0, any other value has infinite relative error,\n * which is counter-intuitive: if the expected voltage is 0, getting 1/10th\n * of a volt doesn't feel like an infinitely large error.\n *\n * 2. This formula does not satisfy the mathematical definition of a metric [3].\n * [4] solved this problem by defining the relative error as `|ln(|A/E|)|`,\n * but that formula only works if all values are positive: for example, it\n * reports the relative error of -10 and 10 as 0.\n *\n * Our implementation sticks with convention and returns:\n *\n * - 0 if the actual and expected values are both zero\n * - Infinity if the actual value is non-zero and the expected value is zero\n * - `|(A-E)/E|` in all other cases\n *\n * [1] https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero\n * [2] https://en.wikipedia.org/wiki/Relative_change_and_difference\n * [3] https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition\n * [4] F.W.J. Olver: \"A New Approach to Error Arithmetic.\" SIAM Journal on\n * Numerical Analysis, 15(2), 1978, 10.1137/0715024.\n *\n * @param {number} actual The actual value.\n * @param {number} expected The expected value.\n * @return {number} The relative error.\n */\nfunction relativeError(actual, expected) {\n if (actual === 0 && expected === 0) {\n return 0;\n }\n return Math.abs((actual - expected) / expected);\n}\n\n/**\n * Approximate equality.\n *\n * @param {number} actual The value to be tested.\n * @param {number} expected The reference value.\n * @param {number} tolerance The acceptable relative difference.\n * @return {boolean} Whether numbers are within tolerance.\n */\nfunction approxEqual(actual, expected, tolerance) {\n if ( tolerance === void 0 ) tolerance = epsilon;\n\n return relativeError(actual, expected) <= tolerance;\n}\n\nexport { BayesianClassifier, PerceptronModel, addToMean, approxEqual, mean as average, meanSimple as averageSimple, BayesianClassifier as bayesian, bernoulliDistribution, binomialDistribution, bisect, chiSquaredDistributionTable, chiSquaredGoodnessOfFit, chunk, ckmeans, coefficientOfVariation, combinations, combinationsReplacement, combineMeans, combineVariances, cumulativeStdLogisticProbability, cumulativeStdNormalProbability, epsilon, equalIntervalBreaks, errorFunction as erf, errorFunction, extent, extentSorted, factorial, gamma, gammaln, geometricMean, harmonicMean, interquartileRange, inverseErrorFunction, interquartileRange as iqr, jenks, kMeansCluster, kernelDensityEstimation as kde, kernelDensityEstimation, linearRegression, linearRegressionLine, logAverage, logit, medianAbsoluteDeviation as mad, max, maxSorted, mean, meanSimple, median, medianAbsoluteDeviation, medianSorted, min, minSorted, mode, modeFast, modeSorted, numericSort, PerceptronModel as perceptron, permutationTest, permutationsHeap, poissonDistribution, probit, product, quantile, quantileRank, quantileRankSorted, quantileSorted, quickselect, rSquared, relativeError, rootMeanSquare as rms, rootMeanSquare, sample, sampleCorrelation, sampleCovariance, sampleKurtosis, sampleRankCorrelation, sampleSkewness, sampleStandardDeviation, sampleVariance, sampleWithReplacement, shuffle, shuffleInPlace, sign, silhouette, silhouetteMetric, standardDeviation, standardNormalTable, subtractFromMean, sum, sumNthPowerDeviations, sumSimple, tTest, tTestTwoSample, uniqueCountSorted, variance, wilcoxonRankSum, zScore };\n//# sourceMappingURL=simple-statistics.mjs.map\n","export const CHANNEL = {\n maxDimensionNumber: 8,\n maxMeasureNumber: 6\n};\nexport const EULER = 0.5772156649;\nexport const PERCENT_THRESHOLD_AS_UNIQUE_INDEX = 0.95;\nexport const DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP = 40;\nexport const DEFAULT_BIN_NUM = 8;\nexport const BIN_NUM_FOR_ANALYTIC = DEFAULT_BIN_NUM * 2;\nexport const VERSION = '0.7.5';\n","import { DEFAULT_BIN_NUM } from '../constant';\n/**\n * 只针对 stdAggregateFromCuboid 设计的写法,其他地方不要使用,不具备通用型。\n * @param rows\n * @param colKey\n * @param opKey\n * @returns\n */\nexport function sumByCol(rows, colKey, opKey) {\n let _sum = 0;\n for (let i = 0; i < rows.length; i++) {\n _sum += rows[i].stat[colKey][opKey];\n }\n return _sum;\n}\n// for cases when all values are same\nfunction fixRange(originalRange) {\n if (originalRange[0] === originalRange[1]) {\n return [originalRange[0], originalRange[1] + 0.1];\n }\n return originalRange;\n}\nexport const dist = function (values, originalRange) {\n const range = fixRange(originalRange);\n const step = (range[1] - range[0]) / DEFAULT_BIN_NUM;\n const bins = new Array(DEFAULT_BIN_NUM + 1).fill(0);\n for (let value of values) {\n const vIndex = Math.floor((value - range[0]) / step);\n bins[vIndex]++;\n }\n bins[DEFAULT_BIN_NUM - 1] += bins[DEFAULT_BIN_NUM];\n return bins.slice(0, -1);\n};\nexport function distMergeBy(rows, colKey, opKey) {\n const bins = new Array(DEFAULT_BIN_NUM).fill(0);\n for (let i = 0; i < rows.length; i++) {\n const recordBins = rows[i].stat[colKey][opKey];\n for (let j = 0; j < bins.length; j++) {\n bins[j] += recordBins[j];\n }\n }\n return bins;\n}\n","import { min, max, sum, mean } from 'simple-statistics';\nimport { distMergeBy, sumByCol } from './aggregators';\nconst SPLITOR = '_join_';\nconst count = function (x) {\n return x.length;\n};\nexport const SFMapper = {\n sum,\n max,\n mean,\n min,\n count\n};\nexport function getAggregator(op) {\n const func = SFMapper[op] || sum;\n return func;\n}\nexport function groupBy(rows, by) {\n const groups = new Map();\n for (let record of rows) {\n const key = by.map((d) => record[d]).join(SPLITOR);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key).push(record);\n }\n return groups;\n}\nexport function simpleAggregate(props) {\n const { dataSource, dimensions, measures, ops } = props;\n const groups = groupBy(dataSource, dimensions);\n const result = [];\n for (let [key, group] of groups) {\n const aggs = {};\n measures.forEach((mea, meaIndex) => {\n const opFunc = getAggregator(ops[meaIndex]);\n aggs[mea] = opFunc(group.map(r => r[mea]));\n });\n const dimValues = key.split(SPLITOR);\n dimensions.forEach((dim, dimIndex) => {\n aggs[dim] = dimValues[dimIndex];\n });\n result.push(aggs);\n }\n return result;\n}\nexport function stdAggregate(props) {\n const { dataSource, dimensions, measures, ops } = props;\n const groups = groupBy(dataSource, dimensions);\n const result = [];\n for (let [key, group] of groups) {\n const aggs = {\n groupDict: {},\n stat: {}\n };\n measures.forEach((mea, meaIndex) => {\n aggs.stat[mea] = {};\n ops.forEach(op => {\n const opFunc = getAggregator(op);\n aggs.stat[mea][op] = opFunc(group.map((r) => r[mea]));\n });\n });\n const dimValues = key.split(SPLITOR);\n dimensions.forEach((dim, dimIndex) => {\n aggs.groupDict[dim] = dimValues[dimIndex];\n });\n result.push(aggs);\n }\n return result;\n}\nexport function getAggHashKey(values) {\n return values.join(SPLITOR);\n}\nfunction cuboidStateGroupBy(state, by) {\n const groups = new Map();\n for (let record of state) {\n const key = by.map((d) => record.groupDict[d]).join(SPLITOR);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key).push(record);\n }\n return groups;\n}\nexport function stdAggregateFromCuboid(props) {\n const { cuboidState, dimensions, measures, ops } = props;\n const groups = cuboidStateGroupBy(cuboidState, dimensions);\n const result = [];\n // TODO: need a formal solution for distributive\\algebraic\\holistic aggregators.\n const generalOpNames = ops.filter(op => !(['sum', 'count', 'mean', 'dist'].includes(op)));\n const generalOps = generalOpNames.map(opName => getAggregator(opName));\n for (let [key, group] of groups) {\n const aggs = {\n groupDict: {},\n stat: {}\n };\n for (let meaIndex = 0; meaIndex < measures.length; meaIndex++) {\n const mea = measures[meaIndex];\n aggs.stat[mea] = {};\n generalOps.forEach((op, opIndex) => {\n const opName = generalOpNames[opIndex];\n aggs.stat[mea][opName] = op(group.map((r) => r.stat[mea][opName]));\n });\n // 讨论:描述的简洁性 vs 性能\n aggs.stat[mea][\"sum\"] = sumByCol(group, mea, 'sum');\n aggs.stat[mea][\"count\"] = sumByCol(group, mea, 'count');\n // aggs[mea][\"sum\"] = getAggregator('sum')(group.map((r) => r[mea][\"sum\"]));\n // aggs[mea][\"count\"] = getAggregator('sum')(group.map((r) => r[mea]['count']));\n aggs.stat[mea][\"mean\"] = aggs.stat[mea]['sum'] / aggs.stat[mea]['count'];\n aggs.stat[mea]['dist'] = distMergeBy(group, mea, 'dist');\n }\n const dimValues = key.split(SPLITOR);\n for (let dimIndex = 0; dimIndex < dimensions.length; dimIndex++) {\n aggs.groupDict[dimensions[dimIndex]] = dimValues[dimIndex];\n }\n result.push(aggs);\n }\n return result;\n}\n","export const TopKSingleField = 6;\nexport const TopKView = 15;\nexport const Depth = 4;\nexport const VisualLimit = 8;\nexport const TopKPercentField = 0.8;\nexport const CrammersVThreshold = 0.3;\nexport const PearsonCorrelation = {\n strong: 0.5,\n weak: 0.3\n};\n","/**\n *\n * @param matrix adjmatrix\n */\nfunction turnAdjMatrix2List(matrix) {\n // only for the special matrix here(corelational matrix)\n let edges = [];\n for (let i = 0; i < matrix.length; i++) {\n for (let j = i + 1; j < matrix[i].length; j++) {\n edges.push([[i, j], Math.abs(matrix[i][j])]);\n }\n }\n return edges;\n}\nfunction find(parents, n) {\n return parents[n] === n ? n : parents[n] = find(parents, parents[n]);\n}\nfunction union(parents, n1, n2) {\n let p1 = find(parents, n1);\n let p2 = find(parents, n2);\n parents[p1] = p2;\n // I'm too tired. this is just a tmp lazy solution.... will be fixed later.\n // may check and prove whether it's necessary.\n find(parents, n1);\n find(parents, n2);\n}\nfunction findWithEffect(parents, sizes, n) {\n if (parents[n] === n) {\n return n;\n }\n parents[n] = findWithEffect(parents, sizes, parents[n]);\n sizes[n] = sizes[parents[n]];\n return parents[n];\n}\nfunction unionWithEffect(parents, sizes, n1, n2) {\n let p1 = findWithEffect(parents, sizes, n1);\n let p2 = findWithEffect(parents, sizes, n2);\n let size1 = sizes[p1];\n let size2 = sizes[p2];\n parents[p1] = p2;\n sizes[p1] = sizes[p2] = size1 + size2;\n findWithEffect(parents, sizes, n1);\n findWithEffect(parents, sizes, n2);\n}\n/**\n * maxiumn spanning tree\n * @param matrix adjmatrix\n * @param groupNumber number of group generated by clustering\n */\nfunction kruskal(matrix, groupNumber, threshold = 0) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const parents = matrix.map((m, i) => i);\n for (let edge of edges) {\n if (find(parents, edge[0][0]) !== find(parents, edge[0][1])) {\n union(parents, edge[0][0], edge[0][1]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = find(parents, i);\n }\n let set = new Set(parents);\n if (set.size <= groupNumber || edge[1] < threshold) {\n break;\n }\n }\n let groups = new Map();\n for (let i = 0; i < parents.length; i++) {\n if (!groups.has(parents[i])) {\n groups.set(parents[i], []);\n }\n groups.get(parents[i]).push(i);\n }\n return groups;\n}\n// todo: delete kruskal with limit size, use largest size to limit it(uncontrolled group number but better), need discuss.\n/**\n *\n * @param matrix\n * @param limitSize max size of each group\n */\nfunction kruskalWithLimitSize(matrix, limitSize) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const parents = matrix.map((m, i) => i);\n const sizes = matrix.map(() => 1);\n for (let edge of edges) {\n if (findWithEffect(parents, sizes, edge[0][0]) !== findWithEffect(parents, sizes, edge[0][1])) {\n if (sizes[edge[0][0]] + sizes[edge[0][1]] > limitSize) {\n continue;\n }\n unionWithEffect(parents, sizes, edge[0][0], edge[0][1]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = findWithEffect(parents, sizes, i);\n }\n let set = new Set(parents);\n if (set.size === 1) {\n break;\n }\n }\n let groups = new Map();\n for (let i = 0; i < parents.length; i++) {\n if (!groups.has(parents[i])) {\n groups.set(parents[i], []);\n }\n groups.get(parents[i]).push(i);\n }\n return groups;\n}\nexport function kruskalMSTWithLimitSize(matrix, limitSize = 4) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const edgesInMST = [];\n const parents = matrix.map((m, i) => i);\n const cloneParents = matrix.map((m, i) => i);\n const sizes = matrix.map(() => 1);\n for (let edge of edges) {\n if (findWithEffect(parents, sizes, edge[0][0]) !== findWithEffect(parents, sizes, edge[0][1])) {\n if (sizes[edge[0][0]] + sizes[edge[0][1]] > limitSize) {\n if (find(cloneParents, edge[0][0]) !== find(cloneParents, edge[0][1])) {\n edgesInMST.push([edge[0], edge[1], true]);\n union(cloneParents, edge[0][0], edge[0][1]);\n }\n continue;\n }\n unionWithEffect(parents, sizes, edge[0][0], edge[0][1]);\n // fuck typescript\n // edgesInMST.push([...edge, inCutEdge]);\n edgesInMST.push([edge[0], edge[1], false]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = findWithEffect(parents, sizes, i);\n cloneParents[i] = find(cloneParents, i);\n }\n let set = new Set(parents);\n if (set.size === 1) {\n break;\n }\n }\n return { edgesInMST, groups: parents };\n}\n/**\n *\n * @param matrix\n * @param groupNumber number of group generated by clustering\n */\nexport function kruskalMST(matrix, groupNumber = 4, threshold = 0) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const edgesInMST = [];\n const parents = matrix.map((m, i) => i);\n let groups = [...parents];\n let inCutEdge = false;\n for (let edge of edges) {\n if (find(parents, edge[0][0]) !== find(parents, edge[0][1])) {\n union(parents, edge[0][0], edge[0][1]);\n // fuck typescript\n // edgesInMST.push([...edge, inCutEdge]);\n edgesInMST.push([edge[0], edge[1], inCutEdge]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = find(parents, i);\n }\n let set = new Set(parents);\n // TODO:\n // + use kruskalMST instead of kruskal.\n if (set.size <= groupNumber || edge[1] < threshold) {\n inCutEdge = true;\n }\n else {\n groups = [...parents];\n }\n if (set.size === 1) {\n break;\n }\n }\n return { edgesInMST, groups };\n}\nfunction cluster({ matrix, measures, method = 'kruskal', groupMaxSize = 4, limitSize = false, threshold = 0 }) {\n // const groups = kruskal({ matrix, groupMaxSize });\n let groups;\n if (limitSize) {\n groups = kruskalWithLimitSize(matrix, groupMaxSize);\n }\n else {\n groups = kruskal(matrix, groupMaxSize, threshold);\n }\n let ans = [];\n for (let meas of groups.values()) {\n ans.push(meas.map(meaIndex => measures[meaIndex]));\n }\n return ans;\n}\nexport default cluster;\n","/**\n * todo reservoir sampling is better to support stream data\n * Algorithm R:\n * Vitter, Jeffrey S. (1 March 1985). \"Random sampling with a reservoir\" (PDF). ACM Transactions on Mathematical Software. 11 (1): 37–57. CiteSeerX 10.1.1.138.784. doi:10.1145/3147.3165.\n */\nexport function reservoirSampling(dataSource, size = 500) {\n if (dataSource.length <= size)\n return dataSource;\n let sampleSpace = dataSource.slice(0, size);\n let len = dataSource.length;\n for (let i = size + 1; i < len; i++) {\n let pos = Math.round(Math.random() * i);\n if (pos < size) {\n sampleSpace[pos] = dataSource[i];\n }\n }\n return sampleSpace;\n}\nfunction linearCongruentialGenerator(size, seed) {\n if (size === 0)\n return [];\n const m = 2147483647;\n const a = 1103515245;\n const c = 12345;\n let ans = [seed];\n for (let i = 1; i < size; i++) {\n ans.push(((ans[i - 1] * a + c) % m));\n }\n return ans.map(v => v / m);\n}\nexport function uniformSampling(dataSource, size) {\n let sampleIndexes = linearCongruentialGenerator(size, Math.random() * 2147483647);\n let ans = [];\n for (let i = 0; i < size; i++) {\n let index = Math.floor(sampleIndexes[i] * size) % size;\n ans.push(dataSource[index]);\n }\n return ans;\n}\n","import { uniformSampling } from \"../../sampling\";\nimport { EULER } from \"../../constant\";\nexport class IsolationForest {\n constructor(dimensions, measures, dataSource, treeNumber = 100, Psi = 256) {\n this.dimensions = dimensions;\n this.measures = measures;\n this.dataSource = dataSource;\n if (dataSource.length < Psi) {\n this.treeNumber = Math.max(1, Math.ceil(Psi / 50));\n this.sampleSize = Math.max(2, Math.floor(dataSource.length / 2));\n }\n else {\n this.treeNumber = treeNumber;\n this.sampleSize = Psi;\n }\n this.limitHeight = Math.ceil(Math.log2(this.sampleSize));\n this.iForest = [];\n this.normalizeDimensions();\n }\n normalizeDimensions() {\n this.normalizedDataSource = [];\n this.valueSets = [];\n this.ranges = [];\n this.dimensions.forEach(() => {\n this.valueSets.push(new Map());\n });\n this.measures.forEach(() => {\n this.ranges.push([Infinity, -Infinity]);\n });\n this.dataSource.forEach(record => {\n this.dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n if (!this.valueSets[index].has(value)) {\n this.valueSets[index].set(value, this.valueSets[index].size);\n }\n });\n this.measures.forEach((mea, index) => {\n let value = record[mea];\n if (typeof value === 'number') {\n this.ranges[index][0] = Math.min(this.ranges[index][0], value);\n this.ranges[index][1] = Math.max(this.ranges[index][1], value);\n }\n });\n });\n this.dataSource.forEach(record => {\n let normalizedRecord = this.normalizeRecord(record);\n this.normalizedDataSource.push(normalizedRecord);\n });\n return this.normalizedDataSource;\n }\n normalizeRecord(record) {\n let normalizedRecord = {};\n this.measures.forEach(mea => {\n normalizedRecord[mea] = record[mea];\n });\n this.dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n normalizedRecord[dim] = this.valueSets[index].get(value);\n });\n return normalizedRecord;\n }\n buildIsolationTree(normalizedSampleData, depth) {\n if (depth >= this.limitHeight || normalizedSampleData.length <= 1) {\n return null;\n }\n else {\n let rand = Math.random();\n let randField = this.measures[0] || this.dimensions[0];\n let dimLength = this.dimensions.length;\n let meaLength = this.measures.length;\n let randValue = 0;\n if (rand >= dimLength / (dimLength + meaLength)) {\n let index = Math.floor(Math.random() * meaLength) % meaLength;\n randField = this.measures[index];\n randValue = this.ranges[index][0] + (this.ranges[index][1] - this.ranges[index][0]) * Math.random();\n }\n else {\n let index = Math.floor(Math.random() * dimLength) % dimLength;\n randField = this.dimensions[index];\n randValue = Math.floor(this.valueSets[index].size * Math.random()) % this.valueSets[index].size;\n }\n // random in range not in distribution.\n // let randValue = normalizedSampleData[Math.floor(Math.random() * normalizedSampleData.length) % normalizedSampleData.length][randField];\n let leftSubData = [];\n let rightSubData = [];\n for (let record of normalizedSampleData) {\n if (record[randField] < randValue) {\n leftSubData.push(record);\n }\n else {\n rightSubData.push(record);\n }\n }\n let node = {\n field: randField,\n value: randValue,\n size: normalizedSampleData.length\n };\n node.left = this.buildIsolationTree(leftSubData, depth + 1);\n node.right = this.buildIsolationTree(rightSubData, depth + 1);\n return node;\n }\n }\n /**\n * average unsuccessful searches in BST (Preiss, 1999)\n * @param Psi\n */\n AFS(Psi) {\n if (Psi > 2)\n return 2 * (Math.log(Psi - 1) + EULER) - 2 * (Psi - 1) / Psi;\n if (Psi === 2)\n return 1;\n return 0;\n }\n getPathLength(record, iTree, pathLength, nodeSize) {\n if (iTree === null) {\n return pathLength + this.AFS(nodeSize);\n }\n let value = record[iTree.field];\n if (value < iTree.value) {\n return this.getPathLength(record, iTree.left, pathLength + 1, iTree.size);\n }\n else {\n return this.getPathLength(record, iTree.right, pathLength + 1, iTree.size);\n }\n }\n buildIsolationForest() {\n this.iForest = [];\n for (let i = 0; i < this.treeNumber; i++) {\n let samples = uniformSampling(this.normalizedDataSource, this.sampleSize);\n let iTree = this.buildIsolationTree(samples, 0);\n this.iForest.push(iTree);\n }\n return this.iForest;\n }\n // public evaluate (record: Record): number {\n // }\n estimateOutierScore() {\n this.recordScoreList = [];\n this.normalizedDataSource.forEach(record => {\n let recordScore = 0;\n let avgPathLength = 0;\n this.iForest.forEach(iTree => {\n avgPathLength += this.getPathLength(record, iTree, 0, this.sampleSize);\n });\n avgPathLength /= this.iForest.length;\n recordScore = Math.pow(2, -(avgPathLength / this.AFS(this.sampleSize)));\n this.recordScoreList.push(recordScore);\n });\n return this.recordScoreList;\n }\n}\n","import * as Cluster from './cluster/index';\nimport { KNN } from './classification/knn';\nimport { IsolationForest } from './outlier/isolationForest';\nconst Outier = {\n IsolationForest\n};\nconst Classification = {\n KNN\n};\nexport { Cluster, Outier, Classification };\n","import { crammersV, getCombination, pearsonCC } from '../statistics/index';\nimport { CrammersVThreshold, PearsonCorrelation } from './config';\nimport { Cluster } from '../ml/index';\nimport { CHANNEL } from '../constant';\n// insights like outlier and trend both request high impurity of dimension.\nexport function getDimCorrelationMatrix(dataSource, dimensions) {\n let matrix = dimensions.map(d => dimensions.map(d => 0));\n for (let i = 0; i < dimensions.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < dimensions.length; j++) {\n matrix[i][j] = matrix[j][i] = crammersV(dataSource, dimensions[i], dimensions[j]);\n }\n }\n return matrix;\n}\nexport function getMeaCorrelationMatrix(dataSource, measures) {\n let matrix = measures.map(i => measures.map(j => 0));\n for (let i = 0; i < measures.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < measures.length; j++) {\n let r = pearsonCC(dataSource, measures[i], measures[j]);\n matrix[j][i] = matrix[i][j] = r;\n }\n }\n return matrix;\n}\nexport function getDimClusterGroups(dataSource, dimensions, threshold = CrammersVThreshold, max_number_of_group) {\n const maxDimNumberInView = 4;\n let dimCorrelationMatrix = getDimCorrelationMatrix(dataSource, dimensions);\n // groupMaxSize here means group number.\n let groups = Cluster.kruskal({\n matrix: dimCorrelationMatrix,\n measures: dimensions,\n groupMaxSize: max_number_of_group ? max_number_of_group : Math.round(dimensions.length / maxDimNumberInView),\n threshold,\n });\n return groups;\n}\nexport function getDimSetsBasedOnClusterGroups(dataSource, dimensions, correlation_threshold, max_dimensions_in_space) {\n let dimSets = [];\n let groups = getDimClusterGroups(dataSource, dimensions, correlation_threshold);\n for (let group of groups) {\n let combineDimSet = getCombination(group, 1, max_dimensions_in_space ? max_dimensions_in_space : CHANNEL.maxDimensionNumber);\n dimSets.push(...combineDimSet);\n }\n return dimSets;\n}\n/**\n *\n * @param dataSource\n * @param measures\n * @param correlation_threshold a threshold of correlation used to define min correlation value in a cluster of measure.\n * @param max_measure_in_view\n */\nexport function getMeaSetsBasedOnClusterGroups(dataSource, measures, correlation_threshold, max_number_of_group = 3) {\n const soft_max_measures_in_view = 3;\n let correlationMatrix = getMeaCorrelationMatrix(dataSource, measures);\n let groups = Cluster.kruskal({\n matrix: correlationMatrix,\n measures: measures,\n groupMaxSize: max_number_of_group ? max_number_of_group : Math.round(measures.length / soft_max_measures_in_view),\n threshold: correlation_threshold ? correlation_threshold : PearsonCorrelation.strong\n });\n return groups;\n}\nexport function subspaceSearching(dataSource, dimensions, should_dimensions_correlated = true) {\n if (should_dimensions_correlated) {\n return getDimSetsBasedOnClusterGroups(dataSource, dimensions);\n }\n else {\n return getCombination(dimensions);\n }\n}\nexport function getRelatedVertices(adjMatrix, vertices, verticesInGraph, topK) {\n let verStatus = vertices.map(v => verticesInGraph.includes(v));\n let edges = [];\n let ans = [];\n for (let i = 0; i < adjMatrix.length; i++) {\n // if vertex in graph, then check all the edges from this vertex\n if (verStatus[i]) {\n for (let j = 0; j < adjMatrix[i].length; j++) {\n if (!verStatus[j]) {\n edges.push([adjMatrix[i][j], [i, j]]);\n }\n }\n }\n }\n edges.sort((a, b) => {\n return b[0] - a[0];\n });\n for (let i = 0; i < edges.length; i++) {\n let targetVertexIndex = edges[i][1][1];\n if (!verStatus[targetVertexIndex]) {\n verStatus[targetVertexIndex] = true;\n ans.push({\n field: vertices[targetVertexIndex],\n corValue: edges[i][0]\n });\n }\n }\n return ans.slice(0, topK ? topK : ans.length);\n}\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Node = /** @class */ (function () {\n function Node(aggFunc) {\n this.children = new Map();\n this._rawData = [];\n this.aggFunc = aggFunc;\n this.cache = false;\n }\n Node.prototype.push = function () {\n var _a;\n var params = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n (_a = this._rawData).push.apply(_a, __spread(params));\n };\n Node.prototype.aggData = function (measures) {\n if (measures === void 0) { measures = []; }\n if (!this.cache) {\n this._aggData = this.aggFunc(this.rawData, measures);\n this.cache = true;\n }\n return this._aggData;\n };\n Node.prototype.clearCache = function () {\n this.cache = false;\n };\n Object.defineProperty(Node.prototype, \"rawData\", {\n get: function () {\n var e_1, _a;\n if (!this.cache) {\n if (this.children.size !== 0) {\n var children = this.children.values();\n var rawData = [];\n try {\n for (var children_1 = __values(children), children_1_1 = children_1.next(); !children_1_1.done; children_1_1 = children_1.next()) {\n var child = children_1_1.value;\n var i = void 0;\n var data = child.rawData;\n var len = data.length;\n for (i = 0; i < len; i++) {\n rawData.push(data[i]);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (children_1_1 && !children_1_1.done && (_a = children_1.return)) _a.call(children_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n this._rawData = rawData;\n }\n this.cache = true;\n }\n return this._rawData;\n },\n enumerable: true,\n configurable: true\n });\n Node.prototype.getNode = function (dimensions) {\n var search = function (node, level) {\n var e_2, _a;\n if (level === dimensions.length) {\n return node;\n }\n var children = node.children.entries();\n try {\n for (var children_2 = __values(children), children_2_1 = children_2.next(); !children_2_1.done; children_2_1 = children_2.next()) {\n var _b = __read(children_2_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (children_2_1 && !children_2_1.done && (_a = children_2.return)) _a.call(children_2);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return null;\n };\n return search(this, 0);\n };\n return Node;\n}());\nvar periodCube = /** @class */ (function () {\n function periodCube(props) {\n this.aggFunc = props.aggFunc;\n this.factTable = props.factTable;\n this.dimensions = props.dimensions;\n this.measures = props.measures;\n }\n periodCube.prototype.get = function (dimensions) {\n var _a = this, tree = _a.tree, aggFunc = _a.aggFunc, measures = _a.measures;\n var search = function (node, level) {\n var e_3, _a;\n if (level === dimensions.length) {\n return node.aggData(measures);\n }\n var children = node.children.entries();\n try {\n for (var children_3 = __values(children), children_3_1 = children_3.next(); !children_3_1.done; children_3_1 = children_3.next()) {\n var _b = __read(children_3_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (children_3_1 && !children_3_1.done && (_a = children_3.return)) _a.call(children_3);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return false;\n };\n return search(tree, 0);\n };\n periodCube.prototype.getNode = function (dimensions) {\n var tree = this.tree;\n return tree.getNode(dimensions);\n };\n periodCube.prototype.buildTree = function () {\n var tree = new Node(this.aggFunc);\n var len = this.factTable.length, i;\n for (i = 0; i < len; i++) {\n this.insertNode(this.factTable[i], tree, 0);\n }\n this.tree = tree;\n return tree;\n };\n periodCube.prototype.insertNode = function (record, node, level) {\n node.push(record);\n node.cache = false;\n if (level < this.dimensions.length) {\n var member = record[this.dimensions[level]];\n if (!node.children.has(member)) {\n node.children.set(member, new Node(this.aggFunc));\n }\n this.insertNode(record, node.children.get(member), level + 1);\n }\n };\n periodCube.prototype.aggTree = function (node) {\n var e_4, _a;\n if (node === void 0) { node = this.tree; }\n var children = node.children.values();\n try {\n for (var children_4 = __values(children), children_4_1 = children_4.next(); !children_4_1.done; children_4_1 = children_4.next()) {\n var child = children_4_1.value;\n this.aggTree(child);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (children_4_1 && !children_4_1.done && (_a = children_4.return)) _a.call(children_4);\n }\n finally { if (e_4) throw e_4.error; }\n }\n node.aggData(this.measures);\n return node;\n };\n periodCube.prototype.aggNode = function (node) {\n var e_5, _a;\n if (node === void 0) { node = this.tree; }\n var children = node.children.values();\n try {\n for (var children_5 = __values(children), children_5_1 = children_5.next(); !children_5_1.done; children_5_1 = children_5.next()) {\n var child = children_5_1.value;\n this.aggTree(child);\n }\n }\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\n finally {\n try {\n if (children_5_1 && !children_5_1.done && (_a = children_5.return)) _a.call(children_5);\n }\n finally { if (e_5) throw e_5.error; }\n }\n node.aggData(this.measures);\n return node;\n };\n return periodCube;\n}());\nexports.default = periodCube;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Node = /** @class */ (function () {\n function Node() {\n this.children = new Map();\n this.rawData = [];\n }\n Node.prototype.push = function () {\n var _a;\n var params = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n (_a = this.rawData).push.apply(_a, __spread(params));\n };\n Node.prototype.aggData = function (aggFunc, measures) {\n if (measures === void 0) { measures = []; }\n this._aggData = aggFunc(this.rawData, measures);\n return this._aggData;\n };\n Node.prototype.getNode = function (dimensions) {\n var search = function (node, level) {\n var e_1, _a;\n if (level === dimensions.length) {\n return node;\n }\n var children = node.children.entries();\n try {\n for (var children_1 = __values(children), children_1_1 = children_1.next(); !children_1_1.done; children_1_1 = children_1.next()) {\n var _b = __read(children_1_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (children_1_1 && !children_1_1.done && (_a = children_1.return)) _a.call(children_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return null;\n };\n return search(this, 0);\n };\n return Node;\n}());\nexports.Node = Node;\nvar momentCube = /** @class */ (function () {\n function momentCube(props) {\n this.aggFunc = props.aggFunc;\n this.factTable = props.factTable;\n this.dimensions = props.dimensions;\n this.measures = props.measures;\n this.buildTree();\n this.aggTree();\n }\n momentCube.prototype.get = function (dimensions) {\n var _a = this, tree = _a.tree, aggFunc = _a.aggFunc, measures = _a.measures;\n var search = function (node, level) {\n var e_2, _a;\n if (level === dimensions.length) {\n return node.aggData(aggFunc, measures);\n }\n var children = node.children.entries();\n try {\n for (var children_2 = __values(children), children_2_1 = children_2.next(); !children_2_1.done; children_2_1 = children_2.next()) {\n var _b = __read(children_2_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (children_2_1 && !children_2_1.done && (_a = children_2.return)) _a.call(children_2);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return false;\n };\n return search(tree, 0);\n };\n momentCube.prototype.getNode = function (dimensions) {\n var tree = this.tree;\n return tree.getNode(dimensions);\n };\n momentCube.prototype.setData = function (props) {\n var _a = props.aggFunc, aggFunc = _a === void 0 ? this.aggFunc : _a, _b = props.factTable, factTable = _b === void 0 ? this.factTable : _b, _c = props.dimensions, dimensions = _c === void 0 ? this.dimensions : _c, _d = props.measures, measures = _d === void 0 ? this.measures : _d;\n if (dimensions !== this.dimensions || factTable !== this.factTable) {\n this.dimensions = dimensions;\n this.factTable = factTable;\n this.measures = measures;\n this.aggFunc = aggFunc;\n this.buildTree();\n this.aggTree();\n }\n else if (measures !== this.measures || aggFunc !== this.aggFunc) {\n this.measures = measures;\n this.aggFunc = aggFunc;\n this.aggTree();\n }\n };\n momentCube.prototype.buildTree = function () {\n var tree = new Node();\n var len = this.factTable.length, i;\n for (i = 0; i < len; i++) {\n this.insertNode(this.factTable[i], tree, 0);\n }\n this.tree = tree;\n return tree;\n };\n momentCube.prototype.insertNode = function (record, node, level) {\n if (level === this.dimensions.length) {\n node.push(record);\n }\n else {\n var member = record[this.dimensions[level]];\n if (!node.children.has(member)) {\n node.children.set(member, new Node());\n }\n this.insertNode(record, node.children.get(member), level + 1);\n }\n };\n momentCube.prototype.aggTree = function (node) {\n var e_3, _a;\n if (node === void 0) { node = this.tree; }\n if (node.children.size > 0) {\n node.rawData = [];\n var children = node.children.values();\n try {\n for (var children_3 = __values(children), children_3_1 = children_3.next(); !children_3_1.done; children_3_1 = children_3.next()) {\n var child = children_3_1.value;\n var i = void 0;\n var data = this.aggTree(child).rawData;\n var len = data.length;\n for (i = 0; i < len; i++) {\n node.rawData.push(data[i]);\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (children_3_1 && !children_3_1.done && (_a = children_3.return)) _a.call(children_3);\n }\n finally { if (e_3) throw e_3.error; }\n }\n }\n node.aggData(this.aggFunc, this.measures);\n return node;\n };\n return momentCube;\n}());\nexports.default = momentCube;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar periodCube_1 = require(\"./periodCube\");\nexports.periodCube = periodCube_1.default;\nvar momentCube_1 = require(\"./momentCube\");\nexports.momentCube = momentCube_1.default;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tree2Table(props) {\n var dimensions = props.dimensions, measures = props.measures, cube = props.cube;\n var aggFunc = cube.aggFunc;\n var table = [];\n function dfs(node, record, level) {\n var e_1, _a, _b;\n if (node.children.size === 0) {\n var values = node._aggData;\n table.push(__assign(__assign({}, record), values));\n return;\n }\n try {\n for (var _c = __values(node.children.entries()), _d = _c.next(); !_d.done; _d = _c.next()) {\n var _e = __read(_d.value, 2), childName = _e[0], child = _e[1];\n var r = __assign(__assign({}, record), (_b = {}, _b[dimensions[level]] = childName, _b));\n dfs(child, r, level + 1);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n dfs(cube.tree, {}, 0);\n return table;\n}\nexports.tree2Table = tree2Table;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sum_unsafe = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_1 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += subset[i][mea];\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_1(i, len);\n }\n return sums;\n};\nexports.sum = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_2 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += Number(subset[i][mea]) || 0;\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_2(i, len);\n }\n return sums;\n};\nexports.count = function (subset, MEASURES) {\n var cnts = {};\n MEASURES.forEach(function (mea) {\n cnts[mea] = 0;\n });\n for (var i = 0, len = subset.length; i < len; i++) {\n MEASURES.forEach(function (mea) {\n cnts[mea]++;\n });\n }\n return cnts;\n};\nexports.mean = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_3 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += Number(subset[i][mea]) || 0;\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_3(i, len);\n }\n measures.forEach(function (mea) {\n sums[mea] /= subset.length;\n });\n return sums;\n};\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar index_1 = require(\"./core/index\");\n// import { JsonRecord } from './types';\nvar transform_1 = require(\"./utils/transform\");\nvar aggregation_1 = require(\"./utils/aggregation\");\nvar operatorMap = {\n 'sum': aggregation_1.sum_unsafe,\n 'mean': aggregation_1.mean,\n 'count': aggregation_1.count,\n};\nfunction copyDataSource(data) {\n return data.map(function (row) {\n return __assign({}, row);\n });\n}\nfunction aggregate(props) {\n var dimensions = props.dimensions, measures = props.measures, asFields = props.asFields, operator = props.operator, dataSource = props.dataSource;\n var data = [];\n var cube = createCube({\n type: 'moment',\n aggFunc: operatorMap[operator] || aggregation_1.count,\n dimensions: dimensions,\n measures: measures,\n factTable: dataSource\n });\n var table = transform_1.tree2Table({ dimensions: dimensions, measures: measures, cube: cube });\n table.forEach(function (row) {\n asFields.forEach(function (as, i) {\n row[as] = row[measures[i]];\n });\n });\n return table;\n}\nfunction createCube(_a) {\n var type = _a.type, _b = _a.aggFunc, aggFunc = _b === void 0 ? aggregation_1.count : _b, _c = _a.factTable, factTable = _c === void 0 ? [] : _c, _d = _a.dimensions, dimensions = _d === void 0 ? [] : _d, _e = _a.measures, measures = _e === void 0 ? [] : _e;\n switch (type) {\n case \"period\":\n return new index_1.periodCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n case \"moment\":\n return new index_1.momentCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n default:\n return new index_1.momentCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n }\n}\nexports.createCube = createCube;\nexports.default = aggregate;\n__export(require(\"./utils/aggregation\"));\n","import { getMeaSetsBasedOnClusterGroups, getDimClusterGroups } from './subspaces';\nimport { CrammersVThreshold, PearsonCorrelation } from './config';\nimport { Outier } from '../ml/index';\nimport { getCombination, mapPositive } from '../statistics/index';\nimport { CHANNEL } from '../constant';\nimport { entropy, normalize } from '../statistics/index';\nimport aggregate from 'cube-core';\nimport { oneDLinearRegression } from '../statistics/index';\nimport { GroupIntention } from \"./intention/groups\";\nconst SPLITER = '=;=';\nfunction crossGroups(dimensionGroups, measureGroups) {\n let viewSpaces = [];\n for (let dimensions of dimensionGroups) {\n for (let measures of measureGroups) {\n viewSpaces.push({\n dimensions,\n measures\n });\n }\n }\n return viewSpaces;\n}\nfunction getDimSetsFromClusterGroups(groups) {\n let dimSets = [];\n for (let group of groups) {\n let combineDimSet = getCombination(group, 1, CHANNEL.maxDimensionNumber);\n dimSets.push(...combineDimSet);\n }\n return dimSets;\n}\nfunction getCombinationFromClusterGroups(groups, limitSize = CHANNEL.maxDimensionNumber) {\n let fieldSets = [];\n for (let group of groups) {\n let combineFieldSet = getCombination(group, 1, limitSize);\n fieldSets.push(...combineFieldSet);\n }\n return fieldSets;\n}\nexport const getGeneralIntentionSpace = async function (aggData, dimensions, measures) {\n let score = 0;\n let significance = 0;\n for (let mea of measures) {\n let fL = aggData.map(r => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n score += value;\n significance += value / Math.log2(fL.length);\n }\n score /= measures.length;\n significance /= measures.length;\n significance = 1 - significance;\n return {\n dimensions,\n measures,\n type: 'default_general',\n score,\n impurity: score,\n significance,\n order: 'asc'\n };\n};\nexport const getOutlierIntentionSpace = async function getOutlierIntentionSpace(aggData, dimensions, measures) {\n let iForest = new Outier.IsolationForest([], measures, aggData);\n iForest.buildIsolationForest();\n let scoreList = iForest.estimateOutierScore();\n let maxIndex = 0;\n let score = 0;\n for (let i = 0; i < scoreList.length; i++) {\n if (scoreList[i] > score) {\n score = scoreList[i];\n maxIndex = i;\n }\n }\n let des = {};\n dimensions.concat(measures).forEach(mea => { des[mea] = aggData[maxIndex][mea]; });\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc',\n description: des\n };\n};\nexport const getTrendIntentionSpace = async function (aggData, dimensions, measures) {\n if (dimensions.length !== 1)\n return null;\n let orderedData = [...aggData];\n orderedData.sort((a, b) => {\n if (a[dimensions[0]] > b[dimensions[0]])\n return 1;\n if (a[dimensions[0]] === b[dimensions[0]])\n return 0;\n if (a[dimensions[0]] < b[dimensions[0]])\n return -1;\n });\n let score = 0;\n for (let mea of measures) {\n let linearModel = new oneDLinearRegression(orderedData, dimensions[0], mea);\n linearModel.normalizeDimensions(dimensions);\n score += linearModel.significance();\n }\n score /= measures.length;\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc'\n };\n};\nexport const getGroupIntentionSpace = async function (aggData, dimensions, measures) {\n if (dimensions.length < 2)\n return null;\n let score = 0;\n let groupIntention = new GroupIntention({\n dataSource: aggData,\n dimensions,\n measures,\n K: 8\n });\n score = groupIntention.getSignificance(measures.concat(dimensions.slice(0, -1)), dimensions.slice(-1));\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc'\n };\n};\n// export const IntentionWorkerCollection: Map<string, IntentionWorker> = new Map();\nexport var DefaultIWorker;\n(function (DefaultIWorker) {\n DefaultIWorker[\"outlier\"] = \"default_outlier\";\n DefaultIWorker[\"cluster\"] = \"default_group\";\n DefaultIWorker[\"trend\"] = \"default_trend\";\n})(DefaultIWorker || (DefaultIWorker = {}));\nexport class IntentionWorkerCollection {\n constructor() {\n this.workers = new Map();\n }\n register(name, iWorker) {\n if (this.workers.has(name)) {\n throw new Error(`There has been a worker named: ${name} already.`);\n }\n else {\n this.workers.set(name, [true, iWorker]);\n }\n }\n enable(name, status) {\n if (!this.workers.has(name)) {\n throw new Error(`Intention Worker \"${name}\" does not exist.`);\n }\n else {\n let iWorkerWithStatus = this.workers.get(name);\n iWorkerWithStatus[0] = status;\n this.workers.set(name, iWorkerWithStatus);\n }\n }\n each(func) {\n for (let [name, iWorker] of this.workers) {\n if (iWorker[0]) {\n func(iWorker[1], name);\n }\n }\n }\n static init(props = { withDefaultIWorkers: true }) {\n const { withDefaultIWorkers = true } = props;\n if (!IntentionWorkerCollection.colletion) {\n IntentionWorkerCollection.colletion = new IntentionWorkerCollection();\n if (withDefaultIWorkers) {\n IntentionWorkerCollection.colletion.register(DefaultIWorker.outlier, getOutlierIntentionSpace);\n IntentionWorkerCollection.colletion.register(DefaultIWorker.cluster, getGroupIntentionSpace);\n IntentionWorkerCollection.colletion.register(DefaultIWorker.trend, getTrendIntentionSpace);\n }\n }\n for (let key in DefaultIWorker) {\n IntentionWorkerCollection.colletion.enable(DefaultIWorker[key], withDefaultIWorkers);\n }\n return IntentionWorkerCollection.colletion;\n }\n}\nexport async function getIntentionSpaces(cubePool, viewSpaces, Collection) {\n let ansSpace = [];\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n let key = dimensions.join(SPLITER);\n if (cubePool.has(key)) {\n let aggData = cubePool.get(key);\n let generalSpace = await getGeneralIntentionSpace(aggData, dimensions, measures);\n Collection.each(async (iWorker, name) => {\n try {\n let iSpace = await iWorker(aggData, dimensions, measures);\n if (iSpace !== null) {\n iSpace.type = name;\n iSpace.impurity = generalSpace.impurity;\n ansSpace.push(iSpace);\n }\n }\n catch (error) {\n console.error('worker failed', { dimensions, measures, aggData }, error);\n }\n });\n }\n }\n return ansSpace;\n}\nexport async function getVisSpaces(props) {\n const { dataSource, dimensions, measures, collection, dimension_correlation_threshold = CrammersVThreshold, measure_correlation_threshold = PearsonCorrelation.strong, max_dimension_num_in_view = 3, max_measure_num_in_view = 3, } = props;\n // 1. get dimension cluster groups.\n // 2. get measure cluster groups.\n // 3. get dimension groups * measure groups = subspaces + aggregate\n // 4. calculate each subspace intention score (entropy, outlier, trend for temporal & oridinal field)\n // 5. filter each intend subspaces with threadshold\n // 6.manage those spaces / order them.\n let visableDimensions = dimensions; //.filter(dim => !isFieldUnique(dataSource, dim));\n let dimensionGroups = getDimClusterGroups(dataSource, visableDimensions, dimension_correlation_threshold);\n // let dimensionSets = getDimSetsFromClusterGroups(dimensionGroups);\n let dimensionSets = getCombinationFromClusterGroups(dimensionGroups, max_dimension_num_in_view);\n let measureGroups = getMeaSetsBasedOnClusterGroups(dataSource, measures, measure_correlation_threshold);\n let measureSets = getCombinationFromClusterGroups(measureGroups, max_measure_num_in_view);\n let viewSpaces = crossGroups(dimensionSets, measureSets);\n let cubePool = new Map();\n // for (let group of dimensionGroups) {\n // todo: similar cuboids computation using cube-core\n let t0 = new Date().getTime();\n for (let group of dimensionSets) {\n let key = group.join(SPLITER);\n let aggData = aggregate({\n dataSource,\n dimensions: group,\n measures,\n asFields: measures,\n operator: 'sum'\n });\n cubePool.set(key, aggData);\n }\n let t1 = new Date().getTime();\n console.log('cube cost', t1 - t0);\n cubePool.set('*', dataSource);\n const usedCollection = collection || IntentionWorkerCollection.init();\n ;\n // usedCollection.enable(DefaultIWorker.cluster, false);\n let ansSpace = await getIntentionSpaces(cubePool, viewSpaces, usedCollection);\n return ansSpace;\n}\n","import { isFieldTime, isFieldContinous, memberCount, isFieldCategory, deepcopy, groupContinousField, groupCategoryField } from '../utils/index';\nimport { normalize, entropy } from '../statistics/index';\nimport { isUniformDistribution } from '../distribution';\nimport { BIN_NUM_FOR_ANALYTIC } from '../constant';\nconst MIN_QUAN_MEMBER_SIZE = BIN_NUM_FOR_ANALYTIC;\n/**\n *\n * @param dataSource\n * @param field\n * todo: should accept BIField type and calculate the semantic type basic on it.\n */\nexport function getFieldType(dataSource, field) {\n if (isFieldTime(dataSource, field)) {\n return 'temporal';\n }\n else if (isFieldContinous(dataSource, field)) {\n // Todo:\n // here is only a tmp solution. we still hope to divided ordinal type and quantitative type.\n // if (memberCount(dataSource, field).length > MIN_QUAN_MEMBER_SIZE) {\n // return 'quantitative'\n // } else {\n // return 'ordinal';\n // }\n // TODO: 讨论这里的严格逻辑\n // [2022.2.8] 由ordinal字段被当做quantitative字段处理导致的效果变差的问题。\n // 参考 https://ewgw6z7tk0.feishu.cn/docs/doccnfuCntXAx5K0SA9jOxgKxYe\n if (memberCount(dataSource, field).length > MIN_QUAN_MEMBER_SIZE) {\n return 'quantitative';\n }\n else {\n return 'ordinal';\n }\n return 'quantitative';\n }\n else if (isFieldCategory(dataSource, field)) {\n // isFieldCategory is a safety checking here, for sometimes dirty data value can be object.\n return 'nominal';\n }\n else {\n // todo do something(like cleaning)\n return 'nominal';\n }\n}\nexport function getAllFieldTypes(dataSource, fields) {\n let fieldsWithType = [];\n for (let field of fields) {\n fieldsWithType.push({\n name: field,\n type: getFieldType(dataSource, field)\n });\n }\n return fieldsWithType;\n}\nexport function getFieldDistribution(dataSource, field) {\n let members = memberCount(dataSource, field);\n // members.sort((a, b) => a[1] - b[1]);\n return members.map(m => {\n return { memberName: m[0], count: m[1] };\n });\n}\nexport function getAllFieldsDistribution(dataSource, fields) {\n let fieldsDistribution = [];\n for (let field of fields) {\n fieldsDistribution.push({\n fieldName: field,\n distribution: getFieldDistribution(dataSource, field)\n });\n }\n return fieldsDistribution;\n}\nexport function getFieldEntropy(dataSource, field) {\n const members = memberCount(dataSource, field);\n const frequencyList = members.map(m => m[1]);\n const probabilityList = normalize(frequencyList);\n const fieldEntropy = entropy(probabilityList);\n const maxEntropy = Math.log2(members.length);\n return {\n fieldName: field,\n entropy: fieldEntropy,\n maxEntropy\n };\n}\nexport function getFloatFieldEntropy(dataSource, field) {\n let _max = -Infinity;\n let _min = Infinity;\n for (let i = 0; i < dataSource.length; i++) {\n _max = Math.max(_max, dataSource[i][field]);\n _min = Math.min(_min, dataSource[i][field]);\n }\n const rangeStep = (_max - _min) / BIN_NUM_FOR_ANALYTIC;\n const rangeCounts = new Array(BIN_NUM_FOR_ANALYTIC + 1).fill(0);\n for (let i = 0; i < dataSource.length; i++) {\n const value = dataSource[i][field];\n const valueIndex = Math.floor((value - _min) / rangeStep);\n rangeCounts[valueIndex]++;\n }\n rangeCounts[BIN_NUM_FOR_ANALYTIC - 1] += rangeCounts[BIN_NUM_FOR_ANALYTIC];\n const pl = normalize(rangeCounts.slice(0, BIN_NUM_FOR_ANALYTIC));\n const fieldEntropy = entropy(pl);\n const maxEntropy = Math.log2(BIN_NUM_FOR_ANALYTIC);\n return {\n fieldName: field,\n entropy: fieldEntropy,\n maxEntropy\n };\n}\nexport function getAllFieldsEntropy(dataSource, fields) {\n let fieldEntropyList = [];\n for (let field of fields) {\n fieldEntropyList.push(getFieldEntropy(dataSource, field));\n }\n return fieldEntropyList;\n}\nexport function groupFields(dataSource, fields) {\n let groupedData = deepcopy(dataSource);\n let newFields = [];\n for (let field of fields) {\n let newFieldName = `${field.name}(group)`;\n if (field.type === 'quantitative' && memberCount(dataSource, field.name).length > MIN_QUAN_MEMBER_SIZE * 2) {\n if (!isUniformDistribution(dataSource, field.name)) {\n groupedData = groupContinousField({\n dataSource: groupedData,\n field: field.name,\n newField: newFieldName,\n groupNumber: 8\n });\n newFields.push({\n name: newFieldName,\n type: 'ordinal'\n });\n }\n }\n else if ((field.type === 'ordinal' || field.type === 'nominal') && memberCount(dataSource, field.name).length > MIN_QUAN_MEMBER_SIZE) {\n if (!isUniformDistribution(dataSource, field.name)) {\n groupedData = groupCategoryField({\n dataSource: groupedData,\n field: field.name,\n newField: newFieldName,\n groupNumber: 8\n });\n newFields.push({\n name: newFieldName,\n type: field.type\n });\n }\n }\n }\n return {\n groupedData,\n fields,\n newFields\n };\n}\n","import { getFieldEntropy, getFieldType, getFloatFieldEntropy } from '../../univariateSummary';\nimport { BIN_NUM_FOR_ANALYTIC } from '../../constant';\nconst TESTS = {\n boolean(x) {\n return x === 'true' || x === 'false' || x === true || x === false;\n },\n integer(x) {\n return TESTS.number(x) && (x = +x) === ~~x;\n },\n number(x) {\n return !isNaN(+x);\n },\n date(x) {\n return !isNaN(Date.parse(x));\n },\n};\nfunction isValid(obj) {\n return obj != null && obj === obj;\n}\nexport function inferDataType(values) {\n // types to test for, in precedence order\n const types = ['boolean', 'integer', 'number', 'date'];\n for (let value of values) {\n // test value against remaining types\n for (let j = 0; j < types.length; ++j) {\n if (isValid(value) && !TESTS[types[j]](value)) {\n types.splice(j, 1);\n j -= 1;\n }\n }\n // if no types left, return 'string'\n if (types.length === 0)\n return 'string';\n }\n return types[0];\n}\n// 实现约束:必须保证fieldKeys与fields的顺序相同。engine依赖了这样的顺序,否则会产生逻辑错误。\nexport function getFieldsSummary(fieldKeys, dataSource) {\n const fields = [];\n const dictonary = new Map();\n for (let f of fieldKeys) {\n const valueMap = new Map();\n dataSource.forEach(row => {\n if (!valueMap.has(row[f])) {\n valueMap.set(row[f], 0);\n }\n valueMap.set(row[f], valueMap.get(row[f]) + 1);\n });\n const dataType = inferDataType([...valueMap.keys()]);\n const semanticType = getFieldType(dataSource, f);\n let maxEntropy = Math.log2(valueMap.size);\n let entropy = maxEntropy;\n let analyticType = 'dimension';\n let useFloatEntropy = false;\n if ((dataType === 'integer' || dataType === 'number') && semanticType !== 'ordinal') {\n analyticType = 'measure';\n if (valueMap.size > BIN_NUM_FOR_ANALYTIC) {\n let info = getFloatFieldEntropy(dataSource, f);\n entropy = info.entropy;\n maxEntropy = info.maxEntropy;\n useFloatEntropy = true;\n }\n }\n if (!useFloatEntropy) {\n let info = getFieldEntropy(dataSource, f);\n entropy = info.entropy;\n maxEntropy = info.maxEntropy;\n }\n let field = {\n key: f,\n analyticType,\n semanticType,\n dataType,\n features: {\n unique: valueMap.size,\n size: dataSource.length,\n entropy,\n maxEntropy\n }\n };\n fields.push(field);\n dictonary.set(field.key, field);\n }\n return {\n fields,\n dictonary\n };\n}\n","import { crammersV, pearsonCC } from \"../../statistics\";\nimport { getDimClusterGroups, getMeaSetsBasedOnClusterGroups } from \"../subspaces\";\nimport { CrammersVThreshold, PearsonCorrelation } from \"../config\";\nexport class DataGraph {\n constructor(dimensions, measures) {\n this.DIMENSION_CORRELATION_THRESHOLD = CrammersVThreshold;\n this.MEASURE_CORRELATION_THRESHOLD = PearsonCorrelation.strong;\n this.dimensions = dimensions;\n this.measures = measures;\n // this.computeDGraph(dataSource);\n // this.computeMGraph(dataSource);\n }\n computeGraph(dataSource, fields, cc) {\n let matrix = fields.map((f) => fields.map(() => 0));\n for (let i = 0; i < fields.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < fields.length; j++) {\n matrix[i][j] = matrix[j][i] = cc(dataSource, fields[i], fields[j]);\n }\n }\n return matrix;\n }\n computeDGraph(dataSource, cc = crammersV) {\n this.DG = this.computeGraph(dataSource, this.dimensions, cc);\n return this.DG;\n }\n computeMGraph(dataSource, cc = pearsonCC) {\n this.MG = this.computeGraph(dataSource, this.measures, cc);\n return this.MG;\n }\n clusterDGraph(dataSource, CORRELATION_THRESHOLD) {\n const { dimensions, DIMENSION_CORRELATION_THRESHOLD } = this;\n this.DClusters = getDimClusterGroups(dataSource, dimensions, CORRELATION_THRESHOLD || DIMENSION_CORRELATION_THRESHOLD);\n return this.DClusters;\n }\n clusterMGraph(dataSource, CORRELATION_THRESHOLD) {\n const { measures, MEASURE_CORRELATION_THRESHOLD } = this;\n this.MClusters = getMeaSetsBasedOnClusterGroups(dataSource, measures, CORRELATION_THRESHOLD || MEASURE_CORRELATION_THRESHOLD);\n return this.MClusters;\n }\n}\n","import { getAggHashKey, groupBy, stdAggregate, stdAggregateFromCuboid } from \"../statistics\";\nimport { dist } from \"../statistics/aggregators\";\nconst DEFAULT_OPS = ['max', 'min', 'sum', 'mean', 'count', 'dist'];\nexport class Cuboid {\n constructor(props) {\n const { dimensions, measures, ops = DEFAULT_OPS, ranges } = props;\n this.dimensions = dimensions;\n this.measures = measures;\n this.ops = ops;\n this.state = [];\n this.ranges = ranges;\n }\n setState(state) {\n this.state = state;\n }\n setData(dataSource) {\n this.state = stdAggregate({\n dimensions: this.dimensions,\n measures: this.measures,\n ops: this.ops,\n dataSource\n });\n const { state, dimensions, measures, ranges } = this;\n const groups = groupBy(dataSource, dimensions);\n for (let row of state) {\n const hashKey = getAggHashKey(dimensions.map(d => row.groupDict[d]));\n const groupValues = groups.get(hashKey);\n for (let mea of measures) {\n const range = ranges.get(mea);\n row.stat[mea]['dist'] = dist(groupValues.map(v => v[mea]), range);\n }\n }\n return this.state;\n }\n computeFromCuboid(cuboid) {\n const { ops, measures, dimensions } = this;\n this.state = stdAggregateFromCuboid({\n dimensions,\n measures,\n ops,\n cuboidState: cuboid.getRawState()\n });\n return this.state;\n }\n get size() {\n return this.state.length;\n }\n getAggregatedRows(measures, operatorOfMeasures) {\n let data = [];\n const { state, dimensions } = this;\n for (let row of state) {\n let newRow = {};\n for (let dim of dimensions) {\n newRow[dim] = row.groupDict[dim];\n }\n for (let i = 0; i < measures.length; i++) {\n const mea = measures[i];\n const op = operatorOfMeasures[i];\n newRow[mea] = row.stat[mea][op];\n }\n data.push(newRow);\n }\n return data;\n }\n getRawState() {\n return this.state;\n }\n}\n","// import { DataSource, Record} from \"../commonTypes\";\n// import { Cuboid } from \"./cuboid\";\nimport { getRangeBy } from \"../statistics\";\nimport { Cuboid } from \"./cuboid\";\n// interface QueryNode {\n// dimCode: string;\n// dimValue: string\n// }\n// export type QueryPath = QueryNode[];\n// interface CuboidNode extends Map<string, CuboidNode | Record> {}\n// function contains (arr1: any[], arr2: any[]): boolean {\n// if (arr1.length < arr2.length) return false;\n// let sets = new Set(arr1);\n// for (let ele of arr2) {\n// if (!sets.has(ele)) {\n// return false;\n// }\n// }\n// return true;\n// }\n// // todo query path support array\n// export class Cube {\n// private computeCuboid: (\n// path: QueryPath,\n// measures: string[]\n// ) => Promise<DataSource>;\n// private cuboids: Map<string, Cuboid>;\n// private inferableDistance: number;\n// public readonly holistic: boolean;\n// constructor(props: {\n// computeCuboid: (path: QueryPath, measures: string[]) => Promise<DataSource>;\n// inferableDistance?: number;\n// holistic?\n// }) {\n// this.computeCuboid = props.computeCuboid;\n// this.cuboids = new Map();\n// this.inferableDistance = props.inferableDistance ? props.inferableDistance : Infinity;\n// this.holistic = props.holistic || false;\n// }\n// /**\n// * check whether the cuboid made of given dimensions can be infered by current diemnsions.\n// * @param dimensions \n// */\n// private isCuboidInferable (dimensions: string[]): Cuboid | null {\n// for (let cuboid of this.cuboids.values()) {\n// let distance = cuboid.dimensions.length - dimensions.length;\n// if (distance < this.inferableDistance && contains(cuboid.dimensions, dimensions)) {\n// return cuboid;\n// }\n// }\n// return null;\n// }\n// private getClosestCuboid (dimensions: string[]): Cuboid | null {\n// let minDis = Infinity;\n// let targetCuboid: Cuboid | null = null;\n// for (let cuboid of this.cuboids.values()) {\n// let distance = cuboid.dimensions.length - dimensions.length;\n// if (distance < this.inferableDistance && contains(cuboid.dimensions, dimensions)) {\n// if (distance < minDis) {\n// minDis = distance;\n// targetCuboid = cuboid;\n// }\n// }\n// }\n// return targetCuboid;\n// }\n// public async getCuboid(\n// dimSet: string[],\n// measures: string[]\n// ): Promise<Cuboid> {\n// const key = dimSet.join(\";\");\n// if (this.holistic) {\n// if (this.cuboids.has(key)) {\n// return this.cuboids.get(key);\n// }\n// } else {\n// let inferedCuboid = this.isCuboidInferable(dimSet);\n// if (inferedCuboid) {\n// return inferedCuboid;\n// }\n// }\n// const path: QueryPath = dimSet.map((d) => {\n// return {\n// dimCode: d,\n// dimValue: \"*\",\n// };\n// });\n// const cuboidDataSource = await this.computeCuboid(path, measures);\n// const cuboid = new Cuboid({\n// dimensions: dimSet,\n// dataSource: cuboidDataSource,\n// });\n// this.cuboids.set(key, cuboid);\n// return cuboid;\n// }\n// }\n// // todo\n// // 至少返回的因该是一个DataFrame,而不应该是当前cuboid粒度的明细。\n// // case: 第一个请求的cuboid是明细粒度,则\nconst CUBOID_KEY_SPLITOR = '_join_';\nconst DEFAULT_OPS = [\"max\", \"min\", \"sum\", \"mean\", \"count\", 'dist'];\nexport class Cube {\n constructor(props) {\n const { dimensions, measures, dataSource, ops = DEFAULT_OPS } = props;\n this.dimensions = dimensions;\n this.measures = measures;\n this.dataSource = dataSource;\n this.ops = ops;\n this.dimOrder = new Map();\n dimensions.forEach((dim, i) => {\n this.dimOrder.set(dim, i);\n });\n this.cuboids = new Map();\n this.ranges = new Map();\n }\n // public contains(dimensions: string[]): boolean {\n // if (dimensions.length > )\n // }\n sortDimension(dimensions) {\n const orderedDims = [...dimensions];\n orderedDims.sort((d1, d2) => {\n return this.dimOrder.get(d1) - this.dimOrder.get(d2);\n });\n return orderedDims;\n }\n getCuboid(dimensions) {\n const orderedDims = this.sortDimension(dimensions);\n const dimKey = orderedDims.join(CUBOID_KEY_SPLITOR);\n // this.cuboids.get(dimKey)\n if (this.cuboids.has(dimKey)) {\n return this.cuboids.get(dimKey);\n }\n // does not get cuboid\n let currDimSet = new Set(dimensions);\n const existingParentKeys = [];\n const nullParentKeys = [];\n for (let dim of this.dimensions) {\n if (!currDimSet.has(dim)) {\n // use insert O(n) instead of sort O(nlogn)\n const parentDimensions = this.sortDimension([...orderedDims, dim]);\n const parentKey = parentDimensions.join(CUBOID_KEY_SPLITOR);\n if (this.cuboids.has(parentKey))\n existingParentKeys.push(parentKey);\n else {\n nullParentKeys.push(parentKey);\n }\n }\n }\n let minCost = Infinity;\n let minCuboidKey = this.dimensions.join(CUBOID_KEY_SPLITOR);\n if (existingParentKeys.length > 0) {\n for (let key of existingParentKeys) {\n const pCuboid = this.cuboids.get(key);\n if (pCuboid.size < minCost) {\n minCost = pCuboid.size;\n minCuboidKey = key;\n }\n }\n }\n else if (nullParentKeys.length > 0) {\n minCuboidKey = nullParentKeys[0];\n }\n const parentCuboid = this.getCuboid(minCuboidKey.split(CUBOID_KEY_SPLITOR));\n // console.log('based on parents cube: ', minCuboidKey)\n // todo: 递归构建相关的cuboid,可能要依赖field dict来判断递归的路径\n let cuboid = new Cuboid({\n dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n // cuboid.setData(parentCuboid.state);\n cuboid.computeFromCuboid(parentCuboid);\n this.cuboids.set(dimKey, cuboid);\n return cuboid;\n }\n computeRanges() {\n const { measures, dataSource } = this;\n for (let mea of measures) {\n this.ranges.set(mea, getRangeBy(dataSource, mea));\n }\n }\n buildCuboidOnCluster(dimensions) {\n let clusterCuboid = new Cuboid({\n dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n const baseCuboid = this.cuboids.get(this.dimensions.join(CUBOID_KEY_SPLITOR));\n // clusterCuboid.setData(this.dataSource)\n clusterCuboid.computeFromCuboid(baseCuboid);\n this.cuboids.set(dimensions.join(CUBOID_KEY_SPLITOR), clusterCuboid);\n }\n buildBaseCuboid() {\n this.computeRanges();\n let baseCuboid = new Cuboid({\n dimensions: this.dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n baseCuboid.setData(this.dataSource);\n this.cuboids.set(this.dimensions.join(CUBOID_KEY_SPLITOR), baseCuboid);\n return baseCuboid;\n }\n loadCuboid(cuboidKey, cuboidState) {\n const cuboid = new Cuboid({\n dimensions: cuboidKey.split(CUBOID_KEY_SPLITOR),\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n cuboid.setState(cuboidState);\n this.cuboids.set(cuboidKey, cuboid);\n }\n exportCuboids() {\n const cbs = {};\n for (let [ck, cb] of this.cuboids) {\n cbs[ck] = cb.getRawState();\n }\n return cbs;\n }\n get baseCuboid() {\n const baseKey = this.dimensions.join(CUBOID_KEY_SPLITOR);\n if (!this.cuboids.has(baseKey)) {\n return this.buildBaseCuboid();\n }\n return this.cuboids.get(baseKey);\n }\n}\n","import { Outier } from \"../../ml\";\nexport const IForestOutlierWorker = async (aggData, dimensions, measures) => {\n let iForest = new Outier.IsolationForest([], measures, aggData);\n iForest.buildIsolationForest();\n let scoreList = iForest.estimateOutierScore();\n let maxIndex = 0;\n let score = 0;\n for (let i = 0; i < scoreList.length; i++) {\n if (scoreList[i] > score) {\n score = scoreList[i];\n maxIndex = i;\n }\n }\n let des = {};\n dimensions.concat(measures).forEach((mea) => {\n des[mea] = aggData[maxIndex][mea];\n });\n return {\n dimensions,\n measures,\n significance: score,\n description: des,\n };\n};\n","import { oneDLinearRegression } from '../../statistics/index';\nexport const LRTrendWorker = async (aggData, dimensions, measures) => {\n if (dimensions.length !== 1)\n return null;\n let orderedData = [...aggData];\n orderedData.sort((a, b) => {\n if (a[dimensions[0]] > b[dimensions[0]])\n return 1;\n if (a[dimensions[0]] === b[dimensions[0]])\n return 0;\n else\n return -1;\n });\n let sig = 0;\n for (let mea of measures) {\n let linearModel = new oneDLinearRegression(orderedData, dimensions[0], mea);\n linearModel.normalizeDimensions(dimensions);\n sig += linearModel.significance();\n }\n sig /= measures.length;\n return {\n dimensions,\n measures,\n significance: sig\n };\n};\n","import { IForestOutlierWorker } from '../workers/IForestOutlier';\nimport { LRTrendWorker } from '../workers/LRTrend';\nexport var DefaultIWorker;\n(function (DefaultIWorker) {\n DefaultIWorker[\"outlier\"] = \"default_outlier\";\n // cluster = 'default_group',\n DefaultIWorker[\"trend\"] = \"default_trend\";\n})(DefaultIWorker || (DefaultIWorker = {}));\n/**\n * collection of insight workers. it helps to manage all the workers in a centralized way.\n */\nexport class InsightWorkerCollection {\n constructor() {\n this.workers = new Map();\n }\n register(name, iWorker) {\n if (this.workers.has(name)) {\n throw new Error(`There has been a worker named: ${name} already.`);\n }\n else {\n this.workers.set(name, [true, iWorker]);\n }\n }\n /**\n * set a existed worker's status.\n * @param name insight worker's name used for register.\n * @param status whether the worker should be used.\n */\n enable(name, status) {\n if (!this.workers.has(name)) {\n throw new Error(`Intention Worker \"${name}\" does not exist.`);\n }\n else {\n let iWorkerWithStatus = this.workers.get(name);\n iWorkerWithStatus[0] = status;\n this.workers.set(name, iWorkerWithStatus);\n }\n }\n /**\n * enumerate all enabled insight workers.\n * @param func (what is going to be done with the given worker)\n */\n each(func) {\n for (let [name, iWorker] of this.workers) {\n if (iWorker[0]) {\n func(iWorker[1], name);\n }\n }\n }\n static init(props = { withDefaultIWorkers: true }) {\n const { withDefaultIWorkers = true } = props;\n if (!InsightWorkerCollection.colletion) {\n InsightWorkerCollection.colletion = new InsightWorkerCollection();\n if (withDefaultIWorkers) {\n InsightWorkerCollection.colletion.register(DefaultIWorker.outlier, IForestOutlierWorker);\n // InsightWorkerCollection.colletion.register(DefaultIWorker.cluster, KNNClusterWorker)\n InsightWorkerCollection.colletion.register(DefaultIWorker.trend, LRTrendWorker);\n }\n }\n Object.values(DefaultIWorker).forEach(workerName => {\n InsightWorkerCollection.colletion.enable(workerName, withDefaultIWorkers);\n });\n return InsightWorkerCollection.colletion;\n }\n}\n","export const geomTypes = {\n interval: [0, 10],\n line: [11, Infinity],\n area: [11, Infinity],\n point: [0, 1000],\n path: [0, 100],\n density: [1001, Infinity],\n};\nfunction getVisualElements() {\n return {\n position: 2,\n color: 1,\n size: 1,\n shape: 1,\n opacity: 1,\n facets: 2,\n page: 1,\n filter: 1,\n highFacets: 1000\n };\n}\nfunction findBestField(type, fieldRankList) {\n for (let i = fieldRankList.length - 1; i >= 0; i--) {\n if (fieldRankList[i].semanticType === type && !fieldRankList[i].choosen) {\n return fieldRankList[i];\n }\n }\n return false;\n}\nexport function encoding(fields) {\n let spec = {};\n let visualElements = getVisualElements();\n let fieldRankList = fields.map((field) => {\n return {\n ...field,\n choosen: false,\n };\n });\n const priority = [\n [\"quantitative\", [\"position\", \"size\", \"color\", \"opacity\", \"highFacets\", \"filter\"]],\n [\"temporal\", [\"position\", \"size\", \"opacity\", \"filter\"]],\n [\"ordinal\", [\"position\", \"color\", \"opacity\", \"facets\", \"size\", \"filter\", \"highFacets\"]],\n [\"nominal\", [\"position\", \"color\", \"facets\", \"shape\", \"filter\", \"hightFacets\"]],\n ];\n let fieldLeft = fieldRankList.length;\n for (let typeIndex = 0; typeIndex < priority.length && fieldLeft > 0; typeIndex++) {\n let type = priority[typeIndex][0];\n let channelList = priority[typeIndex][1];\n for (let i = 0; i < channelList.length && fieldLeft > 0; i++) {\n let channel = channelList[i];\n let field;\n while (visualElements[channel] > 0 && (field = findBestField(type, fieldRankList))) {\n if (typeof spec[channel] === \"undefined\") {\n spec[channel] = [];\n }\n spec[channel].push(field.key);\n visualElements[channel]--;\n fieldLeft--;\n field.choosen = true;\n }\n }\n }\n return spec;\n}\nexport function specification(fields, dataView) {\n let rankedFields = fields.sort((a, b) => a.impurity - b.impurity);\n let spec = encoding(rankedFields);\n const dimensions = new Set(fields.filter(f => f.analyticType === 'dimension').map(f => f.key));\n const measures = new Set(fields.filter(f => f.analyticType === 'measure').map(f => f.key));\n // todo: design a better rule for choosing geom type.\n if (spec.position && spec.position.length === 2) {\n if ((dimensions.has(spec.position[0]) && measures.has(spec.position[1])) ||\n (dimensions.has(spec.position[1]) && measures.has(spec.position[0]))) {\n const dimIndex = dimensions.has(spec.position[0]) ? 0 : 1;\n const dim = spec.position[dimIndex];\n const mea = spec.position[(dimIndex + 1) % 2];\n spec.position = [dim, mea];\n const originDimField = fields.find((f) => f.key === dim);\n const dimCardinality = originDimField ? originDimField.features.unique : 0;\n spec.geomType = [\"interval\", \"line\", \"area\"].filter((geom) => {\n return dimCardinality >= geomTypes[geom][0] && dimCardinality <= geomTypes[geom][1];\n });\n if (originDimField.semanticType === 'nominal') {\n spec.geomType = [\"interval\"];\n }\n }\n else {\n // ['point', 'path', 'heatmap']\n spec.geomType = [\"point\", \"density\"].filter((geom) => {\n return dataView.length >= geomTypes[geom][0] && dataView.length <= geomTypes[geom][1];\n });\n }\n }\n else {\n spec.geomType = [\"point\"];\n }\n return { schema: spec, dataView };\n}\n","const FULL_FIELD_USE_THRESHOLD = 25;\nconst PARTS_FIELD_THRESHOLD = 500;\nconst fixOmiga = Math.round((100 - FULL_FIELD_USE_THRESHOLD) ** 2 / PARTS_FIELD_THRESHOLD);\nexport function autoFieldSelect(_fields) {\n const x = _fields.length;\n const fields = [..._fields];\n fields.sort((fa, fb) => fa.features.entropy - fb.features.entropy);\n if (x < FULL_FIELD_USE_THRESHOLD)\n return fields;\n if (x < PARTS_FIELD_THRESHOLD) {\n return fields.slice(0, Math.round(Math.sqrt(fixOmiga * (x - FULL_FIELD_USE_THRESHOLD)) + FULL_FIELD_USE_THRESHOLD));\n }\n else {\n return fields.slice(0, 100);\n }\n}\nexport function fieldSelectByPercent(_fields, percent) {\n const x = _fields.length;\n const fields = [..._fields];\n fields.sort((fa, fb) => fa.features.entropy - fb.features.entropy);\n return fields.slice(0, Math.round(x * percent));\n}\n","const BIN_SIZE = 8;\nexport function entropyAcc(fl) {\n let total = 0;\n for (let i = 0; i < fl.length; i++) {\n total += fl[i];\n }\n let tLog = Math.log2(total);\n let ent = 0;\n for (let i = 0; i < fl.length; i++) {\n ent = ent + fl[i] * (Math.log2(fl[i]) - tLog) / total;\n }\n return -ent;\n}\nexport function meaImp(dataSource, mea, minValue, maxValue) {\n // const _min = typeof minValue !== 'undefined' ? minValue : Math.min(...dataSource.map(d => d[mea]));\n // const _max = typeof maxValue !== 'undefined' ? maxValue : Math.max(...dataSource.map(d => d[mea]));\n const _min = minValue;\n const _max = maxValue;\n const step = (_max - _min) / BIN_SIZE;\n let dist = new Array(BIN_SIZE + 1).fill(0);\n for (let record of dataSource) {\n let vIndex = Math.floor((record[mea] - _min) / step);\n dist[vIndex]++;\n }\n dist[BIN_SIZE - 1] += dist[BIN_SIZE];\n // const pl = normalize(dist.filter(d => d > 0));\n const ent = entropyAcc(dist.slice(0, BIN_SIZE).filter(d => d > 0));\n return ent;\n}\nexport function viewStrength(dataSource, dimensions, measures) {\n const groups = new Map();\n for (let record of dataSource) {\n const _key = dimensions.map(d => record[d]).join('_');\n if (!groups.has(_key)) {\n groups.set(_key, []);\n }\n groups.get(_key)?.push(record);\n }\n let totalEntLoss = 0;\n for (let mea of measures) {\n const _min = Math.min(...dataSource.map(d => d[mea]));\n const _max = Math.max(...dataSource.map(d => d[mea]));\n ;\n const ent = meaImp(dataSource, mea, _min, _max);\n // conditional ent\n let condEnt = 0;\n let logs = [];\n const entries = [...groups.entries()];\n entries.sort((a, b) => b[1].length - a[1].length);\n for (let i = 0; i < entries.length; i++) {\n if (i >= BIN_SIZE - 1)\n break;\n const groupRows = entries[i][1];\n let groupProb = groupRows.length / dataSource.length;\n const subEnt = meaImp(groupRows, mea, _min, _max);\n condEnt += groupProb * subEnt;\n logs.push([groupProb, subEnt]);\n }\n let noiseGroup = [];\n for (let i = BIN_SIZE - 1; i < entries.length; i++) {\n noiseGroup.push(...entries[i][1]);\n }\n if (noiseGroup.length > 0) {\n let groupProb = noiseGroup.length / dataSource.length;\n const subEnt = meaImp(noiseGroup, mea, _min, _max);\n condEnt += groupProb * subEnt;\n }\n // for (let [groupKey, groupRows] of groups.entries()) {\n // let groupProb = groupRows.length / dataSource.length;\n // const subEnt = meaImp(groupRows, mea, _min, _max);\n // condEnt += groupProb * subEnt;\n // logs.push([groupProb, subEnt])\n // }\n // console.log(logs)\n // console.log('H(X), H(X|Y)]]]]]]', ent, condEnt)\n totalEntLoss += noiseGroup.length > 0 ? (ent - condEnt) / Math.log2(BIN_SIZE) : (ent - condEnt) / Math.log2(groups.size);\n }\n // const groupFL: number[] = [];\n // for (let rows of groups.values()) {\n // groupFL.push(rows.length);\n // }\n // totalEntLoss = totalEntLoss / Math.log2(groups.size)//groups.size;\n // console.log({ dimensions, measures, score: totalEntLoss / measures.length, totalEntLoss })\n return totalEntLoss / measures.length;\n}\n","import { getFieldsSummary } from \"./fieldSummary\";\nimport { DataGraph } from \"./dataGraph\";\nimport { Cube } from \"../../cube\";\nimport { getCombination, normalize, mapPositive, entropy } from \"../../statistics\";\nimport { InsightWorkerCollection } from \"./workerCollection\";\nimport { specification } from './specification/encoding';\nimport { copyData } from \"../../utils\";\nimport { autoFieldSelect, fieldSelectByPercent } from \"./select\";\nimport { DEFAULT_BIN_NUM, DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP, PERCENT_THRESHOLD_AS_UNIQUE_INDEX, VERSION } from \"../../constant\";\nimport { viewStrength, entropyAcc } from \"./patterns/general\";\n// import { SQLInterface } from \"../../SQLInterface\";\nconst MIN_QUAN_MEMBER_SIZE = 50;\nexport class VIEngine {\n constructor() {\n // public cookedDimensions: string[];\n // public cookedMeasures: string[];\n // public cookedFields: IFieldSummary[];\n // protected cookedFieldDictonary: FieldDictonary;\n // private _fieldKeys: string[];\n this._dimensions = [];\n this._measures = [];\n /**\n * number of dimensions appears in a view.\n */\n this.DIMENSION_NUM_IN_VIEW = {\n MAX: 3,\n MIN: 1,\n };\n /**\n * number of measures appears in a view.\n */\n this.MEASURE_NUM_IN_VIEW = {\n MAX: 3,\n MIN: 1,\n };\n this.cube = null;\n this.aggregators = [\"max\", \"min\", \"sum\", \"mean\", \"count\", 'dist'];\n this.workerCollection = InsightWorkerCollection.init();\n }\n serialize() {\n const { fields, dataGraph, subSpaces, insightSpaces, dataSource, rawDataSource, cube } = this;\n const storage = {\n version: VERSION,\n fields,\n dataGraph: {\n MClusters: dataGraph.MClusters,\n DClusters: dataGraph.DClusters,\n DG: dataGraph.DG,\n MG: dataGraph.MG\n },\n subSpaces,\n insightSpaces\n };\n const dataStorage = {\n version: VERSION,\n dataSource: {\n raw: rawDataSource,\n view: dataSource\n },\n cuboids: cube.exportCuboids()\n };\n return {\n storage,\n dataStorage\n };\n }\n deSerialize(storage, dataStorage) {\n this.fields = storage.fields;\n // make fields dict\n if (typeof this.fieldDictonary !== 'undefined' && this.fieldDictonary !== null) {\n this.fieldDictonary.clear();\n }\n else {\n this.fieldDictonary = new Map();\n }\n storage.fields.forEach(f => {\n this.fieldDictonary.set(f.key, f);\n });\n const { dimensions, measures } = this;\n this.dataGraph = new DataGraph(dimensions, measures);\n // this.dat\n this.dataGraph.DG = storage.dataGraph.DG;\n this.dataGraph.MG = storage.dataGraph.MG;\n this.dataGraph.DClusters = storage.dataGraph.DClusters;\n this.dataGraph.MClusters = storage.dataGraph.MClusters;\n this.subSpaces = storage.subSpaces;\n this.insightSpaces = storage.insightSpaces;\n if (dataStorage) {\n const { aggregators } = this;\n this.rawDataSource = dataStorage.dataSource.raw;\n this.dataSource = dataStorage.dataSource.view;\n this.cube = new Cube({\n dataSource: dataStorage.dataSource.view,\n dimensions,\n measures,\n ops: aggregators\n });\n Object.keys(dataStorage.cuboids).forEach(cuboidKey => {\n this.cube.loadCuboid(cuboidKey, dataStorage.cuboids[cuboidKey]);\n });\n }\n }\n /**\n * 为了实现简单,这里加一个隐形约束,必须先setData,才能调用setFields\n *\n * @param mutFields\n */\n setFields(mutFields) {\n this._mutFields = mutFields;\n this.dataSource = copyData(this.rawDataSource);\n const fieldKeys = mutFields.map(f => f.key);\n const { fields, dictonary } = getFieldsSummary(fieldKeys, this.dataSource);\n // 用户指定优先,其次取推荐值\n this.rawFields = fields.map((f, i) => {\n const field = {\n ...f\n };\n if (mutFields[i].dataType !== '?')\n field.dataType = mutFields[i].dataType;\n if (mutFields[i].semanticType !== '?')\n field.semanticType = mutFields[i].semanticType;\n if (mutFields[i].analyticType !== '?')\n field.analyticType = mutFields[i].analyticType;\n return field;\n });\n }\n setData(dataSource) {\n this.rawDataSource = dataSource;\n this.dataSource = copyData(dataSource);\n return this;\n }\n get dimensions() {\n // if (this._dimensions.length > 0) return this._dimensions;\n return this.fields.filter(f => f.analyticType === 'dimension').map(f => f.key);\n // return this._dimensions\n }\n get measures() {\n // if (this._measures.length > 0) return this._measures;\n return this.fields.filter(f => f.analyticType === 'measure').map(f => f.key);\n // return this._measures\n }\n buildfieldsSummary() {\n const fieldKeys = this.fields.map(f => f.key);\n const { fields, dictonary } = getFieldsSummary(fieldKeys, this.dataSource);\n this.fields = fields;\n this.fieldDictonary = dictonary;\n return this;\n }\n univarSelection(selectMode = 'auto', percent = 1) {\n const { rawFields, rawDataSource } = this;\n // 1. trans fields\n // 2. filter fields\n const cookedFieldKeys = [];\n const rawIndices = [];\n // const transedMap: Map<string, string> = new Map();\n for (let i = 0; i < rawFields.length; i++) {\n const field = rawFields[i];\n let transedField = field.key;\n if (field.analyticType === 'dimension') {\n if (field.semanticType === 'quantitative' && field.features.unique > MIN_QUAN_MEMBER_SIZE) {\n // ISSUES [2022.03.07] https://ewgw6z7tk0.feishu.cn/wiki/wikcnnTJjRv9W0p1kae8gK8uzUf?app_id=11\n // if (!isUniformDistribution(rawDataSource, field.key)) {\n // const newFieldKey = `${field.key}(group)`;\n // // const newFieldName = `${field.name}(group)`\n // this.dataSource = groupContinousField({\n // dataSource: rawDataSource,\n // field: field.key,\n // newField: newFieldKey,\n // groupNumber: DEFAULT_BIN_NUM\n // })\n // transedField = newFieldKey\n // // transedMap.set(newFieldKey, field.key);\n // } \n }\n else if (field.semanticType === 'nominal') {\n if (field.features.unique > DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP && field.features.unique > rawDataSource.length * PERCENT_THRESHOLD_AS_UNIQUE_INDEX) {\n continue;\n }\n }\n }\n rawIndices.push(i);\n cookedFieldKeys.push(transedField);\n }\n const { fields: cookedFields, dictonary: cookedFieldDictonary } = getFieldsSummary(cookedFieldKeys, this.dataSource);\n cookedFields.forEach((f, i) => {\n const rawIndex = rawIndices[i];\n f.semanticType = rawFields[rawIndex].semanticType;\n f.dataType = rawFields[rawIndex].dataType;\n f.analyticType = rawFields[rawIndex].analyticType;\n });\n this.fields = selectMode === 'auto' ? autoFieldSelect(cookedFields) : fieldSelectByPercent(cookedFields, percent);\n if (this.fields.findIndex(f => f.analyticType === 'dimension') === -1) {\n // 针对维度较差的情况做的补充。\n const dims = cookedFields.filter(f => f.analyticType === 'dimension');\n // if (dims.length === 0) {\n // throw new Error('提供的数据集中没有维度,暂时不支持这种分析类型。')\n // }\n if (dims.length > 0) {\n dims.sort((a, b) => a.features.entropy - b.features.entropy);\n this.fields.push(dims[0]);\n }\n }\n this.fieldDictonary = cookedFieldDictonary;\n }\n buildGraph() {\n this.dataGraph = new DataGraph(this.dimensions, this.measures);\n this.dataGraph.computeDGraph(this.dataSource);\n this.dataGraph.computeMGraph(this.dataSource);\n return this;\n }\n buildCube() {\n const { measures, dataSource, dataGraph, dimensions, aggregators } = this;\n const cube = new Cube({\n dimensions,\n measures,\n dataSource,\n ops: aggregators,\n });\n cube.buildBaseCuboid();\n // dataGraph.DClusters.forEach((group) => {\n // cube.getCuboid(group);\n // });\n dataGraph.DClusters.forEach((group) => {\n cube.buildCuboidOnCluster(group);\n });\n this.cube = cube;\n return this;\n }\n clusterFields() {\n this.dataGraph.clusterDGraph(this.dataSource);\n this.dataGraph.clusterMGraph(this.dataSource);\n return this;\n }\n static getCombinationFromClusterGroups(groups, limitSize) {\n let fieldSets = [];\n for (let group of groups) {\n let combineFieldSet = getCombination(group, limitSize.MIN, limitSize.MAX);\n fieldSets.push(...combineFieldSet);\n }\n return fieldSets;\n }\n buildSubspaces(DIMENSION_NUM_IN_VIEW = this.DIMENSION_NUM_IN_VIEW, MEASURE_NUM_IN_VIEW = this.MEASURE_NUM_IN_VIEW) {\n // todo: design when to compute clusters.\n const dimensionGroups = this.dataGraph.DClusters;\n const measureGroups = this.dataGraph.MClusters;\n // const dimensionSets = VIEngine.getCombinationFromClusterGroups(\n // dimensionGroups,\n // MAX_DIMENSION_NUM_IN_VIEW\n // );\n const measureSets = VIEngine.getCombinationFromClusterGroups(measureGroups, MEASURE_NUM_IN_VIEW);\n // const subspaces = crossGroups(dimensionSets, measureSets);\n const subspaces = [];\n for (let group of dimensionGroups) {\n const dimSets = getCombination(group, DIMENSION_NUM_IN_VIEW.MIN, DIMENSION_NUM_IN_VIEW.MAX);\n for (let dims of dimSets) {\n for (let meas of measureSets) {\n subspaces.push({\n dimensions: dims,\n measures: meas,\n });\n }\n }\n }\n this.subSpaces = subspaces;\n return this;\n }\n static getSpaceImpurity(dataSource, dimensions, measures) {\n let imp = 0;\n for (let mea of measures) {\n let fL = dataSource.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n imp += value;\n }\n imp /= measures.length;\n return imp;\n }\n async exploreViewsPOC(viewSpaces = this.subSpaces) {\n const context = this;\n let ansSpace = [];\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n const imp = viewStrength(context.dataSource, dimensions, measures);\n ansSpace.push({\n impurity: imp,\n significance: 1,\n dimensions,\n measures\n });\n }\n ansSpace.sort((a, b) => (b.impurity || 0) - (a.impurity || 0));\n return ansSpace;\n }\n async exploreViews(viewSpaces = this.subSpaces) {\n const context = this;\n const { measures: globalMeasures, fieldDictonary, dataSource } = context;\n let ansSpace = [];\n const globalDist = context.cube.getCuboid([]).getAggregatedRows(globalMeasures, globalMeasures.map(() => 'dist'));\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n const localDist = context.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'dist'));\n const freqs = context.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'count'));\n let totalEntLoss = 0;\n for (let mea of measures) {\n let ent = 0;\n if (globalDist.length > 0) {\n ent = entropyAcc(globalDist[0][mea].filter(d => d > 0));\n }\n let conEnt = 0;\n const totalCount = fieldDictonary.get(mea).features.size;\n const distList = localDist.map((r, rIndex) => ({\n // TODO: 讨论是否应当直接使用count\n // props: 节省计算量\n // cons: 强依赖于cube必须去计算count\n // freq: r[mea].reduce((total, value) => total + value, 0),\n freq: freqs[rIndex][mea],\n dist: r[mea]\n }));\n distList.sort((a, b) => b.freq - a.freq);\n for (let i = 0; i < distList.length; i++) {\n if (i >= DEFAULT_BIN_NUM - 1)\n break;\n const subEnt1 = entropyAcc(distList[i].dist.filter(d => d > 0));\n conEnt += (distList[i].freq / totalCount) * subEnt1;\n }\n const noiseGroup = new Array(DEFAULT_BIN_NUM).fill(0);\n let noiseFre = 0;\n for (let i = DEFAULT_BIN_NUM - 1; i < distList.length; i++) {\n for (let j = 0; j < noiseGroup.length; j++) {\n noiseGroup[j] += distList[i].dist[j];\n }\n noiseFre += distList[i].freq;\n }\n if (noiseFre > 0) {\n conEnt += (noiseFre / totalCount) * entropyAcc(noiseGroup.filter(d => d > 0));\n }\n totalEntLoss += (ent - conEnt) / Math.log2(Math.min(DEFAULT_BIN_NUM, distList.length));\n }\n totalEntLoss /= measures.length;\n ansSpace.push({\n dimensions,\n measures,\n significance: 1,\n score: totalEntLoss,\n impurity: totalEntLoss\n });\n }\n ansSpace.sort((a, b) => b.impurity - a.impurity);\n return ansSpace;\n }\n searchPointInterests(viewSpace) {\n }\n async insightExtraction(viewSpaces = this.subSpaces) {\n const context = this;\n let ansSpace = [];\n for (let space of viewSpaces) {\n // const t1 = performance.now();\n const { dimensions, measures } = space;\n let cube = context.cube;\n let cuboid = cube.getCuboid(dimensions);\n const aggData = cuboid.getAggregatedRows(measures, measures.map(() => 'sum'));\n // const t2 = performance.now();\n const imp = VIEngine.getSpaceImpurity(aggData, dimensions, measures);\n const jobPool = [];\n this.workerCollection.each((iWorker, name) => {\n // tslint:disable-next-line: no-shadowed-variable\n const job = async (iWorker, name) => {\n try {\n let iSpace = await iWorker(aggData, dimensions, measures, context.fieldDictonary, context);\n if (iSpace !== null) {\n iSpace.type = name;\n iSpace.impurity = imp;\n ansSpace.push(iSpace);\n }\n }\n catch (error) {\n console.error(\"worker failed\", { dimensions, measures, aggData }, error);\n }\n };\n jobPool.push(job(iWorker, name));\n });\n await Promise.all(jobPool);\n // const t3 = performance.now();\n // const per = Math.round(((t3 - t2) / (t3 - t1)) * 100);\n }\n context.insightSpaces = ansSpace;\n this.setInsightScores();\n this.insightSpaces.sort((a, b) => (a.score || 0) - (b.score || 0));\n return this.insightSpaces;\n }\n // todo:\n setInsightScores() {\n const insightSpaces = this.insightSpaces;\n insightSpaces.forEach(space => {\n space.score = space.impurity / space.significance;\n });\n return this;\n }\n getFieldInfoInVis(insightSpace) {\n const fieldsInVis = [];\n const cube = this.cube;\n const fieldDictonary = this.fieldDictonary;\n const { dimensions, measures } = insightSpace;\n dimensions.forEach((dim) => {\n const aggData = cube.getCuboid([dim]).getAggregatedRows(measures, measures.map(() => 'sum'));\n let imp = 0;\n measures.forEach((mea) => {\n let fL = aggData.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n imp += value;\n });\n fieldsInVis.push({\n ...fieldDictonary.get(dim),\n impurity: imp,\n });\n });\n const dAggData = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'sum'));\n measures.forEach((mea) => {\n let fL = dAggData.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n fieldsInVis.push({\n ...fieldDictonary.get(mea),\n impurity: value,\n });\n });\n return fieldsInVis;\n }\n getFieldInfoInVisBeta(insightSpace) {\n const fieldsInVis = [];\n const cube = this.cube;\n const fieldDictonary = this.fieldDictonary;\n const { dimensions, measures } = insightSpace;\n dimensions.forEach((dim) => {\n const fd = fieldDictonary.get(dim);\n fieldsInVis.push({\n ...fd,\n impurity: fd.features.entropy,\n });\n });\n const aggs = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'dist'));\n const freqs = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'count'));\n measures.forEach((mea) => {\n let conEnt = 0;\n const totalCount = fieldDictonary.get(mea).features.size;\n const distList = aggs.map((r, rIndex) => ({\n // TODO: 讨论是否应当直接使用count\n // props: 节省计算量\n // cons: 强依赖于cube必须去计算count\n // freq: r[mea].reduce((total, value) => total + value, 0),\n freq: freqs[rIndex][mea],\n dist: r[mea]\n }));\n distList.sort((a, b) => b.freq - a.freq);\n for (let i = 0; i < distList.length; i++) {\n if (i >= DEFAULT_BIN_NUM - 1)\n break;\n const subEnt1 = entropyAcc(distList[i].dist.filter(d => d > 0));\n conEnt += (distList[i].freq / totalCount) * subEnt1;\n }\n const noiseGroup = new Array(DEFAULT_BIN_NUM).fill(0);\n let noiseFre = 0;\n for (let i = DEFAULT_BIN_NUM - 1; i < distList.length; i++) {\n for (let j = 0; j < noiseGroup.length; j++) {\n noiseGroup[j] += distList[i].dist[j];\n }\n noiseFre += distList[i].freq;\n }\n if (noiseFre > 0) {\n conEnt += (noiseFre / totalCount) * entropyAcc(noiseGroup.filter(d => d > 0));\n }\n const fd = fieldDictonary.get(mea);\n fieldsInVis.push({\n ...fd,\n impurity: conEnt,\n });\n });\n return fieldsInVis;\n }\n specification(insightSpace) {\n const { dimensions, measures } = insightSpace;\n const fieldsInVis = this.getFieldInfoInVisBeta(insightSpace);\n const dataView = this.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'sum'));\n return specification(fieldsInVis, dataView);\n }\n}\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n };\n return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n var transitional = config.transitional || defaults.transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new Cancel('canceled');\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","module.exports = {\n \"version\": \"0.22.0\"\n};","'use strict';\n\nvar VERSION = require('../env/data').version;\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","module.exports = require('./lib/axios');","import * as Utils from './utils/index';\nimport specification from './specification';\nimport * as Distribution from './distribution';\nimport * as Insight from './insights/index';\nimport * as Cleaner from './cleaner/index';\nimport * as UnivariateSummary from './univariateSummary/index';\nimport * as DashBoard from './dashboard/index';\nimport * as Sampling from './sampling/index';\nimport * as Statistics from './statistics/index';\nimport * as Computation from './computation';\nimport { Cluster, Outier, Classification } from './ml/index';\nexport * from './commonTypes';\nexport * from './insights/InsightFlow/interfaces';\nexport { DashBoard, Sampling, Utils, Statistics, UnivariateSummary, Distribution, specification, Cleaner, Insight, Cluster, Outier, Classification, Computation };\nconsole.log('This is a test version of visual-insights');\n","import { IRow } from \"../interfaces\";\n\nexport function normalizeWithParent(\n data: IRow[],\n parentData: IRow[],\n measures: string[],\n syncScale: boolean\n): {\n normalizedData: IRow[];\n normalizedParentData: IRow[];\n} {\n const totalMeasuresOfParent: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n totalMeasuresOfParent[mea] = 0;\n totalMeasures[mea] = 0;\n });\n parentData.forEach((record) => {\n measures.forEach((mea) => {\n totalMeasuresOfParent[mea] += Math.abs(record[mea]);\n });\n });\n data.forEach((record) => {\n measures.forEach((mea) => {\n totalMeasures[mea] += Math.abs(record[mea]);\n });\n });\n const normalizedParentData: IRow[] = [];\n parentData.forEach((record) => {\n const newRecord = { ...record };\n measures.forEach((mea) => {\n newRecord[mea] /= totalMeasuresOfParent[mea];\n });\n normalizedParentData.push(newRecord);\n });\n const normalizedData: IRow[] = [];\n data.forEach((record) => {\n const newRecord = { ...record };\n measures.forEach((mea) => {\n if (syncScale) {\n newRecord[mea] /= totalMeasuresOfParent[mea];\n } else {\n newRecord[mea] /= totalMeasures[mea];\n }\n });\n normalizedData.push(newRecord);\n });\n return {\n normalizedData,\n normalizedParentData,\n };\n}\n\nexport function compareDistribution(\n distribution1: IRow[],\n distribution2: IRow[],\n dimensions: string[],\n measures: string[]\n): number {\n let score = 0;\n let count = 0;\n const tagsForD2: boolean[] = distribution2.map(() => false);\n for (let record of distribution1) {\n let targetRecordIndex = distribution2.findIndex((r, i) => {\n return !tagsForD2[i] && dimensions.every((dim) => r[dim] === record[dim]);\n });\n if (targetRecordIndex > -1) {\n tagsForD2[targetRecordIndex] = true;\n const targetRecord = distribution2[targetRecordIndex];\n for (let mea of measures) {\n score = Math.max(\n score,\n Math.max(targetRecord[mea], record[mea]) / Math.min(targetRecord[mea], record[mea])\n );\n count++;\n }\n } else {\n for (let mea of measures) {\n score = Math.max(score, record[mea]);\n count++;\n }\n }\n }\n for (let i = 0; i < distribution2.length; i++) {\n if (!tagsForD2[i]) {\n tagsForD2[i] = true;\n for (let mea of measures) {\n score = Math.max(score, distribution2[i][mea]);\n count++;\n }\n }\n }\n return score;\n}\n\nexport function normalizeByMeasures(dataSource: IRow[], measures: string[]) {\n let sums: Map<string, number> = new Map();\n\n measures.forEach((mea) => {\n sums.set(mea, 0);\n });\n\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n sums.set(mea, sums.get(mea)! + Math.abs(record[mea]));\n });\n });\n\n const ans: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n norRecord[mea] /= sums.get(mea)!;\n });\n ans.push(norRecord);\n });\n return ans;\n}\n\nexport function getDistributionDifference(\n dataSource: IRow[],\n dimensions: string[],\n measure1: string,\n measure2: string\n): number {\n let score = 0;\n for (let record of dataSource) {\n if (record[measure1] === 0 || record[measure2] === 0) continue;\n score += Math.max(record[measure1], record[measure2]) / Math.min(record[measure1], record[measure2]);\n }\n return score;\n}\n\nexport function makeBinField(dataSource: IRow[], fid: string, binFid: string, binSize: number | undefined = 10) {\n let _min = Infinity;\n let _max = -Infinity;\n for (let i = 0; i < dataSource.length; i++) {\n let val = dataSource[i][fid];\n if (val > _max) _max = val;\n if (val < _min) _min = val;\n }\n const step = (_max - _min) / binSize;\n const beaStep = Math.max(-Math.round(Math.log10(_max - _min)) + 2, 0)\n return dataSource.map((r) => {\n let bIndex = Math.floor((r[fid] - _min) / step);\n if (bIndex === binSize) bIndex = binSize - 1;\n return {\n ...r,\n [binFid]: Number(((bIndex * step + _min)).toFixed(beaStep)),\n };\n });\n}\n\nexport function makeLogField(dataSource: IRow[], fid: string, logFid: string) {\n return dataSource.map((r) => {\n return {\n ...r,\n [logFid]: typeof r[fid] === \"number\" && r[fid] > 0 ? Math.log10(r[fid]) : null,\n };\n });\n}\n","import { IMutField, Insight } from 'visual-insights';\nimport { IRow, IMeasure } from './interfaces';\nimport { checkMajorFactor, filterByPredicates, checkChildOutlier, IPredicate } from './utils';\nimport { normalizeWithParent, compareDistribution, normalizeByMeasures, getDistributionDifference } from './utils/normalization';\nimport { StatFuncName } from 'visual-insights/build/esm/statistics';\nexport interface IExplaination {\n dimensions: string[];\n measures: IMeasure[];\n extendDs: string[];\n extendMs: IMeasure[];\n type: string;\n score: number;\n description: any;\n predicates: IPredicate[];\n}\n\nexport interface IMeasureWithStat extends IMeasure {\n score: number;\n}\nexport class DataExplainer {\n public dataSource: IRow[];\n private engine: Insight.VIEngine;\n private defaultAggs: StatFuncName[] = ['min', 'max', 'sum', 'count', 'mean'];\n constructor (dataSource: IRow[] = []) {\n this.engine = new Insight.VIEngine();\n this.dataSource = dataSource;\n let keys: string[] = [];\n if (dataSource.length > 0) {\n keys = Object.keys(dataSource[0]);\n }\n this.engine.setData(dataSource)\n // .setFieldKeys(keys)\n // .buildfieldsSummary();\n // const newKeys = this.engine.fields.filter(f => f.domain.size < 40).map(f => f.key);\n // this.engine.setFieldKeys(keys);\n // const keys = Object.keys(dataSource[0])\n }\n public setFields(fields: IMutField[]) {\n this.engine.setFields(fields.map(f => ({\n ...f,\n // @ts-ignore\n key: f.key || f.fid\n })));\n this.engine.univarSelection();\n }\n public preAnalysis() {\n console.log('[graphic-walker:preAnalysis]start')\n this.engine.buildGraph();\n this.engine.dataGraph.DIMENSION_CORRELATION_THRESHOLD = 0.6;\n this.engine.dataGraph.MEASURE_CORRELATION_THRESHOLD = 0.8;\n console.log('[graphic-walker:preAnalysis]graph finish')\n this.engine\n .clusterFields();\n console.log('[graphic-walker:preAnalysis]cluster finish')\n this.engine.buildSubspaces({\n MAX: 2,\n MIN: 1\n },\n {\n MAX: 2,\n MIN: 1\n }\n );\n console.log('[graphic-walker:preAnalysis]subspaces finsh. start build-cube')\n this.engine.buildCube();\n console.log('[graphic-walker:preAnalysis]cube finish')\n return this;\n }\n public explain (predicates: IPredicate[], dimensions: string[], measures: IMeasure[], threshold: number = 0.3): IExplaination[] {\n // const predicates = getPredicates(selection, dimensions, measures);\n // 讨论:知道selection,但是分析的维度是什么?\n this.explainConditionalValue(predicates, dimensions, measures);\n const selectAll = dimensions.length === 0 || predicates.length === 0;\n\n const dimSelectionSpaces = selectAll ? [] : this.explainBySelection(\n predicates,\n dimensions,\n measures,\n 10\n );\n const meaSelectionSpaces = selectAll ? [] : this.explainByCorMeasures(\n predicates,\n dimensions,\n measures,\n 10\n );\n const childrenSpaces = this.explainByChildren(\n [],\n dimensions,\n measures,\n 10\n );\n const ansSpaces: IExplaination[] = [];\n dimSelectionSpaces.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'selection_dim_distribution',\n description: space,\n predicates\n });\n });\n meaSelectionSpaces.forEach((space) => {\n ansSpaces.push({\n dimensions: dimensions,\n extendDs: [],\n extendMs: space.measures,\n measures,\n score: space.score,\n type: 'selection_mea_distribution',\n description: space,\n predicates,\n });\n });\n childrenSpaces.majorList.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'children_major_factor',\n description: space,\n predicates\n });\n });\n childrenSpaces.outlierList.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'children_outlier',\n description: space,\n predicates\n });\n });\n return ansSpaces.filter(space => space.score >= threshold);\n }\n\n public explainConditionalValue(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 5) {\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n for (let extendDim of knn) {\n const result = this.explainValue(predicates, [...dimensions, extendDim], measures);\n }\n }\n public explainValue(predicates: IPredicate[], dimensions: string[], measures: IMeasure[]): number[] {\n const measureNames = measures.map(m => m.key);\n const measureOps = measures.map(m => m.op);\n const data = this.engine.cube.getCuboid(dimensions).getAggregatedRows(measureNames, measureOps);\n const selection = filterByPredicates(data, predicates);\n const cmps: number[] = [];\n for (let mea of measureNames) {\n const values = data.map(r => r[mea]);\n values.sort((a, b) => a - b);\n const selectionValues = selection.map(r => r[mea])\n const lowerBoundary: number = values[Math.floor(values.length * 0.15)];\n const higherBoundary: number = values[Math.min(Math.ceil(values.length * 0.85), values.length - 1)];\n if (selectionValues.some(v => v >= higherBoundary)) {\n cmps.push(1);\n } else if (selectionValues.some(v => v <= lowerBoundary)) {\n cmps.push(-1);\n } else {\n cmps.push(0)\n }\n }\n return cmps;\n }\n public explainByChildren(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // 1. find most relative dimensions(topK)\n // 2. for each dimension, we check all the dim member in it. find the member whos distribution is most close to current one.\n // here we do not nomorlize all the dim member's distribution, we use the relative distribution instead.\n // 3. the dim member we found can be used to explain current one as major factor.\n // const predicates: IPredicate[] = selection === 'all' ? [] : getPredicates(selection, dimensions, []);\n const parentCuboid = this.engine.cube.getCuboid(dimensions);\n const measureNames = measures.map(m => m.key);\n const ops = measures.map(m => m.op);\n const parentData = filterByPredicates(parentCuboid.getAggregatedRows(measureNames, ops), predicates);\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n\n const majorList: Array<{key: string; score: number; dimensions: string[]; measures: IMeasure[]}> = [];\n const outlierList: Array<{key: string; score: number; dimensions: string[]; measures: IMeasure[]}> = [];\n for (let extendDim of knn) {\n const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim]);\n const data = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates);\n let groups: Map<any, IRow[]> = new Map();\n for (let record of data) {\n if (!groups.has(record[extendDim])) {\n groups.set(record[extendDim], [])\n }\n groups.get(record[extendDim])?.push(record)\n }\n const { majorKey, majorSum } = checkMajorFactor(parentData, groups, dimensions, measureNames)\n majorList.push({ key: majorKey, score: majorSum, dimensions: [extendDim], measures })\n const { outlierKey, outlierSum } = checkChildOutlier(parentData, groups, dimensions, measureNames);\n outlierList.push({ key: outlierKey, score: outlierSum, dimensions: [extendDim], measures })\n }\n majorList.sort((a, b) => a.score - b.score);\n outlierList.sort((a, b) => b.score - a.score);\n return {\n majorList,\n outlierList\n };\n }\n public explainBySelection(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // const predicates = getPredicates(selection, dimensions, []);\n // const parentCuboid = this.engine.cube.getCuboid()\n const measureNames = measures.map((m) => m.key);\n const ops = measures.map((m) => m.op);\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n const outlierList: Array<{ score: number; dimensions: string[]; measures: IMeasure[] }> = [];\n for (let extendDim of knn) {\n const parentCuboid = this.engine.cube.getCuboid([extendDim])\n const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim])\n const overallData = parentCuboid.getAggregatedRows(measureNames, ops);\n const subData = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates);\n\n let outlierNormalization = normalizeWithParent(subData, overallData, measureNames, false);\n\n let outlierScore = compareDistribution(\n outlierNormalization.normalizedData,\n outlierNormalization.normalizedParentData,\n [extendDim],\n measureNames\n );\n // outlierScore /= (measures.length * 2)\n outlierList.push({\n dimensions: [extendDim],\n measures,\n score: outlierScore\n })\n // compare overall and subdata. set score. (major and outlier)\n }\n outlierList.sort((a, b) => b.score - a.score)\n return outlierList;\n }\n public explainByCorMeasures(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // const predicates = getPredicates(selection, dimensions, []);\n // const parentCuboid = this.engine.cube.getCuboid()\n const measureNames = measures.map((m) => m.key);\n const ops = measures.map((m) => m.op);\n const knn = this.getGeneralizeKNN('measure', measureNames, K_Neighbor);\n const allMeasureNames = [...measureNames, ...knn];\n // const ops: StatFuncName[] = allMeasures.map(() => 'sum');\n const ans: Array<{ score: number; dimensions: string[]; measures: IMeasure[]; max: number; min: number; intMeasures: IMeasureWithStat[] }> = [];\n const cuboid = this.engine.cube.getCuboid(dimensions);\n // const valueExp = this.explainValue(predicates, dimensions, measures); \n for (let op of this.defaultAggs) {\n const extendMeasureOps = knn.map(() => op);\n const normalizedState = normalizeByMeasures(\n cuboid.getAggregatedRows(allMeasureNames, [...ops, ...extendMeasureOps]),\n allMeasureNames\n );\n for (let extendMea of allMeasureNames) {\n const originMeasure = measures.find(m => m.key === extendMea);\n if (originMeasure && originMeasure.op === op) continue;\n const valueExpOfExtendMea = this.explainValue(predicates, dimensions, [{key: extendMea, op}])\n const intMeasures: IMeasureWithStat[] = [];\n for (let i = 0; i < valueExpOfExtendMea.length; i++) {\n if (valueExpOfExtendMea[i] !== 0) {\n intMeasures.push({\n key: extendMea,\n op,\n score: valueExpOfExtendMea[i]\n })\n }\n }\n if (intMeasures.length === 0) continue;\n if (originMeasure) {\n const norStateWithNewOp = normalizeByMeasures(\n cuboid.getAggregatedRows([extendMea], [op]),\n [extendMea]\n )\n const mergedDataSource = normalizedState.map((record, rIndex) => {\n return {\n ...record,\n [`__${extendMea}`]: norStateWithNewOp[rIndex][extendMea]\n }\n })\n let maxDiff = 0;\n let minDiff = 1;\n for (let baseMeasure of measures) {\n let diffScore =\n getDistributionDifference(\n mergedDataSource,\n dimensions,\n baseMeasure.key,\n `__${extendMea}`\n ) / 2;\n maxDiff = Math.max(maxDiff, diffScore);\n minDiff = Math.min(minDiff, diffScore);\n }\n ans.push({\n dimensions,\n score: Math.max(1 - minDiff, maxDiff),\n measures: [{ key: extendMea, op }],\n max: maxDiff,\n min: minDiff,\n intMeasures\n });\n } else {\n let maxDiff = 0;\n let minDiff = 1;\n for (let baseMeasure of measures) {\n let diffScore =\n getDistributionDifference(\n normalizedState,\n dimensions,\n baseMeasure.key,\n extendMea\n ) / 2;\n maxDiff = Math.max(maxDiff, diffScore);\n minDiff = Math.min(minDiff, diffScore);\n }\n ans.push({\n dimensions,\n score: Math.max(1 - minDiff, maxDiff),\n measures: [{ key: extendMea, op }],\n max: maxDiff,\n min: minDiff,\n intMeasures\n });\n }\n // compare overall and subdata. set score. (major and outlier)\n }\n }\n ans.sort((a, b) => b.score - a.score);\n return ans;\n }\n public getGeneralizeKNN(type: 'dimension' | 'measure', fields: string[], K_Neighbor: number = 3, threshold = 0) {\n if (fields.length === 0) return this.getCenterFields(type, K_Neighbor);\n return this.getKNN(type, fields, K_Neighbor, threshold);\n }\n public getKNN(type: 'dimension' | 'measure', fields: string[], K_Neighbor: number = 3, threshold = 0) {\n const adjMatrix = type === 'dimension' ? this.engine.dataGraph.DG : this.engine.dataGraph.MG;\n const graphFields = type === 'dimension' ? this.engine.dataGraph.dimensions : this.engine.dataGraph.measures;\n const fieldIndices = fields.map(field => {\n let index = graphFields.indexOf(field);\n return index;\n });\n const neighbors: Array<{dis: number, index: number, imp: number}> = [];\n for (let fieldIndex of fieldIndices) {\n for (let i = 0; i < adjMatrix[fieldIndex].length; i++) {\n if (!fieldIndices.includes(i)) {\n const dis = Math.abs(adjMatrix[fieldIndex][i]);\n const fieldKey = graphFields[i];\n const tf = this.engine.fields.find(f => f.key === fieldKey);\n if (dis >= threshold) {\n neighbors.push({\n dis,\n index: i,\n imp: tf?.features.unique || Infinity,\n });\n }\n }\n }\n }\n\n neighbors.sort((a, b) => b.dis / b.imp - a.dis / a.imp);\n return neighbors.slice(0, K_Neighbor).map(f => graphFields[f.index]);\n }\n public getCenterFields (type: 'dimension' | 'measure', num: number = 5): string[] {\n const adjMatrix = type === 'dimension' ? this.engine.dataGraph.DG : this.engine.dataGraph.MG;\n const graphFields = type === 'dimension' ? this.engine.dataGraph.dimensions : this.engine.dataGraph.measures;\n let fieldScores: Array<{field: string; score: number}> = adjMatrix.map((row, rIndex) => {\n return {\n field: graphFields[rIndex],\n score: row.reduce((total, current) => total + Math.abs(current), 0)\n }\n })\n fieldScores.sort((a, b) => b.score - a.score)\n return fieldScores.map(f => f.field).slice(0, num);\n }\n public getVisSpec (spaces: IExplaination[]) {\n const engine = this.engine;\n return spaces.map(space => {\n let visSpace: Insight.InsightSpace;\n const measureNames = space.measures.map(m => m.key);\n const extendMsNames = space.extendMs.map(m => m.key);\n if (space.type === 'children_major_factor' || space.type === 'children_outlier') {\n visSpace = {\n dimensions: [...space.extendDs, ...space.dimensions],\n measures: extendMsNames.length > 0 ? extendMsNames : measureNames,\n significance: space.score,\n score: space.score,\n description: space.description,\n };\n } else {\n visSpace = {\n dimensions: space.extendDs.length > 0 ? space.extendDs : space.dimensions,\n measures: extendMsNames.length > 0 ? extendMsNames : measureNames,\n significance: space.score,\n score: space.score,\n description: space.description,\n };\n }\n const allMeasures = [...space.measures, ...space.extendMs];\n return {\n schema: engine.specification(visSpace).schema,\n dataView: engine.cube.getCuboid([...space.dimensions, ...space.extendDs]).getAggregatedRows(allMeasures.map(m => m.key), allMeasures.map(m => m.op))\n };\n })\n }\n}","/* eslint no-restricted-globals: 0 */\n/* eslint-disable */ \n// import { Record, Filters } from '../interfaces';\nimport { getPredicatesFromVegaSignals } from '../utils';\nimport { DataExplainer } from '../insights';\nconst state = {\n de: null\n};\n\nfunction preAnalysis (props) {\n const { fields, dataSource } = props; // as ReqData;\n const de = new DataExplainer(dataSource);\n de.setFields(fields);\n de.preAnalysis();\n state.de = de;\n return true\n}\n\nfunction getFieldsSummary (props) {\n const de = state.de;\n if (de !== null) {\n return de.engine.fields;\n }\n throw new Error('data explainer is not init.')\n}\nfunction getExplaination(props) {\n\n const { filters = {}, currentSpace } = props; // as ReqData;\n const predicates = getPredicatesFromVegaSignals(filters, currentSpace.dimensions, []);\n const de = state.de;\n const ansSpaces = de.explain(predicates, currentSpace.dimensions, currentSpace.measures);\n const visSpaces = de.getVisSpec(ansSpaces);\n const valueExp = de.explainValue(predicates, currentSpace.dimensions, currentSpace.measures);\n const measureStats = [];\n for (let i = 0; i < valueExp.length; i++) {\n if (valueExp[i] !== 0) {\n measureStats.push({\n ...currentSpace.measures[i],\n score: valueExp[i]\n })\n }\n }\n const fields = de.engine.fields;\n return {\n explainations: ansSpaces,\n visSpaces,\n valueExp: measureStats,\n fieldsWithSemanticType: fields.map(f => ({\n key: f.key,\n type: f.semanticType\n }))\n };\n}\n\nfunction main (e) {\n const { type, data } = e.data;\n let res = false;\n try {\n switch (type) {\n case 'getExplaination':\n res = getExplaination(data);\n break;\n case 'preAnalysis':\n res = preAnalysis(data);\n break;\n default:\n throw new Error(`type ${type} is not supported.`);\n }\n self.postMessage(res);\n } catch (error) {\n console.log(error)\n self.postMessage(false)\n }\n}\n\nself.addEventListener('message', main, false);\n"],"names":["_typeof","obj","_classCallCheck","instance","Constructor","_toPrimitive","input","hint","prim","res","_toPropertyKey","arg","key","toPrimitive","_defineProperties","target","props","i","descriptor","toPropertyKey","_createClass","protoProps","staticProps","_assertThisInitialized","self","_setPrototypeOf","o","p","_inherits","subClass","superClass","setPrototypeOf","_possibleConstructorReturn","call","assertThisInitialized","_getPrototypeOf","_defineProperty","value","_arrayWithHoles","arr","_iterableToArray","iter","_arrayLikeToArray","len","arr2","_unsupportedIterableToArray","minLen","arrayLikeToArray","n","_nonIterableRest","_toArray","arrayWithHoles","iterableToArray","unsupportedIterableToArray","nonIterableRest","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread","source","consoleLogger","args","type","Logger","concreteLogger","options","bool","_len","_key","_len2","_key2","_len3","_key3","_len4","_key4","lvl","prefix","debugOnly","moduleName","baseLogger","EventEmitter","events","listener","_this","event","l","cloned","observer","_cloned","defer","rej","promise","resolve","reject","makeString","copy","a","s","m","getLastOfPath","path","Empty","cleanKey","canNotTraverseDeeper","stack","setPath","newValue","_getLastOfPath","k","pushPath","concat","_getLastOfPath2","getPath","_getLastOfPath3","getPathWithDefaults","data","defaultData","deepExtend","overwrite","prop","regexEscape","str","_entityMap","escape","isIE10","chars","looksLikeObjectPath","nsSeparator","keySeparator","possibleChars","c","matched","ki","ownKeys$1","_objectSpread$1","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","Super","result","NewTarget","deepFind","paths","current","j","mix","joinedPath","ResourceStore","_EventEmitter","_super","ns","index","lng","ignoreJSONStructure","resources","deep","pack","v","postProcessor","module","processors","translator","processor","ownKeys$2","_objectSpread$2","_createSuper$1","_isNativeReflectConstruct$1","checkedLoadedFor","Translator","services","resolved","namespaces","wouldCheckForNsInKey","seemsNaturalLanguage","parts","lastKey","_this2","returnDetails","_this$extractFromKey","namespace","appendNamespaceToCIMode","resUsedKey","resExactUsedKey","resType","noObject","joinArrays","handleAsObjectInI18nFormat","handleAsObject","r","resTypeIsArray","newKeyToUse","deepKey","usedDefault","usedKey","needsPluralHandling","hasDefaultValue","defaultValueSuffix","defaultValue","missingKeyNoValueFallbackToKey","resForMissing","updateMissing","fk","lngs","fallbackLngs","send","specificDefaultValue","defaultForMissing","language","suffix","_this3","skipOnVariables","nestBef","nb","na","nestAft","postProcess","postProcessorNames","_this4","found","exactUsedKey","usedLng","usedNS","extracted","needsZeroSuffixLookup","needsContextHandling","codes","code","finalKeys","pluralSuffix","zeroSuffix","contextKey","possibleKey","option","capitalize","string","LanguageUtil","specialCases","part","cleanedLng","lngOnly","supportedLng","fallbacks","fallbackCode","fallbackCodes","addCode","fc","sets","_rulesPluralsTypes","deprecatedJsonVersions","suffixesOrder","createRules","rules","set","PluralResolver","languageUtils","rule","pluralCategory1","pluralCategory2","pluralCategory","number","count","idx","returnSuffix","ownKeys$3","_objectSpread$3","Interpolator","iOpts","regexpStr","regexpUnescapeStr","nestingRegexpStr","match","replaces","regexSafe","val","handleFormat","f","missingInterpolationHandler","todos","todo","matchedVar","temp","safeValue","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","matchedSingleQuotes","matchedDoubleQuotes","e","formatters","doReduce","elem","ownKeys$4","_objectSpread$4","parseFormatStr","formatStr","formatName","formatOptions","optStr","opts","opt","_opt$split","_opt$split2","rest","createCachedFormatter","fn","cache","formatter","Formatter","name","_format","formats","mem","_parseFormatStr","formatted","valOptions","error","ownKeys$5","_objectSpread$5","_createSuper$2","_isNativeReflectConstruct$2","removePending","q","Connector","backend","store","languages","callback","toLoad","pending","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","err","loaded","loadedKeys","fcName","tried","wait","next","_this5","fallbackValue","isUpdate","get","ret","transformOptions","ownKeys$6","_objectSpread$6","_createSuper$3","_isNativeReflectConstruct$3","noop","bindMemberFunctions","inst","mems","I18n","defOpts","createClassOnDemand","ClassOrObject","lu","storeApi","_this2$store","storeApiChained","_this2$store2","deferred","load","finish","t","usedCallback","append","li","lngInLngs","setLngProps","done","setLng","keyPrefix","fixedT","resultKey","_this$translator","_this$translator2","_this6","fallbackLng","lastLng","loadNotPending","loadState","preResult","_this7","preloaded","newLngs","rtlLngs","_this8","mergedOptions","clone","membersToCopy","normalizeRecords","dataSource","measures","maxMeasures","minMeasures","totalMeasures","mea","record","newData","norRecord","checkMajorFactor","childrenData","dimensions","normalizedData","majorSum","majorKey","childData","sum","childRecord","dim","targetValue","checkChildOutlier","outlierSum","outlierKey","normalizedChildData","getPredicatesFromVegaSignals","signals","predicates","filterByPredicates","pre","copyData","isFieldCategory","fieldName","isFieldContinous","TIME_RULES","isFieldTime","memberCount","field","counter","row","member","chiSquared","nestTree","xSet","ySet","rowSums","colSums","totalSum","x","y","node","chis","observed","expected","crammersV","fieldX","fieldY","pearsonCC","xBar","yBar","mapPositive","getCombination","elements","start","end","ans","combine","step","size","normalize","frequencyList","entropy","probabilityList","getRangeBy","by","maxValue","minValue","oneDLinearRegression","X","Y","normalizedRecord","meanX","meanY","beta","alpha","numerator","denominator","SSR","SST","yHat","r_squared","p_value","correction","transition","mean","min","max","EULER","PERCENT_THRESHOLD_AS_UNIQUE_INDEX","DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP","DEFAULT_BIN_NUM","BIN_NUM_FOR_ANALYTIC","VERSION","sumByCol","rows","colKey","opKey","_sum","fixRange","originalRange","dist","values","range","bins","vIndex","distMergeBy","recordBins","SPLITOR","SFMapper","getAggregator","op","groupBy","groups","d","stdAggregate","ops","group","aggs","meaIndex","opFunc","dimValues","dimIndex","getAggHashKey","cuboidStateGroupBy","state","stdAggregateFromCuboid","cuboidState","generalOpNames","generalOps","opName","opIndex","CrammersVThreshold","PearsonCorrelation","turnAdjMatrix2List","matrix","edges","find","parents","union","n1","n2","p1","p2","findWithEffect","sizes","unionWithEffect","size1","size2","kruskal","groupNumber","threshold","b","edge","kruskalWithLimitSize","limitSize","cluster","method","groupMaxSize","meas","linearCongruentialGenerator","seed","uniformSampling","sampleIndexes","IsolationForest","treeNumber","Psi","normalizedSampleData","depth","rand","randField","dimLength","meaLength","randValue","leftSubData","rightSubData","iTree","pathLength","nodeSize","samples","recordScore","avgPathLength","Outier","getDimCorrelationMatrix","getMeaCorrelationMatrix","getDimClusterGroups","max_number_of_group","dimCorrelationMatrix","Cluster.kruskal","getMeaSetsBasedOnClusterGroups","correlation_threshold","correlationMatrix","__read","this","ar","__spread","__values","periodCube_1","Node","aggFunc","_a","params","_i","e_1","children","rawData","children_1","children_1_1","child","e_1_1","search","level","e_2","children_2","children_2_1","_b","childName","e_2_1","periodCube","tree","e_3","children_3","children_3_1","e_3_1","e_4","children_4","children_4_1","e_4_1","e_5","children_5","children_5_1","e_5_1","periodCube$1","momentCube_1","momentCube$1","momentCube","factTable","_c","_d","core","require$$0","require$$1","__assign","transform","tree2Table","cube","table","dfs","_e","aggregation","subset","sums","_loop_1","_loop_2","MEASURES","cnts","_loop_3","__export","exports","index_1","transform_1","aggregation_1","require$$2","operatorMap","aggregate","asFields","operator","createCube","as","DefaultIWorker","MIN_QUAN_MEMBER_SIZE","getFieldType","getFieldEntropy","members","fieldEntropy","maxEntropy","getFloatFieldEntropy","_max","_min","rangeStep","rangeCounts","valueIndex","pl","TESTS","isValid","inferDataType","types","getFieldsSummary","fieldKeys","fields","dictonary","valueMap","dataType","semanticType","analyticType","useFloatEntropy","info","DataGraph","cc","CORRELATION_THRESHOLD","DIMENSION_CORRELATION_THRESHOLD","MEASURE_CORRELATION_THRESHOLD","DEFAULT_OPS","Cuboid","ranges","hashKey","groupValues","cuboid","operatorOfMeasures","newRow","CUBOID_KEY_SPLITOR","Cube","orderedDims","d1","d2","dimKey","currDimSet","existingParentKeys","nullParentKeys","parentKey","minCost","minCuboidKey","pCuboid","parentCuboid","clusterCuboid","baseCuboid","cuboidKey","cbs","ck","cb","baseKey","IForestOutlierWorker","aggData","iForest","scoreList","maxIndex","score","des","LRTrendWorker","orderedData","sig","linearModel","InsightWorkerCollection","iWorker","status","iWorkerWithStatus","func","withDefaultIWorkers","workerName","geomTypes","getVisualElements","findBestField","fieldRankList","encoding","spec","visualElements","priority","fieldLeft","typeIndex","channelList","channel","specification","dataView","rankedFields","originDimField","dimCardinality","geom","FULL_FIELD_USE_THRESHOLD","PARTS_FIELD_THRESHOLD","fixOmiga","autoFieldSelect","_fields","fa","fb","fieldSelectByPercent","percent","BIN_SIZE","entropyAcc","fl","total","tLog","ent","meaImp","viewStrength","totalEntLoss","condEnt","entries","groupRows","groupProb","subEnt","noiseGroup","VIEngine","dataGraph","subSpaces","insightSpaces","rawDataSource","storage","dataStorage","aggregators","mutFields","selectMode","rawFields","cookedFieldKeys","rawIndices","transedField","cookedFields","cookedFieldDictonary","rawIndex","dims","fieldSets","combineFieldSet","DIMENSION_NUM_IN_VIEW","MEASURE_NUM_IN_VIEW","dimensionGroups","measureGroups","measureSets","subspaces","dimSets","imp","fL","pL","viewSpaces","context","ansSpace","space","globalMeasures","fieldDictonary","globalDist","localDist","freqs","conEnt","totalCount","distList","rIndex","subEnt1","noiseFre","viewSpace","jobPool","job","iSpace","insightSpace","fieldsInVis","dAggData","fd","bind","thisArg","toString","isArray","isUndefined","isBuffer","isArrayBuffer","isFormData","isArrayBufferView","isString","isNumber","isObject","isPlainObject","prototype","isDate","isFile","isBlob","isFunction","isStream","isURLSearchParams","trim","isStandardBrowserEnv","forEach","merge","assignValue","extend","stripBOM","content","utils","encode","buildURL","url","paramsSerializer","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","InterceptorManager$1","id","h","InterceptorManager_1","normalizeHeaderName","headers","normalizedName","enhanceError","config","request","response","createError","message","settle","validateStatus","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","ignoreDuplicateOf","parseHeaders","parsed","line","isURLSameOrigin","msie","urlParsingNode","originURL","resolveURL","href","requestURL","Cancel","Cancel_1","require$$3","require$$4","require$$5","require$$6","require$$7","defaults","require$$8","require$$9","xhr","requestData","requestHeaders","responseType","onCanceled","username","password","fullPath","onloadend","responseHeaders","responseData","timeoutErrorMessage","transitional","xsrfValue","cancel","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","getDefaultAdapter","adapter","stringifySafely","rawValue","parser","encoder","silentJSONParsing","forcedJSONParsing","strictJSONParsing","defaults_1","transformData","fns","isCancel","throwIfCancellationRequested","dispatchRequest","reason","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","validators","thing","deprecatedWarnings","validators$1","validator","version","formatMessage","desc","assertOptions","schema","allowUnknown","Axios","instanceConfig","Axios$1","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","Axios_1","CancelToken","executor","resolvePromise","token","onfulfilled","_resolve","CancelToken_1","spread","isAxiosError","payload","createInstance","defaultConfig","axios","promises","require$$10","axiosModule","axiosExports","normalizeWithParent","parentData","syncScale","totalMeasuresOfParent","normalizedParentData","newRecord","compareDistribution","distribution1","distribution2","tagsForD2","targetRecordIndex","targetRecord","normalizeByMeasures","getDistributionDifference","measure1","measure2","DataExplainer","__publicField","Insight.VIEngine","selectAll","dimSelectionSpaces","meaSelectionSpaces","childrenSpaces","ansSpaces","K_Neighbor","knn","extendDim","measureNames","measureOps","selection","cmps","selectionValues","lowerBoundary","higherBoundary","majorList","outlierList","overallData","subData","outlierNormalization","outlierScore","allMeasureNames","extendMeasureOps","normalizedState","extendMea","originMeasure","valueExpOfExtendMea","intMeasures","norStateWithNewOp","mergedDataSource","maxDiff","minDiff","baseMeasure","diffScore","adjMatrix","graphFields","fieldIndices","neighbors","fieldIndex","dis","fieldKey","tf","num","fieldScores","spaces","engine","visSpace","extendMsNames","allMeasures","preAnalysis","de","getExplaination","filters","currentSpace","visSpaces","valueExp","measureStats","main"],"mappings":"4MAAe,SAASA,EAAQC,EAAK,CAGnC,OAAOD,EAAwB,OAAO,QAArB,YAA2C,OAAO,OAAO,UAA1B,SAAqC,SAAUC,EAAK,CAClG,OAAO,OAAOA,CACf,EAAG,SAAUA,EAAK,CACjB,OAAOA,GAAqB,OAAO,QAArB,YAA+BA,EAAI,cAAgB,QAAUA,IAAQ,OAAO,UAAY,SAAW,OAAOA,CAC5H,EAAKD,EAAQC,CAAG,CAChB,CCRe,SAASC,EAAgBC,EAAUC,EAAa,CAC7D,GAAI,EAAED,aAAoBC,GACxB,MAAM,IAAI,UAAU,mCAAmC,CAE3D,CCHe,SAASC,GAAaC,EAAOC,EAAM,CAChD,GAAIP,EAAQM,CAAK,IAAM,UAAYA,IAAU,KAAM,OAAOA,EAC1D,IAAIE,EAAOF,EAAM,OAAO,WAAW,EACnC,GAAIE,IAAS,OAAW,CACtB,IAAIC,EAAMD,EAAK,KAAKF,EAAOC,GAAQ,SAAS,EAC5C,GAAIP,EAAQS,CAAG,IAAM,SAAU,OAAOA,EACtC,MAAM,IAAI,UAAU,8CAA8C,CACnE,CACD,OAAQF,IAAS,SAAW,OAAS,QAAQD,CAAK,CACpD,CCRe,SAASI,GAAeC,EAAK,CAC1C,IAAIC,EAAMC,GAAYF,EAAK,QAAQ,EACnC,OAAOX,EAAQY,CAAG,IAAM,SAAWA,EAAM,OAAOA,CAAG,CACrD,CCJA,SAASE,GAAkBC,EAAQC,EAAO,CACxC,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAK,CACrC,IAAIC,EAAaF,EAAMC,CAAC,EACxBC,EAAW,WAAaA,EAAW,YAAc,GACjDA,EAAW,aAAe,GACtB,UAAWA,IAAYA,EAAW,SAAW,IACjD,OAAO,eAAeH,EAAQI,GAAcD,EAAW,GAAG,EAAGA,CAAU,CACxE,CACH,CACe,SAASE,EAAahB,EAAaiB,EAAYC,EAAa,CACzE,OAAID,GAAYP,GAAkBV,EAAY,UAAWiB,CAAU,EAC/DC,GAAaR,GAAkBV,EAAakB,CAAW,EAC3D,OAAO,eAAelB,EAAa,YAAa,CAC9C,SAAU,EACd,CAAG,EACMA,CACT,CCjBe,SAASmB,EAAuBC,EAAM,CACnD,GAAIA,IAAS,OACX,MAAM,IAAI,eAAe,2DAA2D,EAEtF,OAAOA,CACT,CCLe,SAASC,GAAgBC,EAAGC,EAAG,CAC5C,OAAAF,GAAkB,OAAO,eAAiB,OAAO,eAAe,KAAI,EAAK,SAAyBC,EAAGC,EAAG,CACtG,OAAAD,EAAE,UAAYC,EACPD,CACX,EACSD,GAAgBC,EAAGC,CAAC,CAC7B,CCLe,SAASC,GAAUC,EAAUC,EAAY,CACtD,GAAI,OAAOA,GAAe,YAAcA,IAAe,KACrD,MAAM,IAAI,UAAU,oDAAoD,EAE1ED,EAAS,UAAY,OAAO,OAAOC,GAAcA,EAAW,UAAW,CACrE,YAAa,CACX,MAAOD,EACP,SAAU,GACV,aAAc,EACf,CACL,CAAG,EACD,OAAO,eAAeA,EAAU,YAAa,CAC3C,SAAU,EACd,CAAG,EACGC,GAAYC,GAAeF,EAAUC,CAAU,CACrD,CCde,SAASE,GAA2BR,EAAMS,EAAM,CAC7D,GAAIA,IAASjC,EAAQiC,CAAI,IAAM,UAAY,OAAOA,GAAS,YACzD,OAAOA,EACF,GAAIA,IAAS,OAClB,MAAM,IAAI,UAAU,0DAA0D,EAEhF,OAAOC,EAAsBV,CAAI,CACnC,CCTe,SAASW,EAAgBT,EAAG,CACzC,OAAAS,EAAkB,OAAO,eAAiB,OAAO,eAAe,KAAM,EAAG,SAAyBT,EAAG,CACnG,OAAOA,EAAE,WAAa,OAAO,eAAeA,CAAC,CACjD,EACSS,EAAgBT,CAAC,CAC1B,CCJe,SAASU,EAAgBnC,EAAKW,EAAKyB,EAAO,CACvD,OAAAzB,EAAMO,GAAcP,CAAG,EACnBA,KAAOX,EACT,OAAO,eAAeA,EAAKW,EAAK,CAC9B,MAAOyB,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EAChB,CAAK,EAEDpC,EAAIW,CAAG,EAAIyB,EAENpC,CACT,CCde,SAASqC,GAAgBC,EAAK,CAC3C,GAAI,MAAM,QAAQA,CAAG,EAAG,OAAOA,CACjC,CCFe,SAASC,GAAiBC,EAAM,CAC7C,GAAI,OAAO,OAAW,KAAeA,EAAK,OAAO,QAAQ,GAAK,MAAQA,EAAK,YAAY,GAAK,KAAM,OAAO,MAAM,KAAKA,CAAI,CAC1H,CCFe,SAASC,GAAkBH,EAAKI,EAAK,EAC9CA,GAAO,MAAQA,EAAMJ,EAAI,UAAQI,EAAMJ,EAAI,QAC/C,QAAStB,EAAI,EAAG2B,EAAO,IAAI,MAAMD,CAAG,EAAG1B,EAAI0B,EAAK1B,IAAK2B,EAAK3B,CAAC,EAAIsB,EAAItB,CAAC,EACpE,OAAO2B,CACT,CCHe,SAASC,GAA4BnB,EAAGoB,EAAQ,CAC7D,GAAKpB,EACL,IAAI,OAAOA,GAAM,SAAU,OAAOqB,GAAiBrB,EAAGoB,CAAM,EAC5D,IAAIE,EAAI,OAAO,UAAU,SAAS,KAAKtB,CAAC,EAAE,MAAM,EAAG,EAAE,EAErD,GADIsB,IAAM,UAAYtB,EAAE,cAAasB,EAAItB,EAAE,YAAY,MACnDsB,IAAM,OAASA,IAAM,MAAO,OAAO,MAAM,KAAKtB,CAAC,EACnD,GAAIsB,IAAM,aAAe,2CAA2C,KAAKA,CAAC,EAAG,OAAOD,GAAiBrB,EAAGoB,CAAM,EAChH,CCRe,SAASG,IAAmB,CACzC,MAAM,IAAI,UAAU;AAAA,mFAA2I,CACjK,CCEe,SAASC,GAASX,EAAK,CACpC,OAAOY,GAAeZ,CAAG,GAAKa,GAAgBb,CAAG,GAAKc,GAA2Bd,CAAG,GAAKe,IAC3F,CCIA,SAASC,GAAQC,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAEzV,SAASG,GAAc9C,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAKsC,GAAQ,OAAOO,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAYP,GAAQ,OAAOO,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAEthB,IAAIgD,GAAgB,CAClB,KAAM,SACN,IAAK,SAAaC,EAAM,CACtB,KAAK,OAAO,MAAOA,CAAI,CACxB,EACD,KAAM,SAAcA,EAAM,CACxB,KAAK,OAAO,OAAQA,CAAI,CACzB,EACD,MAAO,SAAeA,EAAM,CAC1B,KAAK,OAAO,QAASA,CAAI,CAC1B,EACD,OAAQ,SAAgBC,EAAMD,EAAM,CAC9B,SAAW,QAAQC,CAAI,GAAG,QAAQA,CAAI,EAAE,MAAM,QAASD,CAAI,CAChE,CACH,EAEIE,GAAS,UAAY,CACvB,SAASA,EAAOC,EAAgB,CAC9B,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElFlE,EAAgB,KAAMgE,CAAM,EAE5B,KAAK,KAAKC,EAAgBC,CAAO,CAClC,CAED,OAAAhD,EAAa8C,EAAQ,CAAC,CACpB,IAAK,OACL,MAAO,SAAcC,EAAgB,CACnC,IAAIC,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAClF,KAAK,OAASA,EAAQ,QAAU,WAChC,KAAK,OAASD,GAAkBJ,GAChC,KAAK,QAAUK,EACf,KAAK,MAAQA,EAAQ,KACtB,CACL,EAAK,CACD,IAAK,WACL,MAAO,SAAkBC,EAAM,CAC7B,KAAK,MAAQA,CACd,CACL,EAAK,CACD,IAAK,MACL,MAAO,UAAe,CACpB,QAASC,EAAO,UAAU,OAAQN,EAAO,IAAI,MAAMM,CAAI,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EP,EAAKO,CAAI,EAAI,UAAUA,CAAI,EAG7B,OAAO,KAAK,QAAQP,EAAM,MAAO,GAAI,EAAI,CAC1C,CACL,EAAK,CACD,IAAK,OACL,MAAO,UAAgB,CACrB,QAASQ,EAAQ,UAAU,OAAQR,EAAO,IAAI,MAAMQ,CAAK,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACpFT,EAAKS,CAAK,EAAI,UAAUA,CAAK,EAG/B,OAAO,KAAK,QAAQT,EAAM,OAAQ,GAAI,EAAI,CAC3C,CACL,EAAK,CACD,IAAK,QACL,MAAO,UAAiB,CACtB,QAASU,EAAQ,UAAU,OAAQV,EAAO,IAAI,MAAMU,CAAK,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACpFX,EAAKW,CAAK,EAAI,UAAUA,CAAK,EAG/B,OAAO,KAAK,QAAQX,EAAM,QAAS,EAAE,CACtC,CACL,EAAK,CACD,IAAK,YACL,MAAO,UAAqB,CAC1B,QAASY,EAAQ,UAAU,OAAQZ,EAAO,IAAI,MAAMY,CAAK,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACpFb,EAAKa,CAAK,EAAI,UAAUA,CAAK,EAG/B,OAAO,KAAK,QAAQb,EAAM,OAAQ,uBAAwB,EAAI,CAC/D,CACL,EAAK,CACD,IAAK,UACL,MAAO,SAAiBA,EAAMc,EAAKC,EAAQC,EAAW,CACpD,OAAIA,GAAa,CAAC,KAAK,MAAc,MACjC,OAAOhB,EAAK,CAAC,GAAM,WAAUA,EAAK,CAAC,EAAI,GAAG,OAAOe,CAAM,EAAE,OAAO,KAAK,OAAQ,GAAG,EAAE,OAAOf,EAAK,CAAC,CAAC,GAC7F,KAAK,OAAOc,CAAG,EAAEd,CAAI,EAC7B,CACL,EAAK,CACD,IAAK,SACL,MAAO,SAAgBiB,EAAY,CACjC,OAAO,IAAIf,EAAO,KAAK,OAAQL,GAAcA,GAAc,GAAI,CAC7D,OAAQ,GAAG,OAAO,KAAK,OAAQ,GAAG,EAAE,OAAOoB,EAAY,GAAG,CAClE,CAAO,EAAG,KAAK,OAAO,CAAC,CAClB,CACL,EAAK,CACD,IAAK,QACL,MAAO,SAAeb,EAAS,CAC7B,OAAAA,EAAUA,GAAW,KAAK,QAC1BA,EAAQ,OAASA,EAAQ,QAAU,KAAK,OACjC,IAAIF,EAAO,KAAK,OAAQE,CAAO,CACvC,CACF,CAAA,CAAC,EAEKF,CACT,IAEIgB,EAAa,IAAIhB,GAEjBiB,EAAe,UAAY,CAC7B,SAASA,GAAe,CACtBjF,EAAgB,KAAMiF,CAAY,EAElC,KAAK,UAAY,EAClB,CAED,OAAA/D,EAAa+D,EAAc,CAAC,CAC1B,IAAK,KACL,MAAO,SAAYC,EAAQC,EAAU,CACnC,IAAIC,EAAQ,KAEZ,OAAAF,EAAO,MAAM,GAAG,EAAE,QAAQ,SAAUG,EAAO,CACzCD,EAAM,UAAUC,CAAK,EAAID,EAAM,UAAUC,CAAK,GAAK,GAEnDD,EAAM,UAAUC,CAAK,EAAE,KAAKF,CAAQ,CAC5C,CAAO,EACM,IACR,CACL,EAAK,CACD,IAAK,MACL,MAAO,SAAaE,EAAOF,EAAU,CACnC,GAAK,KAAK,UAAUE,CAAK,EAEzB,IAAI,CAACF,EAAU,CACb,OAAO,KAAK,UAAUE,CAAK,EAC3B,MACD,CAED,KAAK,UAAUA,CAAK,EAAI,KAAK,UAAUA,CAAK,EAAE,OAAO,SAAUC,EAAG,CAChE,OAAOA,IAAMH,CACrB,CAAO,EACF,CACL,EAAK,CACD,IAAK,OACL,MAAO,SAAcE,EAAO,CAC1B,QAASjB,EAAO,UAAU,OAAQN,EAAO,IAAI,MAAMM,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAClGP,EAAKO,EAAO,CAAC,EAAI,UAAUA,CAAI,EAGjC,GAAI,KAAK,UAAUgB,CAAK,EAAG,CACzB,IAAIE,EAAS,CAAA,EAAG,OAAO,KAAK,UAAUF,CAAK,CAAC,EAC5CE,EAAO,QAAQ,SAAUC,EAAU,CACjCA,EAAS,MAAM,OAAQ1B,CAAI,CACrC,CAAS,CACF,CAED,GAAI,KAAK,UAAU,GAAG,EAAG,CACvB,IAAI2B,EAAU,CAAA,EAAG,OAAO,KAAK,UAAU,GAAG,CAAC,EAE3CA,EAAQ,QAAQ,SAAUD,EAAU,CAClCA,EAAS,MAAMA,EAAU,CAACH,CAAK,EAAE,OAAOvB,CAAI,CAAC,CACvD,CAAS,CACF,CACF,CACF,CAAA,CAAC,EAEKmB,CACT,IAEA,SAASS,IAAQ,CACf,IAAInF,EACAoF,EACAC,EAAU,IAAI,QAAQ,SAAUC,EAASC,EAAQ,CACnDvF,EAAMsF,EACNF,EAAMG,CACV,CAAG,EACD,OAAAF,EAAQ,QAAUrF,EAClBqF,EAAQ,OAASD,EACVC,CACT,CACA,SAASG,GAAWzC,EAAQ,CAC1B,OAAIA,GAAU,KAAa,GACpB,GAAKA,CACd,CACA,SAAS0C,GAAKC,EAAGC,EAAG,EAAG,CACrBD,EAAE,QAAQ,SAAUE,EAAG,CACjBD,EAAEC,CAAC,IAAG,EAAEA,CAAC,EAAID,EAAEC,CAAC,EACxB,CAAG,CACH,CAEA,SAASC,GAAc9C,EAAQ+C,EAAMC,EAAO,CAC1C,SAASC,EAAS7F,EAAK,CACrB,OAAOA,GAAOA,EAAI,QAAQ,KAAK,EAAI,GAAKA,EAAI,QAAQ,OAAQ,GAAG,EAAIA,CACpE,CAED,SAAS8F,GAAuB,CAC9B,MAAO,CAAClD,GAAU,OAAOA,GAAW,QACrC,CAID,QAFImD,EAAQ,OAAOJ,GAAS,SAAW,CAAE,EAAC,OAAOA,CAAI,EAAIA,EAAK,MAAM,GAAG,EAEhEI,EAAM,OAAS,GAAG,CACvB,GAAID,EAAoB,EAAI,MAAO,GACnC,IAAI9F,EAAM6F,EAASE,EAAM,MAAO,CAAA,EAC5B,CAACnD,EAAO5C,CAAG,GAAK4F,IAAOhD,EAAO5C,CAAG,EAAI,IAAI4F,GAEzC,OAAO,UAAU,eAAe,KAAKhD,EAAQ5C,CAAG,EAClD4C,EAASA,EAAO5C,CAAG,EAEnB4C,EAAS,CAAA,CAEZ,CAED,OAAIkD,EAAoB,EAAW,GAC5B,CACL,IAAKlD,EACL,EAAGiD,EAASE,EAAM,OAAO,CAC7B,CACA,CAEA,SAASC,GAAQpD,EAAQ+C,EAAMM,EAAU,CACvC,IAAIC,EAAiBR,GAAc9C,EAAQ+C,EAAM,MAAM,EACnDtG,EAAM6G,EAAe,IACrBC,EAAID,EAAe,EAEvB7G,EAAI8G,CAAC,EAAIF,CACX,CACA,SAASG,GAASxD,EAAQ+C,EAAMM,EAAUI,EAAQ,CAChD,IAAIC,EAAkBZ,GAAc9C,EAAQ+C,EAAM,MAAM,EACpDtG,EAAMiH,EAAgB,IACtBH,EAAIG,EAAgB,EAExBjH,EAAI8G,CAAC,EAAI9G,EAAI8G,CAAC,GAAK,CAAA,EACfE,IAAQhH,EAAI8G,CAAC,EAAI9G,EAAI8G,CAAC,EAAE,OAAOF,CAAQ,GACtCI,GAAQhH,EAAI8G,CAAC,EAAE,KAAKF,CAAQ,CACnC,CACA,SAASM,GAAQ3D,EAAQ+C,EAAM,CAC7B,IAAIa,EAAkBd,GAAc9C,EAAQ+C,CAAI,EAC5CtG,EAAMmH,EAAgB,IACtBL,EAAIK,EAAgB,EAExB,GAAKnH,EACL,OAAOA,EAAI8G,CAAC,CACd,CACA,SAASM,GAAoBC,EAAMC,EAAa3G,EAAK,CACnD,IAAIyB,EAAQ8E,GAAQG,EAAM1G,CAAG,EAE7B,OAAIyB,IAAU,OACLA,EAGF8E,GAAQI,EAAa3G,CAAG,CACjC,CACA,SAAS4G,GAAWzG,EAAQ+C,EAAQ2D,EAAW,CAC7C,QAASC,KAAQ5D,EACX4D,IAAS,aAAeA,IAAS,gBAC/BA,KAAQ3G,EACN,OAAOA,EAAO2G,CAAI,GAAM,UAAY3G,EAAO2G,CAAI,YAAa,QAAU,OAAO5D,EAAO4D,CAAI,GAAM,UAAY5D,EAAO4D,CAAI,YAAa,OAChID,IAAW1G,EAAO2G,CAAI,EAAI5D,EAAO4D,CAAI,GAEzCF,GAAWzG,EAAO2G,CAAI,EAAG5D,EAAO4D,CAAI,EAAGD,CAAS,EAGlD1G,EAAO2G,CAAI,EAAI5D,EAAO4D,CAAI,GAKhC,OAAO3G,CACT,CACA,SAAS4G,GAAYC,EAAK,CACxB,OAAOA,EAAI,QAAQ,sCAAuC,MAAM,CAClE,CACA,IAAIC,GAAa,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,QACP,EACA,SAASC,GAAOR,EAAM,CACpB,OAAI,OAAOA,GAAS,SACXA,EAAK,QAAQ,aAAc,SAAUlB,EAAG,CAC7C,OAAOyB,GAAWzB,CAAC,CACzB,CAAK,EAGIkB,CACT,CACA,IAAIS,GAAS,OAAO,OAAW,KAAe,OAAO,WAAa,OAAO,OAAO,UAAU,cAAkB,KAAe,OAAO,UAAU,WAAa,OAAO,UAAU,UAAU,QAAQ,MAAM,EAAI,GAClMC,GAAQ,CAAC,IAAK,IAAK,IAAK,IAAK,GAAG,EACpC,SAASC,GAAoBrH,EAAKsH,EAAaC,EAAc,CAC3DD,EAAcA,GAAe,GAC7BC,EAAeA,GAAgB,GAC/B,IAAIC,EAAgBJ,GAAM,OAAO,SAAUK,EAAG,CAC5C,OAAOH,EAAY,QAAQG,CAAC,EAAI,GAAKF,EAAa,QAAQE,CAAC,EAAI,CACnE,CAAG,EACD,GAAID,EAAc,SAAW,EAAG,MAAO,GACvC,IAAI,EAAI,IAAI,OAAO,IAAI,OAAOA,EAAc,IAAI,SAAUC,EAAG,CAC3D,OAAOA,IAAM,IAAM,MAAQA,CAC5B,CAAA,EAAE,KAAK,GAAG,EAAG,GAAG,CAAC,EACdC,EAAU,CAAC,EAAE,KAAK1H,CAAG,EAEzB,GAAI,CAAC0H,EAAS,CACZ,IAAIC,EAAK3H,EAAI,QAAQuH,CAAY,EAE7BI,EAAK,GAAK,CAAC,EAAE,KAAK3H,EAAI,UAAU,EAAG2H,CAAE,CAAC,IACxCD,EAAU,GAEb,CAED,OAAOA,CACT,CAEA,SAASE,GAAUhF,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAAS+E,GAAgB1H,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAKuH,GAAU,OAAO1E,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAY0E,GAAU,OAAO1E,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,SAAS2H,GAAaC,EAAS,CAAE,IAAIC,EAA4BC,GAAyB,EAAI,OAAO,UAAgC,CAAE,IAAIC,EAAQ3G,EAAgBwG,CAAO,EAAGI,EAAQ,GAAIH,EAA2B,CAAE,IAAII,EAAY7G,EAAgB,IAAI,EAAE,YAAa4G,EAAS,QAAQ,UAAUD,EAAO,UAAWE,CAAS,OAAYD,EAASD,EAAM,MAAM,KAAM,SAAS,EAAK,OAAO9G,GAA2B,KAAM+G,CAAM,CAAE,CAAK,CAEza,SAASF,IAA4B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAE,eAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,GAAI,UAAY,CAAE,CAAA,CAAC,EAAU,EAAO,MAAC,CAAY,MAAO,GAAU,CAEzU,SAASI,GAAShJ,EAAKsG,EAAM,CAC3B,IAAI4B,EAAe,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,IACvF,GAAKlI,EACL,IAAIA,EAAIsG,CAAI,EAAG,OAAOtG,EAAIsG,CAAI,EAI9B,QAHI2C,EAAQ3C,EAAK,MAAM4B,CAAY,EAC/BgB,EAAUlJ,EAELgB,EAAI,EAAGA,EAAIiI,EAAM,OAAQ,EAAEjI,EAAG,CAGrC,GAFI,CAACkI,GAED,OAAOA,EAAQD,EAAMjI,CAAC,CAAC,GAAM,UAAYA,EAAI,EAAIiI,EAAM,OACzD,OAGF,GAAIC,EAAQD,EAAMjI,CAAC,CAAC,IAAM,OAAW,CAKnC,QAJImI,EAAI,EACJzH,EAAIuH,EAAM,MAAMjI,EAAGA,EAAImI,CAAC,EAAE,KAAKjB,CAAY,EAC3CkB,EAAMF,EAAQxH,CAAC,EAEZ0H,IAAQ,QAAaH,EAAM,OAASjI,EAAImI,GAC7CA,IACAzH,EAAIuH,EAAM,MAAMjI,EAAGA,EAAImI,CAAC,EAAE,KAAKjB,CAAY,EAC3CkB,EAAMF,EAAQxH,CAAC,EAGjB,GAAI0H,IAAQ,OAAW,OACvB,GAAIA,IAAQ,KAAM,OAAO,KAEzB,GAAI9C,EAAK,SAAS5E,CAAC,EAAG,CACpB,GAAI,OAAO0H,GAAQ,SAAU,OAAOA,EACpC,GAAI1H,GAAK,OAAO0H,EAAI1H,CAAC,GAAM,SAAU,OAAO0H,EAAI1H,CAAC,CAClD,CAED,IAAI2H,EAAaJ,EAAM,MAAMjI,EAAImI,CAAC,EAAE,KAAKjB,CAAY,EACrD,OAAImB,EAAmBL,GAASI,EAAKC,EAAYnB,CAAY,EAC7D,MACD,CAEDgB,EAAUA,EAAQD,EAAMjI,CAAC,CAAC,CAC3B,CAED,OAAOkI,EACT,CAEA,IAAII,GAAgB,SAAUC,EAAe,CAC3C5H,GAAU2H,EAAeC,CAAa,EAEtC,IAAIC,EAASf,GAAaa,CAAa,EAEvC,SAASA,EAAcjC,EAAM,CAC3B,IAAIhC,EAEAlB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,GAAI,CAAC,aAAa,EAClB,UAAW,aACjB,EAEI,OAAAlE,EAAgB,KAAMqJ,CAAa,EAEnCjE,EAAQmE,EAAO,KAAK,IAAI,EAEpB1B,IACF5C,EAAa,KAAK5D,EAAuB+D,CAAK,CAAC,EAGjDA,EAAM,KAAOgC,GAAQ,GACrBhC,EAAM,QAAUlB,EAEZkB,EAAM,QAAQ,eAAiB,SACjCA,EAAM,QAAQ,aAAe,KAG3BA,EAAM,QAAQ,sBAAwB,SACxCA,EAAM,QAAQ,oBAAsB,IAG/BA,CACR,CAED,OAAAlE,EAAamI,EAAe,CAAC,CAC3B,IAAK,gBACL,MAAO,SAAuBG,EAAI,CAC5B,KAAK,QAAQ,GAAG,QAAQA,CAAE,EAAI,GAChC,KAAK,QAAQ,GAAG,KAAKA,CAAE,CAE1B,CACL,EAAK,CACD,IAAK,mBACL,MAAO,SAA0BA,EAAI,CACnC,IAAIC,EAAQ,KAAK,QAAQ,GAAG,QAAQD,CAAE,EAElCC,EAAQ,IACV,KAAK,QAAQ,GAAG,OAAOA,EAAO,CAAC,CAElC,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqBC,EAAKF,EAAI9I,EAAK,CACxC,IAAIwD,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E+D,EAAe/D,EAAQ,eAAiB,OAAYA,EAAQ,aAAe,KAAK,QAAQ,aACxFyF,EAAsBzF,EAAQ,sBAAwB,OAAYA,EAAQ,oBAAsB,KAAK,QAAQ,oBAC7GmC,EAAO,CAACqD,EAAKF,CAAE,EACf9I,GAAO,OAAOA,GAAQ,WAAU2F,EAAOA,EAAK,OAAO3F,CAAG,GACtDA,GAAO,OAAOA,GAAQ,WAAU2F,EAAOA,EAAK,OAAO4B,EAAevH,EAAI,MAAMuH,CAAY,EAAIvH,CAAG,GAE/FgJ,EAAI,QAAQ,GAAG,EAAI,KACrBrD,EAAOqD,EAAI,MAAM,GAAG,GAGtB,IAAIb,EAAS5B,GAAQ,KAAK,KAAMZ,CAAI,EACpC,OAAIwC,GAAU,CAACc,GAAuB,OAAOjJ,GAAQ,SAAiBmI,EAC/DE,GAAS,KAAK,MAAQ,KAAK,KAAKW,CAAG,GAAK,KAAK,KAAKA,CAAG,EAAEF,CAAE,EAAG9I,EAAKuH,CAAY,CACrF,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqByB,EAAKF,EAAI9I,EAAKyB,EAAO,CAC/C,IAAI+B,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,OAAQ,EAChB,EACU+D,EAAe,KAAK,QAAQ,aAC5BA,IAAiB,SAAWA,EAAe,KAC/C,IAAI5B,EAAO,CAACqD,EAAKF,CAAE,EACf9I,IAAK2F,EAAOA,EAAK,OAAO4B,EAAevH,EAAI,MAAMuH,CAAY,EAAIvH,CAAG,GAEpEgJ,EAAI,QAAQ,GAAG,EAAI,KACrBrD,EAAOqD,EAAI,MAAM,GAAG,EACpBvH,EAAQqH,EACRA,EAAKnD,EAAK,CAAC,GAGb,KAAK,cAAcmD,CAAE,EACrB9C,GAAQ,KAAK,KAAML,EAAMlE,CAAK,EACzB+B,EAAQ,QAAQ,KAAK,KAAK,QAASwF,EAAKF,EAAI9I,EAAKyB,CAAK,CAC5D,CACL,EAAK,CACD,IAAK,eACL,MAAO,SAAsBuH,EAAKF,EAAII,EAAW,CAC/C,IAAI1F,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,OAAQ,EAChB,EAEM,QAASiC,KAAKyD,GACR,OAAOA,EAAUzD,CAAC,GAAM,UAAY,OAAO,UAAU,SAAS,MAAMyD,EAAUzD,CAAC,CAAC,IAAM,mBAAkB,KAAK,YAAYuD,EAAKF,EAAIrD,EAAGyD,EAAUzD,CAAC,EAAG,CACrJ,OAAQ,EAClB,CAAS,EAGEjC,EAAQ,QAAQ,KAAK,KAAK,QAASwF,EAAKF,EAAII,CAAS,CAC3D,CACL,EAAK,CACD,IAAK,oBACL,MAAO,SAA2BF,EAAKF,EAAII,EAAWC,EAAMtC,EAAW,CACrE,IAAIrD,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,OAAQ,EAChB,EACUmC,EAAO,CAACqD,EAAKF,CAAE,EAEfE,EAAI,QAAQ,GAAG,EAAI,KACrBrD,EAAOqD,EAAI,MAAM,GAAG,EACpBG,EAAOD,EACPA,EAAYJ,EACZA,EAAKnD,EAAK,CAAC,GAGb,KAAK,cAAcmD,CAAE,EACrB,IAAIM,EAAO7C,GAAQ,KAAK,KAAMZ,CAAI,GAAK,GAEnCwD,EACFvC,GAAWwC,EAAMF,EAAWrC,CAAS,EAErCuC,EAAOvB,GAAgBA,GAAgB,CAAE,EAAEuB,CAAI,EAAGF,CAAS,EAG7DlD,GAAQ,KAAK,KAAML,EAAMyD,CAAI,EACxB5F,EAAQ,QAAQ,KAAK,KAAK,QAASwF,EAAKF,EAAII,CAAS,CAC3D,CACL,EAAK,CACD,IAAK,uBACL,MAAO,SAA8BF,EAAKF,EAAI,CACxC,KAAK,kBAAkBE,EAAKF,CAAE,GAChC,OAAO,KAAK,KAAKE,CAAG,EAAEF,CAAE,EAG1B,KAAK,iBAAiBA,CAAE,EACxB,KAAK,KAAK,UAAWE,EAAKF,CAAE,CAC7B,CACL,EAAK,CACD,IAAK,oBACL,MAAO,SAA2BE,EAAKF,EAAI,CACzC,OAAO,KAAK,YAAYE,EAAKF,CAAE,IAAM,MACtC,CACL,EAAK,CACD,IAAK,oBACL,MAAO,SAA2BE,EAAKF,EAAI,CAEzC,OADKA,IAAIA,EAAK,KAAK,QAAQ,WACvB,KAAK,QAAQ,mBAAqB,KAAajB,GAAgBA,GAAgB,CAAE,EAAE,CAAE,CAAA,EAAG,KAAK,YAAYmB,EAAKF,CAAE,CAAC,EAC9G,KAAK,YAAYE,EAAKF,CAAE,CAChC,CACL,EAAK,CACD,IAAK,oBACL,MAAO,SAA2BE,EAAK,CACrC,OAAO,KAAK,KAAKA,CAAG,CACrB,CACL,EAAK,CACD,IAAK,8BACL,MAAO,SAAqCA,EAAK,CAC/C,IAAItC,EAAO,KAAK,kBAAkBsC,CAAG,EACjC5G,EAAIsE,GAAQ,OAAO,KAAKA,CAAI,GAAK,GACrC,MAAO,CAAC,CAACtE,EAAE,KAAK,SAAUiH,EAAG,CAC3B,OAAO3C,EAAK2C,CAAC,GAAK,OAAO,KAAK3C,EAAK2C,CAAC,CAAC,EAAE,OAAS,CACxD,CAAO,CACF,CACL,EAAK,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,OAAO,KAAK,IACb,CACF,CAAA,CAAC,EAEKV,CACT,EAAEpE,CAAY,EAEV+E,GAAgB,CAClB,WAAY,CAAE,EACd,iBAAkB,SAA0BC,EAAQ,CAClD,KAAK,WAAWA,EAAO,IAAI,EAAIA,CAChC,EACD,OAAQ,SAAgBC,EAAY/H,EAAOzB,EAAKwD,EAASiG,EAAY,CACnE,IAAI/E,EAAQ,KAEZ,OAAA8E,EAAW,QAAQ,SAAUE,EAAW,CAClChF,EAAM,WAAWgF,CAAS,IAAGjI,EAAQiD,EAAM,WAAWgF,CAAS,EAAE,QAAQjI,EAAOzB,EAAKwD,EAASiG,CAAU,EAClH,CAAK,EACMhI,CACR,CACH,EAEA,SAASkI,GAAU/G,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAAS8G,EAAgBzJ,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAKsJ,GAAU,OAAOzG,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAYyG,GAAU,OAAOzG,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,SAAS0J,GAAe9B,EAAS,CAAE,IAAIC,EAA4B8B,GAA2B,EAAI,OAAO,UAAgC,CAAE,IAAI5B,EAAQ3G,EAAgBwG,CAAO,EAAGI,EAAQ,GAAIH,EAA2B,CAAE,IAAII,EAAY7G,EAAgB,IAAI,EAAE,YAAa4G,EAAS,QAAQ,UAAUD,EAAO,UAAWE,CAAS,OAAYD,EAASD,EAAM,MAAM,KAAM,SAAS,EAAK,OAAO9G,GAA2B,KAAM+G,CAAM,CAAE,CAAK,CAE7a,SAAS2B,IAA8B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAE,eAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,GAAI,UAAY,CAAE,CAAA,CAAC,EAAU,EAAO,MAAC,CAAY,MAAO,GAAU,CAC3U,IAAIC,GAAmB,CAAA,EAEnBC,GAAa,SAAUpB,EAAe,CACxC5H,GAAUgJ,EAAYpB,CAAa,EAEnC,IAAIC,EAASgB,GAAeG,CAAU,EAEtC,SAASA,EAAWC,EAAU,CAC5B,IAAIvF,EAEAlB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,OAAAlE,EAAgB,KAAM0K,CAAU,EAEhCtF,EAAQmE,EAAO,KAAK,IAAI,EAEpB1B,IACF5C,EAAa,KAAK5D,EAAuB+D,CAAK,CAAC,EAGjDY,GAAK,CAAC,gBAAiB,gBAAiB,iBAAkB,eAAgB,mBAAoB,aAAc,OAAO,EAAG2E,EAAUtJ,EAAuB+D,CAAK,CAAC,EAC7JA,EAAM,QAAUlB,EAEZkB,EAAM,QAAQ,eAAiB,SACjCA,EAAM,QAAQ,aAAe,KAG/BA,EAAM,OAASJ,EAAW,OAAO,YAAY,EACtCI,CACR,CAED,OAAAlE,EAAawJ,EAAY,CAAC,CACxB,IAAK,iBACL,MAAO,SAAwBhB,EAAK,CAC9BA,IAAK,KAAK,SAAWA,EAC1B,CACL,EAAK,CACD,IAAK,SACL,MAAO,SAAgBhJ,EAAK,CAC1B,IAAIwD,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,cAAe,CAAE,CACzB,EAEM,GAAyBxD,GAAQ,KAC/B,MAAO,GAGT,IAAIkK,EAAW,KAAK,QAAQlK,EAAKwD,CAAO,EACxC,OAAO0G,GAAYA,EAAS,MAAQ,MACrC,CACL,EAAK,CACD,IAAK,iBACL,MAAO,SAAwBlK,EAAKwD,EAAS,CAC3C,IAAI8D,EAAc9D,EAAQ,cAAgB,OAAYA,EAAQ,YAAc,KAAK,QAAQ,YACrF8D,IAAgB,SAAWA,EAAc,KAC7C,IAAIC,EAAe/D,EAAQ,eAAiB,OAAYA,EAAQ,aAAe,KAAK,QAAQ,aACxF2G,EAAa3G,EAAQ,IAAM,KAAK,QAAQ,WAAa,GACrD4G,EAAuB9C,GAAetH,EAAI,QAAQsH,CAAW,EAAI,GACjE+C,EAAuB,CAAC,KAAK,QAAQ,yBAA2B,CAAC7G,EAAQ,cAAgB,CAAC,KAAK,QAAQ,wBAA0B,CAACA,EAAQ,aAAe,CAAC6D,GAAoBrH,EAAKsH,EAAaC,CAAY,EAEhN,GAAI6C,GAAwB,CAACC,EAAsB,CACjD,IAAI5E,EAAIzF,EAAI,MAAM,KAAK,aAAa,aAAa,EAEjD,GAAIyF,GAAKA,EAAE,OAAS,EAClB,MAAO,CACL,IAAKzF,EACL,WAAYmK,CACxB,EAGQ,IAAIG,EAAQtK,EAAI,MAAMsH,CAAW,GAC7BA,IAAgBC,GAAgBD,IAAgBC,GAAgB,KAAK,QAAQ,GAAG,QAAQ+C,EAAM,CAAC,CAAC,EAAI,MAAIH,EAAaG,EAAM,SAC/HtK,EAAMsK,EAAM,KAAK/C,CAAY,CAC9B,CAED,OAAI,OAAO4C,GAAe,WAAUA,EAAa,CAACA,CAAU,GACrD,CACL,IAAKnK,EACL,WAAYmK,CACpB,CACK,CACL,EAAK,CACD,IAAK,YACL,MAAO,SAAmBrH,EAAMU,EAAS+G,EAAS,CAChD,IAAIC,EAAS,KAOb,GALIpL,EAAQoE,CAAO,IAAM,UAAY,KAAK,QAAQ,mCAChDA,EAAU,KAAK,QAAQ,iCAAiC,SAAS,GAG9DA,IAASA,EAAU,IACEV,GAAS,KAAM,MAAO,GAC3C,MAAM,QAAQA,CAAI,IAAGA,EAAO,CAAC,OAAOA,CAAI,CAAC,GAC9C,IAAI2H,EAAgBjH,EAAQ,gBAAkB,OAAYA,EAAQ,cAAgB,KAAK,QAAQ,cAC3F+D,EAAe/D,EAAQ,eAAiB,OAAYA,EAAQ,aAAe,KAAK,QAAQ,aAExFkH,EAAuB,KAAK,eAAe5H,EAAKA,EAAK,OAAS,CAAC,EAAGU,CAAO,EACzExD,EAAM0K,EAAqB,IAC3BP,EAAaO,EAAqB,WAElCC,EAAYR,EAAWA,EAAW,OAAS,CAAC,EAC5CnB,EAAMxF,EAAQ,KAAO,KAAK,SAC1BoH,EAA0BpH,EAAQ,yBAA2B,KAAK,QAAQ,wBAE9E,GAAIwF,GAAOA,EAAI,YAAW,IAAO,SAAU,CACzC,GAAI4B,EAAyB,CAC3B,IAAItD,EAAc9D,EAAQ,aAAe,KAAK,QAAQ,YAEtD,OAAIiH,GACFP,EAAS,IAAM,GAAG,OAAOS,CAAS,EAAE,OAAOrD,CAAW,EAAE,OAAOtH,CAAG,EAC3DkK,GAGF,GAAG,OAAOS,CAAS,EAAE,OAAOrD,CAAW,EAAE,OAAOtH,CAAG,CAC3D,CAED,OAAIyK,GACFP,EAAS,IAAMlK,EACRkK,GAGFlK,CACR,CAED,IAAIkK,EAAW,KAAK,QAAQpH,EAAMU,CAAO,EACrC3D,EAAMqK,GAAYA,EAAS,IAC3BW,EAAaX,GAAYA,EAAS,SAAWlK,EAC7C8K,EAAkBZ,GAAYA,EAAS,cAAgBlK,EACvD+K,EAAU,OAAO,UAAU,SAAS,MAAMlL,CAAG,EAC7CmL,EAAW,CAAC,kBAAmB,oBAAqB,iBAAiB,EACrEC,EAAazH,EAAQ,aAAe,OAAYA,EAAQ,WAAa,KAAK,QAAQ,WAClF0H,EAA6B,CAAC,KAAK,YAAc,KAAK,WAAW,eACjEC,EAAiB,OAAOtL,GAAQ,UAAY,OAAOA,GAAQ,WAAa,OAAOA,GAAQ,SAE3F,GAAIqL,GAA8BrL,GAAOsL,GAAkBH,EAAS,QAAQD,CAAO,EAAI,GAAK,EAAE,OAAOE,GAAe,UAAYF,IAAY,kBAAmB,CAC7J,GAAI,CAACvH,EAAQ,eAAiB,CAAC,KAAK,QAAQ,cAAe,CACpD,KAAK,QAAQ,uBAChB,KAAK,OAAO,KAAK,iEAAiE,EAGpF,IAAI4H,EAAI,KAAK,QAAQ,sBAAwB,KAAK,QAAQ,sBAAsBP,EAAYhL,EAAK+J,EAAgBA,EAAgB,CAAA,EAAIpG,CAAO,EAAG,GAAI,CACjJ,GAAI2G,CACL,CAAA,CAAC,EAAI,QAAQ,OAAOnK,EAAK,IAAI,EAAE,OAAO,KAAK,SAAU,0CAA0C,EAEhG,OAAIyK,GACFP,EAAS,IAAMkB,EACRlB,GAGFkB,CACR,CAED,GAAI7D,EAAc,CAChB,IAAI8D,EAAiBN,IAAY,iBAC7BzF,EAAO+F,EAAiB,CAAE,EAAG,GAC7BC,GAAcD,EAAiBP,EAAkBD,EAErD,QAASpF,KAAK5F,EACZ,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAK4F,CAAC,EAAG,CAChD,IAAI8F,GAAU,GAAG,OAAOD,EAAW,EAAE,OAAO/D,CAAY,EAAE,OAAO9B,CAAC,EAClEH,EAAKG,CAAC,EAAI,KAAK,UAAU8F,GAAS3B,EAAgBA,EAAgB,GAAIpG,CAAO,EAAG,CAC9E,WAAY,GACZ,GAAI2G,CACL,CAAA,CAAC,EACE7E,EAAKG,CAAC,IAAM8F,KAASjG,EAAKG,CAAC,EAAI5F,EAAI4F,CAAC,EACzC,CAGH5F,EAAMyF,CACP,CACT,SAAiB4F,GAA8B,OAAOD,GAAe,UAAYF,IAAY,iBACrFlL,EAAMA,EAAI,KAAKoL,CAAU,EACrBpL,IAAKA,EAAM,KAAK,kBAAkBA,EAAKiD,EAAMU,EAAS+G,CAAO,OAC5D,CACL,IAAIiB,GAAc,GACdC,GAAU,GACVC,GAAsBlI,EAAQ,QAAU,QAAa,OAAOA,EAAQ,OAAU,SAC9EmI,GAAkB3B,EAAW,gBAAgBxG,CAAO,EACpDoI,GAAqBF,GAAsB,KAAK,eAAe,UAAU1C,EAAKxF,EAAQ,MAAOA,CAAO,EAAI,GACxGqI,GAAerI,EAAQ,eAAe,OAAOoI,EAAkB,CAAC,GAAKpI,EAAQ,aAE7E,CAAC,KAAK,cAAc3D,CAAG,GAAK8L,KAC9BH,GAAc,GACd3L,EAAMgM,IAGH,KAAK,cAAchM,CAAG,IACzB4L,GAAU,GACV5L,EAAMG,GAGR,IAAI8L,GAAiCtI,EAAQ,gCAAkC,KAAK,QAAQ,+BACxFuI,GAAgBD,IAAkCL,GAAU,OAAY5L,EACxEmM,GAAgBL,IAAmBE,KAAiBhM,GAAO,KAAK,QAAQ,cAE5E,GAAI4L,IAAWD,IAAeQ,GAAe,CAG3C,GAFA,KAAK,OAAO,IAAIA,GAAgB,YAAc,aAAchD,EAAK2B,EAAW3K,EAAKgM,GAAgBH,GAAehM,CAAG,EAE/G0H,EAAc,CAChB,IAAI0E,GAAK,KAAK,QAAQjM,EAAK4J,EAAgBA,EAAgB,CAAE,EAAEpG,CAAO,EAAG,GAAI,CAC3E,aAAc,EACf,CAAA,CAAC,EACEyI,IAAMA,GAAG,KAAK,KAAK,OAAO,KAAK,iLAAiL,CACrN,CAED,IAAIC,GAAO,CAAA,EACPC,GAAe,KAAK,cAAc,iBAAiB,KAAK,QAAQ,YAAa3I,EAAQ,KAAO,KAAK,QAAQ,EAE7G,GAAI,KAAK,QAAQ,gBAAkB,YAAc2I,IAAgBA,GAAa,CAAC,EAC7E,QAAS9L,GAAI,EAAGA,GAAI8L,GAAa,OAAQ9L,KACvC6L,GAAK,KAAKC,GAAa9L,EAAC,CAAC,OAElB,KAAK,QAAQ,gBAAkB,MACxC6L,GAAO,KAAK,cAAc,mBAAmB1I,EAAQ,KAAO,KAAK,QAAQ,EAEzE0I,GAAK,KAAK1I,EAAQ,KAAO,KAAK,QAAQ,EAGxC,IAAI4I,GAAO,SAAcxH,GAAGuB,GAAGkG,GAAsB,CACnD,IAAIC,GAAoBX,IAAmBU,KAAyBxM,EAAMwM,GAAuBN,GAE7FvB,EAAO,QAAQ,kBACjBA,EAAO,QAAQ,kBAAkB5F,GAAG+F,EAAWxE,GAAGmG,GAAmBN,GAAexI,CAAO,EAClFgH,EAAO,kBAAoBA,EAAO,iBAAiB,aAC5DA,EAAO,iBAAiB,YAAY5F,GAAG+F,EAAWxE,GAAGmG,GAAmBN,GAAexI,CAAO,EAGhGgH,EAAO,KAAK,aAAc5F,GAAG+F,EAAWxE,GAAGtG,CAAG,CAC1D,EAEc,KAAK,QAAQ,cACX,KAAK,QAAQ,oBAAsB6L,GACrCQ,GAAK,QAAQ,SAAUK,GAAU,CAC/B/B,EAAO,eAAe,YAAY+B,GAAU/I,CAAO,EAAE,QAAQ,SAAUgJ,GAAQ,CAC7EJ,GAAK,CAACG,EAAQ,EAAGvM,EAAMwM,GAAQhJ,EAAQ,eAAe,OAAOgJ,EAAM,CAAC,GAAKX,EAAY,CACvG,CAAiB,CACjB,CAAe,EAEDO,GAAKF,GAAMlM,EAAK6L,EAAY,EAGjC,CAEDhM,EAAM,KAAK,kBAAkBA,EAAKiD,EAAMU,EAAS0G,EAAUK,CAAO,EAC9DkB,IAAW5L,IAAQG,GAAO,KAAK,QAAQ,8BAA6BH,EAAM,GAAG,OAAO8K,EAAW,GAAG,EAAE,OAAO3K,CAAG,IAE7GyL,IAAWD,KAAgB,KAAK,QAAQ,yBACvC,KAAK,QAAQ,mBAAqB,KACpC3L,EAAM,KAAK,QAAQ,uBAAuB,KAAK,QAAQ,4BAA8B,GAAG,OAAO8K,EAAW,GAAG,EAAE,OAAO3K,CAAG,EAAIA,EAAKwL,GAAc3L,EAAM,MAAS,EAE/JA,EAAM,KAAK,QAAQ,uBAAuBA,CAAG,EAGlD,CAED,OAAI4K,GACFP,EAAS,IAAMrK,EACRqK,GAGFrK,CACR,CACL,EAAK,CACD,IAAK,oBACL,MAAO,SAA2BA,EAAKG,EAAKwD,EAAS0G,EAAUK,EAAS,CACtE,IAAIkC,EAAS,KAEb,GAAI,KAAK,YAAc,KAAK,WAAW,MACrC5M,EAAM,KAAK,WAAW,MAAMA,EAAK+J,EAAgBA,EAAgB,CAAE,EAAE,KAAK,QAAQ,cAAc,gBAAgB,EAAGpG,CAAO,EAAG0G,EAAS,QAASA,EAAS,OAAQA,EAAS,QAAS,CAChL,SAAUA,CACpB,CAAS,UACQ,CAAC1G,EAAQ,kBAAmB,CACjCA,EAAQ,eAAe,KAAK,aAAa,KAAKoG,EAAgBA,EAAgB,GAAIpG,CAAO,EAAG,CAC9F,cAAeoG,EAAgBA,EAAgB,GAAI,KAAK,QAAQ,aAAa,EAAGpG,EAAQ,aAAa,CACtG,CAAA,CAAC,EACF,IAAIkJ,EAAkB,OAAO7M,GAAQ,WAAa2D,GAAWA,EAAQ,eAAiBA,EAAQ,cAAc,kBAAoB,OAAYA,EAAQ,cAAc,gBAAkB,KAAK,QAAQ,cAAc,iBAC3MmJ,EAEJ,GAAID,EAAiB,CACnB,IAAIE,EAAK/M,EAAI,MAAM,KAAK,aAAa,aAAa,EAClD8M,EAAUC,GAAMA,EAAG,MACpB,CAED,IAAIlG,EAAOlD,EAAQ,SAAW,OAAOA,EAAQ,SAAY,SAAWA,EAAQ,QAAUA,EAItF,GAHI,KAAK,QAAQ,cAAc,mBAAkBkD,EAAOkD,EAAgBA,EAAgB,CAAA,EAAI,KAAK,QAAQ,cAAc,gBAAgB,EAAGlD,CAAI,GAC9I7G,EAAM,KAAK,aAAa,YAAYA,EAAK6G,EAAMlD,EAAQ,KAAO,KAAK,SAAUA,CAAO,EAEhFkJ,EAAiB,CACnB,IAAIG,EAAKhN,EAAI,MAAM,KAAK,aAAa,aAAa,EAC9CiN,EAAUD,GAAMA,EAAG,OACnBF,EAAUG,IAAStJ,EAAQ,KAAO,GACvC,CAEGA,EAAQ,OAAS,KAAO3D,EAAM,KAAK,aAAa,KAAKA,EAAK,UAAY,CACxE,QAAS6D,EAAO,UAAU,OAAQN,EAAO,IAAI,MAAMM,CAAI,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAC/EP,EAAKO,CAAI,EAAI,UAAUA,CAAI,EAG7B,OAAI4G,GAAWA,EAAQ,CAAC,IAAMnH,EAAK,CAAC,GAAK,CAACI,EAAQ,SAChDiJ,EAAO,OAAO,KAAK,6CAA6C,OAAOrJ,EAAK,CAAC,EAAG,WAAW,EAAE,OAAOpD,EAAI,CAAC,CAAC,CAAC,EAEpG,MAGFyM,EAAO,UAAU,MAAMA,EAAQrJ,EAAK,OAAO,CAACpD,CAAG,CAAC,CAAC,CACzD,EAAEwD,CAAO,GACNA,EAAQ,eAAe,KAAK,aAAa,MAAK,CACnD,CAED,IAAIuJ,EAAcvJ,EAAQ,aAAe,KAAK,QAAQ,YAClDwJ,EAAqB,OAAOD,GAAgB,SAAW,CAACA,CAAW,EAAIA,EAE3E,OAAyBlN,GAAQ,MAAQmN,GAAsBA,EAAmB,QAAUxJ,EAAQ,qBAAuB,KACzH3D,EAAMyJ,GAAc,OAAO0D,EAAoBnN,EAAKG,EAAK,KAAK,SAAW,KAAK,QAAQ,wBAA0B4J,EAAgB,CAC9H,aAAcM,CACf,EAAE1G,CAAO,EAAIA,EAAS,IAAI,GAGtB3D,CACR,CACL,EAAK,CACD,IAAK,UACL,MAAO,SAAiBiD,EAAM,CAC5B,IAAImK,EAAS,KAETzJ,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E0J,EACAzB,EACA0B,EACAC,EACAC,EACJ,OAAI,OAAOvK,GAAS,WAAUA,EAAO,CAACA,CAAI,GAC1CA,EAAK,QAAQ,SAAUqD,EAAG,CACxB,GAAI,CAAA8G,EAAO,cAAcC,CAAK,EAE9B,KAAII,EAAYL,EAAO,eAAe9G,EAAG3C,CAAO,EAE5CxD,EAAMsN,EAAU,IACpB7B,EAAUzL,EACV,IAAImK,EAAamD,EAAU,WACvBL,EAAO,QAAQ,aAAY9C,EAAaA,EAAW,OAAO8C,EAAO,QAAQ,UAAU,GACvF,IAAIvB,EAAsBlI,EAAQ,QAAU,QAAa,OAAOA,EAAQ,OAAU,SAE9E+J,EAAwB7B,GAAuB,CAAClI,EAAQ,SAAWA,EAAQ,QAAU,GAAKyJ,EAAO,eAAe,iBAAgB,EAEhIO,EAAuBhK,EAAQ,UAAY,SAAc,OAAOA,EAAQ,SAAY,UAAY,OAAOA,EAAQ,SAAY,WAAaA,EAAQ,UAAY,GAC5JiK,EAAQjK,EAAQ,KAAOA,EAAQ,KAAOyJ,EAAO,cAAc,mBAAmBzJ,EAAQ,KAAOyJ,EAAO,SAAUzJ,EAAQ,WAAW,EACrI2G,EAAW,QAAQ,SAAUrB,EAAI,CAC3BmE,EAAO,cAAcC,CAAK,IAC9BG,EAASvE,EAEL,CAACiB,GAAiB,GAAG,OAAO0D,EAAM,CAAC,EAAG,GAAG,EAAE,OAAO3E,CAAE,CAAC,GAAKmE,EAAO,OAASA,EAAO,MAAM,oBAAsB,CAACA,EAAO,MAAM,mBAAmBI,CAAM,IACtJtD,GAAiB,GAAG,OAAO0D,EAAM,CAAC,EAAG,GAAG,EAAE,OAAO3E,CAAE,CAAC,EAAI,GAExDmE,EAAO,OAAO,KAAK,QAAS,OAAOxB,EAAS,mBAAqB,EAAE,OAAOgC,EAAM,KAAK,IAAI,EAAG,qCAAuC,EAAE,OAAOJ,EAAQ,sBAAuB,EAAG,0NAA0N,GAG1YI,EAAM,QAAQ,SAAUC,EAAM,CAC5B,GAAI,CAAAT,EAAO,cAAcC,CAAK,EAC9B,CAAAE,EAAUM,EACV,IAAIC,EAAY,CAAC3N,CAAG,EAEpB,GAAIiN,EAAO,YAAcA,EAAO,WAAW,cACzCA,EAAO,WAAW,cAAcU,EAAW3N,EAAK0N,EAAM5E,EAAItF,CAAO,MAC5D,CACL,IAAIoK,EACAlC,IAAqBkC,EAAeX,EAAO,eAAe,UAAUS,EAAMlK,EAAQ,MAAOA,CAAO,GACpG,IAAIqK,EAAa,GAAG,OAAOZ,EAAO,QAAQ,gBAAiB,MAAM,EAUjE,GARIvB,IACFiC,EAAU,KAAK3N,EAAM4N,CAAY,EAE7BL,GACFI,EAAU,KAAK3N,EAAM6N,CAAU,GAI/BL,EAAsB,CACxB,IAAIM,EAAa,GAAG,OAAO9N,CAAG,EAAE,OAAOiN,EAAO,QAAQ,gBAAgB,EAAE,OAAOzJ,EAAQ,OAAO,EAC9FmK,EAAU,KAAKG,CAAU,EAErBpC,IACFiC,EAAU,KAAKG,EAAaF,CAAY,EAEpCL,GACFI,EAAU,KAAKG,EAAaD,CAAU,EAG3C,CACF,CAID,QAFIE,EAEGA,EAAcJ,EAAU,OACxBV,EAAO,cAAcC,CAAK,IAC7BC,EAAeY,EACfb,EAAQD,EAAO,YAAYS,EAAM5E,EAAIiF,EAAavK,CAAO,GAGzE,CAAW,EACX,CAAS,EACT,CAAO,EACM,CACL,IAAK0J,EACL,QAASzB,EACT,aAAc0B,EACd,QAASC,EACT,OAAQC,CAChB,CACK,CACL,EAAK,CACD,IAAK,gBACL,MAAO,SAAuBxN,EAAK,CACjC,OAAOA,IAAQ,QAAa,EAAE,CAAC,KAAK,QAAQ,YAAcA,IAAQ,OAAS,EAAE,CAAC,KAAK,QAAQ,mBAAqBA,IAAQ,GACzH,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqB6N,EAAM5E,EAAI9I,EAAK,CACzC,IAAIwD,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAClF,OAAI,KAAK,YAAc,KAAK,WAAW,YAAoB,KAAK,WAAW,YAAYkK,EAAM5E,EAAI9I,EAAKwD,CAAO,EACtG,KAAK,cAAc,YAAYkK,EAAM5E,EAAI9I,EAAKwD,CAAO,CAC7D,CACF,CAAA,EAAG,CAAC,CACH,IAAK,kBACL,MAAO,SAAyBA,EAAS,CACvC,IAAIW,EAAS,eAEb,QAAS6J,KAAUxK,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAASwK,CAAM,GAAK7J,IAAW6J,EAAO,UAAU,EAAG7J,EAAO,MAAM,GAAmBX,EAAQwK,CAAM,IAA5B,OAC5G,MAAO,GAIX,MAAO,EACR,CACF,CAAA,CAAC,EAEKhE,CACT,EAAEzF,CAAY,EAEd,SAAS0J,GAAWC,EAAQ,CAC1B,OAAOA,EAAO,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAO,MAAM,CAAC,CACxD,CAEA,IAAIC,GAAe,UAAY,CAC7B,SAASA,EAAa3K,EAAS,CAC7BlE,EAAgB,KAAM6O,CAAY,EAElC,KAAK,QAAU3K,EACf,KAAK,cAAgB,KAAK,QAAQ,eAAiB,GACnD,KAAK,OAASc,EAAW,OAAO,eAAe,CAChD,CAED,OAAA9D,EAAa2N,EAAc,CAAC,CAC1B,IAAK,wBACL,MAAO,SAA+BT,EAAM,CAC1C,GAAI,CAACA,GAAQA,EAAK,QAAQ,GAAG,EAAI,EAAG,OAAO,KAC3C,IAAI3M,EAAI2M,EAAK,MAAM,GAAG,EAGtB,OAFI3M,EAAE,SAAW,IACjBA,EAAE,IAAG,EACDA,EAAEA,EAAE,OAAS,CAAC,EAAE,YAAa,IAAK,KAAY,KAC3C,KAAK,mBAAmBA,EAAE,KAAK,GAAG,CAAC,CAC3C,CACL,EAAK,CACD,IAAK,0BACL,MAAO,SAAiC2M,EAAM,CAC5C,GAAI,CAACA,GAAQA,EAAK,QAAQ,GAAG,EAAI,EAAG,OAAOA,EAC3C,IAAI3M,EAAI2M,EAAK,MAAM,GAAG,EACtB,OAAO,KAAK,mBAAmB3M,EAAE,CAAC,CAAC,CACpC,CACL,EAAK,CACD,IAAK,qBACL,MAAO,SAA4B2M,EAAM,CACvC,GAAI,OAAOA,GAAS,UAAYA,EAAK,QAAQ,GAAG,EAAI,GAAI,CACtD,IAAIU,EAAe,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAM,EACtErN,EAAI2M,EAAK,MAAM,GAAG,EAEtB,OAAI,KAAK,QAAQ,aACf3M,EAAIA,EAAE,IAAI,SAAUsN,EAAM,CACxB,OAAOA,EAAK,aACxB,CAAW,EACQtN,EAAE,SAAW,GACtBA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,YAAW,EACvBA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,YAAW,EACnBqN,EAAa,QAAQrN,EAAE,CAAC,EAAE,YAAa,CAAA,EAAI,KAAIA,EAAE,CAAC,EAAIkN,GAAWlN,EAAE,CAAC,EAAE,YAAW,CAAE,IAC9EA,EAAE,SAAW,IACtBA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,YAAW,EACnBA,EAAE,CAAC,EAAE,SAAW,IAAGA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,YAAW,GAC1CA,EAAE,CAAC,IAAM,OAASA,EAAE,CAAC,EAAE,SAAW,IAAGA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,eACjDqN,EAAa,QAAQrN,EAAE,CAAC,EAAE,YAAa,CAAA,EAAI,KAAIA,EAAE,CAAC,EAAIkN,GAAWlN,EAAE,CAAC,EAAE,YAAW,CAAE,GACnFqN,EAAa,QAAQrN,EAAE,CAAC,EAAE,YAAa,CAAA,EAAI,KAAIA,EAAE,CAAC,EAAIkN,GAAWlN,EAAE,CAAC,EAAE,YAAW,CAAE,IAGlFA,EAAE,KAAK,GAAG,CAClB,CAED,OAAO,KAAK,QAAQ,WAAa,KAAK,QAAQ,aAAe2M,EAAK,YAAa,EAAGA,CACnF,CACL,EAAK,CACD,IAAK,kBACL,MAAO,SAAyBA,EAAM,CACpC,OAAI,KAAK,QAAQ,OAAS,gBAAkB,KAAK,QAAQ,4BACvDA,EAAO,KAAK,wBAAwBA,CAAI,GAGnC,CAAC,KAAK,eAAiB,CAAC,KAAK,cAAc,QAAU,KAAK,cAAc,QAAQA,CAAI,EAAI,EAChG,CACL,EAAK,CACD,IAAK,wBACL,MAAO,SAA+BD,EAAO,CAC3C,IAAI/I,EAAQ,KAEZ,GAAI,CAAC+I,EAAO,OAAO,KACnB,IAAIP,EACJ,OAAAO,EAAM,QAAQ,SAAUC,EAAM,CAC5B,GAAI,CAAAR,EAEJ,KAAIoB,EAAa5J,EAAM,mBAAmBgJ,CAAI,GAE1C,CAAChJ,EAAM,QAAQ,eAAiBA,EAAM,gBAAgB4J,CAAU,KAAGpB,EAAQoB,GACvF,CAAO,EAEG,CAACpB,GAAS,KAAK,QAAQ,eACzBO,EAAM,QAAQ,SAAUC,EAAM,CAC5B,GAAI,CAAAR,EAEJ,KAAIqB,EAAU7J,EAAM,wBAAwBgJ,CAAI,EAEhD,GAAIhJ,EAAM,gBAAgB6J,CAAO,EAAG,OAAOrB,EAAQqB,EACnDrB,EAAQxI,EAAM,QAAQ,cAAc,KAAK,SAAU8J,EAAc,CAC/D,GAAIA,EAAa,QAAQD,CAAO,IAAM,EAAG,OAAOC,CAC5D,CAAW,EACX,CAAS,EAGEtB,IAAOA,EAAQ,KAAK,iBAAiB,KAAK,QAAQ,WAAW,EAAE,CAAC,GAC9DA,CACR,CACL,EAAK,CACD,IAAK,mBACL,MAAO,SAA0BuB,EAAWf,EAAM,CAChD,GAAI,CAACe,EAAW,MAAO,GAGvB,GAFI,OAAOA,GAAc,aAAYA,EAAYA,EAAUf,CAAI,GAC3D,OAAOe,GAAc,WAAUA,EAAY,CAACA,CAAS,GACrD,OAAO,UAAU,SAAS,MAAMA,CAAS,IAAM,iBAAkB,OAAOA,EAC5E,GAAI,CAACf,EAAM,OAAOe,EAAU,SAAc,CAAA,EAC1C,IAAIvB,EAAQuB,EAAUf,CAAI,EAC1B,OAAKR,IAAOA,EAAQuB,EAAU,KAAK,sBAAsBf,CAAI,CAAC,GACzDR,IAAOA,EAAQuB,EAAU,KAAK,mBAAmBf,CAAI,CAAC,GACtDR,IAAOA,EAAQuB,EAAU,KAAK,wBAAwBf,CAAI,CAAC,GAC3DR,IAAOA,EAAQuB,EAAU,SACvBvB,GAAS,CAAA,CACjB,CACL,EAAK,CACD,IAAK,qBACL,MAAO,SAA4BQ,EAAMgB,EAAc,CACrD,IAAIlE,EAAS,KAETmE,EAAgB,KAAK,iBAAiBD,GAAgB,KAAK,QAAQ,aAAe,GAAIhB,CAAI,EAC1FD,EAAQ,CAAA,EAERmB,EAAU,SAAiBnH,EAAG,CAC3BA,IAED+C,EAAO,gBAAgB/C,CAAC,EAC1BgG,EAAM,KAAKhG,CAAC,EAEZ+C,EAAO,OAAO,KAAK,uDAAuD,OAAO/C,CAAC,CAAC,EAE7F,EAEM,OAAI,OAAOiG,GAAS,UAAYA,EAAK,QAAQ,GAAG,EAAI,IAC9C,KAAK,QAAQ,OAAS,gBAAgBkB,EAAQ,KAAK,mBAAmBlB,CAAI,CAAC,EAC3E,KAAK,QAAQ,OAAS,gBAAkB,KAAK,QAAQ,OAAS,eAAekB,EAAQ,KAAK,sBAAsBlB,CAAI,CAAC,EACrH,KAAK,QAAQ,OAAS,eAAekB,EAAQ,KAAK,wBAAwBlB,CAAI,CAAC,GAC1E,OAAOA,GAAS,UACzBkB,EAAQ,KAAK,mBAAmBlB,CAAI,CAAC,EAGvCiB,EAAc,QAAQ,SAAUE,EAAI,CAC9BpB,EAAM,QAAQoB,CAAE,EAAI,GAAGD,EAAQpE,EAAO,mBAAmBqE,CAAE,CAAC,CACxE,CAAO,EACMpB,CACR,CACF,CAAA,CAAC,EAEKU,CACT,IAEIW,GAAO,CAAC,CACV,KAAM,CAAC,MAAO,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EACrI,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,CACN,EAAG,CACD,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,KAAM,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAC7Y,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,CACN,EAAG,CACD,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAC5I,GAAI,CAAC,CAAC,EACN,GAAI,CACN,EAAG,CACD,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,IAAI,EACtD,GAAI,CAAC,EAAG,EAAG,CAAC,EACZ,GAAI,CACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,GAAG,EACxB,GAAI,CACN,EAAG,CACD,KAAM,CAAC,KAAM,IAAI,EACjB,GAAI,CAAC,EAAG,EAAG,CAAC,EACZ,GAAI,CACN,EAAG,CACD,KAAM,CAAC,MAAO,IAAI,EAClB,GAAI,CAAC,EAAG,EAAG,CAAC,EACZ,GAAI,CACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EACf,GAAI,CACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,CACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAE,EACnB,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,EAAE,EAChB,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EACf,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAE,EACb,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,CAAC,EACZ,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,EACN,EAAG,CACD,KAAM,CAAC,KAAK,EACZ,GAAI,CAAC,EAAG,EAAG,CAAC,EACZ,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,GAAI,EAAE,EACjB,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,CAAC,EACT,GAAI,CACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAE,EACb,GAAI,EACN,EAAG,CACD,KAAM,CAAC,IAAI,EACX,GAAI,CAAC,EAAG,EAAG,EAAG,CAAC,EACf,GAAI,EACN,EAAG,CACD,KAAM,CAAC,KAAM,IAAI,EACjB,GAAI,CAAC,EAAG,EAAG,GAAI,EAAE,EACjB,GAAI,EACN,CAAC,EACGC,GAAqB,CACvB,EAAG,SAAW3M,EAAG,CACf,OAAO,OAAOA,EAAI,CAAC,CACpB,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,CAAC,CACrB,EACD,EAAG,SAAWA,EAAG,CACf,MAAO,EACR,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,EAAI,IAAM,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,CAAC,CACvH,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIA,EAAI,KAAO,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,KAAO,GAAK,EAAI,CAAC,CAC/G,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,GAAKA,GAAK,EAAI,EAAI,CAAC,CACpD,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,EAAI,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,CAAC,CACjG,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIA,GAAK,GAAKA,GAAK,GAAK,EAAI,CAAC,CAClE,EACD,EAAG,SAAWA,EAAG,CACf,OAAO,OAAOA,GAAK,CAAC,CACrB,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIA,EAAI,EAAI,EAAIA,EAAI,GAAK,EAAI,CAAC,CACnE,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,GAAKA,GAAK,GAAK,EAAIA,GAAK,GAAKA,GAAK,GAAK,EAAIA,EAAI,GAAKA,EAAI,GAAK,EAAI,CAAC,CACtF,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,EAAI,IAAM,GAAKA,EAAI,KAAO,EAAE,CAC3C,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,IAAM,CAAC,CACtB,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAI,CAAC,CACvD,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,EAAI,IAAM,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,CAAC,CACxG,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,EAAI,IAAM,GAAKA,EAAI,KAAO,GAAK,EAAIA,IAAM,EAAI,EAAI,CAAC,CACjE,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,GAAKA,EAAI,IAAM,GAAKA,EAAI,KAAO,GAAK,EAAI,CAAC,CAC7D,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAI,CAAC,CAC1C,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,GAAKA,EAAI,IAAM,GAAKA,EAAI,IAAM,GAAK,EAAIA,EAAI,IAAM,IAAMA,EAAI,IAAM,GAAK,EAAI,CAAC,CAC5G,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,GAAKA,EAAI,IAAM,GAAKA,EAAI,IAAM,GAAK,EAAI,CAAC,CACzE,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,EAAI,KAAO,EAAI,EAAIA,EAAI,KAAO,EAAI,EAAIA,EAAI,KAAO,GAAKA,EAAI,KAAO,EAAI,EAAI,CAAC,CACzF,EACD,GAAI,SAAWA,EAAG,CAChB,OAAO,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,GAAKA,EAAI,GAAKA,EAAI,KAAOA,EAAI,IAAM,EAAI,EAAI,CAAC,CACjF,CACH,EACI4M,GAAyB,CAAC,KAAM,KAAM,IAAI,EAC1CC,GAAgB,CAClB,KAAM,EACN,IAAK,EACL,IAAK,EACL,IAAK,EACL,KAAM,EACN,MAAO,CACT,EAEA,SAASC,IAAc,CACrB,IAAIC,EAAQ,CAAA,EACZ,OAAAL,GAAK,QAAQ,SAAUM,EAAK,CAC1BA,EAAI,KAAK,QAAQ,SAAUxK,EAAG,CAC5BuK,EAAMvK,CAAC,EAAI,CACT,QAASwK,EAAI,GACb,QAASL,GAAmBK,EAAI,EAAE,CAC1C,CACA,CAAK,CACL,CAAG,EACMD,CACT,CAEA,IAAIE,GAAiB,UAAY,CAC/B,SAASA,EAAeC,EAAe,CACrC,IAAI9L,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElFlE,EAAgB,KAAM+P,CAAc,EAEpC,KAAK,cAAgBC,EACrB,KAAK,QAAU9L,EACf,KAAK,OAASc,EAAW,OAAO,gBAAgB,GAE3C,CAAC,KAAK,QAAQ,mBAAqB,KAAK,QAAQ,oBAAsB,QAAU,OAAO,KAAS,KAAe,CAAC,KAAK,eACxH,KAAK,QAAQ,kBAAoB,KACjC,KAAK,OAAO,MAAM,oJAAoJ,GAGxK,KAAK,MAAQ4K,IACd,CAED,OAAA1O,EAAa6O,EAAgB,CAAC,CAC5B,IAAK,UACL,MAAO,SAAiBrG,EAAK3J,EAAK,CAChC,KAAK,MAAM2J,CAAG,EAAI3J,CACnB,CACL,EAAK,CACD,IAAK,UACL,MAAO,SAAiBqO,EAAM,CAC5B,IAAIlK,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAI,KAAK,mBACP,GAAI,CACF,OAAO,IAAI,KAAK,YAAYkK,EAAM,CAChC,KAAMlK,EAAQ,QAAU,UAAY,UAChD,CAAW,CACF,MAAC,CACA,MACD,CAGH,OAAO,KAAK,MAAMkK,CAAI,GAAK,KAAK,MAAM,KAAK,cAAc,wBAAwBA,CAAI,CAAC,CACvF,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqBA,EAAM,CAChC,IAAIlK,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E+L,EAAO,KAAK,QAAQ7B,EAAMlK,CAAO,EAErC,OAAI,KAAK,mBACA+L,GAAQA,EAAK,gBAAiB,EAAC,iBAAiB,OAAS,EAG3DA,GAAQA,EAAK,QAAQ,OAAS,CACtC,CACL,EAAK,CACD,IAAK,sBACL,MAAO,SAA6B7B,EAAM1N,EAAK,CAC7C,IAAIwD,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAClF,OAAO,KAAK,YAAYkK,EAAMlK,CAAO,EAAE,IAAI,SAAUgJ,EAAQ,CAC3D,MAAO,GAAG,OAAOxM,CAAG,EAAE,OAAOwM,CAAM,CAC3C,CAAO,CACF,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqBkB,EAAM,CAChC,IAAIhJ,EAAQ,KAERlB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E+L,EAAO,KAAK,QAAQ7B,EAAMlK,CAAO,EAErC,OAAK+L,EAID,KAAK,mBACAA,EAAK,kBAAkB,iBAAiB,KAAK,SAAUC,EAAiBC,EAAiB,CAC9F,OAAOR,GAAcO,CAAe,EAAIP,GAAcQ,CAAe,CAC/E,CAAS,EAAE,IAAI,SAAUC,EAAgB,CAC/B,MAAO,GAAG,OAAOhL,EAAM,QAAQ,OAAO,EAAE,OAAOgL,CAAc,CACvE,CAAS,EAGIH,EAAK,QAAQ,IAAI,SAAUI,EAAQ,CACxC,OAAOjL,EAAM,UAAUgJ,EAAMiC,EAAQnM,CAAO,CACpD,CAAO,EAbQ,EAcV,CACL,EAAK,CACD,IAAK,YACL,MAAO,SAAmBkK,EAAMkC,EAAO,CACrC,IAAIpM,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E+L,EAAO,KAAK,QAAQ7B,EAAMlK,CAAO,EAErC,OAAI+L,EACE,KAAK,mBACA,GAAG,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAOA,EAAK,OAAOK,CAAK,CAAC,EAG3D,KAAK,yBAAyBL,EAAMK,CAAK,GAGlD,KAAK,OAAO,KAAK,6BAA6B,OAAOlC,CAAI,CAAC,EACnD,GACR,CACL,EAAK,CACD,IAAK,2BACL,MAAO,SAAkC6B,EAAMK,EAAO,CACpD,IAAIpF,EAAS,KAETqF,EAAMN,EAAK,MAAQA,EAAK,QAAQK,CAAK,EAAIL,EAAK,QAAQ,KAAK,IAAIK,CAAK,CAAC,EACrEpD,EAAS+C,EAAK,QAAQM,CAAG,EAEzB,KAAK,QAAQ,sBAAwBN,EAAK,QAAQ,SAAW,GAAKA,EAAK,QAAQ,CAAC,IAAM,IACpF/C,IAAW,EACbA,EAAS,SACAA,IAAW,IACpBA,EAAS,KAIb,IAAIsD,EAAe,UAAwB,CACzC,OAAOtF,EAAO,QAAQ,SAAWgC,EAAO,SAAQ,EAAKhC,EAAO,QAAQ,QAAUgC,EAAO,SAAU,EAAGA,EAAO,SAAQ,CACzH,EAEM,OAAI,KAAK,QAAQ,oBAAsB,KACjCA,IAAW,EAAU,GACrB,OAAOA,GAAW,SAAiB,WAAW,OAAOA,EAAO,SAAQ,CAAE,EACnEsD,EAAY,EACV,KAAK,QAAQ,oBAAsB,MAEnC,KAAK,QAAQ,sBAAwBP,EAAK,QAAQ,SAAW,GAAKA,EAAK,QAAQ,CAAC,IAAM,EADxFO,EAAY,EAKd,KAAK,QAAQ,SAAWD,EAAI,SAAQ,EAAK,KAAK,QAAQ,QAAUA,EAAI,SAAU,EAAGA,EAAI,SAAQ,CACrG,CACL,EAAK,CACD,IAAK,mBACL,MAAO,UAA4B,CACjC,MAAO,CAACb,GAAuB,SAAS,KAAK,QAAQ,iBAAiB,CACvE,CACF,CAAA,CAAC,EAEKK,CACT,IAEA,SAASU,GAAUnN,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAASkN,EAAgB7P,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAK0P,GAAU,OAAO7M,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAY6M,GAAU,OAAO7M,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,IAAI8P,GAAe,UAAY,CAC7B,SAASA,GAAe,CACtB,IAAIzM,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElFlE,EAAgB,KAAM2Q,CAAY,EAElC,KAAK,OAAS3L,EAAW,OAAO,cAAc,EAC9C,KAAK,QAAUd,EAEf,KAAK,OAASA,EAAQ,eAAiBA,EAAQ,cAAc,QAAU,SAAU/B,EAAO,CACtF,OAAOA,CACb,EAEI,KAAK,KAAK+B,CAAO,CAClB,CAED,OAAAhD,EAAayP,EAAc,CAAC,CAC1B,IAAK,OACL,MAAO,UAAgB,CACrB,IAAIzM,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC7EA,EAAQ,gBAAeA,EAAQ,cAAgB,CAClD,YAAa,EACrB,GACM,IAAI0M,EAAQ1M,EAAQ,cACpB,KAAK,OAAS0M,EAAM,SAAW,OAAYA,EAAM,OAAShJ,GAC1D,KAAK,YAAcgJ,EAAM,cAAgB,OAAYA,EAAM,YAAc,GACzE,KAAK,oBAAsBA,EAAM,sBAAwB,OAAYA,EAAM,oBAAsB,GACjG,KAAK,OAASA,EAAM,OAASnJ,GAAYmJ,EAAM,MAAM,EAAIA,EAAM,eAAiB,KAChF,KAAK,OAASA,EAAM,OAASnJ,GAAYmJ,EAAM,MAAM,EAAIA,EAAM,eAAiB,KAChF,KAAK,gBAAkBA,EAAM,gBAAkBA,EAAM,gBAAkBA,EAAM,iBAAmB,IAChG,KAAK,eAAiBA,EAAM,eAAiB,GAAKA,EAAM,gBAAkB,IAC1E,KAAK,eAAiB,KAAK,eAAiB,GAAKA,EAAM,gBAAkB,GACzE,KAAK,cAAgBA,EAAM,cAAgBnJ,GAAYmJ,EAAM,aAAa,EAAIA,EAAM,sBAAwBnJ,GAAY,KAAK,EAC7H,KAAK,cAAgBmJ,EAAM,cAAgBnJ,GAAYmJ,EAAM,aAAa,EAAIA,EAAM,sBAAwBnJ,GAAY,GAAG,EAC3H,KAAK,wBAA0BmJ,EAAM,wBAA0BA,EAAM,wBAA0BA,EAAM,yBAA2B,IAChI,KAAK,YAAcA,EAAM,YAAcA,EAAM,YAAc,IAC3D,KAAK,aAAeA,EAAM,eAAiB,OAAYA,EAAM,aAAe,GAC5E,KAAK,YAAW,CACjB,CACL,EAAK,CACD,IAAK,QACL,MAAO,UAAiB,CAClB,KAAK,SAAS,KAAK,KAAK,KAAK,OAAO,CACzC,CACL,EAAK,CACD,IAAK,cACL,MAAO,UAAuB,CAC5B,IAAIC,EAAY,GAAG,OAAO,KAAK,OAAQ,OAAO,EAAE,OAAO,KAAK,MAAM,EAClE,KAAK,OAAS,IAAI,OAAOA,EAAW,GAAG,EACvC,IAAIC,EAAoB,GAAG,OAAO,KAAK,MAAM,EAAE,OAAO,KAAK,eAAgB,OAAO,EAAE,OAAO,KAAK,cAAc,EAAE,OAAO,KAAK,MAAM,EAClI,KAAK,eAAiB,IAAI,OAAOA,EAAmB,GAAG,EACvD,IAAIC,EAAmB,GAAG,OAAO,KAAK,cAAe,OAAO,EAAE,OAAO,KAAK,aAAa,EACvF,KAAK,cAAgB,IAAI,OAAOA,EAAkB,GAAG,CACtD,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqBrJ,EAAKN,EAAMsC,EAAKxF,EAAS,CACnD,IAAIkB,EAAQ,KAER4L,EACA7O,EACA8O,EACA5J,EAAc,KAAK,SAAW,KAAK,QAAQ,eAAiB,KAAK,QAAQ,cAAc,kBAAoB,CAAA,EAE/G,SAAS6J,EAAUC,EAAK,CACtB,OAAOA,EAAI,QAAQ,MAAO,MAAM,CACjC,CAED,IAAIC,EAAe,SAAsB1Q,EAAK,CAC5C,GAAIA,EAAI,QAAQ0E,EAAM,eAAe,EAAI,EAAG,CAC1C,IAAIiB,EAAOc,GAAoBC,EAAMC,EAAa3G,CAAG,EACrD,OAAO0E,EAAM,aAAeA,EAAM,OAAOiB,EAAM,OAAWqD,EAAKgH,EAAgBA,EAAgBA,EAAgB,CAAE,EAAExM,CAAO,EAAGkD,CAAI,EAAG,GAAI,CACtI,iBAAkB1G,CAC9B,CAAW,CAAC,EAAI2F,CACP,CAED,IAAI5E,EAAIf,EAAI,MAAM0E,EAAM,eAAe,EACnCyB,EAAIpF,EAAE,MAAO,EAAC,KAAI,EAClB4P,EAAI5P,EAAE,KAAK2D,EAAM,eAAe,EAAE,OACtC,OAAOA,EAAM,OAAO+B,GAAoBC,EAAMC,EAAaR,CAAC,EAAGwK,EAAG3H,EAAKgH,EAAgBA,EAAgBA,EAAgB,CAAA,EAAIxM,CAAO,EAAGkD,CAAI,EAAG,GAAI,CAC9I,iBAAkBP,CACnB,CAAA,CAAC,CACV,EAEM,KAAK,YAAW,EAChB,IAAIyK,EAA8BpN,GAAWA,EAAQ,6BAA+B,KAAK,QAAQ,4BAC7FkJ,EAAkBlJ,GAAWA,EAAQ,eAAiBA,EAAQ,cAAc,kBAAoB,OAAYA,EAAQ,cAAc,gBAAkB,KAAK,QAAQ,cAAc,gBAC/KqN,EAAQ,CAAC,CACX,MAAO,KAAK,eACZ,UAAW,SAAmBJ,EAAK,CACjC,OAAOD,EAAUC,CAAG,CACrB,CACT,EAAS,CACD,MAAO,KAAK,OACZ,UAAW,SAAmBA,EAAK,CACjC,OAAO/L,EAAM,YAAc8L,EAAU9L,EAAM,OAAO+L,CAAG,CAAC,EAAID,EAAUC,CAAG,CACxE,CACT,CAAO,EACD,OAAAI,EAAM,QAAQ,SAAUC,EAAM,CAG5B,IAFAP,EAAW,EAEJD,EAAQQ,EAAK,MAAM,KAAK9J,CAAG,GAAG,CACnC,IAAI+J,EAAaT,EAAM,CAAC,EAAE,KAAI,EAG9B,GAFA7O,EAAQiP,EAAaK,CAAU,EAE3BtP,IAAU,OACZ,GAAI,OAAOmP,GAAgC,WAAY,CACrD,IAAII,EAAOJ,EAA4B5J,EAAKsJ,EAAO9M,CAAO,EAC1D/B,EAAQ,OAAOuP,GAAS,SAAWA,EAAO,EAC3C,SAAUxN,GAAWA,EAAQ,eAAeuN,CAAU,EACrDtP,EAAQ,WACCiL,EAAiB,CAC1BjL,EAAQ6O,EAAM,CAAC,EACf,QACd,MACc5L,EAAM,OAAO,KAAK,8BAA8B,OAAOqM,EAAY,qBAAqB,EAAE,OAAO/J,CAAG,CAAC,EAErGvF,EAAQ,QAED,OAAOA,GAAU,UAAY,CAACiD,EAAM,sBAC7CjD,EAAQ4D,GAAW5D,CAAK,GAG1B,IAAIwP,EAAYH,EAAK,UAAUrP,CAAK,EAYpC,GAXAuF,EAAMA,EAAI,QAAQsJ,EAAM,CAAC,EAAGW,CAAS,EAEjCvE,GACFoE,EAAK,MAAM,WAAarP,EAAM,OAC9BqP,EAAK,MAAM,WAAaR,EAAM,CAAC,EAAE,QAEjCQ,EAAK,MAAM,UAAY,EAGzBP,IAEIA,GAAY7L,EAAM,YACpB,KAEH,CACT,CAAO,EACMsC,CACR,CACL,EAAK,CACD,IAAK,OACL,MAAO,SAAcA,EAAK6H,EAAI,CAC5B,IAAIrE,EAAS,KAEThH,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9E8M,EACA7O,EAEAyP,EAAgBlB,EAAgB,CAAE,EAAExM,CAAO,EAE/C0N,EAAc,mBAAqB,GACnC,OAAOA,EAAc,aAErB,SAASC,EAAiBnR,EAAKoR,EAAkB,CAC/C,IAAIC,EAAM,KAAK,wBACf,GAAIrR,EAAI,QAAQqR,CAAG,EAAI,EAAG,OAAOrR,EACjC,IAAIyH,EAAIzH,EAAI,MAAM,IAAI,OAAO,GAAG,OAAOqR,EAAK,OAAO,CAAC,CAAC,EACjDC,EAAgB,IAAI,OAAO7J,EAAE,CAAC,CAAC,EACnCzH,EAAMyH,EAAE,CAAC,EACT6J,EAAgB,KAAK,YAAYA,EAAeJ,CAAa,EAC7D,IAAIK,EAAsBD,EAAc,MAAM,IAAI,EAC9CE,EAAsBF,EAAc,MAAM,IAAI,GAE9CC,GAAuBA,EAAoB,OAAS,IAAM,GAAK,CAACC,GAAuBA,EAAoB,OAAS,IAAM,KAC5HF,EAAgBA,EAAc,QAAQ,KAAM,GAAG,GAGjD,GAAI,CACFJ,EAAgB,KAAK,MAAMI,CAAa,EACpCF,IAAkBF,EAAgBlB,EAAgBA,EAAgB,CAAA,EAAIoB,CAAgB,EAAGF,CAAa,EAC3G,OAAQO,EAAP,CACA,YAAK,OAAO,KAAK,oDAAoD,OAAOzR,CAAG,EAAGyR,CAAC,EAC5E,GAAG,OAAOzR,CAAG,EAAE,OAAOqR,CAAG,EAAE,OAAOC,CAAa,CACvD,CAED,cAAOJ,EAAc,aACdlR,CACR,CAED,KAAOsQ,EAAQ,KAAK,cAAc,KAAKtJ,CAAG,GAAG,CAC3C,IAAI0K,EAAa,CAAA,EACbC,EAAW,GAEf,GAAIrB,EAAM,CAAC,EAAE,QAAQ,KAAK,eAAe,IAAM,IAAM,CAAC,OAAO,KAAKA,EAAM,CAAC,CAAC,EAAG,CAC3E,IAAIlF,EAAIkF,EAAM,CAAC,EAAE,MAAM,KAAK,eAAe,EAAE,IAAI,SAAUsB,EAAM,CAC/D,OAAOA,EAAK,MACxB,CAAW,EACDtB,EAAM,CAAC,EAAIlF,EAAE,MAAK,EAClBsG,EAAatG,EACbuG,EAAW,EACZ,CAGD,GADAlQ,EAAQoN,EAAGsC,EAAiB,KAAK,KAAMb,EAAM,CAAC,EAAE,KAAM,EAAEY,CAAa,EAAGA,CAAa,EACjFzP,GAAS6O,EAAM,CAAC,IAAMtJ,GAAO,OAAOvF,GAAU,SAAU,OAAOA,EAC/D,OAAOA,GAAU,WAAUA,EAAQ4D,GAAW5D,CAAK,GAElDA,IACH,KAAK,OAAO,KAAK,qBAAqB,OAAO6O,EAAM,CAAC,EAAG,eAAe,EAAE,OAAOtJ,CAAG,CAAC,EACnFvF,EAAQ,IAGNkQ,IACFlQ,EAAQiQ,EAAW,OAAO,SAAUrI,EAAGsH,EAAG,CACxC,OAAOnG,EAAO,OAAOnB,EAAGsH,EAAGnN,EAAQ,IAAKwM,EAAgBA,EAAgB,CAAA,EAAIxM,CAAO,EAAG,CAAA,EAAI,CACxF,iBAAkB8M,EAAM,CAAC,EAAE,KAAM,CAClC,CAAA,CAAC,CACd,EAAa7O,EAAM,KAAI,CAAE,GAGjBuF,EAAMA,EAAI,QAAQsJ,EAAM,CAAC,EAAG7O,CAAK,EACjC,KAAK,OAAO,UAAY,CACzB,CAED,OAAOuF,CACR,CACF,CAAA,CAAC,EAEKiJ,CACT,IAEA,SAAS4B,GAAUjP,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAASgP,EAAgB3R,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAKwR,GAAU,OAAO3O,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAY2O,GAAU,OAAO3O,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,SAAS4R,GAAeC,EAAW,CACjC,IAAIC,EAAaD,EAAU,YAAa,EAAC,KAAI,EACzCE,EAAgB,CAAA,EAEpB,GAAIF,EAAU,QAAQ,GAAG,EAAI,GAAI,CAC/B,IAAIjR,EAAIiR,EAAU,MAAM,GAAG,EAC3BC,EAAalR,EAAE,CAAC,EAAE,YAAa,EAAC,KAAI,EACpC,IAAIoR,EAASpR,EAAE,CAAC,EAAE,UAAU,EAAGA,EAAE,CAAC,EAAE,OAAS,CAAC,EAE9C,GAAIkR,IAAe,YAAcE,EAAO,QAAQ,GAAG,EAAI,EAChDD,EAAc,WAAUA,EAAc,SAAWC,EAAO,gBACpDF,IAAe,gBAAkBE,EAAO,QAAQ,GAAG,EAAI,EAC3DD,EAAc,QAAOA,EAAc,MAAQC,EAAO,YAClD,CACL,IAAIC,EAAOD,EAAO,MAAM,GAAG,EAC3BC,EAAK,QAAQ,SAAUC,EAAK,CAC1B,GAAKA,EAEL,KAAIC,EAAaD,EAAI,MAAM,GAAG,EAC1BE,EAAcjQ,GAASgQ,CAAU,EACjCtS,EAAMuS,EAAY,CAAC,EACnBC,EAAOD,EAAY,MAAM,CAAC,EAE1B9B,EAAM+B,EAAK,KAAK,GAAG,EAAE,KAAI,EAAG,QAAQ,WAAY,EAAE,EACjDN,EAAclS,EAAI,KAAM,CAAA,IAAGkS,EAAclS,EAAI,MAAM,EAAIyQ,GACxDA,IAAQ,UAASyB,EAAclS,EAAI,KAAI,CAAE,EAAI,IAC7CyQ,IAAQ,SAAQyB,EAAclS,EAAI,KAAI,CAAE,EAAI,IAC3C,MAAMyQ,CAAG,IAAGyB,EAAclS,EAAI,KAAI,CAAE,EAAI,SAASyQ,EAAK,EAAE,GACrE,CAAO,CACF,CACF,CAED,MAAO,CACL,WAAYwB,EACZ,cAAeC,CACnB,CACA,CAEA,SAASO,GAAsBC,EAAI,CACjC,IAAIC,EAAQ,CAAA,EACZ,OAAO,SAAyBlC,EAAKzH,EAAKxF,EAAS,CACjD,IAAIxD,EAAMgJ,EAAM,KAAK,UAAUxF,CAAO,EAClCoP,EAAYD,EAAM3S,CAAG,EAEzB,OAAK4S,IACHA,EAAYF,EAAG1J,EAAKxF,CAAO,EAC3BmP,EAAM3S,CAAG,EAAI4S,GAGRA,EAAUnC,CAAG,CACxB,CACA,CAEA,IAAIoC,GAAY,UAAY,CAC1B,SAASA,GAAY,CACnB,IAAIrP,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElFlE,EAAgB,KAAMuT,CAAS,EAE/B,KAAK,OAASvO,EAAW,OAAO,WAAW,EAC3C,KAAK,QAAUd,EACf,KAAK,QAAU,CACb,OAAQiP,GAAsB,SAAUzJ,EAAKxF,EAAS,CACpD,IAAIoP,EAAY,IAAI,KAAK,aAAa5J,EAAKxF,CAAO,EAClD,OAAO,SAAUiN,EAAK,CACpB,OAAOmC,EAAU,OAAOnC,CAAG,CACrC,CACA,CAAO,EACD,SAAUgC,GAAsB,SAAUzJ,EAAKxF,EAAS,CACtD,IAAIoP,EAAY,IAAI,KAAK,aAAa5J,EAAK8I,EAAgBA,EAAgB,CAAE,EAAEtO,CAAO,EAAG,GAAI,CAC3F,MAAO,UACR,CAAA,CAAC,EACF,OAAO,SAAUiN,EAAK,CACpB,OAAOmC,EAAU,OAAOnC,CAAG,CACrC,CACA,CAAO,EACD,SAAUgC,GAAsB,SAAUzJ,EAAKxF,EAAS,CACtD,IAAIoP,EAAY,IAAI,KAAK,eAAe5J,EAAK8I,EAAgB,CAAA,EAAItO,CAAO,CAAC,EACzE,OAAO,SAAUiN,EAAK,CACpB,OAAOmC,EAAU,OAAOnC,CAAG,CACrC,CACA,CAAO,EACD,aAAcgC,GAAsB,SAAUzJ,EAAKxF,EAAS,CAC1D,IAAIoP,EAAY,IAAI,KAAK,mBAAmB5J,EAAK8I,EAAgB,CAAA,EAAItO,CAAO,CAAC,EAC7E,OAAO,SAAUiN,EAAK,CACpB,OAAOmC,EAAU,OAAOnC,EAAKjN,EAAQ,OAAS,KAAK,CAC7D,CACA,CAAO,EACD,KAAMiP,GAAsB,SAAUzJ,EAAKxF,EAAS,CAClD,IAAIoP,EAAY,IAAI,KAAK,WAAW5J,EAAK8I,EAAgB,CAAA,EAAItO,CAAO,CAAC,EACrE,OAAO,SAAUiN,EAAK,CACpB,OAAOmC,EAAU,OAAOnC,CAAG,CACrC,CACA,CAAO,CACP,EACI,KAAK,KAAKjN,CAAO,CAClB,CAED,OAAAhD,EAAaqS,EAAW,CAAC,CACvB,IAAK,OACL,MAAO,SAAc5I,EAAU,CAC7B,IAAIzG,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAChF,cAAe,CAAE,CACzB,EACU0M,EAAQ1M,EAAQ,cACpB,KAAK,gBAAkB0M,EAAM,gBAAkBA,EAAM,gBAAkBA,EAAM,iBAAmB,GACjG,CACL,EAAK,CACD,IAAK,MACL,MAAO,SAAa4C,EAAMjE,EAAI,CAC5B,KAAK,QAAQiE,EAAK,YAAa,EAAC,KAAI,CAAE,EAAIjE,CAC3C,CACL,EAAK,CACD,IAAK,YACL,MAAO,SAAmBiE,EAAMjE,EAAI,CAClC,KAAK,QAAQiE,EAAK,YAAW,EAAG,MAAM,EAAIL,GAAsB5D,CAAE,CACnE,CACL,EAAK,CACD,IAAK,SACL,MAAO,SAAgBpN,EAAOsR,EAAS/J,EAAKxF,EAAS,CACnD,IAAIkB,EAAQ,KAERsO,EAAUD,EAAQ,MAAM,KAAK,eAAe,EAE5C5K,EAAS6K,EAAQ,OAAO,SAAUC,EAAK,EAAG,CAC5C,IAAIC,EAAkBnB,GAAe,CAAC,EAClCE,EAAaiB,EAAgB,WAC7BhB,EAAgBgB,EAAgB,cAEpC,GAAIxO,EAAM,QAAQuN,CAAU,EAAG,CAC7B,IAAIkB,EAAYF,EAEhB,GAAI,CACF,IAAIG,EAAa5P,GAAWA,EAAQ,cAAgBA,EAAQ,aAAaA,EAAQ,gBAAgB,GAAK,GAClGoB,EAAIwO,EAAW,QAAUA,EAAW,KAAO5P,EAAQ,QAAUA,EAAQ,KAAOwF,EAChFmK,EAAYzO,EAAM,QAAQuN,CAAU,EAAEgB,EAAKrO,EAAGkN,EAAgBA,EAAgBA,EAAgB,CAAE,EAAEI,CAAa,EAAG1O,CAAO,EAAG4P,CAAU,CAAC,CACxI,OAAQC,EAAP,CACA3O,EAAM,OAAO,KAAK2O,CAAK,CACxB,CAED,OAAOF,CACjB,MACUzO,EAAM,OAAO,KAAK,oCAAoC,OAAOuN,CAAU,CAAC,EAG1E,OAAOgB,CACR,EAAExR,CAAK,EACR,OAAO0G,CACR,CACF,CAAA,CAAC,EAEK0K,CACT,IAEA,SAASS,GAAU1Q,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAASyQ,GAAgBpT,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAKiT,GAAU,OAAOpQ,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAYoQ,GAAU,OAAOpQ,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,SAASqT,GAAezL,EAAS,CAAE,IAAIC,EAA4ByL,GAA2B,EAAI,OAAO,UAAgC,CAAE,IAAIvL,EAAQ3G,EAAgBwG,CAAO,EAAGI,EAAQ,GAAIH,EAA2B,CAAE,IAAII,EAAY7G,EAAgB,IAAI,EAAE,YAAa4G,EAAS,QAAQ,UAAUD,EAAO,UAAWE,CAAS,OAAYD,EAASD,EAAM,MAAM,KAAM,SAAS,EAAK,OAAO9G,GAA2B,KAAM+G,CAAM,CAAE,CAAK,CAE7a,SAASsL,IAA8B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAE,eAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,GAAI,UAAY,CAAE,CAAA,CAAC,EAAU,EAAO,MAAC,CAAY,MAAO,GAAU,CAE3U,SAASC,GAAcC,EAAGb,EAAM,CAC1Ba,EAAE,QAAQb,CAAI,IAAM,SACtB,OAAOa,EAAE,QAAQb,CAAI,EACrBa,EAAE,eAEN,CAEA,IAAIC,GAAY,SAAUhL,EAAe,CACvC5H,GAAU4S,EAAWhL,CAAa,EAElC,IAAIC,EAAS2K,GAAeI,CAAS,EAErC,SAASA,EAAUC,EAASC,EAAO7J,EAAU,CAC3C,IAAIvF,EAEAlB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,OAAAlE,EAAgB,KAAMsU,CAAS,EAE/BlP,EAAQmE,EAAO,KAAK,IAAI,EAEpB1B,IACF5C,EAAa,KAAK5D,EAAuB+D,CAAK,CAAC,EAGjDA,EAAM,QAAUmP,EAChBnP,EAAM,MAAQoP,EACdpP,EAAM,SAAWuF,EACjBvF,EAAM,cAAgBuF,EAAS,cAC/BvF,EAAM,QAAUlB,EAChBkB,EAAM,OAASJ,EAAW,OAAO,kBAAkB,EACnDI,EAAM,aAAe,GACrBA,EAAM,iBAAmBlB,EAAQ,kBAAoB,GACrDkB,EAAM,aAAe,EACrBA,EAAM,WAAalB,EAAQ,YAAc,EAAIA,EAAQ,WAAa,EAClEkB,EAAM,aAAelB,EAAQ,cAAgB,EAAIA,EAAQ,aAAe,IACxEkB,EAAM,MAAQ,GACdA,EAAM,MAAQ,GAEVA,EAAM,SAAWA,EAAM,QAAQ,MACjCA,EAAM,QAAQ,KAAKuF,EAAUzG,EAAQ,QAASA,CAAO,EAGhDkB,CACR,CAED,OAAAlE,EAAaoT,EAAW,CAAC,CACvB,IAAK,YACL,MAAO,SAAmBG,EAAW5J,EAAY3G,EAASwQ,EAAU,CAClE,IAAIxJ,EAAS,KAETyJ,EAAS,CAAA,EACTC,EAAU,CAAA,EACVC,EAAkB,CAAA,EAClBC,EAAmB,CAAA,EACvB,OAAAL,EAAU,QAAQ,SAAU/K,EAAK,CAC/B,IAAIqL,EAAmB,GACvBlK,EAAW,QAAQ,SAAUrB,EAAI,CAC/B,IAAIgK,EAAO,GAAG,OAAO9J,EAAK,GAAG,EAAE,OAAOF,CAAE,EAEpC,CAACtF,EAAQ,QAAUgH,EAAO,MAAM,kBAAkBxB,EAAKF,CAAE,EAC3D0B,EAAO,MAAMsI,CAAI,EAAI,EACZtI,EAAO,MAAMsI,CAAI,EAAI,IAActI,EAAO,MAAMsI,CAAI,IAAM,EAC/DoB,EAAQpB,CAAI,IAAM,SAAWoB,EAAQpB,CAAI,EAAI,KAEjDtI,EAAO,MAAMsI,CAAI,EAAI,EACrBuB,EAAmB,GACfH,EAAQpB,CAAI,IAAM,SAAWoB,EAAQpB,CAAI,EAAI,IAC7CmB,EAAOnB,CAAI,IAAM,SAAWmB,EAAOnB,CAAI,EAAI,IAC3CsB,EAAiBtL,CAAE,IAAM,SAAWsL,EAAiBtL,CAAE,EAAI,KAE3E,CAAS,EACIuL,IAAkBF,EAAgBnL,CAAG,EAAI,GACtD,CAAO,GAEG,OAAO,KAAKiL,CAAM,EAAE,QAAU,OAAO,KAAKC,CAAO,EAAE,SACrD,KAAK,MAAM,KAAK,CACd,QAASA,EACT,aAAc,OAAO,KAAKA,CAAO,EAAE,OACnC,OAAQ,CAAE,EACV,OAAQ,CAAE,EACV,SAAUF,CACpB,CAAS,EAGI,CACL,OAAQ,OAAO,KAAKC,CAAM,EAC1B,QAAS,OAAO,KAAKC,CAAO,EAC5B,gBAAiB,OAAO,KAAKC,CAAe,EAC5C,iBAAkB,OAAO,KAAKC,CAAgB,CACtD,CACK,CACL,EAAK,CACD,IAAK,SACL,MAAO,SAAgBtB,EAAMwB,EAAK5N,EAAM,CACtC,IAAIlB,EAAIsN,EAAK,MAAM,GAAG,EAClB9J,EAAMxD,EAAE,CAAC,EACTsD,EAAKtD,EAAE,CAAC,EACR8O,GAAK,KAAK,KAAK,gBAAiBtL,EAAKF,EAAIwL,CAAG,EAE5C5N,GACF,KAAK,MAAM,kBAAkBsC,EAAKF,EAAIpC,CAAI,EAG5C,KAAK,MAAMoM,CAAI,EAAIwB,EAAM,GAAK,EAC9B,IAAIC,EAAS,CAAA,EACb,KAAK,MAAM,QAAQ,SAAUZ,EAAG,CAC9BvN,GAASuN,EAAE,OAAQ,CAAC3K,CAAG,EAAGF,CAAE,EAC5B4K,GAAcC,EAAGb,CAAI,EACjBwB,GAAKX,EAAE,OAAO,KAAKW,CAAG,EAEtBX,EAAE,eAAiB,GAAK,CAACA,EAAE,OAC7B,OAAO,KAAKA,EAAE,MAAM,EAAE,QAAQ,SAAU/O,EAAG,CACpC2P,EAAO3P,CAAC,IAAG2P,EAAO3P,CAAC,EAAI,IAC5B,IAAI4P,EAAab,EAAE,OAAO/O,CAAC,EAEvB4P,EAAW,QACbA,EAAW,QAAQ,SAAU1L,EAAI,CAC3ByL,EAAO3P,CAAC,EAAEkE,CAAE,IAAM,SAAWyL,EAAO3P,CAAC,EAAEkE,CAAE,EAAI,GACjE,CAAe,CAEf,CAAW,EACD6K,EAAE,KAAO,GAELA,EAAE,OAAO,OACXA,EAAE,SAASA,EAAE,MAAM,EAEnBA,EAAE,SAAQ,EAGtB,CAAO,EACD,KAAK,KAAK,SAAUY,CAAM,EAC1B,KAAK,MAAQ,KAAK,MAAM,OAAO,SAAUZ,EAAG,CAC1C,MAAO,CAACA,EAAE,IAClB,CAAO,CACF,CACL,EAAK,CACD,IAAK,OACL,MAAO,SAAc3K,EAAKF,EAAI2L,EAAQ,CACpC,IAAIhI,EAAS,KAETiI,EAAQ,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAC5EC,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,KAAK,aAChFX,EAAW,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OACrD,GAAI,CAAChL,EAAI,OAAQ,OAAOgL,EAAS,KAAM,CAAA,CAAE,EAEzC,GAAI,KAAK,cAAgB,KAAK,iBAAkB,CAC9C,KAAK,aAAa,KAAK,CACrB,IAAKhL,EACL,GAAIF,EACJ,OAAQ2L,EACR,MAAOC,EACP,KAAMC,EACN,SAAUX,CACpB,CAAS,EACD,MACD,CAED,YAAK,eACE,KAAK,QAAQS,CAAM,EAAEzL,EAAKF,EAAI,SAAUwL,EAAK5N,EAAM,CAGxD,GAFA+F,EAAO,eAEHA,EAAO,aAAa,OAAS,EAAG,CAClC,IAAImI,EAAOnI,EAAO,aAAa,MAAK,EAEpCA,EAAO,KAAKmI,EAAK,IAAKA,EAAK,GAAIA,EAAK,OAAQA,EAAK,MAAOA,EAAK,KAAMA,EAAK,QAAQ,CACjF,CAED,GAAIN,GAAO5N,GAAQgO,EAAQjI,EAAO,WAAY,CAC5C,WAAW,UAAY,CACrBA,EAAO,KAAK,KAAKA,EAAQzD,EAAKF,EAAI2L,EAAQC,EAAQ,EAAGC,EAAO,EAAGX,CAAQ,CACxE,EAAEW,CAAI,EACP,MACD,CAEDX,EAASM,EAAK5N,CAAI,CAC1B,CAAO,CACF,CACL,EAAK,CACD,IAAK,iBACL,MAAO,SAAwBqN,EAAW5J,EAAY,CACpD,IAAI8C,EAAS,KAETzJ,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9EwQ,EAAW,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OAErD,GAAI,CAAC,KAAK,QACR,YAAK,OAAO,KAAK,gEAAgE,EAC1EA,GAAYA,IAGjB,OAAOD,GAAc,WAAUA,EAAY,KAAK,cAAc,mBAAmBA,CAAS,GAC1F,OAAO5J,GAAe,WAAUA,EAAa,CAACA,CAAU,GAC5D,IAAI8J,EAAS,KAAK,UAAUF,EAAW5J,EAAY3G,EAASwQ,CAAQ,EAEpE,GAAI,CAACC,EAAO,OAAO,OACjB,OAAKA,EAAO,QAAQ,QAAQD,EAAQ,EAC7B,KAGTC,EAAO,OAAO,QAAQ,SAAUnB,EAAM,CACpC7F,EAAO,QAAQ6F,CAAI,CAC3B,CAAO,CACF,CACL,EAAK,CACD,IAAK,OACL,MAAO,SAAciB,EAAW5J,EAAY6J,EAAU,CACpD,KAAK,eAAeD,EAAW5J,EAAY,CAAE,EAAE6J,CAAQ,CACxD,CACL,EAAK,CACD,IAAK,SACL,MAAO,SAAgBD,EAAW5J,EAAY6J,EAAU,CACtD,KAAK,eAAeD,EAAW5J,EAAY,CACzC,OAAQ,EACT,EAAE6J,CAAQ,CACZ,CACL,EAAK,CACD,IAAK,UACL,MAAO,SAAiBlB,EAAM,CAC5B,IAAI+B,EAAS,KAET1Q,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,GAC7EqB,EAAIsN,EAAK,MAAM,GAAG,EAClB9J,EAAMxD,EAAE,CAAC,EACTsD,EAAKtD,EAAE,CAAC,EACZ,KAAK,KAAKwD,EAAKF,EAAI,OAAQ,OAAW,OAAW,SAAUwL,EAAK5N,EAAM,CAChE4N,GAAKO,EAAO,OAAO,KAAK,GAAG,OAAO1Q,EAAQ,oBAAoB,EAAE,OAAO2E,EAAI,gBAAgB,EAAE,OAAOE,EAAK,SAAS,EAAGsL,CAAG,EACxH,CAACA,GAAO5N,GAAMmO,EAAO,OAAO,IAAI,GAAG,OAAO1Q,EAAQ,mBAAmB,EAAE,OAAO2E,EAAI,gBAAgB,EAAE,OAAOE,CAAG,EAAGtC,CAAI,EAEzHmO,EAAO,OAAO/B,EAAMwB,EAAK5N,CAAI,CACrC,CAAO,CACF,CACL,EAAK,CACD,IAAK,cACL,MAAO,SAAqBqN,EAAWpJ,EAAW3K,EAAK8U,EAAeC,EAAU,CAC9E,IAAIvR,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAI,KAAK,SAAS,OAAS,KAAK,SAAS,MAAM,oBAAsB,CAAC,KAAK,SAAS,MAAM,mBAAmBmH,CAAS,EAAG,CACvH,KAAK,OAAO,KAAK,qBAAsB,OAAO3K,EAAK,sBAAwB,EAAE,OAAO2K,EAAW,sBAAuB,EAAG,0NAA0N,EACnV,MACD,CAEwB3K,GAAQ,MAAQA,IAAQ,KAE7C,KAAK,SAAW,KAAK,QAAQ,QAC/B,KAAK,QAAQ,OAAO+T,EAAWpJ,EAAW3K,EAAK8U,EAAe,KAAMvB,GAAgBA,GAAgB,CAAE,EAAE/P,CAAO,EAAG,CAAA,EAAI,CACpH,SAAUuR,CACX,CAAA,CAAC,EAGA,GAAChB,GAAa,CAACA,EAAU,CAAC,IAC9B,KAAK,MAAM,YAAYA,EAAU,CAAC,EAAGpJ,EAAW3K,EAAK8U,CAAa,EACnE,CACF,CAAA,CAAC,EAEKlB,CACT,EAAErP,CAAY,EAEd,SAASyQ,IAAM,CACb,MAAO,CACL,MAAO,GACP,cAAe,GACf,GAAI,CAAC,aAAa,EAClB,UAAW,CAAC,aAAa,EACzB,YAAa,CAAC,KAAK,EACnB,WAAY,GACZ,cAAe,GACf,yBAA0B,GAC1B,KAAM,MACN,QAAS,GACT,qBAAsB,GACtB,aAAc,IACd,YAAa,IACb,gBAAiB,IACjB,iBAAkB,IAClB,wBAAyB,GACzB,YAAa,GACb,cAAe,GACf,cAAe,WACf,mBAAoB,GACpB,kBAAmB,GACnB,4BAA6B,GAC7B,YAAa,GACb,wBAAyB,GACzB,WAAY,GACZ,kBAAmB,GACnB,cAAe,GACf,WAAY,GACZ,sBAAuB,GACvB,uBAAwB,GACxB,4BAA6B,GAC7B,wBAAyB,GACzB,iCAAkC,SAAgB5R,EAAM,CACtD,IAAI6R,EAAM,CAAA,EAKV,GAJI7V,EAAQgE,EAAK,CAAC,CAAC,IAAM,WAAU6R,EAAM7R,EAAK,CAAC,GAC3C,OAAOA,EAAK,CAAC,GAAM,WAAU6R,EAAI,aAAe7R,EAAK,CAAC,GACtD,OAAOA,EAAK,CAAC,GAAM,WAAU6R,EAAI,aAAe7R,EAAK,CAAC,GAEtDhE,EAAQgE,EAAK,CAAC,CAAC,IAAM,UAAYhE,EAAQgE,EAAK,CAAC,CAAC,IAAM,SAAU,CAClE,IAAII,EAAUJ,EAAK,CAAC,GAAKA,EAAK,CAAC,EAC/B,OAAO,KAAKI,CAAO,EAAE,QAAQ,SAAUxD,EAAK,CAC1CiV,EAAIjV,CAAG,EAAIwD,EAAQxD,CAAG,CAChC,CAAS,CACF,CAED,OAAOiV,CACR,EACD,cAAe,CACb,YAAa,GACb,OAAQ,SAAgBxT,EAAOsR,EAAS/J,EAAKxF,EAAS,CACpD,OAAO/B,CACR,EACD,OAAQ,KACR,OAAQ,KACR,gBAAiB,IACjB,eAAgB,IAChB,cAAe,MACf,cAAe,IACf,wBAAyB,IACzB,YAAa,IACb,gBAAiB,EAClB,CACL,CACA,CACA,SAASyT,GAAiB1R,EAAS,CACjC,OAAI,OAAOA,EAAQ,IAAO,WAAUA,EAAQ,GAAK,CAACA,EAAQ,EAAE,GACxD,OAAOA,EAAQ,aAAgB,WAAUA,EAAQ,YAAc,CAACA,EAAQ,WAAW,GACnF,OAAOA,EAAQ,YAAe,WAAUA,EAAQ,WAAa,CAACA,EAAQ,UAAU,GAEhFA,EAAQ,eAAiBA,EAAQ,cAAc,QAAQ,QAAQ,EAAI,IACrEA,EAAQ,cAAgBA,EAAQ,cAAc,OAAO,CAAC,QAAQ,CAAC,GAG1DA,CACT,CAEA,SAAS2R,GAAUvS,EAAQC,EAAgB,CAAE,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAAOC,IAAkBE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CAAE,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAAW,CAAE,GAAKF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CAAE,CAAG,OAAOD,CAAO,CAE3V,SAASsS,EAAgBjV,EAAQ,CAAE,QAASE,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CAAE,IAAI6C,EAAS,UAAU7C,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EAAMA,EAAI,EAAK8U,GAAU,OAAOjS,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUlD,EAAK,CAAEwB,EAAgBrB,EAAQH,EAAKkD,EAAOlD,CAAG,CAAC,CAAI,CAAA,EAAc,OAAO,0BAA6B,OAAO,iBAAiBG,EAAQ,OAAO,0BAA0B+C,CAAM,CAAC,EAAYiS,GAAU,OAAOjS,CAAM,CAAC,EAAE,QAAQ,SAAUlD,EAAK,CAAE,OAAO,eAAeG,EAAQH,EAAK,OAAO,yBAAyBkD,EAAQlD,CAAG,CAAC,CAAE,CAAE,CAAM,CAAC,OAAOG,CAAS,CAE5hB,SAASkV,GAAetN,EAAS,CAAE,IAAIC,EAA4BsN,GAA2B,EAAI,OAAO,UAAgC,CAAE,IAAIpN,EAAQ3G,EAAgBwG,CAAO,EAAGI,EAAQ,GAAIH,EAA2B,CAAE,IAAII,EAAY7G,EAAgB,IAAI,EAAE,YAAa4G,EAAS,QAAQ,UAAUD,EAAO,UAAWE,CAAS,OAAYD,EAASD,EAAM,MAAM,KAAM,SAAS,EAAK,OAAO9G,GAA2B,KAAM+G,CAAM,CAAE,CAAK,CAE7a,SAASmN,IAA8B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAE,eAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,GAAI,UAAY,CAAE,CAAA,CAAC,EAAU,EAAO,MAAC,CAAY,MAAO,GAAU,CAE3U,SAASC,IAAO,CAAE,CAElB,SAASC,GAAoBC,EAAM,CACjC,IAAIC,EAAO,OAAO,oBAAoB,OAAO,eAAeD,CAAI,CAAC,EACjEC,EAAK,QAAQ,SAAUzC,EAAK,CACtB,OAAOwC,EAAKxC,CAAG,GAAM,aACvBwC,EAAKxC,CAAG,EAAIwC,EAAKxC,CAAG,EAAE,KAAKwC,CAAI,EAErC,CAAG,CACH,CAEA,IAAIE,GAAO,SAAU/M,EAAe,CAClC5H,GAAU2U,EAAM/M,CAAa,EAE7B,IAAIC,EAASwM,GAAeM,CAAI,EAEhC,SAASA,GAAO,CACd,IAAIjR,EAEAlB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9EwQ,EAAW,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OAkBrD,GAhBA1U,EAAgB,KAAMqW,CAAI,EAE1BjR,EAAQmE,EAAO,KAAK,IAAI,EAEpB1B,IACF5C,EAAa,KAAK5D,EAAuB+D,CAAK,CAAC,EAGjDA,EAAM,QAAUwQ,GAAiB1R,CAAO,EACxCkB,EAAM,SAAW,GACjBA,EAAM,OAASJ,EACfI,EAAM,QAAU,CACd,SAAU,CAAE,CAClB,EACI8Q,GAAoB7U,EAAuB+D,CAAK,CAAC,EAE7CsP,GAAY,CAACtP,EAAM,eAAiB,CAAClB,EAAQ,QAAS,CACxD,GAAI,CAACkB,EAAM,QAAQ,cACjB,OAAAA,EAAM,KAAKlB,EAASwQ,CAAQ,EAErB5S,GAA2BsD,EAAO/D,EAAuB+D,CAAK,CAAC,EAGxE,WAAW,UAAY,CACrBA,EAAM,KAAKlB,EAASwQ,CAAQ,CAC7B,EAAE,CAAC,CACL,CAED,OAAOtP,CACR,CAED,OAAAlE,EAAamV,EAAM,CAAC,CAClB,IAAK,OACL,MAAO,UAAgB,CACrB,IAAInL,EAAS,KAEThH,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9EwQ,EAAW,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OAEjD,OAAOxQ,GAAY,aACrBwQ,EAAWxQ,EACXA,EAAU,CAAA,GAGR,CAACA,EAAQ,WAAaA,EAAQ,YAAc,IAASA,EAAQ,KAC3D,OAAOA,EAAQ,IAAO,SACxBA,EAAQ,UAAYA,EAAQ,GACnBA,EAAQ,GAAG,QAAQ,aAAa,EAAI,IAC7CA,EAAQ,UAAYA,EAAQ,GAAG,CAAC,IAIpC,IAAIoS,EAAUZ,KACd,KAAK,QAAUI,EAAgBA,EAAgBA,EAAgB,CAAE,EAAEQ,CAAO,EAAG,KAAK,OAAO,EAAGV,GAAiB1R,CAAO,CAAC,EAEjH,KAAK,QAAQ,mBAAqB,OACpC,KAAK,QAAQ,cAAgB4R,EAAgBA,EAAgB,CAAA,EAAIQ,EAAQ,aAAa,EAAG,KAAK,QAAQ,aAAa,GAGjHpS,EAAQ,eAAiB,SAC3B,KAAK,QAAQ,wBAA0BA,EAAQ,cAG7CA,EAAQ,cAAgB,SAC1B,KAAK,QAAQ,uBAAyBA,EAAQ,aAGhD,SAASqS,EAAoBC,EAAe,CAC1C,OAAKA,EACD,OAAOA,GAAkB,WAAmB,IAAIA,EAC7CA,EAFoB,IAG5B,CAED,GAAI,CAAC,KAAK,QAAQ,QAAS,CACrB,KAAK,QAAQ,OACfxR,EAAW,KAAKuR,EAAoB,KAAK,QAAQ,MAAM,EAAG,KAAK,OAAO,EAEtEvR,EAAW,KAAK,KAAM,KAAK,OAAO,EAGpC,IAAIsO,EAEA,KAAK,QAAQ,UACfA,EAAY,KAAK,QAAQ,UAChB,OAAO,KAAS,MACzBA,EAAYC,IAGd,IAAIkD,EAAK,IAAI5H,GAAa,KAAK,OAAO,EACtC,KAAK,MAAQ,IAAIxF,GAAc,KAAK,QAAQ,UAAW,KAAK,OAAO,EACnE,IAAInD,EAAI,KAAK,SACbA,EAAE,OAASlB,EACXkB,EAAE,cAAgB,KAAK,MACvBA,EAAE,cAAgBuQ,EAClBvQ,EAAE,eAAiB,IAAI6J,GAAe0G,EAAI,CACxC,QAAS,KAAK,QAAQ,gBACtB,kBAAmB,KAAK,QAAQ,kBAChC,qBAAsB,KAAK,QAAQ,oBAC7C,CAAS,EAEGnD,IAAc,CAAC,KAAK,QAAQ,cAAc,QAAU,KAAK,QAAQ,cAAc,SAAWgD,EAAQ,cAAc,UAClHpQ,EAAE,UAAYqQ,EAAoBjD,CAAS,EAC3CpN,EAAE,UAAU,KAAKA,EAAG,KAAK,OAAO,EAChC,KAAK,QAAQ,cAAc,OAASA,EAAE,UAAU,OAAO,KAAKA,EAAE,SAAS,GAGzEA,EAAE,aAAe,IAAIyK,GAAa,KAAK,OAAO,EAC9CzK,EAAE,MAAQ,CACR,mBAAoB,KAAK,mBAAmB,KAAK,IAAI,CAC/D,EACQA,EAAE,iBAAmB,IAAIoO,GAAUiC,EAAoB,KAAK,QAAQ,OAAO,EAAGrQ,EAAE,cAAeA,EAAG,KAAK,OAAO,EAC9GA,EAAE,iBAAiB,GAAG,IAAK,SAAUb,EAAO,CAC1C,QAASjB,EAAO,UAAU,OAAQN,EAAO,IAAI,MAAMM,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAClGP,EAAKO,EAAO,CAAC,EAAI,UAAUA,CAAI,EAGjC6G,EAAO,KAAK,MAAMA,EAAQ,CAAC7F,CAAK,EAAE,OAAOvB,CAAI,CAAC,CACxD,CAAS,EAEG,KAAK,QAAQ,mBACfoC,EAAE,iBAAmBqQ,EAAoB,KAAK,QAAQ,gBAAgB,EACtErQ,EAAE,iBAAiB,KAAKA,EAAG,KAAK,QAAQ,UAAW,KAAK,OAAO,GAG7D,KAAK,QAAQ,aACfA,EAAE,WAAaqQ,EAAoB,KAAK,QAAQ,UAAU,EACtDrQ,EAAE,WAAW,MAAMA,EAAE,WAAW,KAAK,IAAI,GAG/C,KAAK,WAAa,IAAIwE,GAAW,KAAK,SAAU,KAAK,OAAO,EAC5D,KAAK,WAAW,GAAG,IAAK,SAAUrF,EAAO,CACvC,QAASf,EAAQ,UAAU,OAAQR,EAAO,IAAI,MAAMQ,EAAQ,EAAIA,EAAQ,EAAI,CAAC,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACxGT,EAAKS,EAAQ,CAAC,EAAI,UAAUA,CAAK,EAGnC2G,EAAO,KAAK,MAAMA,EAAQ,CAAC7F,CAAK,EAAE,OAAOvB,CAAI,CAAC,CACxD,CAAS,EACD,KAAK,QAAQ,SAAS,QAAQ,SAAUqC,EAAG,CACrCA,EAAE,MAAMA,EAAE,KAAK+E,CAAM,CACnC,CAAS,CACF,CAKD,GAHA,KAAK,OAAS,KAAK,QAAQ,cAAc,OACpCwJ,IAAUA,EAAWuB,IAEtB,KAAK,QAAQ,aAAe,CAAC,KAAK,SAAS,kBAAoB,CAAC,KAAK,QAAQ,IAAK,CACpF,IAAI9H,EAAQ,KAAK,SAAS,cAAc,iBAAiB,KAAK,QAAQ,WAAW,EAC7EA,EAAM,OAAS,GAAKA,EAAM,CAAC,IAAM,QAAO,KAAK,QAAQ,IAAMA,EAAM,CAAC,EACvE,CAEG,CAAC,KAAK,SAAS,kBAAoB,CAAC,KAAK,QAAQ,KACnD,KAAK,OAAO,KAAK,yDAAyD,EAG5E,IAAIuI,EAAW,CAAC,cAAe,oBAAqB,oBAAqB,mBAAmB,EAC5FA,EAAS,QAAQ,SAAUvB,EAAQ,CACjCjK,EAAOiK,CAAM,EAAI,UAAY,CAC3B,IAAIwB,EAEJ,OAAQA,EAAezL,EAAO,OAAOiK,CAAM,EAAE,MAAMwB,EAAc,SAAS,CACpF,CACA,CAAO,EACD,IAAIC,EAAkB,CAAC,cAAe,eAAgB,oBAAqB,sBAAsB,EACjGA,EAAgB,QAAQ,SAAUzB,EAAQ,CACxCjK,EAAOiK,CAAM,EAAI,UAAY,CAC3B,IAAI0B,EAEJ,OAACA,EAAgB3L,EAAO,OAAOiK,CAAM,EAAE,MAAM0B,EAAe,SAAS,EAE9D3L,CACjB,CACA,CAAO,EACD,IAAI4L,EAAWpR,KAEXqR,EAAO,UAAgB,CACzB,IAAIC,EAAS,SAAgBhC,EAAKiC,EAAG,CAC/B/L,EAAO,eAAiB,CAACA,EAAO,sBAAsBA,EAAO,OAAO,KAAK,uEAAuE,EACpJA,EAAO,cAAgB,GAClBA,EAAO,QAAQ,SAASA,EAAO,OAAO,IAAI,cAAeA,EAAO,OAAO,EAE5EA,EAAO,KAAK,cAAeA,EAAO,OAAO,EAEzC4L,EAAS,QAAQG,CAAC,EAClBvC,EAASM,EAAKiC,CAAC,CACzB,EAEQ,GAAI/L,EAAO,WAAaA,EAAO,QAAQ,mBAAqB,MAAQ,CAACA,EAAO,cAAe,OAAO8L,EAAO,KAAM9L,EAAO,EAAE,KAAKA,CAAM,CAAC,EAEpIA,EAAO,eAAeA,EAAO,QAAQ,IAAK8L,CAAM,CACxD,EAEM,OAAI,KAAK,QAAQ,WAAa,CAAC,KAAK,QAAQ,cAC1CD,IAEA,WAAWA,EAAM,CAAC,EAGbD,CACR,CACL,EAAK,CACD,IAAK,gBACL,MAAO,SAAuB7J,EAAU,CACtC,IAAIE,EAAS,KAETuH,EAAW,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIuB,GAC/EiB,EAAexC,EACf5G,EAAU,OAAOb,GAAa,SAAWA,EAAW,KAAK,SAG7D,GAFI,OAAOA,GAAa,aAAYiK,EAAejK,GAE/C,CAAC,KAAK,QAAQ,WAAa,KAAK,QAAQ,wBAAyB,CACnE,GAAIa,GAAWA,EAAQ,YAAa,IAAK,SAAU,OAAOoJ,IAC1D,IAAIvC,EAAS,CAAA,EAETwC,EAAS,SAAgBzN,EAAK,CAChC,GAAKA,EAEL,KAAIkD,EAAOO,EAAO,SAAS,cAAc,mBAAmBzD,CAAG,EAE/DkD,EAAK,QAAQ,SAAUtH,EAAG,CACpBqP,EAAO,QAAQrP,CAAC,EAAI,GAAGqP,EAAO,KAAKrP,CAAC,CACpD,CAAW,EACX,EAEQ,GAAKwI,EAMHqJ,EAAOrJ,CAAO,MANF,CACZ,IAAIqB,EAAY,KAAK,SAAS,cAAc,iBAAiB,KAAK,QAAQ,WAAW,EACrFA,EAAU,QAAQ,SAAU7J,EAAG,CAC7B,OAAO6R,EAAO7R,CAAC,CAC3B,CAAW,CACX,CAIY,KAAK,QAAQ,SACf,KAAK,QAAQ,QAAQ,QAAQ,SAAUA,EAAG,CACxC,OAAO6R,EAAO7R,CAAC,CAC3B,CAAW,EAGH,KAAK,SAAS,iBAAiB,KAAKqP,EAAQ,KAAK,QAAQ,GAAI,SAAUxC,EAAG,CACpE,CAACA,GAAK,CAAChF,EAAO,kBAAoBA,EAAO,UAAUA,EAAO,oBAAoBA,EAAO,QAAQ,EACjG+J,EAAa/E,CAAC,CACxB,CAAS,CACT,MACQ+E,EAAa,IAAI,CAEpB,CACL,EAAK,CACD,IAAK,kBACL,MAAO,SAAyBtK,EAAMpD,EAAIkL,EAAU,CAClD,IAAIoC,EAAWpR,KACf,OAAKkH,IAAMA,EAAO,KAAK,WAClBpD,IAAIA,EAAK,KAAK,QAAQ,IACtBkL,IAAUA,EAAWuB,IAC1B,KAAK,SAAS,iBAAiB,OAAOrJ,EAAMpD,EAAI,SAAUwL,EAAK,CAC7D8B,EAAS,QAAO,EAChBpC,EAASM,CAAG,CACpB,CAAO,EACM8B,CACR,CACL,EAAK,CACD,IAAK,MACL,MAAO,SAAa7M,EAAQ,CAC1B,GAAI,CAACA,EAAQ,MAAM,IAAI,MAAM,+FAA+F,EAC5H,GAAI,CAACA,EAAO,KAAM,MAAM,IAAI,MAAM,0FAA0F,EAE5H,OAAIA,EAAO,OAAS,YAClB,KAAK,QAAQ,QAAUA,IAGrBA,EAAO,OAAS,UAAYA,EAAO,KAAOA,EAAO,MAAQA,EAAO,SAClE,KAAK,QAAQ,OAASA,GAGpBA,EAAO,OAAS,qBAClB,KAAK,QAAQ,iBAAmBA,GAG9BA,EAAO,OAAS,eAClB,KAAK,QAAQ,WAAaA,GAGxBA,EAAO,OAAS,iBAClBD,GAAc,iBAAiBC,CAAM,EAGnCA,EAAO,OAAS,cAClB,KAAK,QAAQ,UAAYA,GAGvBA,EAAO,OAAS,YAClB,KAAK,QAAQ,SAAS,KAAKA,CAAM,EAG5B,IACR,CACL,EAAK,CACD,IAAK,sBACL,MAAO,SAA6B3E,EAAG,CACrC,GAAI,GAACA,GAAK,CAAC,KAAK,YACZ,GAAC,SAAU,KAAK,EAAE,QAAQA,CAAC,EAAI,IAEnC,QAAS8R,EAAK,EAAGA,EAAK,KAAK,UAAU,OAAQA,IAAM,CACjD,IAAIC,EAAY,KAAK,UAAUD,CAAE,EACjC,GAAI,GAAC,SAAU,KAAK,EAAE,QAAQC,CAAS,EAAI,KAEvC,KAAK,MAAM,4BAA4BA,CAAS,EAAG,CACrD,KAAK,iBAAmBA,EACxB,KACD,CACF,CACF,CACL,EAAK,CACD,IAAK,iBACL,MAAO,SAAwB3N,EAAKgL,EAAU,CAC5C,IAAI/G,EAAS,KAEb,KAAK,qBAAuBjE,EAC5B,IAAIoN,EAAWpR,KACf,KAAK,KAAK,mBAAoBgE,CAAG,EAEjC,IAAI4N,EAAc,SAAqBhS,EAAG,CACxCqI,EAAO,SAAWrI,EAClBqI,EAAO,UAAYA,EAAO,SAAS,cAAc,mBAAmBrI,CAAC,EACrEqI,EAAO,iBAAmB,OAE1BA,EAAO,oBAAoBrI,CAAC,CACpC,EAEUiS,EAAO,SAAcvC,EAAK1P,EAAG,CAC3BA,GACFgS,EAAYhS,CAAC,EAEbqI,EAAO,WAAW,eAAerI,CAAC,EAElCqI,EAAO,qBAAuB,OAE9BA,EAAO,KAAK,kBAAmBrI,CAAC,EAEhCqI,EAAO,OAAO,IAAI,kBAAmBrI,CAAC,GAEtCqI,EAAO,qBAAuB,OAGhCmJ,EAAS,QAAQ,UAAY,CAC3B,OAAOnJ,EAAO,EAAE,MAAMA,EAAQ,SAAS,CACjD,CAAS,EACG+G,GAAUA,EAASM,EAAK,UAAY,CACtC,OAAOrH,EAAO,EAAE,MAAMA,EAAQ,SAAS,CACjD,CAAS,CACT,EAEU6J,EAAS,SAAgB5K,EAAM,CAC7B,CAAClD,GAAO,CAACkD,GAAQe,EAAO,SAAS,mBAAkBf,EAAO,IAC9D,IAAItH,EAAI,OAAOsH,GAAS,SAAWA,EAAOe,EAAO,SAAS,cAAc,sBAAsBf,CAAI,EAE9FtH,IACGqI,EAAO,UACV2J,EAAYhS,CAAC,EAGVqI,EAAO,WAAW,UAAUA,EAAO,WAAW,eAAerI,CAAC,EAC/DqI,EAAO,SAAS,kBAAkBA,EAAO,SAAS,iBAAiB,kBAAkBrI,CAAC,GAG5FqI,EAAO,cAAcrI,EAAG,SAAU0P,EAAK,CACrCuC,EAAKvC,EAAK1P,CAAC,CACrB,CAAS,CACT,EAEM,MAAI,CAACoE,GAAO,KAAK,SAAS,kBAAoB,CAAC,KAAK,SAAS,iBAAiB,MAC5E8N,EAAO,KAAK,SAAS,iBAAiB,OAAQ,CAAA,EACrC,CAAC9N,GAAO,KAAK,SAAS,kBAAoB,KAAK,SAAS,iBAAiB,MAClF,KAAK,SAAS,iBAAiB,OAAO8N,CAAM,EAE5CA,EAAO9N,CAAG,EAGLoN,CACR,CACL,EAAK,CACD,IAAK,YACL,MAAO,SAAmBpN,EAAKF,EAAIiO,EAAW,CAC5C,IAAIlC,EAAS,KAETmC,EAAS,SAASA,EAAOhX,EAAKoS,EAAM,CACtC,IAAI5O,EAEJ,GAAIpE,EAAQgT,CAAI,IAAM,SAAU,CAC9B,QAAStO,EAAQ,UAAU,OAAQ0O,EAAO,IAAI,MAAM1O,EAAQ,EAAIA,EAAQ,EAAI,CAAC,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACxGyO,EAAKzO,EAAQ,CAAC,EAAI,UAAUA,CAAK,EAGnCP,EAAUqR,EAAO,QAAQ,iCAAiC,CAAC7U,EAAKoS,CAAI,EAAE,OAAOI,CAAI,CAAC,CAC5F,MACUhP,EAAU4R,EAAgB,GAAIhD,CAAI,EAGpC5O,EAAQ,IAAMA,EAAQ,KAAOwT,EAAO,IACpCxT,EAAQ,KAAOA,EAAQ,MAAQwT,EAAO,KACtCxT,EAAQ,GAAKA,EAAQ,IAAMwT,EAAO,GAClCxT,EAAQ,UAAYA,EAAQ,WAAauT,GAAaC,EAAO,UAC7D,IAAIzP,EAAesN,EAAO,QAAQ,cAAgB,IAC9CoC,EAAYzT,EAAQ,UAAY,GAAG,OAAOA,EAAQ,SAAS,EAAE,OAAO+D,CAAY,EAAE,OAAOvH,CAAG,EAAIA,EACpG,OAAO6U,EAAO,EAAEoC,EAAWzT,CAAO,CAC1C,EAEM,OAAI,OAAOwF,GAAQ,SACjBgO,EAAO,IAAMhO,EAEbgO,EAAO,KAAOhO,EAGhBgO,EAAO,GAAKlO,EACZkO,EAAO,UAAYD,EACZC,CACR,CACL,EAAK,CACD,IAAK,IACL,MAAO,UAAa,CAClB,IAAIE,EAEJ,OAAO,KAAK,aAAeA,EAAmB,KAAK,YAAY,UAAU,MAAMA,EAAkB,SAAS,CAC3G,CACL,EAAK,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,IAAIC,EAEJ,OAAO,KAAK,aAAeA,EAAoB,KAAK,YAAY,OAAO,MAAMA,EAAmB,SAAS,CAC1G,CACL,EAAK,CACD,IAAK,sBACL,MAAO,SAA6BrO,EAAI,CACtC,KAAK,QAAQ,UAAYA,CAC1B,CACL,EAAK,CACD,IAAK,qBACL,MAAO,SAA4BA,EAAI,CACrC,IAAIsO,EAAS,KAET5T,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAI,CAAC,KAAK,cACR,YAAK,OAAO,KAAK,kDAAmD,KAAK,SAAS,EAC3E,GAGT,GAAI,CAAC,KAAK,WAAa,CAAC,KAAK,UAAU,OACrC,YAAK,OAAO,KAAK,6DAA8D,KAAK,SAAS,EACtF,GAGT,IAAIwF,EAAM,KAAK,kBAAoB,KAAK,UAAU,CAAC,EAC/CqO,EAAc,KAAK,QAAU,KAAK,QAAQ,YAAc,GACxDC,EAAU,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EACtD,GAAItO,EAAI,YAAW,IAAO,SAAU,MAAO,GAE3C,IAAIuO,EAAiB,SAAwB3S,EAAGxC,EAAG,CACjD,IAAIoV,EAAYJ,EAAO,SAAS,iBAAiB,MAAM,GAAG,OAAOxS,EAAG,GAAG,EAAE,OAAOxC,CAAC,CAAC,EAElF,OAAOoV,IAAc,IAAMA,IAAc,CACjD,EAEM,GAAIhU,EAAQ,SAAU,CACpB,IAAIiU,EAAYjU,EAAQ,SAAS,KAAM+T,CAAc,EACrD,GAAIE,IAAc,OAAW,OAAOA,CACrC,CAID,MAFI,QAAK,kBAAkBzO,EAAKF,CAAE,GAC9B,CAAC,KAAK,SAAS,iBAAiB,SAAW,KAAK,QAAQ,WAAa,CAAC,KAAK,QAAQ,yBACnFyO,EAAevO,EAAKF,CAAE,IAAM,CAACuO,GAAeE,EAAeD,EAASxO,CAAE,GAE3E,CACL,EAAK,CACD,IAAK,iBACL,MAAO,SAAwBA,EAAIkL,EAAU,CAC3C,IAAI0D,EAAS,KAETtB,EAAWpR,KAEf,OAAK,KAAK,QAAQ,IAKd,OAAO8D,GAAO,WAAUA,EAAK,CAACA,CAAE,GACpCA,EAAG,QAAQ,SAAU1G,EAAG,CAClBsV,EAAO,QAAQ,GAAG,QAAQtV,CAAC,EAAI,GAAGsV,EAAO,QAAQ,GAAG,KAAKtV,CAAC,CACtE,CAAO,EACD,KAAK,cAAc,SAAUkS,EAAK,CAChC8B,EAAS,QAAO,EACZpC,GAAUA,EAASM,CAAG,CAClC,CAAO,EACM8B,IAZLpC,GAAYA,EAAQ,EACb,QAAQ,UAYlB,CACL,EAAK,CACD,IAAK,gBACL,MAAO,SAAuB9H,EAAM8H,EAAU,CAC5C,IAAIoC,EAAWpR,KACX,OAAOkH,GAAS,WAAUA,EAAO,CAACA,CAAI,GAC1C,IAAIyL,EAAY,KAAK,QAAQ,SAAW,CAAA,EACpCC,EAAU1L,EAAK,OAAO,SAAUlD,EAAK,CACvC,OAAO2O,EAAU,QAAQ3O,CAAG,EAAI,CACxC,CAAO,EAED,OAAK4O,EAAQ,QAKb,KAAK,QAAQ,QAAUD,EAAU,OAAOC,CAAO,EAC/C,KAAK,cAAc,SAAUtD,EAAK,CAChC8B,EAAS,QAAO,EACZpC,GAAUA,EAASM,CAAG,CAClC,CAAO,EACM8B,IATDpC,GAAUA,IACP,QAAQ,UASlB,CACL,EAAK,CACD,IAAK,MACL,MAAO,SAAahL,EAAK,CAEvB,GADKA,IAAKA,EAAM,KAAK,mBAAqB,KAAK,WAAa,KAAK,UAAU,OAAS,EAAI,KAAK,UAAU,CAAC,EAAI,KAAK,WAC7G,CAACA,EAAK,MAAO,MACjB,IAAI6O,EAAU,CAAC,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,MAAO,MAAO,MAAO,MAAO,KAAM,MAAO,KAAK,EACrb,OAAOA,EAAQ,QAAQ,KAAK,SAAS,cAAc,wBAAwB7O,CAAG,CAAC,EAAI,IAAMA,EAAI,YAAW,EAAG,QAAQ,OAAO,EAAI,EAAI,MAAQ,KAC3I,CACL,EAAK,CACD,IAAK,gBACL,MAAO,UAAyB,CAC9B,IAAI8O,EAAS,KAETtU,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9EwQ,EAAW,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIuB,GAE/EwC,EAAgB3C,EAAgBA,EAAgBA,EAAgB,CAAE,EAAE,KAAK,OAAO,EAAG5R,CAAO,EAAG,CAC/F,QAAS,EACjB,CAAO,EAEGwU,EAAQ,IAAIrC,EAAKoC,CAAa,GAE9BvU,EAAQ,QAAU,QAAaA,EAAQ,SAAW,UACpDwU,EAAM,OAASA,EAAM,OAAO,MAAMxU,CAAO,GAG3C,IAAIyU,EAAgB,CAAC,QAAS,WAAY,UAAU,EACpD,OAAAA,EAAc,QAAQ,SAAUxS,EAAG,CACjCuS,EAAMvS,CAAC,EAAIqS,EAAOrS,CAAC,CAC3B,CAAO,EACDuS,EAAM,SAAW5C,EAAgB,CAAE,EAAE,KAAK,QAAQ,EAClD4C,EAAM,SAAS,MAAQ,CACrB,mBAAoBA,EAAM,mBAAmB,KAAKA,CAAK,CAC/D,EACMA,EAAM,WAAa,IAAIhO,GAAWgO,EAAM,SAAUA,EAAM,OAAO,EAC/DA,EAAM,WAAW,GAAG,IAAK,SAAUrT,EAAO,CACxC,QAASX,EAAQ,UAAU,OAAQZ,EAAO,IAAI,MAAMY,EAAQ,EAAIA,EAAQ,EAAI,CAAC,EAAGC,EAAQ,EAAGA,EAAQD,EAAOC,IACxGb,EAAKa,EAAQ,CAAC,EAAI,UAAUA,CAAK,EAGnC+T,EAAM,KAAK,MAAMA,EAAO,CAACrT,CAAK,EAAE,OAAOvB,CAAI,CAAC,CACpD,CAAO,EACD4U,EAAM,KAAKD,EAAe/D,CAAQ,EAClCgE,EAAM,WAAW,QAAUA,EAAM,QACjCA,EAAM,WAAW,iBAAiB,SAAS,MAAQ,CACjD,mBAAoBA,EAAM,mBAAmB,KAAKA,CAAK,CAC/D,EACaA,CACR,CACL,EAAK,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,MAAO,CACL,QAAS,KAAK,QACd,MAAO,KAAK,MACZ,SAAU,KAAK,SACf,UAAW,KAAK,UAChB,iBAAkB,KAAK,gBAC/B,CACK,CACF,CAAA,CAAC,EAEKrC,CACT,EAAEpR,CAAY,EAEd/C,EAAgBmU,GAAM,iBAAkB,UAAY,CAClD,IAAInS,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAC9EwQ,EAAW,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OACrD,OAAO,IAAI2B,GAAKnS,EAASwQ,CAAQ,CACnC,CAAC,EAED,IAAIzU,EAAWoW,GAAK,iBACpBpW,EAAS,eAAiBoW,GAAK,eAEVpW,EAAS,eACnBA,EAAS,KACAA,EAAS,cACPA,EAAS,gBACrBA,EAAS,IACEA,EAAS,eACdA,EAAS,UACjBA,EAAS,EACJA,EAAS,OACIA,EAAS,oBACVA,EAAS,mBACbA,EAAS,eACVA,EAAS,cC5xF7B,SAAS2Y,GAAiBC,EAAoBC,EAA+B,CACzE,MAAMC,EAAoB,CAAA,EACpBC,EAAoB,CAAA,EACpBC,EAAsB,CAAA,EACnBH,EAAA,QAASI,GAAQ,CACtBH,EAAYG,CAAG,EAAI,KACnBF,EAAYE,CAAG,EAAI,IACnBD,EAAcC,CAAG,EAAI,CAAA,CACxB,EACUL,EAAA,QAASM,GAAW,CAClBL,EAAA,QAASI,GAAQ,CACVH,EAAAG,CAAG,EAAI,KAAK,IAAIC,EAAOD,CAAG,EAAGH,EAAYG,CAAG,CAAC,EAC7CF,EAAAE,CAAG,EAAI,KAAK,IAAIC,EAAOD,CAAG,EAAGF,EAAYE,CAAG,CAAC,CAAA,CAC5D,CAAA,CACJ,EACD,MAAME,EAAkB,CAAA,EACb,OAAAP,EAAA,QAASM,GAAW,CACrB,MAAAE,EAAkB,CAAE,GAAGF,GACpBL,EAAA,QAASI,GAAQ,CACtBD,EAAcC,CAAG,GAAK,KAAK,IAAIG,EAAUH,CAAG,CAAC,CAAA,CAChD,EACDE,EAAQ,KAAKC,CAAS,CAAA,CACzB,EACOD,EAAA,QAASD,GAAW,CACfL,EAAA,QAASI,GAAQ,CACfC,EAAAD,CAAG,GAAKD,EAAcC,CAAG,CAAA,CACnC,CAAA,CACJ,EACM,CACH,eAAgBE,EAChB,YAAAL,EACA,YAAAC,EACA,cAAAC,CAAA,CAER,CAuCO,SAASK,GACZlS,EACAmS,EACAC,EACAV,EACsC,CAChC,KAAA,CAAE,eAAAW,EAAgB,YAAAV,EAAa,YAAAC,EAAa,cAAAC,GAAkBL,GAAiBxR,EAAM0R,CAAQ,EACnG,IAAIY,EAAW,IACXC,EAAW,GACf,OAAS,CAACjZ,EAAKkZ,CAAS,IAAKL,EAAc,CACvC,IAAIM,EAAM,EACV,QAASV,KAAUM,EAAgB,CAC/B,IAAI5Y,EAAS+Y,EAAU,KAAME,GAClBN,EAAW,MAAOO,GAAQZ,EAAOY,CAAG,IAAMD,EAAYC,CAAG,CAAC,CACpE,EACGlZ,EACSiY,EAAA,QAASI,GAAQ,CACtB,IAAIc,EAAc,OAAOnZ,EAAQqY,CAAG,GAAM,UAAY,CAAC,MAAMrY,EAAQqY,CAAG,CAAC,EAAIrY,EAAQqY,CAAG,EAAI,EAC9Ec,EAAAA,EAAcf,EAAcC,CAAG,EAC7CW,GAAO,KAAK,IAAIV,EAAOD,CAAG,EAAIc,CAAW,CAAA,CAC5C,EAEQlB,EAAA,QAASI,GAAQ,CACtBW,GAAO,KAAK,IAAIV,EAAOD,CAAG,CAAC,CAAA,CAC9B,CAET,CACIW,EAAMH,IACKA,EAAAG,EACAF,EAAAjZ,EAEnB,CACA,OAAAgZ,GAAYZ,EAAS,OAAS,EACvB,CAAE,SAAAa,EAAU,SAAAD,EACvB,CAEO,SAASO,GACZ7S,EACAmS,EACAC,EACAV,EAC0C,CAEpC,KAAA,CAAE,eAAAW,EAAgB,YAAAV,EAAa,YAAAC,EAAa,cAAAC,GAAkBL,GAAiBxR,EAAM0R,CAAQ,EACnG,IAAIoB,EAAa,KACbC,EAAa,GACjB,OAAS,CAACzZ,EAAKkZ,CAAS,IAAKL,EAAc,CAEvC,KAAM,CAAE,eAAgBa,CAAA,EAAwBxB,GAAiBgB,EAAWd,CAAQ,EACpF,IAAIe,EAAM,EACV,QAASV,KAAUM,EAAgB,CAC/B,IAAI5Y,EAASuZ,EAAoB,KAAMN,GAC5BN,EAAW,MAAOO,GAAQZ,EAAOY,CAAG,IAAMD,EAAYC,CAAG,CAAC,CACpE,EACGlZ,EACSiY,EAAA,QAASI,GAAQ,CACtB,IAAIc,EAAc,OAAOnZ,EAAQqY,CAAG,GAAM,UAAY,CAAC,MAAMrY,EAAQqY,CAAG,CAAC,EAAIrY,EAAQqY,CAAG,EAAI,EAC5FW,GAAO,KAAK,IAAIV,EAAOD,CAAG,EAAIc,CAAW,CAAA,CAC5C,EAEQlB,EAAA,QAASI,GAAQ,CACtBW,GAAO,KAAK,IAAIV,EAAOD,CAAG,CAAC,CAAA,CAC9B,CAET,CACIW,EAAMK,IACOA,EAAAL,EACAM,EAAAzZ,EAErB,CACA,OAAAwZ,GAAcpB,EAAS,OAAS,EACzB,CAAE,WAAAqB,EAAY,WAAAD,EACzB,CAwCgB,SAAAG,GAA6BC,EAAkBd,EAAsBV,EAAkC,CACnH,MAAMyB,EAA2B,CAAA,EACtB,OAAAf,EAAA,QAASO,GAAQ,CACxBQ,EAAW,KAAK,CACZ,KAAM,WACN,MAAO,IAAI,IAAID,EAAQP,CAAG,CAAC,EAC3B,IAAKA,CAAA,CACR,CAAA,CACJ,EACMQ,CACX,CAEgB,SAAAC,GAAmBpT,EAAcmT,EAAkC,CAaxE,OAZYnT,EAAK,OAAQ+R,GACrBoB,EAAW,MAAOE,GACjBA,EAAI,OAAS,aAETtB,EAAOsB,EAAI,GAAG,GAAMA,EAAI,MAA2B,CAAC,GACpDtB,EAAOsB,EAAI,GAAG,GAAMA,EAAI,MAA2B,CAAC,EAGhDA,EAAI,MAAmB,IAAItB,EAAOsB,EAAI,GAAG,CAAC,CAEzD,CACJ,CAEL,CCvNA,SAASC,GAAStT,EAAM,CACpB,OAAOA,EAAK,IAAI0E,IAAM,CAClB,GAAGA,CACN,EAAC,CACN,CACA,SAAS6O,GAAgB9B,EAAY+B,EAAW,CAC5C,OAAO/B,EAAW,MAAMM,GACb,OAAOA,EAAOyB,CAAS,GAAM,UAC7B,OAAOzB,EAAOyB,CAAS,EAAM,KAC7BzB,EAAOyB,CAAS,IAAM,IAChC,CACL,CACA,SAASC,GAAiBhC,EAAY+B,EAAW,CAC7C,OAAO/B,EAAW,MAAMM,GACb,CAAC,MAAM,CAACA,EAAOyB,CAAS,CAAC,GACzB,OAAOzB,EAAOyB,CAAS,EAAM,KAC7BzB,EAAOyB,CAAS,IAAM,IAChC,CACL,CAQA,MAAME,GAAa,CACf,8CACA,2CACA,6BACA,2EACJ,EACA,SAASC,GAAYlC,EAAY+B,EAAW,CACxC,OAAO/B,EAAW,MAAMM,GAEhB,CAAC,MAAM,OAAOA,EAAOyB,CAAS,CAAC,CAAC,GAAK,OAAOzB,EAAOyB,CAAS,CAAC,GAAK,MAAQ,OAAOzB,EAAOyB,CAAS,CAAC,GAAK,KAChG,GAEH,OAAOzB,EAAOyB,CAAS,GAAM,UAE9BE,GAAW,KAAK7K,GAAQA,EAAK,KAAKkJ,EAAOyB,CAAS,CAAC,CAAC,GACpD,OAAOzB,EAAOyB,CAAS,EAAM,KAC7BzB,EAAOyB,CAAS,IAAM,IAChC,CACL,CAiCA,SAASI,GAAYnC,EAAYoC,EAAO,CACpC,MAAMC,EAAU,IAAI,IACpB,QAASC,KAAOtC,EAAY,CACxB,IAAIuC,EAASD,EAAIF,CAAK,EACjBC,EAAQ,IAAIE,CAAM,GACnBF,EAAQ,IAAIE,EAAQ,CAAC,EAEzBF,EAAQ,IAAIE,EAAQF,EAAQ,IAAIE,CAAM,EAAI,CAAC,CAC9C,CACD,MAAO,CAAC,GAAGF,EAAQ,QAAO,CAAE,CAChC,CCtFO,SAASG,GAAWC,EAAUC,EAAMC,EAAM,CAC7C,GAAI,OAAOF,EAAa,KAAe,OAAOC,EAAS,KAAe,OAAOC,EAAS,IAClF,MAAO,GAEX,IAAIC,EAAU,IAAI,IACdC,EAAU,IAAI,IACdC,EAAW,EACf,QAASC,KAAKL,EACVE,EAAQ,IAAIG,EAAG,CAAC,EAEpB,QAASC,KAAKL,EACVE,EAAQ,IAAIG,EAAG,CAAC,EAEpB,OAAS,CAACD,EAAGE,CAAI,IAAKR,EAClB,OAAS,CAACO,EAAGX,CAAO,IAAKY,EACrBL,EAAQ,IAAIG,EAAGH,EAAQ,IAAIG,CAAC,EAAIV,CAAO,EACvCQ,EAAQ,IAAIG,EAAGH,EAAQ,IAAIG,CAAC,EAAIX,CAAO,EACvCS,GAAYT,EAGpB,IAAIa,EAAO,EACX,OAAS,CAACH,EAAGE,CAAI,IAAKR,EAClB,OAAS,CAACO,EAAGG,CAAQ,IAAKF,EAAM,CAC5B,IAAIG,EAAWR,EAAQ,IAAIG,CAAC,EAAIF,EAAQ,IAAIG,CAAC,EAAIF,EACjDI,IAASC,EAAWC,IAAa,EAAIA,CACxC,CAEL,OAAOF,CACX,CAOO,MAAMG,GAAY,CAACrD,EAAYsD,EAAQC,IAAW,CACrD,MAAMb,EAAO,IAAI,IACXC,EAAO,IAAI,IACXF,EAAW,IAAI,IACrB,IAAI7Y,EAAMoW,EAAW,OACrB,QAAS9X,EAAI,EAAGA,EAAI0B,EAAK1B,IAAK,CAC1B,IAAIoY,EAASN,EAAW9X,CAAC,EACzBwa,EAAK,IAAIpC,EAAOgD,CAAM,CAAC,EACvBX,EAAK,IAAIrC,EAAOiD,CAAM,CAAC,EAClBd,EAAS,IAAInC,EAAOgD,CAAM,CAAC,GAC5Bb,EAAS,IAAInC,EAAOgD,CAAM,EAAG,IAAI,GAAK,EAE1C,IAAIL,EAAOR,EAAS,IAAInC,EAAOgD,CAAM,CAAC,EACjCL,EAAK,IAAI3C,EAAOiD,CAAM,CAAC,GACxBN,EAAK,IAAI3C,EAAOiD,CAAM,EAAG,CAAC,EAE9BN,EAAK,IAAI3C,EAAOiD,CAAM,EAAGN,EAAK,IAAI3C,EAAOiD,CAAM,CAAC,EAAI,CAAC,CACxD,CACD,MAAML,EAAOV,GAAWC,EAAUC,EAAMC,CAAI,EAE5C,OADU,KAAK,KAAKO,GAAQlD,EAAW,OAAS,KAAK,IAAI0C,EAAK,KAAO,EAAGC,EAAK,KAAO,CAAC,EAAE,CAE3F,EA4Baa,GAAY,CAACxD,EAAYsD,EAAQC,IAAW,CACrD,IAAItQ,EAAI,EACJwQ,EAAOzC,GAAIhB,EAAW,IAAIsC,GAAOA,EAAIgB,CAAM,CAAC,CAAC,EAAItD,EAAW,OAC5D0D,EAAO1C,GAAIhB,EAAW,IAAIsC,GAAOA,EAAIiB,CAAM,CAAC,CAAC,EAAIvD,EAAW,OAChE,OAAA/M,EAAI+N,GAAIhB,EAAW,IAAIsC,IAAQA,EAAIgB,CAAM,EAAIG,IAASnB,EAAIiB,CAAM,EAAIG,EAAK,CAAC,EACtE,KAAK,KAAK1C,GAAIhB,EAAW,IAAIsC,GAAO,KAAK,IAAIA,EAAIgB,CAAM,EAAIG,EAAM,CAAC,CAAC,CAAC,EAAIzC,GAAIhB,EAAW,IAAIsC,GAAO,KAAK,IAAIA,EAAIiB,CAAM,EAAIG,EAAM,CAAC,CAAC,CAAC,CAAC,EAChIzQ,CACX,EACA,SAAS+N,GAAIxX,EAAK,CACd,IAAI6D,EAAI,EACR,QAASnF,EAAI,EAAG0B,EAAMJ,EAAI,OAAQtB,EAAI0B,EAAK1B,IAEvCmF,GAAK7D,EAAItB,CAAC,EAEd,OAAOmF,CACX,CCrGO,SAASsW,GAAYna,EAAK,CAC7B,OAAOA,EAAI,IAAI4D,GAAK,KAAK,IAAIA,CAAC,CAAC,EAAE,OAAOA,GAAKA,IAAM,CAAC,CACxD,CACO,SAASwW,GAAeC,EAAUC,EAAQ,EAAGC,EAAMF,EAAS,OAAQ,CACvE,IAAIG,EAAM,CAAA,EACV,MAAMC,EAAU,CAACC,EAAMjN,EAAKkN,IAAS,CACjC,GAAIlN,EAAI,SAAWkN,EAAM,CACrBH,EAAI,KAAK,CAAC,GAAG/M,CAAG,CAAC,EACjB,MACH,CACGiN,GAAQL,EAAS,SAGrBI,EAAQC,EAAO,EAAG,CAAC,GAAGjN,EAAK4M,EAASK,CAAI,CAAC,EAAGC,CAAI,EAChDF,EAAQC,EAAO,EAAGjN,EAAKkN,CAAI,EACnC,EACI,QAASjc,EAAI4b,EAAO5b,GAAK6b,EAAK7b,IAC1B+b,EAAQ,EAAG,GAAI/b,CAAC,EAEpB,OAAO8b,CACX,CACO,SAASI,GAAUC,EAAe,CACrC,IAAIrD,EAAM,EACV,QAASxI,KAAK6L,EACVrD,GAAOxI,EAEX,OAAO6L,EAAc,IAAI7L,GAAKA,EAAIwI,CAAG,CACzC,CACO,MAAMsD,GAAWC,GAAoB,CACxC,IAAIvD,EAAM,EACV,QAASpY,KAAK2b,EACVvD,GAAOpY,EAAI,KAAK,KAAKA,CAAC,EAE1B,MAAO,CAACoY,CACZ,EAQO,SAASwD,GAAWxE,EAAYyE,EAAI,CACvC,IAAIC,EAAW,KACXC,EAAW,IACf,QAASrC,KAAOtC,EACZ0E,EAAW,KAAK,IAAIpC,EAAImC,CAAE,EAAGC,CAAQ,EACrCC,EAAW,KAAK,IAAIrC,EAAImC,CAAE,EAAGE,CAAQ,EAEzC,MAAO,CAACA,EAAUD,CAAQ,CAC9B,CCtDO,MAAME,EAAqB,CAC9B,YAAY5E,EAAY6E,EAAGC,EAAG,CAC1B,KAAK,WAAa9E,EAClB,KAAK,EAAI6E,EACT,KAAK,EAAIC,EACT,KAAK,qBAAuB9E,CAC/B,CACD,oBAAoBW,EAAY,CAC5B,YAAK,qBAAuB,GAC5B,KAAK,UAAY,GACjBA,EAAW,QAAQ,IAAM,CACrB,KAAK,UAAU,KAAK,IAAI,GAAK,CACzC,CAAS,EACD,KAAK,WAAW,QAAQL,GAAU,CAC9BK,EAAW,QAAQ,CAACO,EAAKtQ,IAAU,CAC/B,IAAItH,GAASgX,EAAOY,CAAG,GAAK,UAAU,WACjC,KAAK,UAAUtQ,CAAK,EAAE,IAAItH,CAAK,GAChC,KAAK,UAAUsH,CAAK,EAAE,IAAItH,EAAO,KAAK,UAAUsH,CAAK,EAAE,IAAI,CAE/E,CAAa,CACb,CAAS,EACD,KAAK,WAAW,QAAQ0P,GAAU,CAC9B,IAAIyE,EAAmB,KAAK,gBAAgBzE,EAAQK,CAAU,EAC9D,KAAK,qBAAqB,KAAKoE,CAAgB,CAC3D,CAAS,EACM,KAAK,oBACf,CACD,gBAAgBzE,EAAQK,EAAY,CAChC,IAAIoE,EAAmB,CAAA,EACvB,cAAO,KAAKzE,CAAM,EAAE,QAAQD,GAAO,CAC/B0E,EAAiB1E,CAAG,EAAIC,EAAOD,CAAG,CAC9C,CAAS,EACDM,EAAW,QAAQ,CAACO,EAAKtQ,IAAU,CAC/B,IAAItH,GAASgX,EAAOY,CAAG,GAAK,UAAU,WACtC6D,EAAiB7D,CAAG,EAAI,KAAK,UAAUtQ,CAAK,EAAE,IAAItH,CAAK,CACnE,CAAS,EACMyb,CACV,CACD,MAAO,CACH,IAAIC,EAAQ,EACRC,EAAQ,EACZ,OAAI,KAAK,qBAAqB,SAAW,EAC9B,CAACD,EAAOC,CAAK,GACxB,KAAK,qBAAqB,QAAQ,CAAC3E,EAAQ1P,IAAU,CACjDoU,GAAS1E,EAAO,KAAK,CAAC,EACtB2E,GAAS3E,EAAO,KAAK,CAAC,CAClC,CAAS,EACD0E,GAAS,KAAK,qBAAqB,OACnCC,GAAS,KAAK,qBAAqB,OAC5B,CAACD,EAAOC,CAAK,EACvB,CACD,uBAAwB,CACpB,GAAI,KAAK,qBAAqB,SAAW,EACrC,MAAO,CAAC,EAAG,CAAC,EAChB,KAAM,CAACD,EAAOC,CAAK,EAAI,KAAK,KAAI,EAChC,IAAIC,EAAO,EACPC,EAAQ,EACRC,EAAY,EACZC,EAAc,EAClB,YAAK,qBAAqB,QAAQ/E,GAAU,CACxC8E,IAAc9E,EAAO,KAAK,CAAC,EAAI0E,IAAU1E,EAAO,KAAK,CAAC,EAAI2E,GAC1DI,IAAgB/E,EAAO,KAAK,CAAC,EAAI0E,IAAU,CACvD,CAAS,EACDE,EAAOE,EAAYC,EACnBF,EAAQF,EAAQD,EAAQE,EACjB,CAACC,EAAOD,CAAI,CACtB,CACD,WAAY,CACR,KAAM,EAAGD,CAAK,EAAI,KAAK,KAAI,EACrB,CAACE,EAAOD,CAAI,EAAI,KAAK,sBAAqB,EAChD,IAAII,EAAM,EACNC,EAAM,EACV,YAAK,qBAAqB,QAAQjF,GAAU,CACxC,IAAIyC,EAAIzC,EAAO,KAAK,CAAC,EACjB0C,EAAI1C,EAAO,KAAK,CAAC,EACjBkF,EAAOzC,EAAImC,EAAOC,EACtBG,IAAQE,EAAOP,IAAU,EACzBM,IAAQvC,EAAIiC,IAAU,CAClC,CAAS,EACMK,EAAMC,CAChB,CACD,+BAA+BxC,EAAG,CAG9B,MAAO,IAAK,EAAI,KAAK,IAAI,KAAK,EAAG,EAAEA,EAAI,IAAM,CAAM,EACtD,CACD,QAAS,CACL,KAAM,EAAGmC,CAAI,EAAI,KAAK,sBAAqB,EACrC5b,EAAQ,KAAK,+BAA+B,KAAK,IAAI4b,CAAI,CAAC,EAChE,OAAI5b,EAAQ,GACD,GAAK,EAAIA,GAGT,EAAIA,CAElB,CACD,cAAe,CACX,IAAImc,EAAY,KAAK,YACjBC,EAAU,KAAK,SACnB,OAAOD,GAAa,EAAIC,EAC3B,CACL,CCYA,SAAS1E,GAAI+B,EAAG,CAEZ,GAAIA,EAAE,SAAW,EACb,MAAO,GAIX,IAAI/B,EAAM+B,EAAE,CAAC,EAGT4C,EAAa,EAEbC,EAEJ,GAAI,OAAO5E,GAAQ,SACf,MAAO,KAGX,QAAS9Y,EAAI,EAAGA,EAAI6a,EAAE,OAAQ7a,IAAK,CAC/B,GAAI,OAAO6a,EAAE7a,CAAC,GAAM,SAChB,MAAO,KAEX0d,EAAa5E,EAAM+B,EAAE7a,CAAC,EAIlB,KAAK,IAAI8Y,CAAG,GAAK,KAAK,IAAI+B,EAAE7a,CAAC,CAAC,EAC9Byd,GAAc3E,EAAM4E,EAAa7C,EAAE7a,CAAC,EAEpCyd,GAAc5C,EAAE7a,CAAC,EAAI0d,EAAa5E,EAGtCA,EAAM4E,CACT,CAGD,OAAO5E,EAAM2E,CACjB,CAgBA,SAASE,GAAK9C,EAAG,CACb,GAAIA,EAAE,SAAW,EACb,MAAM,IAAI,MAAM,uCAAuC,EAG3D,OAAO/B,GAAI+B,CAAC,EAAIA,EAAE,MACtB,CA+TA,SAAS+C,GAAI/C,EAAG,CACZ,GAAIA,EAAE,SAAW,EACb,MAAM,IAAI,MAAM,sCAAsC,EAI1D,QADIzZ,EAAQyZ,EAAE,CAAC,EACN7a,EAAI,EAAGA,EAAI6a,EAAE,OAAQ7a,IACtB6a,EAAE7a,CAAC,EAAIoB,IACPA,EAAQyZ,EAAE7a,CAAC,GAGnB,OAAOoB,CACX,CAcA,SAASyc,GAAIhD,EAAG,CACZ,GAAIA,EAAE,SAAW,EACb,MAAM,IAAI,MAAM,sCAAsC,EAI1D,QADIzZ,EAAQyZ,EAAE,CAAC,EACN7a,EAAI,EAAGA,EAAI6a,EAAE,OAAQ7a,IACtB6a,EAAE7a,CAAC,EAAIoB,IACPA,EAAQyZ,EAAE7a,CAAC,GAGnB,OAAOoB,CACX,CC7gBO,MAAM0c,GAAQ,YACRC,GAAoC,IACpCC,GAAoC,GACpCC,EAAkB,EAClBC,EAAuBD,EAAkB,EACzCE,GAAU,QCDhB,SAASC,GAASC,EAAMC,EAAQC,EAAO,CAC1C,IAAIC,EAAO,EACX,QAASxe,EAAI,EAAGA,EAAIqe,EAAK,OAAQre,IAC7Bwe,GAAQH,EAAKre,CAAC,EAAE,KAAKse,CAAM,EAAEC,CAAK,EAEtC,OAAOC,CACX,CAEA,SAASC,GAASC,EAAe,CAC7B,OAAIA,EAAc,CAAC,IAAMA,EAAc,CAAC,EAC7B,CAACA,EAAc,CAAC,EAAGA,EAAc,CAAC,EAAI,EAAG,EAE7CA,CACX,CACO,MAAMC,GAAO,SAAUC,EAAQF,EAAe,CACjD,MAAMG,EAAQJ,GAASC,CAAa,EAC9B1C,GAAQ6C,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKZ,EAC/Ba,EAAO,IAAI,MAAMb,EAAkB,CAAC,EAAE,KAAK,CAAC,EAClD,QAAS7c,KAASwd,EAAQ,CACtB,MAAMG,EAAS,KAAK,OAAO3d,EAAQyd,EAAM,CAAC,GAAK7C,CAAI,EACnD8C,EAAKC,CAAM,GACd,CACD,OAAAD,EAAKb,EAAkB,CAAC,GAAKa,EAAKb,CAAe,EAC1Ca,EAAK,MAAM,EAAG,EAAE,CAC3B,EACO,SAASE,GAAYX,EAAMC,EAAQC,EAAO,CAC7C,MAAMO,EAAO,IAAI,MAAMb,CAAe,EAAE,KAAK,CAAC,EAC9C,QAASje,EAAI,EAAGA,EAAIqe,EAAK,OAAQre,IAAK,CAClC,MAAMif,EAAaZ,EAAKre,CAAC,EAAE,KAAKse,CAAM,EAAEC,CAAK,EAC7C,QAASpW,EAAI,EAAGA,EAAI2W,EAAK,OAAQ3W,IAC7B2W,EAAK3W,CAAC,GAAK8W,EAAW9W,CAAC,CAE9B,CACD,OAAO2W,CACX,CCxCA,MAAMI,GAAU,SAIHC,GAAW,CACpB,IAAArG,GACA,IAAA+E,GACA,KAAAF,GACA,IAAAC,GACA,MARU,SAAU/C,EAAG,CACvB,OAAOA,EAAE,MACb,CAOA,EACO,SAASuE,GAAcC,EAAI,CAE9B,OADaF,GAASE,CAAE,GAAKvG,EAEjC,CACO,SAASwG,GAAQjB,EAAM9B,EAAI,CAC9B,MAAMgD,EAAS,IAAI,IACnB,QAASnH,KAAUiG,EAAM,CACrB,MAAM1e,EAAM4c,EAAG,IAAKiD,GAAMpH,EAAOoH,CAAC,CAAC,EAAE,KAAKN,EAAO,EAC5CK,EAAO,IAAI5f,CAAG,GACf4f,EAAO,IAAI5f,EAAK,CAAA,CAAE,EAEtB4f,EAAO,IAAI5f,CAAG,EAAE,KAAKyY,CAAM,CAC9B,CACD,OAAOmH,CACX,CAmBO,SAASE,GAAa1f,EAAO,CAChC,KAAM,CAAE,WAAA+X,EAAY,WAAAW,EAAY,SAAAV,EAAU,IAAA2H,CAAG,EAAK3f,EAC5Cwf,EAASD,GAAQxH,EAAYW,CAAU,EACvC3Q,EAAS,CAAA,EACf,OAAS,CAACnI,EAAKggB,CAAK,IAAKJ,EAAQ,CAC7B,MAAMK,EAAO,CACT,UAAW,CAAE,EACb,KAAM,CAAE,CACpB,EACQ7H,EAAS,QAAQ,CAACI,EAAK0H,IAAa,CAChCD,EAAK,KAAKzH,CAAG,EAAI,GACjBuH,EAAI,QAAQL,GAAM,CACd,MAAMS,EAASV,GAAcC,CAAE,EAC/BO,EAAK,KAAKzH,CAAG,EAAEkH,CAAE,EAAIS,EAAOH,EAAM,IAAK5U,GAAMA,EAAEoN,CAAG,CAAC,CAAC,CACpE,CAAa,CACb,CAAS,EACD,MAAM4H,EAAYpgB,EAAI,MAAMuf,EAAO,EACnCzG,EAAW,QAAQ,CAACO,EAAKgH,IAAa,CAClCJ,EAAK,UAAU5G,CAAG,EAAI+G,EAAUC,CAAQ,CACpD,CAAS,EACDlY,EAAO,KAAK8X,CAAI,CACnB,CACD,OAAO9X,CACX,CACO,SAASmY,GAAcrB,EAAQ,CAClC,OAAOA,EAAO,KAAKM,EAAO,CAC9B,CACA,SAASgB,GAAmBC,EAAO5D,EAAI,CACnC,MAAMgD,EAAS,IAAI,IACnB,QAASnH,KAAU+H,EAAO,CACtB,MAAMxgB,EAAM4c,EAAG,IAAKiD,GAAMpH,EAAO,UAAUoH,CAAC,CAAC,EAAE,KAAKN,EAAO,EACtDK,EAAO,IAAI5f,CAAG,GACf4f,EAAO,IAAI5f,EAAK,CAAA,CAAE,EAEtB4f,EAAO,IAAI5f,CAAG,EAAE,KAAKyY,CAAM,CAC9B,CACD,OAAOmH,CACX,CACO,SAASa,GAAuBrgB,EAAO,CAC1C,KAAM,CAAE,YAAAsgB,EAAa,WAAA5H,EAAY,SAAAV,EAAU,IAAA2H,CAAG,EAAK3f,EAC7Cwf,EAASW,GAAmBG,EAAa5H,CAAU,EACnD3Q,EAAS,CAAA,EAETwY,EAAiBZ,EAAI,OAAOL,GAAM,CAAE,CAAC,MAAO,QAAS,OAAQ,MAAM,EAAE,SAASA,CAAE,CAAE,EAClFkB,EAAaD,EAAe,IAAIE,GAAUpB,GAAcoB,CAAM,CAAC,EACrE,OAAS,CAAC7gB,EAAKggB,CAAK,IAAKJ,EAAQ,CAC7B,MAAMK,EAAO,CACT,UAAW,CAAE,EACb,KAAM,CAAE,CACpB,EACQ,QAASC,EAAW,EAAGA,EAAW9H,EAAS,OAAQ8H,IAAY,CAC3D,MAAM1H,EAAMJ,EAAS8H,CAAQ,EAC7BD,EAAK,KAAKzH,CAAG,EAAI,GACjBoI,EAAW,QAAQ,CAAClB,EAAIoB,IAAY,CAChC,MAAMD,EAASF,EAAeG,CAAO,EACrCb,EAAK,KAAKzH,CAAG,EAAEqI,CAAM,EAAInB,EAAGM,EAAM,IAAK5U,GAAMA,EAAE,KAAKoN,CAAG,EAAEqI,CAAM,CAAC,CAAC,CACjF,CAAa,EAEDZ,EAAK,KAAKzH,CAAG,EAAE,IAASiG,GAASuB,EAAOxH,EAAK,KAAK,EAClDyH,EAAK,KAAKzH,CAAG,EAAE,MAAWiG,GAASuB,EAAOxH,EAAK,OAAO,EAGtDyH,EAAK,KAAKzH,CAAG,EAAE,KAAUyH,EAAK,KAAKzH,CAAG,EAAE,IAASyH,EAAK,KAAKzH,CAAG,EAAE,MAChEyH,EAAK,KAAKzH,CAAG,EAAE,KAAU6G,GAAYW,EAAOxH,EAAK,MAAM,CAC1D,CACD,MAAM4H,EAAYpgB,EAAI,MAAMuf,EAAO,EACnC,QAASc,EAAW,EAAGA,EAAWvH,EAAW,OAAQuH,IACjDJ,EAAK,UAAUnH,EAAWuH,CAAQ,CAAC,EAAID,EAAUC,CAAQ,EAE7DlY,EAAO,KAAK8X,CAAI,CACnB,CACD,OAAO9X,CACX,CCjHO,MAAM4Y,GAAqB,GACrBC,GAAqB,CAC9B,OAAQ,GACR,KAAM,EACV,ECLA,SAASC,GAAmBC,EAAQ,CAEhC,IAAIC,EAAQ,CAAA,EACZ,QAAS9gB,EAAI,EAAGA,EAAI6gB,EAAO,OAAQ7gB,IAC/B,QAASmI,EAAInI,EAAI,EAAGmI,EAAI0Y,EAAO7gB,CAAC,EAAE,OAAQmI,IACtC2Y,EAAM,KAAK,CAAC,CAAC9gB,EAAGmI,CAAC,EAAG,KAAK,IAAI0Y,EAAO7gB,CAAC,EAAEmI,CAAC,CAAC,CAAC,CAAC,EAGnD,OAAO2Y,CACX,CACA,SAASC,EAAKC,EAASjf,EAAG,CACtB,OAAOif,EAAQjf,CAAC,IAAMA,EAAIA,EAAIif,EAAQjf,CAAC,EAAIgf,EAAKC,EAASA,EAAQjf,CAAC,CAAC,CACvE,CACA,SAASkf,GAAMD,EAASE,EAAIC,EAAI,CAC5B,IAAIC,EAAKL,EAAKC,EAASE,CAAE,EACrBG,EAAKN,EAAKC,EAASG,CAAE,EACzBH,EAAQI,CAAE,EAAIC,EAGdN,EAAKC,EAASE,CAAE,EAChBH,EAAKC,EAASG,CAAE,CACpB,CACA,SAASG,EAAeN,EAASO,EAAOxf,EAAG,CACvC,OAAIif,EAAQjf,CAAC,IAAMA,EACRA,GAEXif,EAAQjf,CAAC,EAAIuf,EAAeN,EAASO,EAAOP,EAAQjf,CAAC,CAAC,EACtDwf,EAAMxf,CAAC,EAAIwf,EAAMP,EAAQjf,CAAC,CAAC,EACpBif,EAAQjf,CAAC,EACpB,CACA,SAASyf,GAAgBR,EAASO,EAAOL,EAAIC,EAAI,CAC7C,IAAIC,EAAKE,EAAeN,EAASO,EAAOL,CAAE,EACtCG,EAAKC,EAAeN,EAASO,EAAOJ,CAAE,EACtCM,EAAQF,EAAMH,CAAE,EAChBM,EAAQH,EAAMF,CAAE,EACpBL,EAAQI,CAAE,EAAIC,EACdE,EAAMH,CAAE,EAAIG,EAAMF,CAAE,EAAII,EAAQC,EAChCJ,EAAeN,EAASO,EAAOL,CAAE,EACjCI,EAAeN,EAASO,EAAOJ,CAAE,CACrC,CAMA,SAASQ,GAAQd,EAAQe,EAAaC,EAAY,EAAG,CACjD,MAAMf,EAAQF,GAAmBC,CAAM,EACvCC,EAAM,KAAK,CAAC5b,EAAG4c,IAAMA,EAAE,CAAC,EAAI5c,EAAE,CAAC,CAAC,EAChC,MAAM8b,EAAUH,EAAO,IAAI,CAACzb,EAAGpF,IAAMA,CAAC,EACtC,QAAS+hB,KAAQjB,EAAO,CAChBC,EAAKC,EAASe,EAAK,CAAC,EAAE,CAAC,CAAC,IAAMhB,EAAKC,EAASe,EAAK,CAAC,EAAE,CAAC,CAAC,GACtDd,GAAMD,EAASe,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EAEzC,QAAS/hB,EAAI,EAAGA,EAAIghB,EAAQ,OAAQhhB,IAChCghB,EAAQhhB,CAAC,EAAI+gB,EAAKC,EAAShhB,CAAC,EAGhC,GADU,IAAI,IAAIghB,CAAO,EACjB,MAAQY,GAAeG,EAAK,CAAC,EAAIF,EACrC,KAEP,CACD,IAAItC,EAAS,IAAI,IACjB,QAASvf,EAAI,EAAGA,EAAIghB,EAAQ,OAAQhhB,IAC3Buf,EAAO,IAAIyB,EAAQhhB,CAAC,CAAC,GACtBuf,EAAO,IAAIyB,EAAQhhB,CAAC,EAAG,CAAE,CAAA,EAE7Buf,EAAO,IAAIyB,EAAQhhB,CAAC,CAAC,EAAE,KAAKA,CAAC,EAEjC,OAAOuf,CACX,CAOA,SAASyC,GAAqBnB,EAAQoB,EAAW,CAC7C,MAAMnB,EAAQF,GAAmBC,CAAM,EACvCC,EAAM,KAAK,CAAC5b,EAAG4c,IAAMA,EAAE,CAAC,EAAI5c,EAAE,CAAC,CAAC,EAChC,MAAM8b,EAAUH,EAAO,IAAI,CAACzb,EAAGpF,IAAMA,CAAC,EAChCuhB,EAAQV,EAAO,IAAI,IAAM,CAAC,EAChC,QAASkB,KAAQjB,EAAO,CACpB,GAAIQ,EAAeN,EAASO,EAAOQ,EAAK,CAAC,EAAE,CAAC,CAAC,IAAMT,EAAeN,EAASO,EAAOQ,EAAK,CAAC,EAAE,CAAC,CAAC,EAAG,CAC3F,GAAIR,EAAMQ,EAAK,CAAC,EAAE,CAAC,CAAC,EAAIR,EAAMQ,EAAK,CAAC,EAAE,CAAC,CAAC,EAAIE,EACxC,SAEJT,GAAgBR,EAASO,EAAOQ,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,CACzD,CACD,QAAS/hB,EAAI,EAAGA,EAAIghB,EAAQ,OAAQhhB,IAChCghB,EAAQhhB,CAAC,EAAIshB,EAAeN,EAASO,EAAOvhB,CAAC,EAGjD,GADU,IAAI,IAAIghB,CAAO,EACjB,OAAS,EACb,KAEP,CACD,IAAIzB,EAAS,IAAI,IACjB,QAASvf,EAAI,EAAGA,EAAIghB,EAAQ,OAAQhhB,IAC3Buf,EAAO,IAAIyB,EAAQhhB,CAAC,CAAC,GACtBuf,EAAO,IAAIyB,EAAQhhB,CAAC,EAAG,CAAE,CAAA,EAE7Buf,EAAO,IAAIyB,EAAQhhB,CAAC,CAAC,EAAE,KAAKA,CAAC,EAEjC,OAAOuf,CACX,CAsEA,SAAS2C,GAAQ,CAAE,OAAArB,EAAQ,SAAA9I,EAAU,OAAAoK,EAAS,UAAW,aAAAC,EAAe,EAAG,UAAAH,EAAY,GAAO,UAAAJ,EAAY,CAAC,EAAI,CAE3G,IAAItC,EACA0C,EACA1C,EAASyC,GAAqBnB,EAAQuB,CAAY,EAGlD7C,EAASoC,GAAQd,EAAQuB,EAAcP,CAAS,EAEpD,IAAI/F,EAAM,CAAA,EACV,QAASuG,KAAQ9C,EAAO,SACpBzD,EAAI,KAAKuG,EAAK,IAAIxC,GAAY9H,EAAS8H,CAAQ,CAAC,CAAC,EAErD,OAAO/D,CACX,CC9KA,SAASwG,GAA4BrG,EAAMsG,EAAM,CAC7C,GAAItG,IAAS,EACT,MAAO,GACX,MAAM7W,EAAI,WACJF,EAAI,WACJkC,EAAI,MACV,IAAI0U,EAAM,CAACyG,CAAI,EACf,QAASviB,EAAI,EAAGA,EAAIic,EAAMjc,IACtB8b,EAAI,MAAOA,EAAI9b,EAAI,CAAC,EAAIkF,EAAIkC,GAAKhC,GAErC,OAAO0W,EAAI,IAAI9S,GAAKA,EAAI5D,CAAC,CAC7B,CACO,SAASod,GAAgB1K,EAAYmE,EAAM,CAC9C,IAAIwG,EAAgBH,GAA4BrG,EAAM,KAAK,OAAM,EAAK,UAAU,EAC5EH,EAAM,CAAA,EACV,QAAS9b,EAAI,EAAGA,EAAIic,EAAMjc,IAAK,CAC3B,IAAI0I,EAAQ,KAAK,MAAM+Z,EAAcziB,CAAC,EAAIic,CAAI,EAAIA,EAClDH,EAAI,KAAKhE,EAAWpP,CAAK,CAAC,CAC7B,CACD,OAAOoT,CACX,CCpCO,MAAM4G,EAAgB,CACzB,YAAYjK,EAAYV,EAAUD,EAAY6K,EAAa,IAAKC,EAAM,IAAK,CACvE,KAAK,WAAanK,EAClB,KAAK,SAAWV,EAChB,KAAK,WAAaD,EACdA,EAAW,OAAS8K,GACpB,KAAK,WAAa,KAAK,IAAI,EAAG,KAAK,KAAKA,EAAM,EAAE,CAAC,EACjD,KAAK,WAAa,KAAK,IAAI,EAAG,KAAK,MAAM9K,EAAW,OAAS,CAAC,CAAC,IAG/D,KAAK,WAAa6K,EAClB,KAAK,WAAaC,GAEtB,KAAK,YAAc,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,CAAC,EACvD,KAAK,QAAU,GACf,KAAK,oBAAmB,CAC3B,CACD,qBAAsB,CAClB,YAAK,qBAAuB,GAC5B,KAAK,UAAY,GACjB,KAAK,OAAS,GACd,KAAK,WAAW,QAAQ,IAAM,CAC1B,KAAK,UAAU,KAAK,IAAI,GAAK,CACzC,CAAS,EACD,KAAK,SAAS,QAAQ,IAAM,CACxB,KAAK,OAAO,KAAK,CAAC,IAAU,IAAS,CAAC,CAClD,CAAS,EACD,KAAK,WAAW,QAAQxK,GAAU,CAC9B,KAAK,WAAW,QAAQ,CAACY,EAAKtQ,IAAU,CACpC,IAAItH,GAASgX,EAAOY,CAAG,GAAK,UAAU,WACjC,KAAK,UAAUtQ,CAAK,EAAE,IAAItH,CAAK,GAChC,KAAK,UAAUsH,CAAK,EAAE,IAAItH,EAAO,KAAK,UAAUsH,CAAK,EAAE,IAAI,CAE/E,CAAa,EACD,KAAK,SAAS,QAAQ,CAACyP,EAAKzP,IAAU,CAClC,IAAItH,EAAQgX,EAAOD,CAAG,EAClB,OAAO/W,GAAU,WACjB,KAAK,OAAOsH,CAAK,EAAE,CAAC,EAAI,KAAK,IAAI,KAAK,OAAOA,CAAK,EAAE,CAAC,EAAGtH,CAAK,EAC7D,KAAK,OAAOsH,CAAK,EAAE,CAAC,EAAI,KAAK,IAAI,KAAK,OAAOA,CAAK,EAAE,CAAC,EAAGtH,CAAK,EAEjF,CAAa,CACb,CAAS,EACD,KAAK,WAAW,QAAQgX,GAAU,CAC9B,IAAIyE,EAAmB,KAAK,gBAAgBzE,CAAM,EAClD,KAAK,qBAAqB,KAAKyE,CAAgB,CAC3D,CAAS,EACM,KAAK,oBACf,CACD,gBAAgBzE,EAAQ,CACpB,IAAIyE,EAAmB,CAAA,EACvB,YAAK,SAAS,QAAQ1E,GAAO,CACzB0E,EAAiB1E,CAAG,EAAIC,EAAOD,CAAG,CAC9C,CAAS,EACD,KAAK,WAAW,QAAQ,CAACa,EAAKtQ,IAAU,CACpC,IAAItH,GAASgX,EAAOY,CAAG,GAAK,UAAU,WACtC6D,EAAiB7D,CAAG,EAAI,KAAK,UAAUtQ,CAAK,EAAE,IAAItH,CAAK,CACnE,CAAS,EACMyb,CACV,CACD,mBAAmBgG,EAAsBC,EAAO,CAC5C,GAAIA,GAAS,KAAK,aAAeD,EAAqB,QAAU,EAC5D,OAAO,KAEN,CACD,IAAIE,EAAO,KAAK,SACZC,EAAY,KAAK,SAAS,CAAC,GAAK,KAAK,WAAW,CAAC,EACjDC,EAAY,KAAK,WAAW,OAC5BC,EAAY,KAAK,SAAS,OAC1BC,EAAY,EAChB,GAAIJ,GAAQE,GAAaA,EAAYC,GAAY,CAC7C,IAAIxa,EAAQ,KAAK,MAAM,KAAK,SAAWwa,CAAS,EAAIA,EACpDF,EAAY,KAAK,SAASta,CAAK,EAC/Bya,EAAY,KAAK,OAAOza,CAAK,EAAE,CAAC,GAAK,KAAK,OAAOA,CAAK,EAAE,CAAC,EAAI,KAAK,OAAOA,CAAK,EAAE,CAAC,GAAK,KAAK,QAC9F,KACI,CACD,IAAIA,EAAQ,KAAK,MAAM,KAAK,SAAWua,CAAS,EAAIA,EACpDD,EAAY,KAAK,WAAWta,CAAK,EACjCya,EAAY,KAAK,MAAM,KAAK,UAAUza,CAAK,EAAE,KAAO,KAAK,OAAQ,CAAA,EAAI,KAAK,UAAUA,CAAK,EAAE,IAC9F,CAGD,IAAI0a,EAAc,CAAA,EACdC,EAAe,CAAA,EACnB,QAASjL,KAAUyK,EACXzK,EAAO4K,CAAS,EAAIG,EACpBC,EAAY,KAAKhL,CAAM,EAGvBiL,EAAa,KAAKjL,CAAM,EAGhC,IAAI2C,EAAO,CACP,MAAOiI,EACP,MAAOG,EACP,KAAMN,EAAqB,MAC3C,EACY,OAAA9H,EAAK,KAAO,KAAK,mBAAmBqI,EAAaN,EAAQ,CAAC,EAC1D/H,EAAK,MAAQ,KAAK,mBAAmBsI,EAAcP,EAAQ,CAAC,EACrD/H,CACV,CACJ,CAKD,IAAI6H,EAAK,CACL,OAAIA,EAAM,EACC,GAAK,KAAK,IAAIA,EAAM,CAAC,EAAI9E,IAAS,GAAK8E,EAAM,GAAKA,EACzDA,IAAQ,EACD,EACJ,CACV,CACD,cAAcxK,EAAQkL,EAAOC,EAAYC,EAAU,CAC/C,OAAIF,IAAU,KACHC,EAAa,KAAK,IAAIC,CAAQ,EAE7BpL,EAAOkL,EAAM,KAAK,EAClBA,EAAM,MACP,KAAK,cAAclL,EAAQkL,EAAM,KAAMC,EAAa,EAAGD,EAAM,IAAI,EAGjE,KAAK,cAAclL,EAAQkL,EAAM,MAAOC,EAAa,EAAGD,EAAM,IAAI,CAEhF,CACD,sBAAuB,CACnB,KAAK,QAAU,GACf,QAAStjB,EAAI,EAAGA,EAAI,KAAK,WAAYA,IAAK,CACtC,IAAIyjB,EAAUjB,GAAgB,KAAK,qBAAsB,KAAK,UAAU,EACpEc,EAAQ,KAAK,mBAAmBG,EAAS,CAAC,EAC9C,KAAK,QAAQ,KAAKH,CAAK,CAC1B,CACD,OAAO,KAAK,OACf,CAGD,qBAAsB,CAClB,YAAK,gBAAkB,GACvB,KAAK,qBAAqB,QAAQlL,GAAU,CACxC,IAAIsL,EAAc,EACdC,EAAgB,EACpB,KAAK,QAAQ,QAAQL,GAAS,CAC1BK,GAAiB,KAAK,cAAcvL,EAAQkL,EAAO,EAAG,KAAK,UAAU,CACrF,CAAa,EACDK,GAAiB,KAAK,QAAQ,OAC9BD,EAAc,KAAK,IAAI,EAAG,EAAEC,EAAgB,KAAK,IAAI,KAAK,UAAU,EAAE,EACtE,KAAK,gBAAgB,KAAKD,CAAW,CACjD,CAAS,EACM,KAAK,eACf,CACL,CCpJA,MAAME,GAAS,CACX,gBAAAlB,EACJ,ECAO,SAASmB,GAAwB/L,EAAYW,EAAY,CAC5D,IAAIoI,EAASpI,EAAW,IAAI+G,GAAK/G,EAAW,IAAI+G,GAAK,CAAC,CAAC,EACvD,QAASxf,EAAI,EAAGA,EAAIyY,EAAW,OAAQzY,IAAK,CACxC6gB,EAAO7gB,CAAC,EAAEA,CAAC,EAAI,EACf,QAASmI,EAAInI,EAAI,EAAGmI,EAAIsQ,EAAW,OAAQtQ,IACvC0Y,EAAO7gB,CAAC,EAAEmI,CAAC,EAAI0Y,EAAO1Y,CAAC,EAAEnI,CAAC,EAAImb,GAAUrD,EAAYW,EAAWzY,CAAC,EAAGyY,EAAWtQ,CAAC,CAAC,CAEvF,CACD,OAAO0Y,CACX,CACO,SAASiD,GAAwBhM,EAAYC,EAAU,CAC1D,IAAI8I,EAAS9I,EAAS,IAAI/X,GAAK+X,EAAS,IAAI5P,GAAK,CAAC,CAAC,EACnD,QAASnI,EAAI,EAAGA,EAAI+X,EAAS,OAAQ/X,IAAK,CACtC6gB,EAAO7gB,CAAC,EAAEA,CAAC,EAAI,EACf,QAASmI,EAAInI,EAAI,EAAGmI,EAAI4P,EAAS,OAAQ5P,IAAK,CAC1C,IAAI4C,EAAIuQ,GAAUxD,EAAYC,EAAS/X,CAAC,EAAG+X,EAAS5P,CAAC,CAAC,EACtD0Y,EAAO1Y,CAAC,EAAEnI,CAAC,EAAI6gB,EAAO7gB,CAAC,EAAEmI,CAAC,EAAI4C,CACjC,CACJ,CACD,OAAO8V,CACX,CACO,SAASkD,GAAoBjM,EAAYW,EAAYoJ,EAAYnB,GAAoBsD,EAAqB,CAE7G,IAAIC,EAAuBJ,GAAwB/L,EAAYW,CAAU,EAQzE,OANayL,GAAgB,CACzB,OAAQD,EACR,SAAUxL,EACV,aAAcuL,GAA4C,KAAK,MAAMvL,EAAW,OAAS,CAAkB,EAC3G,UAAAoJ,CACR,CAAK,CAEL,CAiBO,SAASsC,GAA+BrM,EAAYC,EAAUqM,EAAuBJ,EAAsB,EAAG,CAEjH,IAAIK,EAAoBP,GAAwBhM,EAAYC,CAAQ,EAOpE,OANamM,GAAgB,CACzB,OAAQG,EACR,SAAUtM,EACV,aAAciM,GAA4C,KAAK,MAAMjM,EAAS,OAAS,CAAyB,EAChH,UAAWqM,GAAgDzD,GAAmB,MACtF,CAAK,CAEL,oIC/DI2D,GAAUC,GAAQA,EAAK,QAAW,SAAU9jB,EAAGsB,EAAG,CAClD,IAAIqD,EAAI,OAAO,QAAW,YAAc3E,EAAE,OAAO,QAAQ,EACzD,GAAI,CAAC2E,EAAG,OAAO3E,EACf,IAAIT,EAAIoF,EAAE,KAAK3E,CAAC,EAAG,EAAG+jB,EAAK,CAAE,EAAEpT,EAC/B,GAAI,CACA,MAAQrP,IAAM,QAAUA,KAAM,IAAM,EAAE,EAAI/B,EAAE,KAAM,GAAE,MAAMwkB,EAAG,KAAK,EAAE,KAAK,CAC5E,OACMxR,EAAP,CAAgB5B,EAAI,CAAE,MAAO4B,CAAO,CAAG,QAC/B,CACJ,GAAI,CACI,GAAK,CAAC,EAAE,OAAS5N,EAAIpF,EAAE,SAAYoF,EAAE,KAAKpF,CAAC,CAClD,QACO,CAAE,GAAIoR,EAAG,MAAMA,EAAE,KAAQ,CACpC,CACD,OAAOoT,CACX,EACIC,GAAYF,GAAQA,EAAK,UAAa,UAAY,CAClD,QAASC,EAAK,GAAIxkB,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAKwkB,EAAKA,EAAG,OAAOF,GAAO,UAAUtkB,CAAC,CAAC,CAAC,EACvF,OAAOwkB,CACX,EACIE,GAAYH,GAAQA,EAAK,UAAa,SAAS9jB,EAAG,CAClD,IAAI0E,EAAI,OAAO,QAAW,YAAc,OAAO,SAAUC,EAAID,GAAK1E,EAAE0E,CAAC,EAAGnF,EAAI,EAC5E,GAAIoF,EAAG,OAAOA,EAAE,KAAK3E,CAAC,EACtB,GAAIA,GAAK,OAAOA,EAAE,QAAW,SAAU,MAAO,CAC1C,KAAM,UAAY,CACd,OAAIA,GAAKT,GAAKS,EAAE,SAAQA,EAAI,QACrB,CAAE,MAAOA,GAAKA,EAAET,GAAG,EAAG,KAAM,CAACS,EACvC,CACT,EACI,MAAM,IAAI,UAAU0E,EAAI,0BAA4B,iCAAiC,CACzF,EACA,OAAO,eAAewf,GAAS,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5D,IAAIC,GAAsB,UAAY,CAClC,SAASA,EAAKC,EAAS,CACnB,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,GAChB,KAAK,QAAUA,EACf,KAAK,MAAQ,EAChB,CACD,OAAAD,EAAK,UAAU,KAAO,UAAY,CAG9B,QAFIE,EACAC,EAAS,CAAA,EACJC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAOC,CAAE,EAAI,UAAUA,CAAE,GAE5BF,EAAK,KAAK,UAAU,KAAK,MAAMA,EAAIL,GAASM,CAAM,CAAC,CAC5D,EACIH,EAAK,UAAU,QAAU,SAAU7M,EAAU,CACzC,OAAIA,IAAa,SAAUA,EAAW,CAAE,GACnC,KAAK,QACN,KAAK,SAAW,KAAK,QAAQ,KAAK,QAASA,CAAQ,EACnD,KAAK,MAAQ,IAEV,KAAK,QACpB,EACI6M,EAAK,UAAU,WAAa,UAAY,CACpC,KAAK,MAAQ,EACrB,EACI,OAAO,eAAeA,EAAK,UAAW,UAAW,CAC7C,IAAK,UAAY,CACb,IAAIK,EAAKH,EACT,GAAI,CAAC,KAAK,MAAO,CACb,GAAI,KAAK,SAAS,OAAS,EAAG,CAC1B,IAAII,EAAW,KAAK,SAAS,OAAM,EAC/BC,EAAU,CAAA,EACd,GAAI,CACA,QAASC,EAAaV,GAASQ,CAAQ,EAAGG,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIE,EAAQD,EAAa,MACrBrlB,EAAI,OACJqG,EAAOif,EAAM,QACb5jB,EAAM2E,EAAK,OACf,IAAKrG,EAAI,EAAGA,EAAI0B,EAAK1B,IACjBmlB,EAAQ,KAAK9e,EAAKrG,CAAC,CAAC,CAE3B,CACJ,OACMulB,EAAP,CAAgBN,EAAM,CAAE,MAAOM,CAAO,CAAG,QACjC,CACJ,GAAI,CACIF,GAAgB,CAACA,EAAa,OAASP,EAAKM,EAAW,SAASN,EAAG,KAAKM,CAAU,CACzF,QACO,CAAE,GAAIH,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,KAAK,SAAWE,CACnB,CACD,KAAK,MAAQ,EAChB,CACD,OAAO,KAAK,QACf,EACD,WAAY,GACZ,aAAc,EACtB,CAAK,EACDP,EAAK,UAAU,QAAU,SAAUnM,EAAY,CAC3C,IAAI+M,EAAS,SAAUzK,EAAM0K,EAAO,CAChC,IAAIC,EAAKZ,EACT,GAAIW,IAAUhN,EAAW,OACrB,OAAOsC,EAEX,IAAImK,EAAWnK,EAAK,SAAS,QAAO,EACpC,GAAI,CACA,QAAS4K,EAAajB,GAASQ,CAAQ,EAAGU,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIE,EAAKvB,GAAOsB,EAAa,MAAO,CAAC,EAAGE,EAAYD,EAAG,CAAC,EAAGP,EAAQO,EAAG,CAAC,EACvE,GAAIC,IAAcrN,EAAWgN,CAAK,EAC9B,OAAOD,EAAOF,EAAOG,EAAQ,CAAC,CAErC,CACJ,OACMM,EAAP,CAAgBL,EAAM,CAAE,MAAOK,CAAO,CAAG,QACjC,CACJ,GAAI,CACIH,GAAgB,CAACA,EAAa,OAASd,EAAKa,EAAW,SAASb,EAAG,KAAKa,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,OAAO,IACnB,EACQ,OAAOF,EAAO,KAAM,CAAC,CAC7B,EACWZ,CACX,EAAC,EACGoB,GAA4B,UAAY,CACxC,SAASA,EAAWjmB,EAAO,CACvB,KAAK,QAAUA,EAAM,QACrB,KAAK,UAAYA,EAAM,UACvB,KAAK,WAAaA,EAAM,WACxB,KAAK,SAAWA,EAAM,QACzB,CACD,OAAAimB,EAAW,UAAU,IAAM,SAAUvN,EAAY,CAC7C,IAAIqM,EAAK,KAAMmB,EAAOnB,EAAG,KAAgBA,EAAG,YAAS/M,EAAW+M,EAAG,SAC/DU,EAAS,SAAUzK,EAAM0K,EAAO,CAChC,IAAIS,EAAKpB,EACT,GAAIW,IAAUhN,EAAW,OACrB,OAAOsC,EAAK,QAAQhD,CAAQ,EAEhC,IAAImN,EAAWnK,EAAK,SAAS,QAAO,EACpC,GAAI,CACA,QAASoL,EAAazB,GAASQ,CAAQ,EAAGkB,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIN,EAAKvB,GAAO8B,EAAa,MAAO,CAAC,EAAGN,EAAYD,EAAG,CAAC,EAAGP,EAAQO,EAAG,CAAC,EACvE,GAAIC,IAAcrN,EAAWgN,CAAK,EAC9B,OAAOD,EAAOF,EAAOG,EAAQ,CAAC,CAErC,CACJ,OACMY,EAAP,CAAgBH,EAAM,CAAE,MAAOG,CAAO,CAAG,QACjC,CACJ,GAAI,CACID,GAAgB,CAACA,EAAa,OAAStB,EAAKqB,EAAW,SAASrB,EAAG,KAAKqB,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,MAAO,EACnB,EACQ,OAAOV,EAAOS,EAAM,CAAC,CAC7B,EACID,EAAW,UAAU,QAAU,SAAUvN,EAAY,CACjD,IAAIwN,EAAO,KAAK,KAChB,OAAOA,EAAK,QAAQxN,CAAU,CACtC,EACIuN,EAAW,UAAU,UAAY,UAAY,CACzC,IAAIC,EAAO,IAAIrB,GAAK,KAAK,OAAO,EAC5BljB,EAAM,KAAK,UAAU,OAAQ1B,EACjC,IAAKA,EAAI,EAAGA,EAAI0B,EAAK1B,IACjB,KAAK,WAAW,KAAK,UAAUA,CAAC,EAAGimB,EAAM,CAAC,EAE9C,YAAK,KAAOA,EACLA,CACf,EACID,EAAW,UAAU,WAAa,SAAU5N,EAAQ2C,EAAM0K,EAAO,CAG7D,GAFA1K,EAAK,KAAK3C,CAAM,EAChB2C,EAAK,MAAQ,GACT0K,EAAQ,KAAK,WAAW,OAAQ,CAChC,IAAIpL,EAASjC,EAAO,KAAK,WAAWqN,CAAK,CAAC,EACrC1K,EAAK,SAAS,IAAIV,CAAM,GACzBU,EAAK,SAAS,IAAIV,EAAQ,IAAIuK,GAAK,KAAK,OAAO,CAAC,EAEpD,KAAK,WAAWxM,EAAQ2C,EAAK,SAAS,IAAIV,CAAM,EAAGoL,EAAQ,CAAC,CAC/D,CACT,EACIO,EAAW,UAAU,QAAU,SAAUjL,EAAM,CAC3C,IAAIuL,EAAKxB,EACL/J,IAAS,SAAUA,EAAO,KAAK,MACnC,IAAImK,EAAWnK,EAAK,SAAS,OAAM,EACnC,GAAI,CACA,QAASwL,EAAa7B,GAASQ,CAAQ,EAAGsB,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIjB,EAAQkB,EAAa,MACzB,KAAK,QAAQlB,CAAK,CACrB,CACJ,OACMmB,EAAP,CAAgBH,EAAM,CAAE,MAAOG,CAAO,CAAG,QACjC,CACJ,GAAI,CACID,GAAgB,CAACA,EAAa,OAAS1B,EAAKyB,EAAW,SAASzB,EAAG,KAAKyB,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,OAAAvL,EAAK,QAAQ,KAAK,QAAQ,EACnBA,CACf,EACIiL,EAAW,UAAU,QAAU,SAAUjL,EAAM,CAC3C,IAAI2L,EAAK5B,EACL/J,IAAS,SAAUA,EAAO,KAAK,MACnC,IAAImK,EAAWnK,EAAK,SAAS,OAAM,EACnC,GAAI,CACA,QAAS4L,EAAajC,GAASQ,CAAQ,EAAG0B,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIrB,EAAQsB,EAAa,MACzB,KAAK,QAAQtB,CAAK,CACrB,CACJ,OACMuB,EAAP,CAAgBH,EAAM,CAAE,MAAOG,CAAO,CAAG,QACjC,CACJ,GAAI,CACID,GAAgB,CAACA,EAAa,OAAS9B,EAAK6B,EAAW,SAAS7B,EAAG,KAAK6B,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,OAAA3L,EAAK,QAAQ,KAAK,QAAQ,EACnBA,CACf,EACWiL,CACX,EAAC,EACDc,GAAA,QAAkBd,aC5Nd1B,GAAUC,GAAQA,EAAK,QAAW,SAAU9jB,EAAGsB,EAAG,CAClD,IAAIqD,EAAI,OAAO,QAAW,YAAc3E,EAAE,OAAO,QAAQ,EACzD,GAAI,CAAC2E,EAAG,OAAO3E,EACf,IAAIT,EAAIoF,EAAE,KAAK3E,CAAC,EAAG,EAAG+jB,EAAK,CAAE,EAAEpT,EAC/B,GAAI,CACA,MAAQrP,IAAM,QAAUA,KAAM,IAAM,EAAE,EAAI/B,EAAE,KAAM,GAAE,MAAMwkB,EAAG,KAAK,EAAE,KAAK,CAC5E,OACMxR,EAAP,CAAgB5B,EAAI,CAAE,MAAO4B,CAAO,CAAG,QAC/B,CACJ,GAAI,CACI,GAAK,CAAC,EAAE,OAAS5N,EAAIpF,EAAE,SAAYoF,EAAE,KAAKpF,CAAC,CAClD,QACO,CAAE,GAAIoR,EAAG,MAAMA,EAAE,KAAQ,CACpC,CACD,OAAOoT,CACX,EACIC,GAAYF,GAAQA,EAAK,UAAa,UAAY,CAClD,QAASC,EAAK,GAAIxkB,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAKwkB,EAAKA,EAAG,OAAOF,GAAO,UAAUtkB,CAAC,CAAC,CAAC,EACvF,OAAOwkB,CACX,EACIE,GAAYH,GAAQA,EAAK,UAAa,SAAS9jB,EAAG,CAClD,IAAI0E,EAAI,OAAO,QAAW,YAAc,OAAO,SAAUC,EAAID,GAAK1E,EAAE0E,CAAC,EAAGnF,EAAI,EAC5E,GAAIoF,EAAG,OAAOA,EAAE,KAAK3E,CAAC,EACtB,GAAIA,GAAK,OAAOA,EAAE,QAAW,SAAU,MAAO,CAC1C,KAAM,UAAY,CACd,OAAIA,GAAKT,GAAKS,EAAE,SAAQA,EAAI,QACrB,CAAE,MAAOA,GAAKA,EAAET,GAAG,EAAG,KAAM,CAACS,EACvC,CACT,EACI,MAAM,IAAI,UAAU0E,EAAI,0BAA4B,iCAAiC,CACzF,EACA,OAAO,eAAe4hB,GAAS,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5D,IAAInC,GAAsB,UAAY,CAClC,SAASA,GAAO,CACZ,KAAK,SAAW,IAAI,IACpB,KAAK,QAAU,EAClB,CACD,OAAAA,EAAK,UAAU,KAAO,UAAY,CAG9B,QAFIE,EACAC,EAAS,CAAA,EACJC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAOC,CAAE,EAAI,UAAUA,CAAE,GAE5BF,EAAK,KAAK,SAAS,KAAK,MAAMA,EAAIL,GAASM,CAAM,CAAC,CAC3D,EACIH,EAAK,UAAU,QAAU,SAAUC,EAAS9M,EAAU,CAClD,OAAIA,IAAa,SAAUA,EAAW,CAAE,GACxC,KAAK,SAAW8M,EAAQ,KAAK,QAAS9M,CAAQ,EACvC,KAAK,QACpB,EACI6M,EAAK,UAAU,QAAU,SAAUnM,EAAY,CAC3C,IAAI+M,EAAS,SAAUzK,EAAM0K,EAAO,CAChC,IAAIR,EAAKH,EACT,GAAIW,IAAUhN,EAAW,OACrB,OAAOsC,EAEX,IAAImK,EAAWnK,EAAK,SAAS,QAAO,EACpC,GAAI,CACA,QAASqK,EAAaV,GAASQ,CAAQ,EAAGG,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIS,EAAKvB,GAAOe,EAAa,MAAO,CAAC,EAAGS,EAAYD,EAAG,CAAC,EAAGP,EAAQO,EAAG,CAAC,EACvE,GAAIC,IAAcrN,EAAWgN,CAAK,EAC9B,OAAOD,EAAOF,EAAOG,EAAQ,CAAC,CAErC,CACJ,OACMF,EAAP,CAAgBN,EAAM,CAAE,MAAOM,CAAO,CAAG,QACjC,CACJ,GAAI,CACIF,GAAgB,CAACA,EAAa,OAASP,EAAKM,EAAW,SAASN,EAAG,KAAKM,CAAU,CACzF,QACO,CAAE,GAAIH,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,OAAO,IACnB,EACQ,OAAOO,EAAO,KAAM,CAAC,CAC7B,EACWZ,CACX,EAAC,EACWoC,GAAA,KAAGpC,GACf,IAAIqC,GAA4B,UAAY,CACxC,SAASA,EAAWlnB,EAAO,CACvB,KAAK,QAAUA,EAAM,QACrB,KAAK,UAAYA,EAAM,UACvB,KAAK,WAAaA,EAAM,WACxB,KAAK,SAAWA,EAAM,SACtB,KAAK,UAAS,EACd,KAAK,QAAO,CACf,CACD,OAAAknB,EAAW,UAAU,IAAM,SAAUxO,EAAY,CAC7C,IAAIqM,EAAK,KAAMmB,EAAOnB,EAAG,KAAMD,EAAUC,EAAG,QAAS/M,EAAW+M,EAAG,SAC/DU,EAAS,SAAUzK,EAAM0K,EAAO,CAChC,IAAIC,EAAKZ,EACT,GAAIW,IAAUhN,EAAW,OACrB,OAAOsC,EAAK,QAAQ8J,EAAS9M,CAAQ,EAEzC,IAAImN,EAAWnK,EAAK,SAAS,QAAO,EACpC,GAAI,CACA,QAAS4K,EAAajB,GAASQ,CAAQ,EAAGU,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIE,EAAKvB,GAAOsB,EAAa,MAAO,CAAC,EAAGE,EAAYD,EAAG,CAAC,EAAGP,EAAQO,EAAG,CAAC,EACvE,GAAIC,IAAcrN,EAAWgN,CAAK,EAC9B,OAAOD,EAAOF,EAAOG,EAAQ,CAAC,CAErC,CACJ,OACMM,EAAP,CAAgBL,EAAM,CAAE,MAAOK,CAAO,CAAG,QACjC,CACJ,GAAI,CACIH,GAAgB,CAACA,EAAa,OAASd,EAAKa,EAAW,SAASb,EAAG,KAAKa,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACD,MAAO,EACnB,EACQ,OAAOF,EAAOS,EAAM,CAAC,CAC7B,EACIgB,EAAW,UAAU,QAAU,SAAUxO,EAAY,CACjD,IAAIwN,EAAO,KAAK,KAChB,OAAOA,EAAK,QAAQxN,CAAU,CACtC,EACIwO,EAAW,UAAU,QAAU,SAAUlnB,EAAO,CAC5C,IAAI+kB,EAAK/kB,EAAM,QAAS8kB,EAAUC,IAAO,OAAS,KAAK,QAAUA,EAAIe,EAAK9lB,EAAM,UAAWmnB,EAAYrB,IAAO,OAAS,KAAK,UAAYA,EAAIsB,EAAKpnB,EAAM,WAAY0Y,EAAa0O,IAAO,OAAS,KAAK,WAAaA,EAAIC,EAAKrnB,EAAM,SAAUgY,EAAWqP,IAAO,OAAS,KAAK,SAAWA,EAClR3O,IAAe,KAAK,YAAcyO,IAAc,KAAK,WACrD,KAAK,WAAazO,EAClB,KAAK,UAAYyO,EACjB,KAAK,SAAWnP,EAChB,KAAK,QAAU8M,EACf,KAAK,UAAS,EACd,KAAK,QAAO,IAEP9M,IAAa,KAAK,UAAY8M,IAAY,KAAK,WACpD,KAAK,SAAW9M,EAChB,KAAK,QAAU8M,EACf,KAAK,QAAO,EAExB,EACIoC,EAAW,UAAU,UAAY,UAAY,CACzC,IAAIhB,EAAO,IAAIrB,GACXljB,EAAM,KAAK,UAAU,OAAQ1B,EACjC,IAAKA,EAAI,EAAGA,EAAI0B,EAAK1B,IACjB,KAAK,WAAW,KAAK,UAAUA,CAAC,EAAGimB,EAAM,CAAC,EAE9C,YAAK,KAAOA,EACLA,CACf,EACIgB,EAAW,UAAU,WAAa,SAAU7O,EAAQ2C,EAAM0K,EAAO,CAC7D,GAAIA,IAAU,KAAK,WAAW,OAC1B1K,EAAK,KAAK3C,CAAM,MAEf,CACD,IAAIiC,EAASjC,EAAO,KAAK,WAAWqN,CAAK,CAAC,EACrC1K,EAAK,SAAS,IAAIV,CAAM,GACzBU,EAAK,SAAS,IAAIV,EAAQ,IAAIuK,EAAM,EAExC,KAAK,WAAWxM,EAAQ2C,EAAK,SAAS,IAAIV,CAAM,EAAGoL,EAAQ,CAAC,CAC/D,CACT,EACIwB,EAAW,UAAU,QAAU,SAAUlM,EAAM,CAC3C,IAAImL,EAAKpB,EAET,GADI/J,IAAS,SAAUA,EAAO,KAAK,MAC/BA,EAAK,SAAS,KAAO,EAAG,CACxBA,EAAK,QAAU,GACf,IAAImK,EAAWnK,EAAK,SAAS,OAAM,EACnC,GAAI,CACA,QAASoL,EAAazB,GAASQ,CAAQ,EAAGkB,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIb,EAAQc,EAAa,MACrBpmB,EAAI,OACJqG,EAAO,KAAK,QAAQif,CAAK,EAAE,QAC3B5jB,EAAM2E,EAAK,OACf,IAAKrG,EAAI,EAAGA,EAAI0B,EAAK1B,IACjB+a,EAAK,QAAQ,KAAK1U,EAAKrG,CAAC,CAAC,CAEhC,CACJ,OACMqmB,EAAP,CAAgBH,EAAM,CAAE,MAAOG,CAAO,CAAG,QACjC,CACJ,GAAI,CACID,GAAgB,CAACA,EAAa,OAAStB,EAAKqB,EAAW,SAASrB,EAAG,KAAKqB,CAAU,CACzF,QACO,CAAE,GAAID,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACJ,CACD,OAAAnL,EAAK,QAAQ,KAAK,QAAS,KAAK,QAAQ,EACjCA,CACf,EACWkM,CACX,EAAC,EACDD,GAAA,QAAkBC,GC1LlB,OAAO,eAAeI,GAAS,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5D,IAAI1C,GAAe2C,GACnBD,GAAA,WAAqB1C,GAAa,QAClC,IAAIoC,GAAeQ,GACDF,GAAA,WAAGN,GAAa,kBCJ9BS,GAAYjD,GAAQA,EAAK,UAAa,UAAY,CAClD,OAAAiD,GAAW,OAAO,QAAU,SAAStR,EAAG,CACpC,QAAS/Q,EAAGnF,EAAI,EAAG,EAAI,UAAU,OAAQA,EAAI,EAAGA,IAAK,CACjDmF,EAAI,UAAUnF,CAAC,EACf,QAASU,KAAKyE,EAAO,OAAO,UAAU,eAAe,KAAKA,EAAGzE,CAAC,IAC1DwV,EAAExV,CAAC,EAAIyE,EAAEzE,CAAC,EACjB,CACD,OAAOwV,CACf,EACWsR,GAAS,MAAM,KAAM,SAAS,CACzC,EACI9C,GAAYH,GAAQA,EAAK,UAAa,SAAS9jB,EAAG,CAClD,IAAI0E,EAAI,OAAO,QAAW,YAAc,OAAO,SAAUC,EAAID,GAAK1E,EAAE0E,CAAC,EAAGnF,EAAI,EAC5E,GAAIoF,EAAG,OAAOA,EAAE,KAAK3E,CAAC,EACtB,GAAIA,GAAK,OAAOA,EAAE,QAAW,SAAU,MAAO,CAC1C,KAAM,UAAY,CACd,OAAIA,GAAKT,GAAKS,EAAE,SAAQA,EAAI,QACrB,CAAE,MAAOA,GAAKA,EAAET,GAAG,EAAG,KAAM,CAACS,EACvC,CACT,EACI,MAAM,IAAI,UAAU0E,EAAI,0BAA4B,iCAAiC,CACzF,EACImf,GAAUC,GAAQA,EAAK,QAAW,SAAU9jB,EAAGsB,EAAG,CAClD,IAAIqD,EAAI,OAAO,QAAW,YAAc3E,EAAE,OAAO,QAAQ,EACzD,GAAI,CAAC2E,EAAG,OAAO3E,EACf,IAAIT,EAAIoF,EAAE,KAAK3E,CAAC,EAAG,EAAG+jB,EAAK,CAAE,EAAEpT,EAC/B,GAAI,CACA,MAAQrP,IAAM,QAAUA,KAAM,IAAM,EAAE,EAAI/B,EAAE,KAAM,GAAE,MAAMwkB,EAAG,KAAK,EAAE,KAAK,CAC5E,OACMxR,EAAP,CAAgB5B,EAAI,CAAE,MAAO4B,CAAO,CAAG,QAC/B,CACJ,GAAI,CACI,GAAK,CAAC,EAAE,OAAS5N,EAAIpF,EAAE,SAAYoF,EAAE,KAAKpF,CAAC,CAClD,QACO,CAAE,GAAIoR,EAAG,MAAMA,EAAE,KAAQ,CACpC,CACD,OAAOoT,CACX,EACA,OAAO,eAAeiD,GAAS,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5D,SAASC,GAAW3nB,EAAO,KACnB0Y,EAAa1Y,EAAM,WAAuBA,EAAM,SAAU,IAAA4nB,EAAO5nB,EAAM,KAC7D4nB,EAAK,QACnB,IAAIC,EAAQ,CAAA,EACZ,SAASC,EAAI9M,EAAM3C,EAAQqN,EAAO,CAC9B,IAAIR,EAAKH,EAAIe,EACb,GAAI9K,EAAK,SAAS,OAAS,EAAG,CAC1B,IAAI6D,EAAS7D,EAAK,SAClB6M,EAAM,KAAKJ,GAASA,GAAS,CAAE,EAAEpP,CAAM,EAAGwG,CAAM,CAAC,EACjD,MACH,CACD,GAAI,CACA,QAASuI,EAAKzC,GAAS3J,EAAK,SAAS,QAAS,CAAA,EAAGqM,EAAKD,EAAG,KAAI,EAAI,CAACC,EAAG,KAAMA,EAAKD,EAAG,OAAQ,CACvF,IAAIW,EAAKxD,GAAO8C,EAAG,MAAO,CAAC,EAAGtB,EAAYgC,EAAG,CAAC,EAAGxC,EAAQwC,EAAG,CAAC,EACzD/c,EAAIyc,GAASA,GAAS,CAAA,EAAIpP,CAAM,GAAIyN,EAAK,CAAE,EAAEA,EAAGpN,EAAWgN,CAAK,CAAC,EAAIK,EAAWD,EAAE,EACtFgC,EAAIvC,EAAOva,EAAG0a,EAAQ,CAAC,CAC1B,CACJ,OACMF,EAAP,CAAgBN,EAAM,CAAE,MAAOM,CAAO,CAAG,QACjC,CACJ,GAAI,CACI6B,GAAM,CAACA,EAAG,OAAStC,EAAKqC,EAAG,SAASrC,EAAG,KAAKqC,CAAE,CACrD,QACO,CAAE,GAAIlC,EAAK,MAAMA,EAAI,KAAQ,CACxC,CACJ,CACD,OAAA4C,EAAIF,EAAK,KAAM,CAAE,EAAE,CAAC,EACbC,CACX,CACAH,GAAA,WAAqBC,aCpErB,OAAO,eAAeK,GAAS,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5DA,GAAA,WAAqB,SAAUC,EAAQjQ,EAAU,CAC7C,IAAIkQ,EAAO,CAAA,EACXlQ,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,EAAI,CACpB,CAAK,EAMD,QALI+P,EAAU,SAAUloB,EAAG0B,EAAK,CAC5BqW,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,GAAK6P,EAAOhoB,CAAC,EAAEmY,CAAG,CACtC,CAAS,CACT,EACanY,EAAI,EAAG0B,EAAMsmB,EAAO,OAAQhoB,EAAI0B,EAAK1B,IAC1CkoB,EAAQloB,CAAM,EAElB,OAAOioB,CACX,EACAF,GAAA,IAAc,SAAUC,EAAQjQ,EAAU,CACtC,IAAIkQ,EAAO,CAAA,EACXlQ,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,EAAI,CACpB,CAAK,EAMD,QALIgQ,EAAU,SAAUnoB,EAAG0B,EAAK,CAC5BqW,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,GAAK,OAAO6P,EAAOhoB,CAAC,EAAEmY,CAAG,CAAC,GAAK,CACnD,CAAS,CACT,EACanY,EAAI,EAAG0B,EAAMsmB,EAAO,OAAQhoB,EAAI0B,EAAK1B,IAC1CmoB,EAAQnoB,CAAM,EAElB,OAAOioB,CACX,EACAF,GAAA,MAAgB,SAAUC,EAAQI,EAAU,CACxC,IAAIC,EAAO,CAAA,EACXD,EAAS,QAAQ,SAAUjQ,EAAK,CAC5BkQ,EAAKlQ,CAAG,EAAI,CACpB,CAAK,EACD,QAASnY,EAAI,EAAG0B,EAAMsmB,EAAO,OAAQhoB,EAAI0B,EAAK1B,IAC1CooB,EAAS,QAAQ,SAAUjQ,EAAK,CAC5BkQ,EAAKlQ,CAAG,GACpB,CAAS,EAEL,OAAOkQ,CACX,EACAN,GAAA,KAAe,SAAUC,EAAQjQ,EAAU,CACvC,IAAIkQ,EAAO,CAAA,EACXlQ,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,EAAI,CACpB,CAAK,EAMD,QALImQ,EAAU,SAAUtoB,EAAG0B,EAAK,CAC5BqW,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,GAAK,OAAO6P,EAAOhoB,CAAC,EAAEmY,CAAG,CAAC,GAAK,CACnD,CAAS,CACT,EACanY,EAAI,EAAG0B,EAAMsmB,EAAO,OAAQhoB,EAAI0B,EAAK1B,IAC1CsoB,EAAQtoB,CAAM,EAElB,OAAA+X,EAAS,QAAQ,SAAUI,EAAK,CAC5B8P,EAAK9P,CAAG,GAAK6P,EAAO,MAC5B,CAAK,EACMC,CACX,cC5DA,IAAIT,EAAYjD,GAAQA,EAAK,UAAa,UAAY,CAClD,OAAAiD,EAAW,OAAO,QAAU,SAAStR,EAAG,CACpC,QAAS/Q,EAAGnF,EAAI,EAAG+B,EAAI,UAAU,OAAQ/B,EAAI+B,EAAG/B,IAAK,CACjDmF,EAAI,UAAUnF,CAAC,EACf,QAASU,KAAKyE,EAAO,OAAO,UAAU,eAAe,KAAKA,EAAGzE,CAAC,IAC1DwV,EAAExV,CAAC,EAAIyE,EAAEzE,CAAC,EACjB,CACD,OAAOwV,CACf,EACWsR,EAAS,MAAM,KAAM,SAAS,CACzC,EACA,SAASe,EAASnjB,EAAG,CACjB,QAAS1E,KAAK0E,EAAQojB,EAAQ,eAAe9nB,CAAC,IAAG8nB,EAAQ9nB,CAAC,EAAI0E,EAAE1E,CAAC,EACpE,CACD,OAAO,eAAc8nB,EAAU,aAAc,CAAE,MAAO,EAAI,CAAE,EAC5D,IAAIC,EAAUnB,GAEVoB,EAAcnB,GACdoB,EAAgBC,GAChBC,EAAc,CACd,IAAOF,EAAc,WACrB,KAAQA,EAAc,KACtB,MAASA,EAAc,KAC3B,EAMA,SAASG,EAAU/oB,EAAO,CACtB,IAAI0Y,EAAa1Y,EAAM,WAAYgY,EAAWhY,EAAM,SAAUgpB,EAAWhpB,EAAM,SAAUipB,EAAWjpB,EAAM,SAAU+X,EAAa/X,EAAM,WAEnI4nB,EAAOsB,EAAW,CAClB,KAAM,SACN,QAASJ,EAAYG,CAAQ,GAAKL,EAAc,MAChD,WAAYlQ,EACZ,SAAUV,EACV,UAAWD,CACnB,CAAK,EACG8P,EAAQc,EAAY,WAAW,CAAE,WAAYjQ,EAAY,SAAUV,EAAU,KAAM4P,CAAM,CAAA,EAC7F,OAAAC,EAAM,QAAQ,SAAUxN,EAAK,CACzB2O,EAAS,QAAQ,SAAUG,EAAIlpB,EAAG,CAC9Boa,EAAI8O,CAAE,EAAI9O,EAAIrC,EAAS/X,CAAC,CAAC,CACrC,CAAS,CACT,CAAK,EACM4nB,CACV,CACD,SAASqB,EAAWnE,EAAI,CACpB,IAAI9hB,EAAO8hB,EAAG,KAAMe,EAAKf,EAAG,QAASD,EAAUgB,IAAO,OAAS8C,EAAc,MAAQ9C,EAAIsB,EAAKrC,EAAG,UAAWoC,EAAYC,IAAO,OAAS,CAAA,EAAKA,EAAIC,EAAKtC,EAAG,WAAYrM,EAAa2O,IAAO,OAAS,CAAE,EAAGA,EAAIU,EAAKhD,EAAG,SAAU/M,EAAW+P,IAAO,OAAS,CAAE,EAAGA,EAC7P,OAAQ9kB,EAAI,CACR,IAAK,SACD,OAAO,IAAIylB,EAAQ,WAAW,CAC1B,QAAS5D,EACT,UAAWqC,EACX,WAAYzO,EACZ,SAAUV,CAC1B,CAAa,EACL,IAAK,SACD,OAAO,IAAI0Q,EAAQ,WAAW,CAC1B,QAAS5D,EACT,UAAWqC,EACX,WAAYzO,EACZ,SAAUV,CAC1B,CAAa,EACL,QACI,OAAO,IAAI0Q,EAAQ,WAAW,CAC1B,QAAS5D,EACT,UAAWqC,EACX,WAAYzO,EACZ,SAAUV,CAC1B,CAAa,CACR,CACJ,CACDyQ,EAAA,WAAqBS,EACrBT,EAAA,QAAkBM,EAClBP,EAASK,EAA8B,OCuDhC,IAAIO,IACV,SAAUA,EAAgB,CACvBA,EAAe,QAAa,kBAC5BA,EAAe,QAAa,gBAC5BA,EAAe,MAAW,eAC9B,GAAGA,KAAmBA,GAAiB,CAAA,EAAG,ECpI1C,MAAMC,GAAuBlL,EAOtB,SAASmL,GAAavR,EAAYoC,EAAO,CAC5C,OAAIF,GAAYlC,EAAYoC,CAAK,EACtB,WAEFJ,GAAiBhC,EAAYoC,CAAK,EAWnCD,GAAYnC,EAAYoC,CAAK,EAAE,OAASkP,GACjC,eAGA,WAINxP,GAAgB9B,EAAYoC,CAAK,EAE/B,UAMf,CA4BO,SAASoP,GAAgBxR,EAAYoC,EAAO,CAC/C,MAAMqP,EAAUtP,GAAYnC,EAAYoC,CAAK,EACvCiC,EAAgBoN,EAAQ,IAAInkB,GAAKA,EAAE,CAAC,CAAC,EACrCiX,EAAkBH,GAAUC,CAAa,EACzCqN,EAAepN,GAAQC,CAAe,EACtCoN,EAAa,KAAK,KAAKF,EAAQ,MAAM,EAC3C,MAAO,CACH,UAAWrP,EACX,QAASsP,EACT,WAAAC,CACR,CACA,CACO,SAASC,GAAqB5R,EAAYoC,EAAO,CACpD,IAAIyP,EAAO,KACPC,EAAO,IACX,QAAS5pB,EAAI,EAAGA,EAAI8X,EAAW,OAAQ9X,IACnC2pB,EAAO,KAAK,IAAIA,EAAM7R,EAAW9X,CAAC,EAAEka,CAAK,CAAC,EAC1C0P,EAAO,KAAK,IAAIA,EAAM9R,EAAW9X,CAAC,EAAEka,CAAK,CAAC,EAE9C,MAAM2P,GAAaF,EAAOC,GAAQ1L,EAC5B4L,EAAc,IAAI,MAAM5L,EAAuB,CAAC,EAAE,KAAK,CAAC,EAC9D,QAASle,EAAI,EAAGA,EAAI8X,EAAW,OAAQ9X,IAAK,CACxC,MAAMoB,EAAQ0W,EAAW9X,CAAC,EAAEka,CAAK,EAC3B6P,EAAa,KAAK,OAAO3oB,EAAQwoB,GAAQC,CAAS,EACxDC,EAAYC,CAAU,GACzB,CACDD,EAAY5L,EAAuB,CAAC,GAAK4L,EAAY5L,CAAoB,EACzE,MAAM8L,EAAK9N,GAAU4N,EAAY,MAAM,EAAG5L,CAAoB,CAAC,EACzDsL,EAAepN,GAAQ4N,CAAE,EACzBP,EAAa,KAAK,KAAKvL,CAAoB,EACjD,MAAO,CACH,UAAWhE,EACX,QAASsP,EACT,WAAAC,CACR,CACA,CCvGA,MAAMQ,GAAQ,CACV,QAAQpP,EAAG,CACP,OAAOA,IAAM,QAAUA,IAAM,SAAWA,IAAM,IAAQA,IAAM,EAC/D,EACD,QAAQA,EAAG,CACP,OAAOoP,GAAM,OAAOpP,CAAC,IAAMA,EAAI,CAACA,KAAO,CAAC,CAACA,CAC5C,EACD,OAAOA,EAAG,CACN,MAAO,CAAC,MAAM,CAACA,CAAC,CACnB,EACD,KAAKA,EAAG,CACJ,MAAO,CAAC,MAAM,KAAK,MAAMA,CAAC,CAAC,CAC9B,CACL,EACA,SAASqP,GAAQlrB,EAAK,CAClB,OAAOA,GAAO,MAAQA,IAAQA,CAClC,CACO,SAASmrB,GAAcvL,EAAQ,CAElC,MAAMwL,EAAQ,CAAC,UAAW,UAAW,SAAU,MAAM,EACrD,QAAShpB,KAASwd,EAAQ,CAEtB,QAASzW,EAAI,EAAGA,EAAIiiB,EAAM,OAAQ,EAAEjiB,EAC5B+hB,GAAQ9oB,CAAK,GAAK,CAAC6oB,GAAMG,EAAMjiB,CAAC,CAAC,EAAE/G,CAAK,IACxCgpB,EAAM,OAAOjiB,EAAG,CAAC,EACjBA,GAAK,GAIb,GAAIiiB,EAAM,SAAW,EACjB,MAAO,QACd,CACD,OAAOA,EAAM,CAAC,CAClB,CAEO,SAASC,GAAiBC,EAAWxS,EAAY,CACpD,MAAMyS,EAAS,CAAA,EACTC,EAAY,IAAI,IACtB,QAASla,KAAKga,EAAW,CACrB,MAAMG,EAAW,IAAI,IACrB3S,EAAW,QAAQsC,GAAO,CACjBqQ,EAAS,IAAIrQ,EAAI9J,CAAC,CAAC,GACpBma,EAAS,IAAIrQ,EAAI9J,CAAC,EAAG,CAAC,EAE1Bma,EAAS,IAAIrQ,EAAI9J,CAAC,EAAGma,EAAS,IAAIrQ,EAAI9J,CAAC,CAAC,EAAI,CAAC,CACzD,CAAS,EACD,MAAMoa,EAAWP,GAAc,CAAC,GAAGM,EAAS,KAAM,CAAA,CAAC,EAC7CE,EAAetB,GAAavR,EAAYxH,CAAC,EAC/C,IAAImZ,EAAa,KAAK,KAAKgB,EAAS,IAAI,EACpCrO,EAAUqN,EACVmB,EAAe,YACfC,EAAkB,GACtB,IAAKH,IAAa,WAAaA,IAAa,WAAaC,IAAiB,YACtEC,EAAe,UACXH,EAAS,KAAOvM,GAAsB,CACtC,IAAI4M,EAAOpB,GAAqB5R,EAAYxH,CAAC,EAC7C8L,EAAU0O,EAAK,QACfrB,EAAaqB,EAAK,WAClBD,EAAkB,EACrB,CAEL,GAAI,CAACA,EAAiB,CAClB,IAAIC,EAAOxB,GAAgBxR,EAAYxH,CAAC,EACxC8L,EAAU0O,EAAK,QACfrB,EAAaqB,EAAK,UACrB,CACD,IAAI5Q,EAAQ,CACR,IAAK5J,EACL,aAAAsa,EACA,aAAAD,EACA,SAAAD,EACA,SAAU,CACN,OAAQD,EAAS,KACjB,KAAM3S,EAAW,OACjB,QAAAsE,EACA,WAAAqN,CACH,CACb,EACQc,EAAO,KAAKrQ,CAAK,EACjBsQ,EAAU,IAAItQ,EAAM,IAAKA,CAAK,CACjC,CACD,MAAO,CACH,OAAAqQ,EACA,UAAAC,CACR,CACA,CCpFO,MAAMO,EAAU,CACnB,YAAYtS,EAAYV,EAAU,CAC9B,KAAK,gCAAkC2I,GACvC,KAAK,8BAAgCC,GAAmB,OACxD,KAAK,WAAalI,EAClB,KAAK,SAAWV,CAGnB,CACD,aAAaD,EAAYyS,EAAQS,EAAI,CACjC,IAAInK,EAAS0J,EAAO,IAAKja,GAAMia,EAAO,IAAI,IAAM,CAAC,CAAC,EAClD,QAASvqB,EAAI,EAAGA,EAAIuqB,EAAO,OAAQvqB,IAAK,CACpC6gB,EAAO7gB,CAAC,EAAEA,CAAC,EAAI,EACf,QAASmI,EAAInI,EAAI,EAAGmI,EAAIoiB,EAAO,OAAQpiB,IACnC0Y,EAAO7gB,CAAC,EAAEmI,CAAC,EAAI0Y,EAAO1Y,CAAC,EAAEnI,CAAC,EAAIgrB,EAAGlT,EAAYyS,EAAOvqB,CAAC,EAAGuqB,EAAOpiB,CAAC,CAAC,CAExE,CACD,OAAO0Y,CACV,CACD,cAAc/I,EAAYkT,EAAK7P,GAAW,CACtC,YAAK,GAAK,KAAK,aAAarD,EAAY,KAAK,WAAYkT,CAAE,EACpD,KAAK,EACf,CACD,cAAclT,EAAYkT,EAAK1P,GAAW,CACtC,YAAK,GAAK,KAAK,aAAaxD,EAAY,KAAK,SAAUkT,CAAE,EAClD,KAAK,EACf,CACD,cAAclT,EAAYmT,EAAuB,CAC7C,KAAM,CAAE,WAAAxS,EAAY,gCAAAyS,CAAiC,EAAG,KACxD,YAAK,UAAYnH,GAAoBjM,EAAYW,EAAYwS,GAAyBC,CAA+B,EAC9G,KAAK,SACf,CACD,cAAcpT,EAAYmT,EAAuB,CAC7C,KAAM,CAAE,SAAAlT,EAAU,8BAAAoT,CAA+B,EAAG,KACpD,YAAK,UAAYhH,GAA+BrM,EAAYC,EAAUkT,GAAyBE,CAA6B,EACrH,KAAK,SACf,CACL,CCtCA,MAAMC,GAAc,CAAC,MAAO,MAAO,MAAO,OAAQ,QAAS,MAAM,EAC1D,MAAMC,EAAO,CAChB,YAAYtrB,EAAO,CACf,KAAM,CAAE,WAAA0Y,EAAY,SAAAV,EAAU,IAAA2H,EAAM0L,GAAa,OAAAE,CAAQ,EAAGvrB,EAC5D,KAAK,WAAa0Y,EAClB,KAAK,SAAWV,EAChB,KAAK,IAAM2H,EACX,KAAK,MAAQ,GACb,KAAK,OAAS4L,CACjB,CACD,SAASnL,EAAO,CACZ,KAAK,MAAQA,CAChB,CACD,QAAQrI,EAAY,CAChB,KAAK,MAAQ2H,GAAa,CACtB,WAAY,KAAK,WACjB,SAAU,KAAK,SACf,IAAK,KAAK,IACV,WAAA3H,CACZ,CAAS,EACD,KAAM,CAAE,MAAAqI,EAAO,WAAA1H,EAAY,SAAAV,EAAU,OAAAuT,CAAM,EAAK,KAC1C/L,EAASD,GAAQxH,EAAYW,CAAU,EAC7C,QAAS2B,KAAO+F,EAAO,CACnB,MAAMoL,EAAUtL,GAAcxH,EAAW,IAAI+G,GAAKpF,EAAI,UAAUoF,CAAC,CAAC,CAAC,EAC7DgM,EAAcjM,EAAO,IAAIgM,CAAO,EACtC,QAASpT,KAAOJ,EAAU,CACtB,MAAM8G,EAAQyM,EAAO,IAAInT,CAAG,EAC5BiC,EAAI,KAAKjC,CAAG,EAAE,KAAUwG,GAAK6M,EAAY,IAAIxiB,GAAKA,EAAEmP,CAAG,CAAC,EAAG0G,CAAK,CACnE,CACJ,CACD,OAAO,KAAK,KACf,CACD,kBAAkB4M,EAAQ,CACtB,KAAM,CAAE,IAAA/L,EAAK,SAAA3H,EAAU,WAAAU,CAAU,EAAK,KACtC,YAAK,MAAQ2H,GAAuB,CAChC,WAAA3H,EACA,SAAAV,EACA,IAAA2H,EACA,YAAa+L,EAAO,YAAa,CAC7C,CAAS,EACM,KAAK,KACf,CACD,IAAI,MAAO,CACP,OAAO,KAAK,MAAM,MACrB,CACD,kBAAkB1T,EAAU2T,EAAoB,CAC5C,IAAIrlB,EAAO,CAAA,EACX,KAAM,CAAE,MAAA8Z,EAAO,WAAA1H,CAAY,EAAG,KAC9B,QAAS2B,KAAO+F,EAAO,CACnB,IAAIwL,EAAS,CAAA,EACb,QAAS3S,KAAOP,EACZkT,EAAO3S,CAAG,EAAIoB,EAAI,UAAUpB,CAAG,EAEnC,QAAShZ,EAAI,EAAGA,EAAI+X,EAAS,OAAQ/X,IAAK,CACtC,MAAMmY,EAAMJ,EAAS/X,CAAC,EAChBqf,EAAKqM,EAAmB1rB,CAAC,EAC/B2rB,EAAOxT,CAAG,EAAIiC,EAAI,KAAKjC,CAAG,EAAEkH,CAAE,CACjC,CACDhZ,EAAK,KAAKslB,CAAM,CACnB,CACD,OAAOtlB,CACV,CACD,aAAc,CACV,OAAO,KAAK,KACf,CACL,CCgCA,MAAMulB,EAAqB,SACrBR,GAAc,CAAC,MAAO,MAAO,MAAO,OAAQ,QAAS,MAAM,EAC1D,MAAMS,EAAK,CACd,YAAY9rB,EAAO,CACf,KAAM,CAAE,WAAA0Y,EAAY,SAAAV,EAAU,WAAAD,EAAY,IAAA4H,EAAM0L,EAAa,EAAGrrB,EAChE,KAAK,WAAa0Y,EAClB,KAAK,SAAWV,EAChB,KAAK,WAAaD,EAClB,KAAK,IAAM4H,EACX,KAAK,SAAW,IAAI,IACpBjH,EAAW,QAAQ,CAACO,EAAKhZ,IAAM,CAC3B,KAAK,SAAS,IAAIgZ,EAAKhZ,CAAC,CACpC,CAAS,EACD,KAAK,QAAU,IAAI,IACnB,KAAK,OAAS,IAAI,GACrB,CAID,cAAcyY,EAAY,CACtB,MAAMqT,EAAc,CAAC,GAAGrT,CAAU,EAClC,OAAAqT,EAAY,KAAK,CAACC,EAAIC,IACX,KAAK,SAAS,IAAID,CAAE,EAAI,KAAK,SAAS,IAAIC,CAAE,CACtD,EACMF,CACV,CACD,UAAUrT,EAAY,CAClB,MAAMqT,EAAc,KAAK,cAAcrT,CAAU,EAC3CwT,EAASH,EAAY,KAAKF,CAAkB,EAElD,GAAI,KAAK,QAAQ,IAAIK,CAAM,EACvB,OAAO,KAAK,QAAQ,IAAIA,CAAM,EAGlC,IAAIC,EAAa,IAAI,IAAIzT,CAAU,EACnC,MAAM0T,EAAqB,CAAA,EACrBC,EAAiB,CAAA,EACvB,QAASpT,KAAO,KAAK,WACjB,GAAI,CAACkT,EAAW,IAAIlT,CAAG,EAAG,CAGtB,MAAMqT,EADmB,KAAK,cAAc,CAAC,GAAGP,EAAa9S,CAAG,CAAC,EAC9B,KAAK4S,CAAkB,EACtD,KAAK,QAAQ,IAAIS,CAAS,EAC1BF,EAAmB,KAAKE,CAAS,EAEjCD,EAAe,KAAKC,CAAS,CAEpC,CAEL,IAAIC,EAAU,IACVC,EAAe,KAAK,WAAW,KAAKX,CAAkB,EAC1D,GAAIO,EAAmB,OAAS,EAC5B,QAASxsB,KAAOwsB,EAAoB,CAChC,MAAMK,EAAU,KAAK,QAAQ,IAAI7sB,CAAG,EAChC6sB,EAAQ,KAAOF,IACfA,EAAUE,EAAQ,KAClBD,EAAe5sB,EAEtB,MAEIysB,EAAe,OAAS,IAC7BG,EAAeH,EAAe,CAAC,GAEnC,MAAMK,EAAe,KAAK,UAAUF,EAAa,MAAMX,CAAkB,CAAC,EAG1E,IAAIH,EAAS,IAAIJ,GAAO,CACpB,WAAA5S,EACA,SAAU,KAAK,SACf,IAAK,KAAK,IACV,OAAQ,KAAK,MACzB,CAAS,EAED,OAAAgT,EAAO,kBAAkBgB,CAAY,EACrC,KAAK,QAAQ,IAAIR,EAAQR,CAAM,EACxBA,CACV,CACD,eAAgB,CACZ,KAAM,CAAE,SAAA1T,EAAU,WAAAD,CAAY,EAAG,KACjC,QAASK,KAAOJ,EACZ,KAAK,OAAO,IAAII,EAAKmE,GAAWxE,EAAYK,CAAG,CAAC,CAEvD,CACD,qBAAqBM,EAAY,CAC7B,IAAIiU,EAAgB,IAAIrB,GAAO,CAC3B,WAAA5S,EACA,SAAU,KAAK,SACf,IAAK,KAAK,IACV,OAAQ,KAAK,MACzB,CAAS,EACD,MAAMkU,EAAa,KAAK,QAAQ,IAAI,KAAK,WAAW,KAAKf,CAAkB,CAAC,EAE5Ec,EAAc,kBAAkBC,CAAU,EAC1C,KAAK,QAAQ,IAAIlU,EAAW,KAAKmT,CAAkB,EAAGc,CAAa,CACtE,CACD,iBAAkB,CACd,KAAK,cAAa,EAClB,IAAIC,EAAa,IAAItB,GAAO,CACxB,WAAY,KAAK,WACjB,SAAU,KAAK,SACf,IAAK,KAAK,IACV,OAAQ,KAAK,MACzB,CAAS,EACD,OAAAsB,EAAW,QAAQ,KAAK,UAAU,EAClC,KAAK,QAAQ,IAAI,KAAK,WAAW,KAAKf,CAAkB,EAAGe,CAAU,EAC9DA,CACV,CACD,WAAWC,EAAWvM,EAAa,CAC/B,MAAMoL,EAAS,IAAIJ,GAAO,CACtB,WAAYuB,EAAU,MAAMhB,CAAkB,EAC9C,SAAU,KAAK,SACf,IAAK,KAAK,IACV,OAAQ,KAAK,MACzB,CAAS,EACDH,EAAO,SAASpL,CAAW,EAC3B,KAAK,QAAQ,IAAIuM,EAAWnB,CAAM,CACrC,CACD,eAAgB,CACZ,MAAMoB,EAAM,CAAA,EACZ,OAAS,CAACC,EAAIC,CAAE,IAAK,KAAK,QACtBF,EAAIC,CAAE,EAAIC,EAAG,YAAW,EAE5B,OAAOF,CACV,CACD,IAAI,YAAa,CACb,MAAMG,EAAU,KAAK,WAAW,KAAKpB,CAAkB,EACvD,OAAK,KAAK,QAAQ,IAAIoB,CAAO,EAGtB,KAAK,QAAQ,IAAIA,CAAO,EAFpB,KAAK,iBAGnB,CACL,CCrOO,MAAMC,GAAuB,MAAOC,EAASzU,EAAYV,IAAa,CACzE,IAAIoV,EAAU,IAAIvJ,GAAO,gBAAgB,CAAA,EAAI7L,EAAUmV,CAAO,EAC9DC,EAAQ,qBAAoB,EAC5B,IAAIC,EAAYD,EAAQ,sBACpBE,EAAW,EACXC,EAAQ,EACZ,QAASttB,EAAI,EAAGA,EAAIotB,EAAU,OAAQptB,IAC9BotB,EAAUptB,CAAC,EAAIstB,IACfA,EAAQF,EAAUptB,CAAC,EACnBqtB,EAAWrtB,GAGnB,IAAIutB,EAAM,CAAA,EACV,OAAA9U,EAAW,OAAOV,CAAQ,EAAE,QAASI,GAAQ,CACzCoV,EAAIpV,CAAG,EAAI+U,EAAQG,CAAQ,EAAElV,CAAG,CACxC,CAAK,EACM,CACH,WAAAM,EACA,SAAAV,EACA,aAAcuV,EACd,YAAaC,CACrB,CACA,ECtBaC,GAAgB,MAAON,EAASzU,EAAYV,IAAa,CAClE,GAAIU,EAAW,SAAW,EACtB,OAAO,KACX,IAAIgV,EAAc,CAAC,GAAGP,CAAO,EAC7BO,EAAY,KAAK,CAAC,EAAG3L,IACb,EAAErJ,EAAW,CAAC,CAAC,EAAIqJ,EAAErJ,EAAW,CAAC,CAAC,EAC3B,EACP,EAAEA,EAAW,CAAC,CAAC,IAAMqJ,EAAErJ,EAAW,CAAC,CAAC,EAC7B,EAEA,EACd,EACD,IAAIiV,EAAM,EACV,QAASvV,KAAOJ,EAAU,CACtB,IAAI4V,EAAc,IAAIjR,GAAqB+Q,EAAahV,EAAW,CAAC,EAAGN,CAAG,EAC1EwV,EAAY,oBAAoBlV,CAAU,EAC1CiV,GAAOC,EAAY,cACtB,CACD,OAAAD,GAAO3V,EAAS,OACT,CACH,WAAAU,EACA,SAAAV,EACA,aAAc2V,CACtB,CACA,ECvBO,IAAIvE,IACV,SAAUA,EAAgB,CACvBA,EAAe,QAAa,kBAE5BA,EAAe,MAAW,eAC9B,GAAGA,KAAmBA,GAAiB,CAAE,EAAC,EAInC,MAAMyE,CAAwB,CACjC,aAAc,CACV,KAAK,QAAU,IAAI,GACtB,CACD,SAASnb,EAAMob,EAAS,CACpB,GAAI,KAAK,QAAQ,IAAIpb,CAAI,EACrB,MAAM,IAAI,MAAM,kCAAkCA,YAAe,EAGjE,KAAK,QAAQ,IAAIA,EAAM,CAAC,GAAMob,CAAO,CAAC,CAE7C,CAMD,OAAOpb,EAAMqb,EAAQ,CACjB,GAAK,KAAK,QAAQ,IAAIrb,CAAI,EAGrB,CACD,IAAIsb,EAAoB,KAAK,QAAQ,IAAItb,CAAI,EAC7Csb,EAAkB,CAAC,EAAID,EACvB,KAAK,QAAQ,IAAIrb,EAAMsb,CAAiB,CAC3C,KANG,OAAM,IAAI,MAAM,qBAAqBtb,oBAAuB,CAOnE,CAKD,KAAKub,EAAM,CACP,OAAS,CAACvb,EAAMob,CAAO,IAAK,KAAK,QACzBA,EAAQ,CAAC,GACTG,EAAKH,EAAQ,CAAC,EAAGpb,CAAI,CAGhC,CACD,OAAO,KAAK1S,EAAQ,CAAE,oBAAqB,EAAI,EAAI,CAC/C,KAAM,CAAE,oBAAAkuB,EAAsB,EAAM,EAAGluB,EACvC,OAAK6tB,EAAwB,YACzBA,EAAwB,UAAY,IAAIA,EACpCK,IACAL,EAAwB,UAAU,SAASzE,GAAe,QAAS8D,EAAoB,EAEvFW,EAAwB,UAAU,SAASzE,GAAe,MAAOqE,EAAa,IAGtF,OAAO,OAAOrE,EAAc,EAAE,QAAQ+E,GAAc,CAChDN,EAAwB,UAAU,OAAOM,EAAYD,CAAmB,CACpF,CAAS,EACML,EAAwB,SAClC,CACL,CChEO,MAAMO,GAAY,CACrB,SAAU,CAAC,EAAG,EAAE,EAChB,KAAM,CAAC,GAAI,GAAQ,EACnB,KAAM,CAAC,GAAI,GAAQ,EACnB,MAAO,CAAC,EAAG,GAAI,EACf,KAAM,CAAC,EAAG,GAAG,EACb,QAAS,CAAC,KAAM,GAAQ,CAC5B,EACA,SAASC,IAAoB,CACzB,MAAO,CACH,SAAU,EACV,MAAO,EACP,KAAM,EACN,MAAO,EACP,QAAS,EACT,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,WAAY,GACpB,CACA,CACA,SAASC,GAAcrrB,EAAMsrB,EAAe,CACxC,QAAStuB,EAAIsuB,EAAc,OAAS,EAAGtuB,GAAK,EAAGA,IAC3C,GAAIsuB,EAActuB,CAAC,EAAE,eAAiBgD,GAAQ,CAACsrB,EAActuB,CAAC,EAAE,QAC5D,OAAOsuB,EAActuB,CAAC,EAG9B,MAAO,EACX,CACO,SAASuuB,GAAShE,EAAQ,CAC7B,IAAIiE,EAAO,CAAA,EACPC,EAAiBL,KACjBE,EAAgB/D,EAAO,IAAKrQ,IACrB,CACH,GAAGA,EACH,QAAS,EACrB,EACK,EACD,MAAMwU,EAAW,CACb,CAAC,eAAgB,CAAC,WAAY,OAAQ,QAAS,UAAW,aAAc,QAAQ,CAAC,EACjF,CAAC,WAAY,CAAC,WAAY,OAAQ,UAAW,QAAQ,CAAC,EACtD,CAAC,UAAW,CAAC,WAAY,QAAS,UAAW,SAAU,OAAQ,SAAU,YAAY,CAAC,EACtF,CAAC,UAAW,CAAC,WAAY,QAAS,SAAU,QAAS,SAAU,aAAa,CAAC,CACrF,EACI,IAAIC,EAAYL,EAAc,OAC9B,QAASM,EAAY,EAAGA,EAAYF,EAAS,QAAUC,EAAY,EAAGC,IAAa,CAC/E,IAAI5rB,EAAO0rB,EAASE,CAAS,EAAE,CAAC,EAC5BC,EAAcH,EAASE,CAAS,EAAE,CAAC,EACvC,QAAS5uB,EAAI,EAAGA,EAAI6uB,EAAY,QAAUF,EAAY,EAAG3uB,IAAK,CAC1D,IAAI8uB,EAAUD,EAAY7uB,CAAC,EACvBka,EACJ,KAAOuU,EAAeK,CAAO,EAAI,IAAM5U,EAAQmU,GAAcrrB,EAAMsrB,CAAa,IACxE,OAAOE,EAAKM,CAAO,EAAM,MACzBN,EAAKM,CAAO,EAAI,IAEpBN,EAAKM,CAAO,EAAE,KAAK5U,EAAM,GAAG,EAC5BuU,EAAeK,CAAO,IACtBH,IACAzU,EAAM,QAAU,EAEvB,CACJ,CACD,OAAOsU,CACX,CACO,SAASO,GAAcxE,EAAQyE,EAAU,CAC5C,IAAIC,EAAe1E,EAAO,KAAK,CAACrlB,EAAG4c,IAAM5c,EAAE,SAAW4c,EAAE,QAAQ,EAC5D0M,EAAOD,GAASU,CAAY,EAChC,MAAMxW,EAAa,IAAI,IAAI8R,EAAO,OAAOja,GAAKA,EAAE,eAAiB,WAAW,EAAE,IAAIA,GAAKA,EAAE,GAAG,CAAC,EACvFyH,EAAW,IAAI,IAAIwS,EAAO,OAAOja,GAAKA,EAAE,eAAiB,SAAS,EAAE,IAAIA,GAAKA,EAAE,GAAG,CAAC,EAEzF,GAAIke,EAAK,UAAYA,EAAK,SAAS,SAAW,EAC1C,GAAK/V,EAAW,IAAI+V,EAAK,SAAS,CAAC,CAAC,GAAKzW,EAAS,IAAIyW,EAAK,SAAS,CAAC,CAAC,GACjE/V,EAAW,IAAI+V,EAAK,SAAS,CAAC,CAAC,GAAKzW,EAAS,IAAIyW,EAAK,SAAS,CAAC,CAAC,EAAI,CACtE,MAAMxO,EAAWvH,EAAW,IAAI+V,EAAK,SAAS,CAAC,CAAC,EAAI,EAAI,EAClDxV,EAAMwV,EAAK,SAASxO,CAAQ,EAC5B7H,EAAMqW,EAAK,UAAUxO,EAAW,GAAK,CAAC,EAC5CwO,EAAK,SAAW,CAACxV,EAAKb,CAAG,EACzB,MAAM+W,EAAiB3E,EAAO,KAAMja,GAAMA,EAAE,MAAQ0I,CAAG,EACjDmW,EAAiBD,EAAiBA,EAAe,SAAS,OAAS,EACzEV,EAAK,SAAW,CAAC,WAAY,OAAQ,MAAM,EAAE,OAAQY,GAC1CD,GAAkBhB,GAAUiB,CAAI,EAAE,CAAC,GAAKD,GAAkBhB,GAAUiB,CAAI,EAAE,CAAC,CACrF,EACGF,EAAe,eAAiB,YAChCV,EAAK,SAAW,CAAC,UAAU,EAElC,MAGGA,EAAK,SAAW,CAAC,QAAS,SAAS,EAAE,OAAQY,GAClCJ,EAAS,QAAUb,GAAUiB,CAAI,EAAE,CAAC,GAAKJ,EAAS,QAAUb,GAAUiB,CAAI,EAAE,CAAC,CACvF,OAILZ,EAAK,SAAW,CAAC,OAAO,EAE5B,MAAO,CAAE,OAAQA,EAAM,SAAAQ,EAC3B,CCjGA,MAAMK,GAA2B,GAC3BC,GAAwB,IACxBC,GAAW,KAAK,OAAO,IAAMF,KAA6B,EAAIC,EAAqB,EAClF,SAASE,GAAgBC,EAAS,CACrC,MAAM5U,EAAI4U,EAAQ,OACZlF,EAAS,CAAC,GAAGkF,CAAO,EAE1B,OADAlF,EAAO,KAAK,CAACmF,EAAIC,IAAOD,EAAG,SAAS,QAAUC,EAAG,SAAS,OAAO,EAC7D9U,EAAIwU,GACG9E,EACP1P,EAAIyU,GACG/E,EAAO,MAAM,EAAG,KAAK,MAAM,KAAK,KAAKgF,IAAY1U,EAAIwU,GAAyB,EAAIA,EAAwB,CAAC,EAG3G9E,EAAO,MAAM,EAAG,GAAG,CAElC,CACO,SAASqF,GAAqBH,EAASI,EAAS,CACnD,MAAMhV,EAAI4U,EAAQ,OACZlF,EAAS,CAAC,GAAGkF,CAAO,EAC1B,OAAAlF,EAAO,KAAK,CAACmF,EAAIC,IAAOD,EAAG,SAAS,QAAUC,EAAG,SAAS,OAAO,EAC1DpF,EAAO,MAAM,EAAG,KAAK,MAAM1P,EAAIgV,CAAO,CAAC,CAClD,CCrBA,MAAMC,EAAW,EACV,SAASC,GAAWC,EAAI,CAC3B,IAAIC,EAAQ,EACZ,QAASjwB,EAAI,EAAGA,EAAIgwB,EAAG,OAAQhwB,IAC3BiwB,GAASD,EAAGhwB,CAAC,EAEjB,IAAIkwB,EAAO,KAAK,KAAKD,CAAK,EACtBE,EAAM,EACV,QAASnwB,EAAI,EAAGA,EAAIgwB,EAAG,OAAQhwB,IAC3BmwB,EAAMA,EAAMH,EAAGhwB,CAAC,GAAK,KAAK,KAAKgwB,EAAGhwB,CAAC,CAAC,EAAIkwB,GAAQD,EAEpD,MAAO,CAACE,CACZ,CACO,SAASC,GAAOtY,EAAYK,EAAKsE,EAAUD,EAAU,CAGxD,MAAMoN,EAAOnN,EAEPT,GADOQ,EACQoN,GAAQkG,EAC7B,IAAInR,EAAO,IAAI,MAAMmR,EAAW,CAAC,EAAE,KAAK,CAAC,EACzC,QAAS1X,KAAUN,EAAY,CAC3B,IAAIiH,EAAS,KAAK,OAAO3G,EAAOD,CAAG,EAAIyR,GAAQ5N,CAAI,EACnD2C,EAAKI,CAAM,GACd,CACD,OAAAJ,EAAKmR,EAAW,CAAC,GAAKnR,EAAKmR,CAAQ,EAEvBC,GAAWpR,EAAK,MAAM,EAAGmR,CAAQ,EAAE,OAAOtQ,GAAKA,EAAI,CAAC,CAAC,CAErE,CACO,SAAS6Q,GAAavY,EAAYW,EAAYV,EAAU,OAC3D,MAAMwH,EAAS,IAAI,IACnB,QAASnH,KAAUN,EAAY,CAC3B,MAAMxU,EAAOmV,EAAW,IAAI+G,GAAKpH,EAAOoH,CAAC,CAAC,EAAE,KAAK,GAAG,EAC/CD,EAAO,IAAIjc,CAAI,GAChBic,EAAO,IAAIjc,EAAM,CAAA,CAAE,GAEvBwhB,EAAAvF,EAAO,IAAIjc,CAAI,IAAf,MAAAwhB,EAAkB,KAAK1M,EAC1B,CACD,IAAIkY,EAAe,EACnB,QAASnY,KAAOJ,EAAU,CACtB,MAAM6R,EAAO,KAAK,IAAI,GAAG9R,EAAW,IAAI0H,GAAKA,EAAErH,CAAG,CAAC,CAAC,EAC9CwR,EAAO,KAAK,IAAI,GAAG7R,EAAW,IAAI0H,GAAKA,EAAErH,CAAG,CAAC,CAAC,EAE9CgY,EAAMC,GAAOtY,EAAYK,EAAKyR,EAAMD,CAAI,EAE9C,IAAI4G,EAAU,EAEd,MAAMC,EAAU,CAAC,GAAGjR,EAAO,QAAS,CAAA,EACpCiR,EAAQ,KAAK,CAACtrB,EAAG4c,IAAMA,EAAE,CAAC,EAAE,OAAS5c,EAAE,CAAC,EAAE,MAAM,EAChD,QAASlF,EAAI,EAAGA,EAAIwwB,EAAQ,QACpB,EAAAxwB,GAAK8vB,EAAW,GADY9vB,IAAK,CAGrC,MAAMywB,EAAYD,EAAQxwB,CAAC,EAAE,CAAC,EAC9B,IAAI0wB,EAAYD,EAAU,OAAS3Y,EAAW,OAC9C,MAAM6Y,EAASP,GAAOK,EAAWtY,EAAKyR,EAAMD,CAAI,EAChD4G,GAAWG,EAAYC,CAE1B,CACD,IAAIC,EAAa,CAAA,EACjB,QAAS5wB,EAAI8vB,EAAW,EAAG9vB,EAAIwwB,EAAQ,OAAQxwB,IAC3C4wB,EAAW,KAAK,GAAGJ,EAAQxwB,CAAC,EAAE,CAAC,CAAC,EAEpC,GAAI4wB,EAAW,OAAS,EAAG,CACvB,IAAIF,EAAYE,EAAW,OAAS9Y,EAAW,OAC/C,MAAM6Y,EAASP,GAAOQ,EAAYzY,EAAKyR,EAAMD,CAAI,EACjD4G,GAAWG,EAAYC,CAC1B,CASDL,GAAgBM,EAAW,OAAS,GAAKT,EAAMI,GAAW,KAAK,KAAKT,CAAQ,GAAKK,EAAMI,GAAW,KAAK,KAAKhR,EAAO,IAAI,CAC1H,CAOD,OAAO+Q,EAAevY,EAAS,MACnC,CCzEA,MAAMqR,GAAuB,GACtB,MAAMyH,EAAS,CAClB,aAAc,CAMV,KAAK,YAAc,GACnB,KAAK,UAAY,GAIjB,KAAK,sBAAwB,CACzB,IAAK,EACL,IAAK,CACjB,EAIQ,KAAK,oBAAsB,CACvB,IAAK,EACL,IAAK,CACjB,EACQ,KAAK,KAAO,KACZ,KAAK,YAAc,CAAC,MAAO,MAAO,MAAO,OAAQ,QAAS,MAAM,EAChE,KAAK,iBAAmBjD,EAAwB,MACnD,CACD,WAAY,CACR,KAAM,CAAE,OAAArD,EAAQ,UAAAuG,EAAW,UAAAC,EAAW,cAAAC,EAAe,WAAAlZ,EAAY,cAAAmZ,EAAe,KAAAtJ,CAAM,EAAG,KACnFuJ,EAAU,CACZ,QAAS/S,GACT,OAAAoM,EACA,UAAW,CACP,UAAWuG,EAAU,UACrB,UAAWA,EAAU,UACrB,GAAIA,EAAU,GACd,GAAIA,EAAU,EACjB,EACD,UAAAC,EACA,cAAAC,CACZ,EACcG,EAAc,CAChB,QAAShT,GACT,WAAY,CACR,IAAK8S,EACL,KAAMnZ,CACT,EACD,QAAS6P,EAAK,cAAe,CACzC,EACQ,MAAO,CACH,QAAAuJ,EACA,YAAAC,CACZ,CACK,CACD,YAAYD,EAASC,EAAa,CAC9B,KAAK,OAASD,EAAQ,OAElB,OAAO,KAAK,eAAmB,KAAe,KAAK,iBAAmB,KACtE,KAAK,eAAe,QAGpB,KAAK,eAAiB,IAAI,IAE9BA,EAAQ,OAAO,QAAQ5gB,GAAK,CACxB,KAAK,eAAe,IAAIA,EAAE,IAAKA,CAAC,CAC5C,CAAS,EACD,KAAM,CAAE,WAAAmI,EAAY,SAAAV,CAAU,EAAG,KASjC,GARA,KAAK,UAAY,IAAIgT,GAAUtS,EAAYV,CAAQ,EAEnD,KAAK,UAAU,GAAKmZ,EAAQ,UAAU,GACtC,KAAK,UAAU,GAAKA,EAAQ,UAAU,GACtC,KAAK,UAAU,UAAYA,EAAQ,UAAU,UAC7C,KAAK,UAAU,UAAYA,EAAQ,UAAU,UAC7C,KAAK,UAAYA,EAAQ,UACzB,KAAK,cAAgBA,EAAQ,cACzBC,EAAa,CACb,KAAM,CAAE,YAAAC,CAAa,EAAG,KACxB,KAAK,cAAgBD,EAAY,WAAW,IAC5C,KAAK,WAAaA,EAAY,WAAW,KACzC,KAAK,KAAO,IAAItF,GAAK,CACjB,WAAYsF,EAAY,WAAW,KACnC,WAAA1Y,EACA,SAAAV,EACA,IAAKqZ,CACrB,CAAa,EACD,OAAO,KAAKD,EAAY,OAAO,EAAE,QAAQvE,GAAa,CAClD,KAAK,KAAK,WAAWA,EAAWuE,EAAY,QAAQvE,CAAS,CAAC,CAC9E,CAAa,CACJ,CACJ,CAMD,UAAUyE,EAAW,CACjB,KAAK,WAAaA,EAClB,KAAK,WAAa1X,GAAS,KAAK,aAAa,EAC7C,MAAM2Q,EAAY+G,EAAU,IAAI/gB,GAAKA,EAAE,GAAG,EACpC,CAAE,OAAAia,EAAQ,UAAAC,CAAW,EAAGH,GAAiBC,EAAW,KAAK,UAAU,EAEzE,KAAK,UAAYC,EAAO,IAAI,CAACja,EAAGtQ,IAAM,CAClC,MAAMka,EAAQ,CACV,GAAG5J,CACnB,EACY,OAAI+gB,EAAUrxB,CAAC,EAAE,WAAa,MAC1Bka,EAAM,SAAWmX,EAAUrxB,CAAC,EAAE,UAC9BqxB,EAAUrxB,CAAC,EAAE,eAAiB,MAC9Bka,EAAM,aAAemX,EAAUrxB,CAAC,EAAE,cAClCqxB,EAAUrxB,CAAC,EAAE,eAAiB,MAC9Bka,EAAM,aAAemX,EAAUrxB,CAAC,EAAE,cAC/Bka,CACnB,CAAS,CACJ,CACD,QAAQpC,EAAY,CAChB,YAAK,cAAgBA,EACrB,KAAK,WAAa6B,GAAS7B,CAAU,EAC9B,IACV,CACD,IAAI,YAAa,CAEb,OAAO,KAAK,OAAO,OAAOxH,GAAKA,EAAE,eAAiB,WAAW,EAAE,IAAIA,GAAKA,EAAE,GAAG,CAEhF,CACD,IAAI,UAAW,CAEX,OAAO,KAAK,OAAO,OAAOA,GAAKA,EAAE,eAAiB,SAAS,EAAE,IAAIA,GAAKA,EAAE,GAAG,CAE9E,CACD,oBAAqB,CACjB,MAAMga,EAAY,KAAK,OAAO,IAAIha,GAAKA,EAAE,GAAG,EACtC,CAAE,OAAAia,EAAQ,UAAAC,CAAW,EAAGH,GAAiBC,EAAW,KAAK,UAAU,EACzE,YAAK,OAASC,EACd,KAAK,eAAiBC,EACf,IACV,CACD,gBAAgB8G,EAAa,OAAQzB,EAAU,EAAG,CAC9C,KAAM,CAAE,UAAA0B,EAAW,cAAAN,CAAe,EAAG,KAG/BO,EAAkB,CAAA,EAClBC,EAAa,CAAA,EAEnB,QAASzxB,EAAI,EAAGA,EAAIuxB,EAAU,OAAQvxB,IAAK,CACvC,MAAMka,EAAQqX,EAAUvxB,CAAC,EACzB,IAAI0xB,EAAexX,EAAM,IACzB,GAAIA,EAAM,eAAiB,aACnB,EAAAA,EAAM,eAAiB,gBAAkBA,EAAM,SAAS,OAASkP,KAehE,GAAIlP,EAAM,eAAiB,WACxBA,EAAM,SAAS,OAAS8D,IAAqC9D,EAAM,SAAS,OAAS+W,EAAc,OAASlT,GAC5G,SAIZ0T,EAAW,KAAKzxB,CAAC,EACjBwxB,EAAgB,KAAKE,CAAY,CACpC,CACD,KAAM,CAAE,OAAQC,EAAc,UAAWC,GAAyBvH,GAAiBmH,EAAiB,KAAK,UAAU,EAQnH,GAPAG,EAAa,QAAQ,CAACrhB,EAAGtQ,IAAM,CAC3B,MAAM6xB,EAAWJ,EAAWzxB,CAAC,EAC7BsQ,EAAE,aAAeihB,EAAUM,CAAQ,EAAE,aACrCvhB,EAAE,SAAWihB,EAAUM,CAAQ,EAAE,SACjCvhB,EAAE,aAAeihB,EAAUM,CAAQ,EAAE,YACjD,CAAS,EACD,KAAK,OAASP,IAAe,OAAS9B,GAAgBmC,CAAY,EAAI/B,GAAqB+B,EAAc9B,CAAO,EAC5G,KAAK,OAAO,UAAUvf,GAAKA,EAAE,eAAiB,WAAW,IAAM,GAAI,CAEnE,MAAMwhB,EAAOH,EAAa,OAAO,GAAK,EAAE,eAAiB,WAAW,EAIhEG,EAAK,OAAS,IACdA,EAAK,KAAK,CAAC5sB,EAAG4c,IAAM5c,EAAE,SAAS,QAAU4c,EAAE,SAAS,OAAO,EAC3D,KAAK,OAAO,KAAKgQ,EAAK,CAAC,CAAC,EAE/B,CACD,KAAK,eAAiBF,CACzB,CACD,YAAa,CACT,YAAK,UAAY,IAAI7G,GAAU,KAAK,WAAY,KAAK,QAAQ,EAC7D,KAAK,UAAU,cAAc,KAAK,UAAU,EAC5C,KAAK,UAAU,cAAc,KAAK,UAAU,EACrC,IACV,CACD,WAAY,CACR,KAAM,CAAE,SAAAhT,EAAU,WAAAD,EAAY,UAAAgZ,EAAW,WAAArY,EAAY,YAAA2Y,CAAa,EAAG,KAC/DzJ,EAAO,IAAIkE,GAAK,CAClB,WAAApT,EACA,SAAAV,EACA,WAAAD,EACA,IAAKsZ,CACjB,CAAS,EACD,OAAAzJ,EAAK,gBAAe,EAIpBmJ,EAAU,UAAU,QAASnR,GAAU,CACnCgI,EAAK,qBAAqBhI,CAAK,CAC3C,CAAS,EACD,KAAK,KAAOgI,EACL,IACV,CACD,eAAgB,CACZ,YAAK,UAAU,cAAc,KAAK,UAAU,EAC5C,KAAK,UAAU,cAAc,KAAK,UAAU,EACrC,IACV,CACD,OAAO,gCAAgCpI,EAAQ0C,EAAW,CACtD,IAAI8P,EAAY,CAAA,EAChB,QAASpS,KAASJ,EAAQ,CACtB,IAAIyS,EAAkBtW,GAAeiE,EAAOsC,EAAU,IAAKA,EAAU,GAAG,EACxE8P,EAAU,KAAK,GAAGC,CAAe,CACpC,CACD,OAAOD,CACV,CACD,eAAeE,EAAwB,KAAK,sBAAuBC,EAAsB,KAAK,oBAAqB,CAE/G,MAAMC,EAAkB,KAAK,UAAU,UACjCC,EAAgB,KAAK,UAAU,UAK/BC,EAAcxB,GAAS,gCAAgCuB,EAAeF,CAAmB,EAEzFI,EAAY,CAAA,EAClB,QAAS3S,KAASwS,EAAiB,CAC/B,MAAMI,EAAU7W,GAAeiE,EAAOsS,EAAsB,IAAKA,EAAsB,GAAG,EAC1F,QAASH,KAAQS,EACb,QAASlQ,KAAQgQ,EACbC,EAAU,KAAK,CACX,WAAYR,EACZ,SAAUzP,CAClC,CAAqB,CAGZ,CACD,YAAK,UAAYiQ,EACV,IACV,CACD,OAAO,iBAAiBxa,EAAYW,EAAYV,EAAU,CACtD,IAAIya,EAAM,EACV,QAASra,KAAOJ,EAAU,CACtB,IAAI0a,EAAK3a,EAAW,IAAK/M,GAAMA,EAAEoN,CAAG,CAAC,EACjCua,EAAKxW,GAAUT,GAAYgX,CAAE,CAAC,EAC9BrxB,EAAQgb,GAAQsW,CAAE,EACtBF,GAAOpxB,CACV,CACD,OAAAoxB,GAAOza,EAAS,OACTya,CACV,CACD,MAAM,gBAAgBG,EAAa,KAAK,UAAW,CAC/C,MAAMC,EAAU,KAChB,IAAIC,EAAW,CAAA,EACf,QAASC,KAASH,EAAY,CAC1B,KAAM,CAAE,WAAAla,EAAY,SAAAV,CAAU,EAAG+a,EAC3BN,EAAMnC,GAAauC,EAAQ,WAAYna,EAAYV,CAAQ,EACjE8a,EAAS,KAAK,CACV,SAAUL,EACV,aAAc,EACd,WAAA/Z,EACA,SAAAV,CAChB,CAAa,CACJ,CACD,OAAA8a,EAAS,KAAK,CAAC3tB,EAAG4c,KAAOA,EAAE,UAAY,IAAM5c,EAAE,UAAY,EAAE,EACtD2tB,CACV,CACD,MAAM,aAAaF,EAAa,KAAK,UAAW,CAC5C,MAAMC,EAAU,KACV,CAAE,SAAUG,EAAgB,eAAAC,EAAgB,WAAAlb,CAAU,EAAK8a,EACjE,IAAIC,EAAW,CAAA,EACf,MAAMI,EAAaL,EAAQ,KAAK,UAAU,CAAA,CAAE,EAAE,kBAAkBG,EAAgBA,EAAe,IAAI,IAAM,MAAM,CAAC,EAChH,QAASD,KAASH,EAAY,CAC1B,KAAM,CAAE,WAAAla,EAAY,SAAAV,CAAU,EAAG+a,EAC3BI,EAAYN,EAAQ,KAAK,UAAUna,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,MAAM,CAAC,EACrGob,EAAQP,EAAQ,KAAK,UAAUna,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,OAAO,CAAC,EACxG,IAAIuY,EAAe,EACnB,QAASnY,KAAOJ,EAAU,CACtB,IAAIoY,EAAM,EACN8C,EAAW,OAAS,IACpB9C,EAAMJ,GAAWkD,EAAW,CAAC,EAAE9a,CAAG,EAAE,OAAOqH,GAAKA,EAAI,CAAC,CAAC,GAE1D,IAAI4T,EAAS,EACb,MAAMC,EAAaL,EAAe,IAAI7a,CAAG,EAAE,SAAS,KAC9Cmb,EAAWJ,EAAU,IAAI,CAACnoB,EAAGwoB,KAAY,CAK3C,KAAMJ,EAAMI,CAAM,EAAEpb,CAAG,EACvB,KAAMpN,EAAEoN,CAAG,CACd,EAAC,EACFmb,EAAS,KAAK,CAACpuB,EAAG4c,IAAMA,EAAE,KAAO5c,EAAE,IAAI,EACvC,QAASlF,EAAI,EAAGA,EAAIszB,EAAS,QACrB,EAAAtzB,GAAKie,EAAkB,GADMje,IAAK,CAGtC,MAAMwzB,EAAUzD,GAAWuD,EAAStzB,CAAC,EAAE,KAAK,OAAOwf,GAAKA,EAAI,CAAC,CAAC,EAC9D4T,GAAWE,EAAStzB,CAAC,EAAE,KAAOqzB,EAAcG,CAC/C,CACD,MAAM5C,EAAa,IAAI,MAAM3S,CAAe,EAAE,KAAK,CAAC,EACpD,IAAIwV,EAAW,EACf,QAASzzB,EAAIie,EAAkB,EAAGje,EAAIszB,EAAS,OAAQtzB,IAAK,CACxD,QAASmI,EAAI,EAAGA,EAAIyoB,EAAW,OAAQzoB,IACnCyoB,EAAWzoB,CAAC,GAAKmrB,EAAStzB,CAAC,EAAE,KAAKmI,CAAC,EAEvCsrB,GAAYH,EAAStzB,CAAC,EAAE,IAC3B,CACGyzB,EAAW,IACXL,GAAWK,EAAWJ,EAActD,GAAWa,EAAW,OAAOpR,GAAKA,EAAI,CAAC,CAAC,GAEhF8Q,IAAiBH,EAAMiD,GAAU,KAAK,KAAK,KAAK,IAAInV,EAAiBqV,EAAS,MAAM,CAAC,CACxF,CACDhD,GAAgBvY,EAAS,OACzB8a,EAAS,KAAK,CACV,WAAApa,EACA,SAAAV,EACA,aAAc,EACd,MAAOuY,EACP,SAAUA,CAC1B,CAAa,CACJ,CACD,OAAAuC,EAAS,KAAK,CAAC3tB,EAAG4c,IAAMA,EAAE,SAAW5c,EAAE,QAAQ,EACxC2tB,CACV,CACD,qBAAqBa,EAAW,CAC/B,CACD,MAAM,kBAAkBf,EAAa,KAAK,UAAW,CACjD,MAAMC,EAAU,KAChB,IAAIC,EAAW,CAAA,EACf,QAASC,KAASH,EAAY,CAE1B,KAAM,CAAE,WAAAla,EAAY,SAAAV,CAAU,EAAG+a,EAG3B5F,EAFK0F,EAAQ,KACD,UAAUna,CAAU,EACf,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,KAAK,CAAC,EAEtEya,EAAM3B,GAAS,iBAAiB3D,EAASzU,EAAYV,CAAQ,EAC7D4b,EAAU,CAAA,EAChB,KAAK,iBAAiB,KAAK,CAAC9F,EAASpb,IAAS,CAE1C,MAAMmhB,EAAM,MAAO/F,EAASpb,IAAS,CACjC,GAAI,CACA,IAAIohB,EAAS,MAAMhG,EAAQX,EAASzU,EAAYV,EAAU6a,EAAQ,eAAgBA,CAAO,EACrFiB,IAAW,OACXA,EAAO,KAAOphB,EACdohB,EAAO,SAAWrB,EAClBK,EAAS,KAAKgB,CAAM,EAE3B,OACM7gB,EAAP,CACI,QAAQ,MAAM,gBAAiB,CAAE,WAAAyF,EAAY,SAAAV,EAAU,QAAAmV,CAAO,EAAIla,CAAK,CAC1E,CACrB,EACgB2gB,EAAQ,KAAKC,EAAI/F,EAASpb,CAAI,CAAC,CAC/C,CAAa,EACD,MAAM,QAAQ,IAAIkhB,CAAO,CAG5B,CACD,OAAAf,EAAQ,cAAgBC,EACxB,KAAK,iBAAgB,EACrB,KAAK,cAAc,KAAK,CAAC3tB,EAAG4c,KAAO5c,EAAE,OAAS,IAAM4c,EAAE,OAAS,EAAE,EAC1D,KAAK,aACf,CAED,kBAAmB,CAEf,OADsB,KAAK,cACb,QAAQgR,GAAS,CAC3BA,EAAM,MAAQA,EAAM,SAAWA,EAAM,YACjD,CAAS,EACM,IACV,CACD,kBAAkBgB,EAAc,CAC5B,MAAMC,EAAc,CAAA,EACdpM,EAAO,KAAK,KACZqL,EAAiB,KAAK,eACtB,CAAE,WAAAva,EAAY,SAAAV,CAAU,EAAG+b,EACjCrb,EAAW,QAASO,GAAQ,CACxB,MAAMkU,EAAUvF,EAAK,UAAU,CAAC3O,CAAG,CAAC,EAAE,kBAAkBjB,EAAUA,EAAS,IAAI,IAAM,KAAK,CAAC,EAC3F,IAAIya,EAAM,EACVza,EAAS,QAASI,GAAQ,CACtB,IAAIsa,EAAKvF,EAAQ,IAAKniB,GAAMA,EAAEoN,CAAG,CAAC,EAC9Bua,EAAKxW,GAAUT,GAAYgX,CAAE,CAAC,EAC9BrxB,EAAQgb,GAAQsW,CAAE,EACtBF,GAAOpxB,CACvB,CAAa,EACD2yB,EAAY,KAAK,CACb,GAAGf,EAAe,IAAIha,CAAG,EACzB,SAAUwZ,CAC1B,CAAa,CACb,CAAS,EACD,MAAMwB,EAAWrM,EAAK,UAAUlP,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,KAAK,CAAC,EACjG,OAAAA,EAAS,QAASI,GAAQ,CACtB,IAAIsa,EAAKuB,EAAS,IAAKjpB,GAAMA,EAAEoN,CAAG,CAAC,EAC/Bua,EAAKxW,GAAUT,GAAYgX,CAAE,CAAC,EAC9BrxB,EAAQgb,GAAQsW,CAAE,EACtBqB,EAAY,KAAK,CACb,GAAGf,EAAe,IAAI7a,CAAG,EACzB,SAAU/W,CAC1B,CAAa,CACb,CAAS,EACM2yB,CACV,CACD,sBAAsBD,EAAc,CAChC,MAAMC,EAAc,CAAA,EACdpM,EAAO,KAAK,KACZqL,EAAiB,KAAK,eACtB,CAAE,WAAAva,EAAY,SAAAV,CAAU,EAAG+b,EACjCrb,EAAW,QAASO,GAAQ,CACxB,MAAMib,EAAKjB,EAAe,IAAIha,CAAG,EACjC+a,EAAY,KAAK,CACb,GAAGE,EACH,SAAUA,EAAG,SAAS,OACtC,CAAa,CACb,CAAS,EACD,MAAMrU,EAAO+H,EAAK,UAAUlP,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,MAAM,CAAC,EACxFob,EAAQxL,EAAK,UAAUlP,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,OAAO,CAAC,EAChG,OAAAA,EAAS,QAASI,GAAQ,CACtB,IAAIib,EAAS,EACb,MAAMC,EAAaL,EAAe,IAAI7a,CAAG,EAAE,SAAS,KAC9Cmb,EAAW1T,EAAK,IAAI,CAAC7U,EAAGwoB,KAAY,CAKtC,KAAMJ,EAAMI,CAAM,EAAEpb,CAAG,EACvB,KAAMpN,EAAEoN,CAAG,CACd,EAAC,EACFmb,EAAS,KAAK,CAACpuB,EAAG4c,IAAMA,EAAE,KAAO5c,EAAE,IAAI,EACvC,QAASlF,EAAI,EAAGA,EAAIszB,EAAS,QACrB,EAAAtzB,GAAKie,EAAkB,GADMje,IAAK,CAGtC,MAAMwzB,EAAUzD,GAAWuD,EAAStzB,CAAC,EAAE,KAAK,OAAOwf,GAAKA,EAAI,CAAC,CAAC,EAC9D4T,GAAWE,EAAStzB,CAAC,EAAE,KAAOqzB,EAAcG,CAC/C,CACD,MAAM5C,EAAa,IAAI,MAAM3S,CAAe,EAAE,KAAK,CAAC,EACpD,IAAIwV,EAAW,EACf,QAASzzB,EAAIie,EAAkB,EAAGje,EAAIszB,EAAS,OAAQtzB,IAAK,CACxD,QAASmI,EAAI,EAAGA,EAAIyoB,EAAW,OAAQzoB,IACnCyoB,EAAWzoB,CAAC,GAAKmrB,EAAStzB,CAAC,EAAE,KAAKmI,CAAC,EAEvCsrB,GAAYH,EAAStzB,CAAC,EAAE,IAC3B,CACGyzB,EAAW,IACXL,GAAWK,EAAWJ,EAActD,GAAWa,EAAW,OAAOpR,GAAKA,EAAI,CAAC,CAAC,GAEhF,MAAMyU,EAAKjB,EAAe,IAAI7a,CAAG,EACjC4b,EAAY,KAAK,CACb,GAAGE,EACH,SAAUb,CAC1B,CAAa,CACb,CAAS,EACMW,CACV,CACD,cAAcD,EAAc,CACxB,KAAM,CAAE,WAAArb,EAAY,SAAAV,CAAU,EAAG+b,EAC3BC,EAAc,KAAK,sBAAsBD,CAAY,EACrD9E,EAAW,KAAK,KAAK,UAAUvW,CAAU,EAAE,kBAAkBV,EAAUA,EAAS,IAAI,IAAM,KAAK,CAAC,EACtG,OAAOgX,GAAcgF,EAAa/E,CAAQ,CAC7C,CACL,uHCpeAkF,GAAiB,SAAc7hB,EAAI8hB,EAAS,CAC1C,OAAO,UAAgB,CAErB,QADIpxB,EAAO,IAAI,MAAM,UAAU,MAAM,EAC5B/C,EAAI,EAAGA,EAAI+C,EAAK,OAAQ/C,IAC/B+C,EAAK/C,CAAC,EAAI,UAAUA,CAAC,EAEvB,OAAOqS,EAAG,MAAM8hB,EAASpxB,CAAI,CACjC,CACA,ECRImxB,GAAO5M,GAIP8M,GAAW,OAAO,UAAU,SAQhC,SAASC,GAAQjkB,EAAK,CACpB,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,gBAChC,CAQA,SAASkkB,GAAYlkB,EAAK,CACxB,OAAO,OAAOA,EAAQ,GACxB,CAQA,SAASmkB,GAASnkB,EAAK,CACrB,OAAOA,IAAQ,MAAQ,CAACkkB,GAAYlkB,CAAG,GAAKA,EAAI,cAAgB,MAAQ,CAACkkB,GAAYlkB,EAAI,WAAW,GAC/F,OAAOA,EAAI,YAAY,UAAa,YAAcA,EAAI,YAAY,SAASA,CAAG,CACrF,CAQA,SAASokB,GAAcpkB,EAAK,CAC1B,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,sBAChC,CAQA,SAASqkB,GAAWrkB,EAAK,CACvB,OAAQ,OAAO,SAAa,KAAiBA,aAAe,QAC9D,CAQA,SAASskB,GAAkBtkB,EAAK,CAC9B,IAAItI,EACJ,OAAK,OAAO,YAAgB,KAAiB,YAAY,OACvDA,EAAS,YAAY,OAAOsI,CAAG,EAE/BtI,EAAUsI,GAASA,EAAI,QAAYA,EAAI,kBAAkB,YAEpDtI,CACT,CAQA,SAAS6sB,GAASvkB,EAAK,CACrB,OAAO,OAAOA,GAAQ,QACxB,CAQA,SAASwkB,GAASxkB,EAAK,CACrB,OAAO,OAAOA,GAAQ,QACxB,CAQA,SAASykB,GAASzkB,EAAK,CACrB,OAAOA,IAAQ,MAAQ,OAAOA,GAAQ,QACxC,CAQA,SAAS0kB,GAAc1kB,EAAK,CAC1B,GAAIgkB,GAAS,KAAKhkB,CAAG,IAAM,kBACzB,MAAO,GAGT,IAAI2kB,EAAY,OAAO,eAAe3kB,CAAG,EACzC,OAAO2kB,IAAc,MAAQA,IAAc,OAAO,SACpD,CAQA,SAASC,GAAO5kB,EAAK,CACnB,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,eAChC,CAQA,SAAS6kB,GAAO7kB,EAAK,CACnB,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,eAChC,CAQA,SAAS8kB,GAAO9kB,EAAK,CACnB,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,eAChC,CAQA,SAAS+kB,GAAW/kB,EAAK,CACvB,OAAOgkB,GAAS,KAAKhkB,CAAG,IAAM,mBAChC,CAQA,SAASglB,GAAShlB,EAAK,CACrB,OAAOykB,GAASzkB,CAAG,GAAK+kB,GAAW/kB,EAAI,IAAI,CAC7C,CAQA,SAASilB,GAAkBjlB,EAAK,CAC9B,OAAO,OAAO,gBAAoB,KAAeA,aAAe,eAClE,CAQA,SAASklB,GAAK3uB,EAAK,CACjB,OAAOA,EAAI,KAAOA,EAAI,KAAI,EAAKA,EAAI,QAAQ,aAAc,EAAE,CAC7D,CAiBA,SAAS4uB,IAAuB,CAC9B,OAAI,OAAO,UAAc,MAAgB,UAAU,UAAY,eACtB,UAAU,UAAY,gBACtB,UAAU,UAAY,MACtD,GAGP,OAAO,OAAW,KAClB,OAAO,SAAa,GAExB,CAcA,SAASC,GAAQx2B,EAAKqT,EAAI,CAExB,GAAI,EAAArT,IAAQ,MAAQ,OAAOA,EAAQ,KAUnC,GALI,OAAOA,GAAQ,WAEjBA,EAAM,CAACA,CAAG,GAGRq1B,GAAQr1B,CAAG,EAEb,QAASgB,EAAI,EAAGuE,EAAIvF,EAAI,OAAQgB,EAAIuE,EAAGvE,IACrCqS,EAAG,KAAK,KAAMrT,EAAIgB,CAAC,EAAGA,EAAGhB,CAAG,MAI9B,SAASW,KAAOX,EACV,OAAO,UAAU,eAAe,KAAKA,EAAKW,CAAG,GAC/C0S,EAAG,KAAK,KAAMrT,EAAIW,CAAG,EAAGA,EAAKX,CAAG,CAIxC,CAmBA,SAASy2B,IAAmC,CAC1C,IAAI3tB,EAAS,CAAA,EACb,SAAS4tB,EAAYtlB,EAAKzQ,EAAK,CACzBm1B,GAAchtB,EAAOnI,CAAG,CAAC,GAAKm1B,GAAc1kB,CAAG,EACjDtI,EAAOnI,CAAG,EAAI81B,GAAM3tB,EAAOnI,CAAG,EAAGyQ,CAAG,EAC3B0kB,GAAc1kB,CAAG,EAC1BtI,EAAOnI,CAAG,EAAI81B,GAAM,CAAE,EAAErlB,CAAG,EAClBikB,GAAQjkB,CAAG,EACpBtI,EAAOnI,CAAG,EAAIyQ,EAAI,MAAK,EAEvBtI,EAAOnI,CAAG,EAAIyQ,CAEjB,CAED,QAASpQ,EAAI,EAAGuE,EAAI,UAAU,OAAQvE,EAAIuE,EAAGvE,IAC3Cw1B,GAAQ,UAAUx1B,CAAC,EAAG01B,CAAW,EAEnC,OAAO5tB,CACT,CAUA,SAAS6tB,GAAOzwB,EAAG4c,EAAGqS,EAAS,CAC7B,OAAAqB,GAAQ1T,EAAG,SAAqB1R,EAAKzQ,EAAK,CACpCw0B,GAAW,OAAO/jB,GAAQ,WAC5BlL,EAAEvF,CAAG,EAAIu0B,GAAK9jB,EAAK+jB,CAAO,EAE1BjvB,EAAEvF,CAAG,EAAIyQ,CAEf,CAAG,EACMlL,CACT,CAQA,SAAS0wB,GAASC,EAAS,CACzB,OAAIA,EAAQ,WAAW,CAAC,IAAM,QAC5BA,EAAUA,EAAQ,MAAM,CAAC,GAEpBA,CACT,CAEA,IAAAC,EAAiB,CACf,QAASzB,GACT,cAAeG,GACf,SAAUD,GACV,WAAYE,GACZ,kBAAmBC,GACnB,SAAUC,GACV,SAAUC,GACV,SAAUC,GACV,cAAeC,GACf,YAAaR,GACb,OAAQU,GACR,OAAQC,GACR,OAAQC,GACR,WAAYC,GACZ,SAAUC,GACV,kBAAmBC,GACnB,qBAAsBE,GACtB,QAASC,GACT,MAAOC,GACP,OAAQE,GACR,KAAML,GACN,SAAUM,EACZ,EC1VIE,GAAQxO,EAEZ,SAASyO,GAAO3lB,EAAK,CACnB,OAAO,mBAAmBA,CAAG,EAC3B,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,EACnB,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,EACnB,QAAQ,QAAS,GAAG,EACpB,QAAQ,QAAS,GAAG,CACxB,KASA4lB,GAAiB,SAAkBC,EAAKlR,EAAQmR,EAAkB,CAEhE,GAAI,CAACnR,EACH,OAAOkR,EAGT,IAAIE,EACJ,GAAID,EACFC,EAAmBD,EAAiBnR,CAAM,UACjC+Q,GAAM,kBAAkB/Q,CAAM,EACvCoR,EAAmBpR,EAAO,eACrB,CACL,IAAI9a,EAAQ,CAAA,EAEZ6rB,GAAM,QAAQ/Q,EAAQ,SAAmB3U,EAAKzQ,EAAK,CAC7CyQ,IAAQ,MAAQ,OAAOA,EAAQ,MAI/B0lB,GAAM,QAAQ1lB,CAAG,EACnBzQ,EAAMA,EAAM,KAEZyQ,EAAM,CAACA,CAAG,EAGZ0lB,GAAM,QAAQ1lB,EAAK,SAAoBpH,EAAG,CACpC8sB,GAAM,OAAO9sB,CAAC,EAChBA,EAAIA,EAAE,cACG8sB,GAAM,SAAS9sB,CAAC,IACzBA,EAAI,KAAK,UAAUA,CAAC,GAEtBiB,EAAM,KAAK8rB,GAAOp2B,CAAG,EAAI,IAAMo2B,GAAO/sB,CAAC,CAAC,CAChD,CAAO,EACP,CAAK,EAEDmtB,EAAmBlsB,EAAM,KAAK,GAAG,CAClC,CAED,GAAIksB,EAAkB,CACpB,IAAIC,EAAgBH,EAAI,QAAQ,GAAG,EAC/BG,IAAkB,KACpBH,EAAMA,EAAI,MAAM,EAAGG,CAAa,GAGlCH,IAAQA,EAAI,QAAQ,GAAG,IAAM,GAAK,IAAM,KAAOE,CAChD,CAED,OAAOF,CACT,ECnEIH,GAAQxO,EAEZ,SAAS+O,IAAqB,CAC5B,KAAK,SAAW,EAClB,CAUAA,GAAmB,UAAU,IAAM,SAAaC,EAAWC,EAAUpzB,EAAS,CAC5E,YAAK,SAAS,KAAK,CACjB,UAAWmzB,EACX,SAAUC,EACV,YAAapzB,EAAUA,EAAQ,YAAc,GAC7C,QAASA,EAAUA,EAAQ,QAAU,IACzC,CAAG,EACM,KAAK,SAAS,OAAS,CAChC,EAOkBqzB,GAAC,UAAU,MAAQ,SAAeC,EAAI,CAClD,KAAK,SAASA,CAAE,IAClB,KAAK,SAASA,CAAE,EAAI,KAExB,EAUkBD,GAAC,UAAU,QAAU,SAAiBnkB,EAAI,CAC1DyjB,GAAM,QAAQ,KAAK,SAAU,SAAwBY,EAAG,CAClDA,IAAM,MACRrkB,EAAGqkB,CAAC,CAEV,CAAG,CACH,EAEA,IAAAC,GAAiBN,GCnDbP,GAAQxO,EAEZsP,GAAiB,SAA6BC,EAASC,EAAgB,CACrEhB,GAAM,QAAQe,EAAS,SAAuBz1B,EAAOqR,EAAM,CACrDA,IAASqkB,GAAkBrkB,EAAK,YAAW,IAAOqkB,EAAe,gBACnED,EAAQC,CAAc,EAAI11B,EAC1B,OAAOy1B,EAAQpkB,CAAI,EAEzB,CAAG,CACH,ECCAskB,GAAiB,SAAsB/jB,EAAOgkB,EAAQ3pB,EAAM4pB,EAASC,EAAU,CAC7E,OAAAlkB,EAAM,OAASgkB,EACX3pB,IACF2F,EAAM,KAAO3F,GAGf2F,EAAM,QAAUikB,EAChBjkB,EAAM,SAAWkkB,EACjBlkB,EAAM,aAAe,GAErBA,EAAM,OAAS,UAAkB,CAC/B,MAAO,CAEL,QAAS,KAAK,QACd,KAAM,KAAK,KAEX,YAAa,KAAK,YAClB,OAAQ,KAAK,OAEb,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,MAAO,KAAK,MAEZ,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,OAAQ,KAAK,UAAY,KAAK,SAAS,OAAS,KAAK,SAAS,OAAS,IAC7E,CACA,EACSA,CACT,2CCxCA,IAAI+jB,EAAezP,GAYnB,OAAA6P,GAAiB,SAAqBC,EAASJ,EAAQ3pB,EAAM4pB,EAASC,EAAU,CAC9E,IAAIlkB,EAAQ,IAAI,MAAMokB,CAAO,EAC7B,OAAOL,EAAa/jB,EAAOgkB,EAAQ3pB,EAAM4pB,EAASC,CAAQ,mDCd5D,IAAIC,EAAc7P,KASJ,OAAA+P,GAAG,SAAgBvyB,EAASC,EAAQmyB,EAAU,CAC1D,IAAII,EAAiBJ,EAAS,OAAO,eACjC,CAACA,EAAS,QAAU,CAACI,GAAkBA,EAAeJ,EAAS,MAAM,EACvEpyB,EAAQoyB,CAAQ,EAEhBnyB,EAAOoyB,EACL,mCAAqCD,EAAS,OAC9CA,EAAS,OACT,KACAA,EAAS,QACTA,CACN,CAAK,mDCpBL,IAAIpB,EAAQxO,EAEE,OAAAiQ,GACZzB,EAAM,qBAAsB,EAGzB,UAA8B,CAC7B,MAAO,CACL,MAAO,SAAerjB,EAAMrR,EAAOo2B,EAASlyB,EAAMmyB,EAAQC,EAAQ,CAChE,IAAIC,EAAS,CAAA,EACbA,EAAO,KAAKllB,EAAO,IAAM,mBAAmBrR,CAAK,CAAC,EAE9C00B,EAAM,SAAS0B,CAAO,GACxBG,EAAO,KAAK,WAAa,IAAI,KAAKH,CAAO,EAAE,YAAW,CAAE,EAGtD1B,EAAM,SAASxwB,CAAI,GACrBqyB,EAAO,KAAK,QAAUryB,CAAI,EAGxBwwB,EAAM,SAAS2B,CAAM,GACvBE,EAAO,KAAK,UAAYF,CAAM,EAG5BC,IAAW,IACbC,EAAO,KAAK,QAAQ,EAGtB,SAAS,OAASA,EAAO,KAAK,IAAI,CACnC,EAED,KAAM,SAAcllB,EAAM,CACxB,IAAIxC,EAAQ,SAAS,OAAO,MAAM,IAAI,OAAO,aAAewC,EAAO,WAAW,CAAC,EAC/E,OAAQxC,EAAQ,mBAAmBA,EAAM,CAAC,CAAC,EAAI,IAChD,EAED,OAAQ,SAAgBwC,EAAM,CAC5B,KAAK,MAAMA,EAAM,GAAI,KAAK,IAAG,EAAK,KAAQ,CAC3C,CACT,CACA,EAAQ,EAGH,UAAiC,CAChC,MAAO,CACL,MAAO,UAAiB,CAAE,EAC1B,KAAM,UAAgB,CAAE,OAAO,IAAO,EACtC,OAAQ,UAAkB,CAAE,CACpC,CACA,EAAQ,8CC3CRmlB,GAAiB,SAAuB3B,EAAK,CAI3C,MAAO,gCAAgC,KAAKA,CAAG,gDCHjD4B,GAAiB,SAAqBC,EAASC,EAAa,CAC1D,OAAOA,EACHD,EAAQ,QAAQ,OAAQ,EAAE,EAAI,IAAMC,EAAY,QAAQ,OAAQ,EAAE,EAClED,oDCVN,IAAIF,EAAgBtQ,KAChBuQ,EAActQ,KAWlB,OAAAyQ,GAAiB,SAAuBF,EAASG,EAAc,CAC7D,OAAIH,GAAW,CAACF,EAAcK,CAAY,EACjCJ,EAAYC,EAASG,CAAY,EAEnCA,mDChBT,IAAInC,EAAQxO,EAIR4Q,EAAoB,CACtB,MAAO,gBAAiB,iBAAkB,eAAgB,OAC1D,UAAW,OAAQ,OAAQ,oBAAqB,sBAChD,gBAAiB,WAAY,eAAgB,sBAC7C,UAAW,cAAe,YAC5B,EAeA,OAAAC,GAAiB,SAAsBtB,EAAS,CAC9C,IAAIuB,EAAS,CAAA,EACTz4B,EACAyQ,EACApQ,EAEJ,OAAK62B,GAELf,EAAM,QAAQe,EAAQ,MAAM;AAAA,CAAI,EAAG,SAAgBwB,EAAM,CAKvD,GAJAr4B,EAAIq4B,EAAK,QAAQ,GAAG,EACpB14B,EAAMm2B,EAAM,KAAKuC,EAAK,OAAO,EAAGr4B,CAAC,CAAC,EAAE,cACpCoQ,EAAM0lB,EAAM,KAAKuC,EAAK,OAAOr4B,EAAI,CAAC,CAAC,EAE/BL,EAAK,CACP,GAAIy4B,EAAOz4B,CAAG,GAAKu4B,EAAkB,QAAQv4B,CAAG,GAAK,EACnD,OAEEA,IAAQ,aACVy4B,EAAOz4B,CAAG,GAAKy4B,EAAOz4B,CAAG,EAAIy4B,EAAOz4B,CAAG,EAAI,CAAA,GAAI,OAAO,CAACyQ,CAAG,CAAC,EAE3DgoB,EAAOz4B,CAAG,EAAIy4B,EAAOz4B,CAAG,EAAIy4B,EAAOz4B,CAAG,EAAI,KAAOyQ,EAAMA,CAE1D,CACL,CAAG,EAEMgoB,mDCjDT,IAAItC,EAAQxO,EAEE,OAAAgR,GACZxC,EAAM,qBAAsB,EAIzB,UAA8B,CAC7B,IAAIyC,EAAO,kBAAkB,KAAK,UAAU,SAAS,EACjDC,EAAiB,SAAS,cAAc,GAAG,EAC3CC,EAQJ,SAASC,EAAWzC,EAAK,CACvB,IAAI0C,EAAO1C,EAEX,OAAIsC,IAEFC,EAAe,aAAa,OAAQG,CAAI,EACxCA,EAAOH,EAAe,MAGxBA,EAAe,aAAa,OAAQG,CAAI,EAGjC,CACL,KAAMH,EAAe,KACrB,SAAUA,EAAe,SAAWA,EAAe,SAAS,QAAQ,KAAM,EAAE,EAAI,GAChF,KAAMA,EAAe,KACrB,OAAQA,EAAe,OAASA,EAAe,OAAO,QAAQ,MAAO,EAAE,EAAI,GAC3E,KAAMA,EAAe,KAAOA,EAAe,KAAK,QAAQ,KAAM,EAAE,EAAI,GACpE,SAAUA,EAAe,SACzB,KAAMA,EAAe,KACrB,SAAWA,EAAe,SAAS,OAAO,CAAC,IAAM,IAC/CA,EAAe,SACf,IAAMA,EAAe,QACjC,CACO,CAED,OAAAC,EAAYC,EAAW,OAAO,SAAS,IAAI,EAQpC,SAAyBE,EAAY,CAC1C,IAAIR,EAAUtC,EAAM,SAAS8C,CAAU,EAAKF,EAAWE,CAAU,EAAIA,EACrE,OAAQR,EAAO,WAAaK,EAAU,UAClCL,EAAO,OAASK,EAAU,IACtC,CACA,EAAQ,EAGH,UAAiC,CAChC,OAAO,UAA2B,CAChC,MAAO,EACf,CACA,EAAQ,kDC1DR,SAASI,EAAOzB,EAAS,CACvB,KAAK,QAAUA,CAChB,CAED,OAAAyB,EAAO,UAAU,SAAW,UAAoB,CAC9C,MAAO,UAAY,KAAK,QAAU,KAAO,KAAK,QAAU,GAC1D,EAEAA,EAAO,UAAU,WAAa,GAE9BC,GAAiBD,kDChBjB,IAAI/C,EAAQxO,EACR+P,EAAS9P,KACTgQ,EAAU3O,KACVoN,EAAW+C,GACXf,EAAgBgB,KAChBb,EAAec,KACfX,EAAkBY,KAClB/B,EAAcgC,KACdC,EAAWC,KACXR,EAASS,KAEb,OAAAC,GAAiB,SAAoBvC,EAAQ,CAC3C,OAAO,IAAI,QAAQ,SAA4BlyB,EAASC,EAAQ,CAC9D,IAAIy0B,EAAcxC,EAAO,KACrByC,EAAiBzC,EAAO,QACxB0C,EAAe1C,EAAO,aACtB2C,EACJ,SAASnjB,GAAO,CACVwgB,EAAO,aACTA,EAAO,YAAY,YAAY2C,CAAU,EAGvC3C,EAAO,QACTA,EAAO,OAAO,oBAAoB,QAAS2C,CAAU,CAExD,CAEG7D,EAAM,WAAW0D,CAAW,GAC9B,OAAOC,EAAe,cAAc,EAGtC,IAAIxC,EAAU,IAAI,eAGlB,GAAID,EAAO,KAAM,CACf,IAAI4C,EAAW5C,EAAO,KAAK,UAAY,GACnC6C,EAAW7C,EAAO,KAAK,SAAW,SAAS,mBAAmBA,EAAO,KAAK,QAAQ,CAAC,EAAI,GAC3FyC,EAAe,cAAgB,SAAW,KAAKG,EAAW,IAAMC,CAAQ,CACzE,CAED,IAAIC,EAAW9B,EAAchB,EAAO,QAASA,EAAO,GAAG,EACvDC,EAAQ,KAAKD,EAAO,OAAO,YAAa,EAAEhB,EAAS8D,EAAU9C,EAAO,OAAQA,EAAO,gBAAgB,EAAG,EAAI,EAG1GC,EAAQ,QAAUD,EAAO,QAEzB,SAAS+C,GAAY,CACnB,GAAK9C,EAIL,KAAI+C,EAAkB,0BAA2B/C,EAAUkB,EAAalB,EAAQ,sBAAqB,CAAE,EAAI,KACvGgD,EAAe,CAACP,GAAgBA,IAAiB,QAAWA,IAAiB,OAC/EzC,EAAQ,aAAeA,EAAQ,SAC7BC,EAAW,CACb,KAAM+C,EACN,OAAQhD,EAAQ,OAChB,WAAYA,EAAQ,WACpB,QAAS+C,EACT,OAAQhD,EACR,QAASC,CACjB,EAEMI,EAAO,SAAkBj2B,EAAO,CAC9B0D,EAAQ1D,CAAK,EACboV,GACR,EAAS,SAAiBvC,EAAK,CACvBlP,EAAOkP,CAAG,EACVuC,GACD,EAAE0gB,CAAQ,EAGXD,EAAU,KACX,CAmED,GAjEI,cAAeA,EAEjBA,EAAQ,UAAY8C,EAGpB9C,EAAQ,mBAAqB,UAAsB,CAC7C,CAACA,GAAWA,EAAQ,aAAe,GAQnCA,EAAQ,SAAW,GAAK,EAAEA,EAAQ,aAAeA,EAAQ,YAAY,QAAQ,OAAO,IAAM,IAK9F,WAAW8C,CAAS,CAC5B,EAII9C,EAAQ,QAAU,UAAuB,CAClCA,IAILlyB,EAAOoyB,EAAY,kBAAmBH,EAAQ,eAAgBC,CAAO,CAAC,EAGtEA,EAAU,KAChB,EAGIA,EAAQ,QAAU,UAAuB,CAGvClyB,EAAOoyB,EAAY,gBAAiBH,EAAQ,KAAMC,CAAO,CAAC,EAG1DA,EAAU,IAChB,EAGIA,EAAQ,UAAY,UAAyB,CAC3C,IAAIiD,EAAsB,cAAgBlD,EAAO,QAAU,cACvDmD,EAAenD,EAAO,cAAgBoC,EAAS,aAC/CpC,EAAO,sBACTkD,EAAsBlD,EAAO,qBAE/BjyB,EAAOoyB,EACL+C,EACAlD,EACAmD,EAAa,oBAAsB,YAAc,eACjDlD,CAAO,CAAC,EAGVA,EAAU,IAChB,EAKQnB,EAAM,uBAAwB,CAEhC,IAAIsE,GAAapD,EAAO,iBAAmBsB,EAAgBwB,CAAQ,IAAM9C,EAAO,eAC9EO,EAAQ,KAAKP,EAAO,cAAc,EAClC,OAEEoD,IACFX,EAAezC,EAAO,cAAc,EAAIoD,EAE3C,CAGG,qBAAsBnD,GACxBnB,EAAM,QAAQ2D,EAAgB,SAA0BrpB,EAAKzQ,EAAK,CAC5D,OAAO65B,EAAgB,KAAe75B,EAAI,YAAW,IAAO,eAE9D,OAAO85B,EAAe95B,CAAG,EAGzBs3B,EAAQ,iBAAiBt3B,EAAKyQ,CAAG,CAE3C,CAAO,EAIE0lB,EAAM,YAAYkB,EAAO,eAAe,IAC3CC,EAAQ,gBAAkB,CAAC,CAACD,EAAO,iBAIjC0C,GAAgBA,IAAiB,SACnCzC,EAAQ,aAAeD,EAAO,cAI5B,OAAOA,EAAO,oBAAuB,YACvCC,EAAQ,iBAAiB,WAAYD,EAAO,kBAAkB,EAI5D,OAAOA,EAAO,kBAAqB,YAAcC,EAAQ,QAC3DA,EAAQ,OAAO,iBAAiB,WAAYD,EAAO,gBAAgB,GAGjEA,EAAO,aAAeA,EAAO,UAG/B2C,EAAa,SAASU,EAAQ,CACvBpD,IAGLlyB,EAAO,CAACs1B,GAAWA,GAAUA,EAAO,KAAQ,IAAIxB,EAAO,UAAU,EAAIwB,CAAM,EAC3EpD,EAAQ,MAAK,EACbA,EAAU,KAClB,EAEMD,EAAO,aAAeA,EAAO,YAAY,UAAU2C,CAAU,EACzD3C,EAAO,SACTA,EAAO,OAAO,QAAU2C,EAAY,EAAG3C,EAAO,OAAO,iBAAiB,QAAS2C,CAAU,IAIxFH,IACHA,EAAc,MAIhBvC,EAAQ,KAAKuC,CAAW,CAC5B,CAAG,mDChNH,IAAI1D,EAAQxO,EACRsP,EAAsBrP,GACtBwP,EAAenO,GAEf0R,EAAuB,CACzB,eAAgB,mCAClB,EAEA,SAASC,EAAsB1D,EAASz1B,EAAO,CACzC,CAAC00B,EAAM,YAAYe,CAAO,GAAKf,EAAM,YAAYe,EAAQ,cAAc,CAAC,IAC1EA,EAAQ,cAAc,EAAIz1B,EAE7B,CAED,SAASo5B,GAAoB,CAC3B,IAAIC,EACJ,OAAI,OAAO,eAAmB,KAGnB,OAAO,QAAY,KAAe,OAAO,UAAU,SAAS,KAAK,OAAO,IAAM,sBAEvFA,EAAUzB,GAAA,GAELyB,CACR,CAED,SAASC,EAAgBC,EAAUC,EAAQC,EAAS,CAClD,GAAI/E,EAAM,SAAS6E,CAAQ,EACzB,GAAI,CACF,OAACC,GAAU,KAAK,OAAOD,CAAQ,EACxB7E,EAAM,KAAK6E,CAAQ,CAC3B,OAAQvpB,EAAP,CACA,GAAIA,EAAE,OAAS,cACb,MAAMA,CAET,CAGH,OAAQypB,GAAW,KAAK,WAAWF,CAAQ,CAC5C,CAED,IAAIvB,EAAW,CAEb,aAAc,CACZ,kBAAmB,GACnB,kBAAmB,GACnB,oBAAqB,EACtB,EAED,QAASoB,EAAmB,EAE5B,iBAAkB,CAAC,SAA0Bn0B,EAAMwwB,EAAS,CAI1D,OAHAD,EAAoBC,EAAS,QAAQ,EACrCD,EAAoBC,EAAS,cAAc,EAEvCf,EAAM,WAAWzvB,CAAI,GACvByvB,EAAM,cAAczvB,CAAI,GACxByvB,EAAM,SAASzvB,CAAI,GACnByvB,EAAM,SAASzvB,CAAI,GACnByvB,EAAM,OAAOzvB,CAAI,GACjByvB,EAAM,OAAOzvB,CAAI,EAEVA,EAELyvB,EAAM,kBAAkBzvB,CAAI,EACvBA,EAAK,OAEVyvB,EAAM,kBAAkBzvB,CAAI,GAC9Bk0B,EAAsB1D,EAAS,iDAAiD,EACzExwB,EAAK,YAEVyvB,EAAM,SAASzvB,CAAI,GAAMwwB,GAAWA,EAAQ,cAAc,IAAM,oBAClE0D,EAAsB1D,EAAS,kBAAkB,EAC1C6D,EAAgBr0B,CAAI,GAEtBA,CACX,CAAG,EAED,kBAAmB,CAAC,SAA2BA,EAAM,CACnD,IAAI8zB,EAAe,KAAK,cAAgBf,EAAS,aAC7C0B,EAAoBX,GAAgBA,EAAa,kBACjDY,EAAoBZ,GAAgBA,EAAa,kBACjDa,EAAoB,CAACF,GAAqB,KAAK,eAAiB,OAEpE,GAAIE,GAAsBD,GAAqBjF,EAAM,SAASzvB,CAAI,GAAKA,EAAK,OAC1E,GAAI,CACF,OAAO,KAAK,MAAMA,CAAI,CACvB,OAAQ+K,EAAP,CACA,GAAI4pB,EACF,MAAI5pB,EAAE,OAAS,cACP2lB,EAAa3lB,EAAG,KAAM,cAAc,EAEtCA,CAET,CAGH,OAAO/K,CACX,CAAG,EAMD,QAAS,EAET,eAAgB,aAChB,eAAgB,eAEhB,iBAAkB,GAClB,cAAe,GAEf,eAAgB,SAAwBynB,EAAQ,CAC9C,OAAOA,GAAU,KAAOA,EAAS,GAClC,EAED,QAAS,CACP,OAAQ,CACN,OAAU,mCACX,CACF,CACH,EAEA,OAAAgI,EAAM,QAAQ,CAAC,SAAU,MAAO,MAAM,EAAG,SAA6B3T,EAAQ,CAC5EiX,EAAS,QAAQjX,CAAM,EAAI,EAC7B,CAAC,EAED2T,EAAM,QAAQ,CAAC,OAAQ,MAAO,OAAO,EAAG,SAA+B3T,EAAQ,CAC7EiX,EAAS,QAAQjX,CAAM,EAAI2T,EAAM,MAAMwE,CAAoB,CAC7D,CAAC,EAEDW,GAAiB7B,KCnIjB,IAAItD,GAAQxO,EACR8R,GAAW7R,GAAA,EAUf2T,GAAiB,SAAuB70B,EAAMwwB,EAASsE,EAAK,CAC1D,IAAIvI,EAAU,MAAQwG,GAEtBtD,OAAAA,GAAM,QAAQqF,EAAK,SAAmB9oB,EAAI,CACxChM,EAAOgM,EAAG,KAAKugB,EAASvsB,EAAMwwB,CAAO,CACzC,CAAG,EAEMxwB,CACT,uCCnBA+0B,GAAiB,SAAkBh6B,EAAO,CACxC,MAAO,CAAC,EAAEA,GAASA,EAAM,iBCD3B,IAAI00B,GAAQxO,EACR4T,GAAgB3T,GAChB6T,GAAWxS,GAAA,EACXwQ,GAAWL,GAAA,EACXF,GAASG,GAAA,EAKb,SAASqC,GAA6BrE,EAAQ,CAK5C,GAJIA,EAAO,aACTA,EAAO,YAAY,mBAGjBA,EAAO,QAAUA,EAAO,OAAO,QACjC,MAAM,IAAI6B,GAAO,UAAU,CAE/B,CAQA,IAAAyC,GAAiB,SAAyBtE,EAAQ,CAChDqE,GAA6BrE,CAAM,EAGnCA,EAAO,QAAUA,EAAO,SAAW,CAAA,EAGnCA,EAAO,KAAOkE,GAAc,KAC1BlE,EACAA,EAAO,KACPA,EAAO,QACPA,EAAO,gBACX,EAGEA,EAAO,QAAUlB,GAAM,MACrBkB,EAAO,QAAQ,QAAU,CAAE,EAC3BA,EAAO,QAAQA,EAAO,MAAM,GAAK,CAAE,EACnCA,EAAO,OACX,EAEElB,GAAM,QACJ,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,QAAS,QAAQ,EAC1D,SAA2B3T,EAAQ,CACjC,OAAO6U,EAAO,QAAQ7U,CAAM,CAC7B,CACL,EAEE,IAAIsY,EAAUzD,EAAO,SAAWoC,GAAS,QAEzC,OAAOqB,EAAQzD,CAAM,EAAE,KAAK,SAA6BE,EAAU,CACjE,OAAAmE,GAA6BrE,CAAM,EAGnCE,EAAS,KAAOgE,GAAc,KAC5BlE,EACAE,EAAS,KACTA,EAAS,QACTF,EAAO,iBACb,EAEWE,CACX,EAAK,SAA4BqE,EAAQ,CACrC,OAAKH,GAASG,CAAM,IAClBF,GAA6BrE,CAAM,EAG/BuE,GAAUA,EAAO,WACnBA,EAAO,SAAS,KAAOL,GAAc,KACnClE,EACAuE,EAAO,SAAS,KAChBA,EAAO,SAAS,QAChBvE,EAAO,iBACjB,IAIW,QAAQ,OAAOuE,CAAM,CAChC,CAAG,CACH,ECpFIzF,EAAQxO,EAUZkU,GAAiB,SAAqBC,EAASC,EAAS,CAEtDA,EAAUA,GAAW,GACrB,IAAI1E,EAAS,CAAA,EAEb,SAAS2E,EAAe77B,EAAQ+C,EAAQ,CACtC,OAAIizB,EAAM,cAAch2B,CAAM,GAAKg2B,EAAM,cAAcjzB,CAAM,EACpDizB,EAAM,MAAMh2B,EAAQ+C,CAAM,EACxBizB,EAAM,cAAcjzB,CAAM,EAC5BizB,EAAM,MAAM,CAAE,EAAEjzB,CAAM,EACpBizB,EAAM,QAAQjzB,CAAM,EACtBA,EAAO,QAETA,CACR,CAGD,SAAS+4B,EAAoBn1B,EAAM,CACjC,GAAKqvB,EAAM,YAAY4F,EAAQj1B,CAAI,CAAC,GAE7B,GAAI,CAACqvB,EAAM,YAAY2F,EAAQh1B,CAAI,CAAC,EACzC,OAAOk1B,EAAe,OAAWF,EAAQh1B,CAAI,CAAC,MAF9C,QAAOk1B,EAAeF,EAAQh1B,CAAI,EAAGi1B,EAAQj1B,CAAI,CAAC,CAIrD,CAGD,SAASo1B,EAAiBp1B,EAAM,CAC9B,GAAI,CAACqvB,EAAM,YAAY4F,EAAQj1B,CAAI,CAAC,EAClC,OAAOk1B,EAAe,OAAWD,EAAQj1B,CAAI,CAAC,CAEjD,CAGD,SAASq1B,EAAiBr1B,EAAM,CAC9B,GAAKqvB,EAAM,YAAY4F,EAAQj1B,CAAI,CAAC,GAE7B,GAAI,CAACqvB,EAAM,YAAY2F,EAAQh1B,CAAI,CAAC,EACzC,OAAOk1B,EAAe,OAAWF,EAAQh1B,CAAI,CAAC,MAF9C,QAAOk1B,EAAe,OAAWD,EAAQj1B,CAAI,CAAC,CAIjD,CAGD,SAASs1B,EAAgBt1B,EAAM,CAC7B,GAAIA,KAAQi1B,EACV,OAAOC,EAAeF,EAAQh1B,CAAI,EAAGi1B,EAAQj1B,CAAI,CAAC,EAC7C,GAAIA,KAAQg1B,EACjB,OAAOE,EAAe,OAAWF,EAAQh1B,CAAI,CAAC,CAEjD,CAED,IAAIu1B,EAAW,CACb,IAAOH,EACP,OAAUA,EACV,KAAQA,EACR,QAAWC,EACX,iBAAoBA,EACpB,kBAAqBA,EACrB,iBAAoBA,EACpB,QAAWA,EACX,eAAkBA,EAClB,gBAAmBA,EACnB,QAAWA,EACX,aAAgBA,EAChB,eAAkBA,EAClB,eAAkBA,EAClB,iBAAoBA,EACpB,mBAAsBA,EACtB,WAAcA,EACd,iBAAoBA,EACpB,cAAiBA,EACjB,UAAaA,EACb,UAAaA,EACb,WAAcA,EACd,YAAeA,EACf,WAAcA,EACd,iBAAoBA,EACpB,eAAkBC,CACtB,EAEEjG,OAAAA,EAAM,QAAQ,OAAO,KAAK2F,CAAO,EAAE,OAAO,OAAO,KAAKC,CAAO,CAAC,EAAG,SAA4Bj1B,EAAM,CACjG,IAAIgvB,EAAQuG,EAASv1B,CAAI,GAAKm1B,EAC1BK,EAAcxG,EAAMhvB,CAAI,EAC3BqvB,EAAM,YAAYmG,CAAW,GAAKxG,IAAUsG,IAAqB/E,EAAOvwB,CAAI,EAAIw1B,EACrF,CAAG,EAEMjF,CACT,uCClGA3wB,GAAiB,CACf,QAAW,cCCb,IAAI8X,GAAUmJ,GAAsB,EAAC,QAEjC4U,GAAa,CAAA,EAGjB,CAAC,SAAU,UAAW,SAAU,WAAY,SAAU,QAAQ,EAAE,QAAQ,SAASl5B,EAAMhD,EAAG,CACxFk8B,GAAWl5B,CAAI,EAAI,SAAmBm5B,EAAO,CAC3C,OAAO,OAAOA,IAAUn5B,GAAQ,KAAOhD,EAAI,EAAI,KAAO,KAAOgD,CACjE,CACA,CAAC,EAED,IAAIo5B,GAAqB,CAAA,EASfC,GAAC,aAAe,SAAsBC,EAAWC,EAASnF,EAAS,CAC3E,SAASoF,EAAcxqB,EAAKyqB,EAAM,CAChC,MAAO,WAAate,GAAU,0BAA6BnM,EAAM,IAAOyqB,GAAQrF,EAAU,KAAOA,EAAU,GAC5G,CAGD,OAAO,SAASh2B,EAAO4Q,EAAKD,EAAM,CAChC,GAAIuqB,IAAc,GAChB,MAAM,IAAI,MAAME,EAAcxqB,EAAK,qBAAuBuqB,EAAU,OAASA,EAAU,GAAG,CAAC,EAG7F,OAAIA,GAAW,CAACH,GAAmBpqB,CAAG,IACpCoqB,GAAmBpqB,CAAG,EAAI,GAE1B,QAAQ,KACNwqB,EACExqB,EACA,+BAAiCuqB,EAAU,yCAC5C,CACT,GAGWD,EAAYA,EAAUl7B,EAAO4Q,EAAKD,CAAI,EAAI,EACrD,CACA,EASA,SAAS2qB,GAAcv5B,EAASw5B,EAAQC,EAAc,CACpD,GAAI,OAAOz5B,GAAY,SACrB,MAAM,IAAI,UAAU,2BAA2B,EAIjD,QAFIV,EAAO,OAAO,KAAKU,CAAO,EAC1BnD,EAAIyC,EAAK,OACNzC,KAAM,GAAG,CACd,IAAIgS,EAAMvP,EAAKzC,CAAC,EACZs8B,EAAYK,EAAO3qB,CAAG,EAC1B,GAAIsqB,EAAW,CACb,IAAIl7B,EAAQ+B,EAAQ6O,CAAG,EACnBlK,EAAS1G,IAAU,QAAak7B,EAAUl7B,EAAO4Q,EAAK7O,CAAO,EACjE,GAAI2E,IAAW,GACb,MAAM,IAAI,UAAU,UAAYkK,EAAM,YAAclK,CAAM,EAE5D,QACD,CACD,GAAI80B,IAAiB,GACnB,MAAM,MAAM,kBAAoB5qB,CAAG,CAEtC,CACH,CAEA,IAAAsqB,GAAiB,CACf,cAAeI,GACf,WAAYR,EACd,EC/EIpG,GAAQxO,EACR0O,GAAWzO,GACX8O,GAAqBzN,GACrB0S,GAAkBvC,GAClByC,GAAcxC,GACdsD,GAAYrD,GAEZiD,GAAaI,GAAU,WAM3B,SAASO,GAAMC,EAAgB,CAC7B,KAAK,SAAWA,EAChB,KAAK,aAAe,CAClB,QAAS,IAAIzG,GACb,SAAU,IAAIA,EAClB,CACA,CAOK0G,GAAC,UAAU,QAAU,SAAiB/F,EAAQ,CAG7C,OAAOA,GAAW,UACpBA,EAAS,UAAU,CAAC,GAAK,GACzBA,EAAO,IAAM,UAAU,CAAC,GAExBA,EAASA,GAAU,GAGrBA,EAASwE,GAAY,KAAK,SAAUxE,CAAM,EAGtCA,EAAO,OACTA,EAAO,OAASA,EAAO,OAAO,YAAW,EAChC,KAAK,SAAS,OACvBA,EAAO,OAAS,KAAK,SAAS,OAAO,YAAW,EAEhDA,EAAO,OAAS,MAGlB,IAAImD,EAAenD,EAAO,aAEtBmD,IAAiB,QACnBmC,GAAU,cAAcnC,EAAc,CACpC,kBAAmB+B,GAAW,aAAaA,GAAW,OAAO,EAC7D,kBAAmBA,GAAW,aAAaA,GAAW,OAAO,EAC7D,oBAAqBA,GAAW,aAAaA,GAAW,OAAO,CAChE,EAAE,EAAK,EAIV,IAAIc,EAA0B,CAAA,EAC1BC,EAAiC,GACrC,KAAK,aAAa,QAAQ,QAAQ,SAAoCC,EAAa,CAC7E,OAAOA,EAAY,SAAY,YAAcA,EAAY,QAAQlG,CAAM,IAAM,KAIjFiG,EAAiCA,GAAkCC,EAAY,YAE/EF,EAAwB,QAAQE,EAAY,UAAWA,EAAY,QAAQ,EAC/E,CAAG,EAED,IAAIC,EAA2B,CAAA,EAC/B,KAAK,aAAa,SAAS,QAAQ,SAAkCD,EAAa,CAChFC,EAAyB,KAAKD,EAAY,UAAWA,EAAY,QAAQ,CAC7E,CAAG,EAED,IAAIr4B,EAEJ,GAAI,CAACo4B,EAAgC,CACnC,IAAIG,EAAQ,CAAC9B,GAAiB,MAAS,EAMvC,IAJA,MAAM,UAAU,QAAQ,MAAM8B,EAAOJ,CAAuB,EAC5DI,EAAQA,EAAM,OAAOD,CAAwB,EAE7Ct4B,EAAU,QAAQ,QAAQmyB,CAAM,EACzBoG,EAAM,QACXv4B,EAAUA,EAAQ,KAAKu4B,EAAM,MAAK,EAAIA,EAAM,MAAK,CAAE,EAGrD,OAAOv4B,CACR,CAID,QADIw4B,EAAYrG,EACTgG,EAAwB,QAAQ,CACrC,IAAIM,EAAcN,EAAwB,QACtCO,EAAaP,EAAwB,QACzC,GAAI,CACFK,EAAYC,EAAYD,CAAS,CAClC,OAAQrqB,EAAP,CACAuqB,EAAWvqB,CAAK,EAChB,KACD,CACF,CAED,GAAI,CACFnO,EAAUy2B,GAAgB+B,CAAS,CACpC,OAAQrqB,EAAP,CACA,OAAO,QAAQ,OAAOA,CAAK,CAC5B,CAED,KAAOmqB,EAAyB,QAC9Bt4B,EAAUA,EAAQ,KAAKs4B,EAAyB,MAAK,EAAIA,EAAyB,MAAK,CAAE,EAG3F,OAAOt4B,CACT,EAEKk4B,GAAC,UAAU,OAAS,SAAgB/F,EAAQ,CAC/C,OAAAA,EAASwE,GAAY,KAAK,SAAUxE,CAAM,EACnChB,GAASgB,EAAO,IAAKA,EAAO,OAAQA,EAAO,gBAAgB,EAAE,QAAQ,MAAO,EAAE,CACvF,EAGAlB,GAAM,QAAQ,CAAC,SAAU,MAAO,OAAQ,SAAS,EAAG,SAA6B3T,EAAQ,CAEvF0a,GAAM,UAAU1a,CAAM,EAAI,SAAS8T,EAAKe,EAAQ,CAC9C,OAAO,KAAK,QAAQwE,GAAYxE,GAAU,CAAA,EAAI,CAC5C,OAAQ7U,EACR,IAAK8T,EACL,MAAOe,GAAU,CAAA,GAAI,IACtB,CAAA,CAAC,CACN,CACA,CAAC,EAEDlB,GAAM,QAAQ,CAAC,OAAQ,MAAO,OAAO,EAAG,SAA+B3T,EAAQ,CAE7E0a,GAAM,UAAU1a,CAAM,EAAI,SAAS8T,EAAK5vB,EAAM2wB,EAAQ,CACpD,OAAO,KAAK,QAAQwE,GAAYxE,GAAU,CAAA,EAAI,CAC5C,OAAQ7U,EACR,IAAK8T,EACL,KAAM5vB,CACP,CAAA,CAAC,CACN,CACA,CAAC,EAED,IAAAm3B,GAAiBX,4CCjJjB,IAAIhE,EAASvR,KAQb,SAASmW,EAAYC,EAAU,CAC7B,GAAI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,8BAA8B,EAGpD,IAAIC,EAEJ,KAAK,QAAU,IAAI,QAAQ,SAAyB74B,EAAS,CAC3D64B,EAAiB74B,CACrB,CAAG,EAED,IAAI84B,EAAQ,KAGZ,KAAK,QAAQ,KAAK,SAASvD,EAAQ,CACjC,GAAKuD,EAAM,WAEX,KAAI59B,EACAuE,EAAIq5B,EAAM,WAAW,OAEzB,IAAK59B,EAAI,EAAGA,EAAIuE,EAAGvE,IACjB49B,EAAM,WAAW59B,CAAC,EAAEq6B,CAAM,EAE5BuD,EAAM,WAAa,KACvB,CAAG,EAGD,KAAK,QAAQ,KAAO,SAASC,EAAa,CACxC,IAAIC,EAEAj5B,EAAU,IAAI,QAAQ,SAASC,EAAS,CAC1C84B,EAAM,UAAU94B,CAAO,EACvBg5B,EAAWh5B,CACjB,CAAK,EAAE,KAAK+4B,CAAW,EAEnB,OAAAh5B,EAAQ,OAAS,UAAkB,CACjC+4B,EAAM,YAAYE,CAAQ,CAChC,EAEWj5B,CACX,EAEE64B,EAAS,SAAgBtG,EAAS,CAC5BwG,EAAM,SAKVA,EAAM,OAAS,IAAI/E,EAAOzB,CAAO,EACjCuG,EAAeC,EAAM,MAAM,EAC/B,CAAG,CACF,CAKD,OAAAH,EAAY,UAAU,iBAAmB,UAA4B,CACnE,GAAI,KAAK,OACP,MAAM,KAAK,MAEf,EAMAA,EAAY,UAAU,UAAY,SAAmBr5B,EAAU,CAC7D,GAAI,KAAK,OAAQ,CACfA,EAAS,KAAK,MAAM,EACpB,MACD,CAEG,KAAK,WACP,KAAK,WAAW,KAAKA,CAAQ,EAE7B,KAAK,WAAa,CAACA,CAAQ,CAE/B,EAMAq5B,EAAY,UAAU,YAAc,SAAqBr5B,EAAU,CACjE,GAAK,KAAK,WAGV,KAAIsE,EAAQ,KAAK,WAAW,QAAQtE,CAAQ,EACxCsE,IAAU,IACZ,KAAK,WAAW,OAAOA,EAAO,CAAC,EAEnC,EAMA+0B,EAAY,OAAS,UAAkB,CACrC,IAAIpD,EACAuD,EAAQ,IAAIH,EAAY,SAAkBr2B,EAAG,CAC/CizB,EAASjzB,CACb,CAAG,EACD,MAAO,CACL,MAAOw2B,EACP,OAAQvD,CACZ,CACA,EAEA0D,GAAiBN,8CChGjBO,GAAiB,SAAgBrqB,EAAU,CACzC,OAAO,SAAcrS,EAAK,CACxB,OAAOqS,EAAS,MAAM,KAAMrS,CAAG,CACnC,gDCjBA28B,GAAiB,SAAsBC,EAAS,CAC9C,OAAQ,OAAOA,GAAY,UAAcA,EAAQ,eAAiB,QCPpE,IAAIpI,GAAQxO,EACR4M,GAAO3M,GACPsV,GAAQjU,GACR4S,GAAczC,GACdK,GAAWJ,GAAA,EAQf,SAASmF,GAAeC,EAAe,CACrC,IAAIxL,EAAU,IAAIiK,GAAMuB,CAAa,EACjCl/B,EAAWg1B,GAAK2I,GAAM,UAAU,QAASjK,CAAO,EAGpD,OAAAkD,GAAM,OAAO52B,EAAU29B,GAAM,UAAWjK,CAAO,EAG/CkD,GAAM,OAAO52B,EAAU0zB,CAAO,EAG9B1zB,EAAS,OAAS,SAAgB49B,EAAgB,CAChD,OAAOqB,GAAe3C,GAAY4C,EAAetB,CAAc,CAAC,CACpE,EAES59B,CACT,CAGA,IAAIm/B,EAAQF,GAAe/E,EAAQ,EAGnCiF,EAAM,MAAQxB,GAGdwB,EAAM,OAASpF,KACfoF,EAAM,YAAcnF,KACpBmF,EAAM,SAAWlF,KACjBkF,EAAM,QAAUhF,GAAqB,EAAC,QAGtCgF,EAAM,IAAM,SAAaC,EAAU,CACjC,OAAO,QAAQ,IAAIA,CAAQ,CAC7B,EACAD,EAAM,OAAS/E,KAGf+E,EAAM,aAAeE,KAErBC,GAAc,QAAGH,EAGjBI,GAAA,QAAyBJ,cCxDzBn1B,EAAA,QAAiBoe,QCcjB,QAAQ,IAAI,2CAA2C,ECZhD,SAASoX,GACZr4B,EACAs4B,EACA5mB,EACA6mB,EAIF,CACE,MAAMC,EAA8B,CAAA,EAC9B3mB,EAAsB,CAAA,EACnBH,EAAA,QAASI,GAAQ,CACtB0mB,EAAsB1mB,CAAG,EAAI,EAC7BD,EAAcC,CAAG,EAAI,CAAA,CACxB,EACUwmB,EAAA,QAASvmB,GAAW,CAClBL,EAAA,QAASI,GAAQ,CACtB0mB,EAAsB1mB,CAAG,GAAK,KAAK,IAAIC,EAAOD,CAAG,CAAC,CAAA,CACrD,CAAA,CACJ,EACI9R,EAAA,QAAS+R,GAAW,CACZL,EAAA,QAASI,GAAQ,CACtBD,EAAcC,CAAG,GAAK,KAAK,IAAIC,EAAOD,CAAG,CAAC,CAAA,CAC7C,CAAA,CACJ,EACD,MAAM2mB,EAA+B,CAAA,EAC1BH,EAAA,QAASvmB,GAAW,CACrB,MAAA2mB,EAAY,CAAE,GAAG3mB,GACdL,EAAA,QAASI,GAAQ,CACZ4mB,EAAA5mB,CAAG,GAAK0mB,EAAsB1mB,CAAG,CAAA,CAC9C,EACD2mB,EAAqB,KAAKC,CAAS,CAAA,CACtC,EACD,MAAMrmB,EAAyB,CAAA,EAC1B,OAAArS,EAAA,QAAS+R,GAAW,CACf,MAAA2mB,EAAY,CAAE,GAAG3mB,GACdL,EAAA,QAASI,GAAQ,CAClBymB,EACUG,EAAA5mB,CAAG,GAAK0mB,EAAsB1mB,CAAG,EAEjC4mB,EAAA5mB,CAAG,GAAKD,EAAcC,CAAG,CACvC,CACH,EACDO,EAAe,KAAKqmB,CAAS,CAAA,CAChC,EACM,CACH,eAAArmB,EACA,qBAAAomB,CAAA,CAER,CAEO,SAASE,GACZC,EACAC,EACAzmB,EACAV,EACM,CACN,IAAIuV,EAAQ,EAEZ,MAAM6R,EAAuBD,EAAc,IAAI,IAAM,EAAK,EAC1D,QAAS9mB,KAAU6mB,EAAe,CAC9B,IAAIG,EAAoBF,EAAc,UAAU,CAACn0B,EAAG/K,IACzC,CAACm/B,EAAUn/B,CAAC,GAAKyY,EAAW,MAAOO,GAAQjO,EAAEiO,CAAG,IAAMZ,EAAOY,CAAG,CAAC,CAC3E,EACD,GAAIomB,EAAoB,GAAI,CACxBD,EAAUC,CAAiB,EAAI,GACzB,MAAAC,EAAeH,EAAcE,CAAiB,EACpD,QAASjnB,KAAOJ,EACZuV,EAAQ,KAAK,IACTA,EACA,KAAK,IAAI+R,EAAalnB,CAAG,EAAGC,EAAOD,CAAG,CAAC,EAAI,KAAK,IAAIknB,EAAalnB,CAAG,EAAGC,EAAOD,CAAG,CAAC,CAAA,CAG1F,KAEA,SAASA,KAAOJ,EACZuV,EAAQ,KAAK,IAAIA,EAAOlV,EAAOD,CAAG,CAAC,CAI/C,CACA,QAASnY,EAAI,EAAGA,EAAIk/B,EAAc,OAAQl/B,IAClC,GAAA,CAACm/B,EAAUn/B,CAAC,EAAG,CACfm/B,EAAUn/B,CAAC,EAAI,GACf,QAASmY,KAAOJ,EACZuV,EAAQ,KAAK,IAAIA,EAAO4R,EAAcl/B,CAAC,EAAEmY,CAAG,CAAC,CAGrD,CAEG,OAAAmV,CACX,CAEgB,SAAAgS,GAAoBxnB,EAAoBC,EAAoB,CACpE,IAAAkQ,MAAgC,IAE3BlQ,EAAA,QAASI,GAAQ,CACjB8P,EAAA,IAAI9P,EAAK,CAAC,CAAA,CAClB,EAEUL,EAAA,QAASM,GAAW,CAClBL,EAAA,QAASI,GAAQ,CACjB8P,EAAA,IAAI9P,EAAK8P,EAAK,IAAI9P,CAAG,EAAK,KAAK,IAAIC,EAAOD,CAAG,CAAC,CAAC,CAAA,CACvD,CAAA,CACJ,EAED,MAAM2D,EAAc,CAAA,EACT,OAAAhE,EAAA,QAASM,GAAW,CACrB,MAAAE,EAAkB,CAAE,GAAGF,GACpBL,EAAA,QAASI,GAAQ,CACtBG,EAAUH,CAAG,GAAK8P,EAAK,IAAI9P,CAAG,CAAA,CACjC,EACD2D,EAAI,KAAKxD,CAAS,CAAA,CACrB,EACMwD,CACX,CAEO,SAASyjB,GACZznB,EACAW,EACA+mB,EACAC,EACM,CACN,IAAInS,EAAQ,EACZ,QAASlV,KAAUN,EACXM,EAAOonB,CAAQ,IAAM,GAAKpnB,EAAOqnB,CAAQ,IAAM,IACnDnS,GAAS,KAAK,IAAIlV,EAAOonB,CAAQ,EAAGpnB,EAAOqnB,CAAQ,CAAC,EAAI,KAAK,IAAIrnB,EAAOonB,CAAQ,EAAGpnB,EAAOqnB,CAAQ,CAAC,GAEhG,OAAAnS,CACX,CChHO,MAAMoS,EAAc,CAIvB,YAAa5nB,EAAqB,GAAI,CAH/B6nB,GAAA,mBACCA,GAAA,eACAA,GAAA,mBAA8B,CAAC,MAAO,MAAO,MAAO,QAAS,MAAM,GAElE,KAAA,OAAS,IAAIC,GAClB,KAAK,WAAa9nB,EAEdA,EAAW,OAAS,GACb,OAAO,KAAKA,EAAW,CAAC,CAAC,EAE/B,KAAA,OAAO,QAAQA,CAAU,CAMlC,CACO,UAAUyS,EAAqB,CAClC,KAAK,OAAO,UAAUA,EAAO,IAAUja,IAAA,CACnC,GAAGA,EAEH,IAAKA,EAAE,KAAOA,EAAE,KAClB,CAAC,EACH,KAAK,OAAO,iBAChB,CACO,aAAc,CACjB,eAAQ,IAAI,mCAAmC,EAC/C,KAAK,OAAO,aACP,KAAA,OAAO,UAAU,gCAAkC,GACnD,KAAA,OAAO,UAAU,8BAAgC,GACtD,QAAQ,IAAI,0CAA0C,EACtD,KAAK,OACA,gBACL,QAAQ,IAAI,4CAA4C,EACxD,KAAK,OAAO,eAAe,CACnB,IAAK,EACL,IAAK,CACT,EACA,CACI,IAAK,EACL,IAAK,CACT,CAAA,EAEJ,QAAQ,IAAI,+DAA+D,EAC3E,KAAK,OAAO,YACZ,QAAQ,IAAI,yCAAyC,EAC9C,IACX,CACO,QAASkJ,EAA0Bf,EAAsBV,EAAsB8J,EAAoB,GAAsB,CAGvH,KAAA,wBAAwBrI,EAAYf,EAAYV,CAAQ,EAC7D,MAAM8nB,EAAYpnB,EAAW,SAAW,GAAKe,EAAW,SAAW,EAE7DsmB,EAAqBD,EAAY,CAAC,EAAI,KAAK,mBAC7CrmB,EACAf,EACAV,EACA,EAAA,EAEEgoB,EAAqBF,EAAY,CAAC,EAAI,KAAK,qBAC7CrmB,EACAf,EACAV,EACA,EAAA,EAEEioB,EAAiB,KAAK,kBACxB,CAAC,EACDvnB,EACAV,EACA,EAAA,EAEEkoB,EAA6B,CAAA,EAChB,OAAAH,EAAA,QAAShN,GAAU,CAClCmN,EAAU,KAAK,CACX,WAAAxnB,EACA,SAAUqa,EAAM,WAChB,SAAA/a,EACA,SAAU,CAAC,EACX,MAAO+a,EAAM,MACb,KAAM,6BACN,YAAaA,EACb,WAAAtZ,CAAA,CACH,CAAA,CACJ,EACkBumB,EAAA,QAASjN,GAAU,CAClCmN,EAAU,KAAK,CACX,WAAAxnB,EACA,SAAU,CAAC,EACX,SAAUqa,EAAM,SAChB,SAAA/a,EACA,MAAO+a,EAAM,MACb,KAAM,6BACN,YAAaA,EACb,WAAAtZ,CAAA,CACH,CAAA,CACJ,EACcwmB,EAAA,UAAU,QAASlN,GAAU,CACxCmN,EAAU,KAAK,CACX,WAAAxnB,EACA,SAAUqa,EAAM,WAChB,SAAA/a,EACA,SAAU,CAAC,EACX,MAAO+a,EAAM,MACb,KAAM,wBACN,YAAaA,EACb,WAAAtZ,CAAA,CACH,CAAA,CACJ,EACcwmB,EAAA,YAAY,QAASlN,GAAU,CAC1CmN,EAAU,KAAK,CACX,WAAAxnB,EACA,SAAUqa,EAAM,WAChB,SAAA/a,EACA,SAAU,CAAC,EACX,MAAO+a,EAAM,MACb,KAAM,mBACN,YAAaA,EACb,WAAAtZ,CAAA,CACH,CAAA,CACJ,EACMymB,EAAU,OAAgBnN,GAAAA,EAAM,OAASjR,CAAS,CAC7D,CAEO,wBAAwBrI,EAA0Bf,EAAsBV,EAAsBmoB,EAAqB,EAAG,CACzH,MAAMC,EAAM,KAAK,iBAAiB,YAAa1nB,EAAYynB,EAAY,CAAC,EACxE,QAASE,KAAaD,EACH,KAAK,aAAa3mB,EAAY,CAAC,GAAGf,EAAY2nB,CAAS,EAAGroB,CAAQ,CAEzF,CACO,aAAayB,EAA0Bf,EAAsBV,EAAgC,CAChG,MAAMsoB,EAAetoB,EAAS,IAAI3S,GAAKA,EAAE,GAAG,EACtCk7B,EAAavoB,EAAS,IAAI3S,GAAKA,EAAE,EAAE,EACnCiB,EAAO,KAAK,OAAO,KAAK,UAAUoS,CAAU,EAAE,kBAAkB4nB,EAAcC,CAAU,EACxFC,EAAY9mB,GAAmBpT,EAAMmT,CAAU,EAC/CgnB,EAAiB,CAAA,EACvB,QAASroB,KAAOkoB,EAAc,CAC1B,MAAMzhB,EAASvY,EAAK,IAAS0E,GAAAA,EAAEoN,CAAG,CAAC,EACnCyG,EAAO,KAAK,CAAC1Z,EAAG4c,IAAM5c,EAAI4c,CAAC,EAC3B,MAAM2e,EAAkBF,EAAU,IAASx1B,GAAAA,EAAEoN,CAAG,CAAC,EAC3CuoB,EAAwB9hB,EAAO,KAAK,MAAMA,EAAO,OAAS,GAAI,CAAC,EAC/D+hB,EAAyB/hB,EAAO,KAAK,IAAI,KAAK,KAAKA,EAAO,OAAS,GAAI,EAAGA,EAAO,OAAS,CAAC,CAAC,EAC9F6hB,EAAgB,KAAUz3B,GAAAA,GAAK23B,CAAc,EAC7CH,EAAK,KAAK,CAAC,EACJC,EAAgB,KAAUz3B,GAAAA,GAAK03B,CAAa,EACnDF,EAAK,KAAK,EAAE,EAEZA,EAAK,KAAK,CAAC,CAEnB,CACO,OAAAA,CACX,CACO,kBAAkBhnB,EAA0Bf,EAAsBV,EAAsBmoB,EAAqB,EAAG,OAMnH,MAAMzT,EAAe,KAAK,OAAO,KAAK,UAAUhU,CAAU,EACpD4nB,EAAetoB,EAAS,IAAI3S,GAAKA,EAAE,GAAG,EACtCsa,EAAM3H,EAAS,IAAI3S,GAAKA,EAAE,EAAE,EAC5Bu5B,EAAallB,GAAmBgT,EAAa,kBAAkB4T,EAAc3gB,CAAG,EAAGlG,CAAU,EAC7F2mB,EAAM,KAAK,iBAAiB,YAAa1nB,EAAYynB,EAAY,CAAC,EAElEU,EAA6F,CAAA,EAC7FC,EAA+F,CAAA,EACrG,QAAST,KAAaD,EAAK,CACjB,MAAA1U,EAAS,KAAK,OAAO,KAAK,UAAU,CAAC,GAAGhT,EAAY2nB,CAAS,CAAC,EAC9D/5B,EAAOoT,GAAmBgS,EAAO,kBAAkB4U,EAAc3gB,CAAG,EAAGlG,CAAU,EACnF,IAAA+F,MAA+B,IACnC,QAASnH,KAAU/R,EACVkZ,EAAO,IAAInH,EAAOgoB,CAAS,CAAC,GAC7B7gB,EAAO,IAAInH,EAAOgoB,CAAS,EAAG,CAAE,CAAA,GAEpCtb,EAAAvF,EAAO,IAAInH,EAAOgoB,CAAS,CAAC,IAA5B,MAAAtb,EAA+B,KAAK1M,GAElC,KAAA,CAAE,SAAAQ,EAAU,SAAAD,GAAaJ,GAAiBomB,EAAYpf,EAAQ9G,EAAY4nB,CAAY,EAClFO,EAAA,KAAK,CAAE,IAAKhoB,EAAU,MAAOD,EAAU,WAAY,CAACynB,CAAS,EAAG,SAAAroB,CAAU,CAAA,EAC9E,KAAA,CAAE,WAAAqB,EAAY,WAAAD,GAAeD,GAAkBylB,EAAYpf,EAAQ9G,EAAY4nB,CAAY,EACrFQ,EAAA,KAAK,CAAE,IAAKznB,EAAY,MAAOD,EAAY,WAAY,CAACinB,CAAS,EAAG,SAAAroB,CAAU,CAAA,CAC9F,CACA,OAAA6oB,EAAU,KAAK,CAAC17B,EAAG4c,IAAM5c,EAAE,MAAQ4c,EAAE,KAAK,EAC1C+e,EAAY,KAAK,CAAC37B,EAAG4c,IAAMA,EAAE,MAAQ5c,EAAE,KAAK,EACrC,CACH,UAAA07B,EACA,YAAAC,CAAA,CAER,CACO,mBAAmBrnB,EAA0Bf,EAAsBV,EAAsBmoB,EAAqB,EAAG,CAGpH,MAAMG,EAAetoB,EAAS,IAAK3S,GAAMA,EAAE,GAAG,EACxCsa,EAAM3H,EAAS,IAAK3S,GAAMA,EAAE,EAAE,EAC9B+6B,EAAM,KAAK,iBAAiB,YAAa1nB,EAAYynB,EAAY,CAAC,EAClEW,EAAoF,CAAA,EAC1F,QAAST,KAAaD,EAAK,CACvB,MAAM1T,EAAe,KAAK,OAAO,KAAK,UAAU,CAAC2T,CAAS,CAAC,EACrD3U,EAAS,KAAK,OAAO,KAAK,UAAU,CAAC,GAAGhT,EAAY2nB,CAAS,CAAC,EAC9DU,EAAcrU,EAAa,kBAAkB4T,EAAc3gB,CAAG,EAC9DqhB,EAAUtnB,GAAmBgS,EAAO,kBAAkB4U,EAAc3gB,CAAG,EAAGlG,CAAU,EAE1F,IAAIwnB,EAAuBtC,GAAoBqC,EAASD,EAAaT,EAAc,EAAK,EAEpFY,EAAejC,GACfgC,EAAqB,eACrBA,EAAqB,qBACrB,CAACZ,CAAS,EACVC,CAAA,EAGJQ,EAAY,KAAK,CACb,WAAY,CAACT,CAAS,EACtB,SAAAroB,EACA,MAAOkpB,CAAA,CACV,CAEL,CACA,OAAAJ,EAAY,KAAK,CAAC37B,EAAG4c,IAAMA,EAAE,MAAQ5c,EAAE,KAAK,EACrC27B,CACX,CACO,qBAAqBrnB,EAA0Bf,EAAsBV,EAAsBmoB,EAAqB,EAAG,CAGtH,MAAMG,EAAetoB,EAAS,IAAK3S,GAAMA,EAAE,GAAG,EACxCsa,EAAM3H,EAAS,IAAK3S,GAAMA,EAAE,EAAE,EAC9B+6B,EAAM,KAAK,iBAAiB,UAAWE,EAAcH,CAAU,EAC/DgB,EAAkB,CAAC,GAAGb,EAAc,GAAGF,CAAG,EAE1CrkB,EAAwI,CAAA,EACxI2P,EAAS,KAAK,OAAO,KAAK,UAAUhT,CAAU,EAE3C,QAAA4G,KAAM,KAAK,YAAa,CAC7B,MAAM8hB,EAAmBhB,EAAI,IAAI,IAAM9gB,CAAE,EACnC+hB,EAAkB9B,GACpB7T,EAAO,kBAAkByV,EAAiB,CAAC,GAAGxhB,EAAK,GAAGyhB,CAAgB,CAAC,EACvED,CAAA,EAEJ,QAASG,KAAaH,EAAiB,CACnC,MAAMI,EAAgBvpB,EAAS,KAAU3S,GAAAA,EAAE,MAAQi8B,CAAS,EACxD,GAAAC,GAAiBA,EAAc,KAAOjiB,EAAI,SACxC,MAAAkiB,EAAsB,KAAK,aAAa/nB,EAAYf,EAAY,CAAC,CAAC,IAAK4oB,EAAW,GAAAhiB,CAAE,CAAC,CAAC,EACtFmiB,EAAkC,CAAA,EACxC,QAASxhC,EAAI,EAAGA,EAAIuhC,EAAoB,OAAQvhC,IACxCuhC,EAAoBvhC,CAAC,IAAM,GAC3BwhC,EAAY,KAAK,CACb,IAAKH,EACL,GAAAhiB,EACA,MAAOkiB,EAAoBvhC,CAAC,CAAA,CAC/B,EAGT,GAAIwhC,EAAY,SAAW,EAC3B,GAAIF,EAAe,CACf,MAAMG,EAAoBnC,GACtB7T,EAAO,kBAAkB,CAAC4V,CAAS,EAAG,CAAChiB,CAAE,CAAC,EAC1C,CAACgiB,CAAS,CAAA,EAERK,EAAmBN,EAAgB,IAAI,CAAChpB,EAAQmb,KAC3C,CACH,GAAGnb,EACH,CAAC,KAAKipB,GAAW,EAAGI,EAAkBlO,CAAM,EAAE8N,CAAS,CAAA,EAE9D,EACD,IAAIM,EAAU,EACVC,EAAU,EACd,QAASC,KAAe9pB,EAAU,CAC9B,IAAI+pB,EACAvC,GACImC,EACAjpB,EACAopB,EAAY,IACZ,KAAKR,GACL,EAAA,EACEM,EAAA,KAAK,IAAIA,EAASG,CAAS,EAC3BF,EAAA,KAAK,IAAIA,EAASE,CAAS,CACzC,CACAhmB,EAAI,KAAK,CACL,WAAArD,EACA,MAAO,KAAK,IAAI,EAAImpB,EAASD,CAAO,EACpC,SAAU,CAAC,CAAE,IAAKN,EAAW,GAAAhiB,EAAI,EACjC,IAAKsiB,EACL,IAAKC,EACL,YAAAJ,CAAA,CACH,CAAA,KACE,CACH,IAAIG,EAAU,EACVC,EAAU,EACd,QAASC,KAAe9pB,EAAU,CAC9B,IAAI+pB,EACAvC,GACI6B,EACA3oB,EACAopB,EAAY,IACZR,CACA,EAAA,EACEM,EAAA,KAAK,IAAIA,EAASG,CAAS,EAC3BF,EAAA,KAAK,IAAIA,EAASE,CAAS,CACzC,CACAhmB,EAAI,KAAK,CACL,WAAArD,EACA,MAAO,KAAK,IAAI,EAAImpB,EAASD,CAAO,EACpC,SAAU,CAAC,CAAE,IAAKN,EAAW,GAAAhiB,EAAI,EACjC,IAAKsiB,EACL,IAAKC,EACL,YAAAJ,CAAA,CACH,CACL,CAEJ,CACJ,CACA,OAAA1lB,EAAI,KAAK,CAAC5W,EAAG4c,IAAMA,EAAE,MAAQ5c,EAAE,KAAK,EAC7B4W,CACX,CACO,iBAAiB9Y,EAA+BunB,EAAkB2V,EAAqB,EAAGre,EAAY,EAAG,CAC5G,OAAI0I,EAAO,SAAW,EAAU,KAAK,gBAAgBvnB,EAAMk9B,CAAU,EAC9D,KAAK,OAAOl9B,EAAMunB,EAAQ2V,EAAYre,CAAS,CAC1D,CACO,OAAO7e,EAA+BunB,EAAkB2V,EAAqB,EAAGre,EAAY,EAAG,CAC5F,MAAAkgB,EAAY/+B,IAAS,YAAc,KAAK,OAAO,UAAU,GAAK,KAAK,OAAO,UAAU,GACpFg/B,EAAch/B,IAAS,YAAc,KAAK,OAAO,UAAU,WAAa,KAAK,OAAO,UAAU,SAC9Fi/B,EAAe1X,EAAO,IAAarQ,GACzB8nB,EAAY,QAAQ9nB,CAAK,CAExC,EACKgoB,EAA8D,CAAA,EACpE,QAASC,KAAcF,EACnB,QAASjiC,EAAI,EAAGA,EAAI+hC,EAAUI,CAAU,EAAE,OAAQniC,IAC9C,GAAI,CAACiiC,EAAa,SAASjiC,CAAC,EAAG,CAC3B,MAAMoiC,EAAM,KAAK,IAAIL,EAAUI,CAAU,EAAEniC,CAAC,CAAC,EACvCqiC,EAAWL,EAAYhiC,CAAC,EACxBsiC,EAAK,KAAK,OAAO,OAAO,KAAUhyB,GAAAA,EAAE,MAAQ+xB,CAAQ,EACtDD,GAAOvgB,GACPqgB,EAAU,KAAK,CACX,IAAAE,EACA,MAAOpiC,EACP,KAAKsiC,GAAA,YAAAA,EAAI,SAAS,SAAU,GAAA,CAC/B,CAET,CAIE,OAAAJ,EAAA,KAAK,CAACh9B,EAAG4c,IAAMA,EAAE,IAAMA,EAAE,IAAM5c,EAAE,IAAMA,EAAE,GAAG,EAC/Cg9B,EAAU,MAAM,EAAGhC,CAAU,EAAE,IAAS5vB,GAAA0xB,EAAY1xB,EAAE,KAAK,CAAC,CACvE,CACO,gBAAiBtN,EAA+Bu/B,EAAc,EAAa,CACxE,MAAAR,EAAY/+B,IAAS,YAAc,KAAK,OAAO,UAAU,GAAK,KAAK,OAAO,UAAU,GACpFg/B,EAAch/B,IAAS,YAAc,KAAK,OAAO,UAAU,WAAa,KAAK,OAAO,UAAU,SACpG,IAAIw/B,EAAqDT,EAAU,IAAI,CAAC3nB,EAAKmZ,KAClE,CACH,MAAOyO,EAAYzO,CAAM,EACzB,MAAOnZ,EAAI,OAAO,CAAC6V,EAAO/nB,IAAY+nB,EAAQ,KAAK,IAAI/nB,CAAO,EAAG,CAAC,CAAA,EAEzE,EACD,OAAAs6B,EAAY,KAAK,CAACt9B,EAAG4c,IAAMA,EAAE,MAAQ5c,EAAE,KAAK,EACrCs9B,EAAY,IAASlyB,GAAAA,EAAE,KAAK,EAAE,MAAM,EAAGiyB,CAAG,CACrD,CACO,WAAYE,EAAyB,CACxC,MAAMC,EAAS,KAAK,OACb,OAAAD,EAAO,IAAa3P,GAAA,CACnB,IAAA6P,EACJ,MAAMtC,EAAevN,EAAM,SAAS,IAAI1tB,GAAKA,EAAE,GAAG,EAC5Cw9B,EAAgB9P,EAAM,SAAS,IAAI1tB,GAAKA,EAAE,GAAG,EAC/C0tB,EAAM,OAAS,yBAA2BA,EAAM,OAAS,mBAC9C6P,EAAA,CACP,WAAY,CAAC,GAAG7P,EAAM,SAAU,GAAGA,EAAM,UAAU,EACnD,SAAU8P,EAAc,OAAS,EAAIA,EAAgBvC,EACrD,aAAcvN,EAAM,MACpB,MAAOA,EAAM,MACb,YAAaA,EAAM,WAAA,EAGZ6P,EAAA,CACP,WAAY7P,EAAM,SAAS,OAAS,EAAIA,EAAM,SAAWA,EAAM,WAC/D,SAAU8P,EAAc,OAAS,EAAIA,EAAgBvC,EACrD,aAAcvN,EAAM,MACpB,MAAOA,EAAM,MACb,YAAaA,EAAM,WAAA,EAG3B,MAAM+P,EAAc,CAAC,GAAG/P,EAAM,SAAU,GAAGA,EAAM,QAAQ,EAClD,MAAA,CACH,OAAQ4P,EAAO,cAAcC,CAAQ,EAAE,OACvC,SAAUD,EAAO,KAAK,UAAU,CAAC,GAAG5P,EAAM,WAAY,GAAGA,EAAM,QAAQ,CAAC,EAAE,kBAAkB+P,EAAY,IAAIz9B,GAAKA,EAAE,GAAG,EAAGy9B,EAAY,IAAIz9B,GAAKA,EAAE,EAAE,CAAC,CAAA,CACvJ,CACH,CACL,CACJ,CClZA,MAAM+a,GAAQ,CACV,GAAI,IACR,EAEA,SAAS2iB,GAAa/iC,EAAO,CACzB,KAAM,CAAE,OAAAwqB,EAAQ,WAAAzS,CAAY,EAAG/X,EACzBgjC,EAAK,IAAIrD,GAAc5nB,CAAU,EACvC,OAAAirB,EAAG,UAAUxY,CAAM,EACnBwY,EAAG,YAAW,EACd5iB,GAAM,GAAK4iB,EACJ,EACX,CASA,SAASC,GAAgBjjC,EAAO,CAE5B,KAAM,CAAE,QAAAkjC,EAAU,CAAA,EAAI,aAAAC,CAAY,EAAKnjC,EACjCyZ,EAAaF,GAA6B2pB,EAASC,EAAa,UAAc,EAC9EH,EAAK5iB,GAAM,GACX8f,EAAY8C,EAAG,QAAQvpB,EAAY0pB,EAAa,WAAYA,EAAa,QAAQ,EACjFC,EAAYJ,EAAG,WAAW9C,CAAS,EACnCmD,EAAWL,EAAG,aAAavpB,EAAY0pB,EAAa,WAAYA,EAAa,QAAQ,EACrFG,EAAe,CAAA,EACrB,QAASrjC,EAAI,EAAGA,EAAIojC,EAAS,OAAQpjC,IAC7BojC,EAASpjC,CAAC,IAAM,GAChBqjC,EAAa,KAAK,CACd,GAAGH,EAAa,SAASljC,CAAC,EAC1B,MAAOojC,EAASpjC,CAAC,CACjC,CAAa,EAGT,MAAMuqB,EAASwY,EAAG,OAAO,OACzB,MAAO,CACH,cAAe9C,EACf,UAAAkD,EACA,SAAUE,EACV,uBAAwB9Y,EAAO,IAAI,IAAM,CACrC,IAAK,EAAE,IACP,KAAM,EAAE,YACpB,EAAU,CACV,CACA,CAEA,SAAS+Y,GAAMlyB,EAAG,CACd,KAAM,CAAE,KAAApO,EAAM,KAAAqD,GAAS+K,EAAE,KACzB,IAAI5R,EAAM,GACV,GAAI,CACA,OAAQwD,EAAI,CACR,IAAK,kBACDxD,EAAMwjC,GAAgB38B,CAAI,EAC1B,MACJ,IAAK,cACD7G,EAAMsjC,GAAYz8B,CAAI,EACtB,MACJ,QACI,MAAM,IAAI,MAAM,QAAQrD,qBAAwB,CACvD,CACD,KAAK,YAAYxD,CAAG,CACvB,OAAQwT,EAAP,CACE,QAAQ,IAAIA,CAAK,EACjB,KAAK,YAAY,EAAK,CACzB,CACL,CAEA,KAAK,iBAAiB,UAAWswB,GAAM,EAAK"}
|
|
1
|
+
{"version":3,"file":"explainer.worker-8428eb12.js","sources":["../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/createClass.js","../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/inherits.js","../../../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../../../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../../../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../../../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../../../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../../../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../../../node_modules/@babel/runtime/helpers/esm/toArray.js","../../../node_modules/i18next/dist/esm/i18next.js","../src/utils/index.ts","../../../node_modules/visual-insights/build/esm/utils/common.js","../../../node_modules/visual-insights/build/esm/statistics/correlation.js","../../../node_modules/visual-insights/build/esm/statistics/utils.js","../../../node_modules/visual-insights/build/esm/statistics/linearRegression.js","../../../node_modules/simple-statistics/dist/simple-statistics.mjs","../../../node_modules/visual-insights/build/esm/constant.js","../../../node_modules/visual-insights/build/esm/statistics/aggregators.js","../../../node_modules/visual-insights/build/esm/statistics/aggregation.js","../../../node_modules/visual-insights/build/esm/insights/config.js","../../../node_modules/visual-insights/build/esm/ml/cluster/kruskal.js","../../../node_modules/visual-insights/build/esm/sampling/index.js","../../../node_modules/visual-insights/build/esm/ml/outlier/isolationForest.js","../../../node_modules/visual-insights/build/esm/ml/index.js","../../../node_modules/visual-insights/build/esm/insights/subspaces.js","../../../node_modules/cube-core/built/core/periodCube.js","../../../node_modules/cube-core/built/core/momentCube.js","../../../node_modules/cube-core/built/core/index.js","../../../node_modules/cube-core/built/utils/transform.js","../../../node_modules/cube-core/built/utils/aggregation.js","../../../node_modules/cube-core/built/index.js","../../../node_modules/visual-insights/build/esm/insights/dev.js","../../../node_modules/visual-insights/build/esm/univariateSummary/index.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/fieldSummary.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/dataGraph.js","../../../node_modules/visual-insights/build/esm/cube/cuboid.js","../../../node_modules/visual-insights/build/esm/cube/index.js","../../../node_modules/visual-insights/build/esm/insights/workers/IForestOutlier.js","../../../node_modules/visual-insights/build/esm/insights/workers/LRTrend.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/workerCollection.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/specification/encoding.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/select.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/patterns/general.js","../../../node_modules/visual-insights/build/esm/insights/InsightFlow/engine.js","../../../node_modules/axios/lib/helpers/bind.js","../../../node_modules/axios/lib/utils.js","../../../node_modules/axios/lib/helpers/buildURL.js","../../../node_modules/axios/lib/core/InterceptorManager.js","../../../node_modules/axios/lib/helpers/normalizeHeaderName.js","../../../node_modules/axios/lib/core/enhanceError.js","../../../node_modules/axios/lib/core/createError.js","../../../node_modules/axios/lib/core/settle.js","../../../node_modules/axios/lib/helpers/cookies.js","../../../node_modules/axios/lib/helpers/isAbsoluteURL.js","../../../node_modules/axios/lib/helpers/combineURLs.js","../../../node_modules/axios/lib/core/buildFullPath.js","../../../node_modules/axios/lib/helpers/parseHeaders.js","../../../node_modules/axios/lib/helpers/isURLSameOrigin.js","../../../node_modules/axios/lib/cancel/Cancel.js","../../../node_modules/axios/lib/adapters/xhr.js","../../../node_modules/axios/lib/defaults.js","../../../node_modules/axios/lib/core/transformData.js","../../../node_modules/axios/lib/cancel/isCancel.js","../../../node_modules/axios/lib/core/dispatchRequest.js","../../../node_modules/axios/lib/core/mergeConfig.js","../../../node_modules/axios/lib/env/data.js","../../../node_modules/axios/lib/helpers/validator.js","../../../node_modules/axios/lib/core/Axios.js","../../../node_modules/axios/lib/cancel/CancelToken.js","../../../node_modules/axios/lib/helpers/spread.js","../../../node_modules/axios/lib/helpers/isAxiosError.js","../../../node_modules/axios/lib/axios.js","../../../node_modules/axios/index.js","../../../node_modules/visual-insights/build/esm/index.js","../src/utils/normalization.ts","../src/insights.ts","../src/workers/explainer.worker.js"],"sourcesContent":["export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n}","import _typeof from '@babel/runtime/helpers/esm/typeof';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/esm/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/esm/getPrototypeOf';\nimport _defineProperty from '@babel/runtime/helpers/esm/defineProperty';\nimport _toArray from '@babel/runtime/helpers/esm/toArray';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar consoleLogger = {\n type: 'logger',\n log: function log(args) {\n this.output('log', args);\n },\n warn: function warn(args) {\n this.output('warn', args);\n },\n error: function error(args) {\n this.output('error', args);\n },\n output: function output(type, args) {\n if (console && console[type]) console[type].apply(console, args);\n }\n};\n\nvar Logger = function () {\n function Logger(concreteLogger) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Logger);\n\n this.init(concreteLogger, options);\n }\n\n _createClass(Logger, [{\n key: \"init\",\n value: function init(concreteLogger) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.prefix = options.prefix || 'i18next:';\n this.logger = concreteLogger || consoleLogger;\n this.options = options;\n this.debug = options.debug;\n }\n }, {\n key: \"setDebug\",\n value: function setDebug(bool) {\n this.debug = bool;\n }\n }, {\n key: \"log\",\n value: function log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return this.forward(args, 'log', '', true);\n }\n }, {\n key: \"warn\",\n value: function warn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return this.forward(args, 'warn', '', true);\n }\n }, {\n key: \"error\",\n value: function error() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return this.forward(args, 'error', '');\n }\n }, {\n key: \"deprecate\",\n value: function deprecate() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n }\n }, {\n key: \"forward\",\n value: function forward(args, lvl, prefix, debugOnly) {\n if (debugOnly && !this.debug) return null;\n if (typeof args[0] === 'string') args[0] = \"\".concat(prefix).concat(this.prefix, \" \").concat(args[0]);\n return this.logger[lvl](args);\n }\n }, {\n key: \"create\",\n value: function create(moduleName) {\n return new Logger(this.logger, _objectSpread(_objectSpread({}, {\n prefix: \"\".concat(this.prefix, \":\").concat(moduleName, \":\")\n }), this.options));\n }\n }, {\n key: \"clone\",\n value: function clone(options) {\n options = options || this.options;\n options.prefix = options.prefix || this.prefix;\n return new Logger(this.logger, options);\n }\n }]);\n\n return Logger;\n}();\n\nvar baseLogger = new Logger();\n\nvar EventEmitter = function () {\n function EventEmitter() {\n _classCallCheck(this, EventEmitter);\n\n this.observers = {};\n }\n\n _createClass(EventEmitter, [{\n key: \"on\",\n value: function on(events, listener) {\n var _this = this;\n\n events.split(' ').forEach(function (event) {\n _this.observers[event] = _this.observers[event] || [];\n\n _this.observers[event].push(listener);\n });\n return this;\n }\n }, {\n key: \"off\",\n value: function off(event, listener) {\n if (!this.observers[event]) return;\n\n if (!listener) {\n delete this.observers[event];\n return;\n }\n\n this.observers[event] = this.observers[event].filter(function (l) {\n return l !== listener;\n });\n }\n }, {\n key: \"emit\",\n value: function emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (this.observers[event]) {\n var cloned = [].concat(this.observers[event]);\n cloned.forEach(function (observer) {\n observer.apply(void 0, args);\n });\n }\n\n if (this.observers['*']) {\n var _cloned = [].concat(this.observers['*']);\n\n _cloned.forEach(function (observer) {\n observer.apply(observer, [event].concat(args));\n });\n }\n }\n }]);\n\n return EventEmitter;\n}();\n\nfunction defer() {\n var res;\n var rej;\n var promise = new Promise(function (resolve, reject) {\n res = resolve;\n rej = reject;\n });\n promise.resolve = res;\n promise.reject = rej;\n return promise;\n}\nfunction makeString(object) {\n if (object == null) return '';\n return '' + object;\n}\nfunction copy(a, s, t) {\n a.forEach(function (m) {\n if (s[m]) t[m] = s[m];\n });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n function cleanKey(key) {\n return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n }\n\n function canNotTraverseDeeper() {\n return !object || typeof object === 'string';\n }\n\n var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n\n while (stack.length > 1) {\n if (canNotTraverseDeeper()) return {};\n var key = cleanKey(stack.shift());\n if (!object[key] && Empty) object[key] = new Empty();\n\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n object = object[key];\n } else {\n object = {};\n }\n }\n\n if (canNotTraverseDeeper()) return {};\n return {\n obj: object,\n k: cleanKey(stack.shift())\n };\n}\n\nfunction setPath(object, path, newValue) {\n var _getLastOfPath = getLastOfPath(object, path, Object),\n obj = _getLastOfPath.obj,\n k = _getLastOfPath.k;\n\n obj[k] = newValue;\n}\nfunction pushPath(object, path, newValue, concat) {\n var _getLastOfPath2 = getLastOfPath(object, path, Object),\n obj = _getLastOfPath2.obj,\n k = _getLastOfPath2.k;\n\n obj[k] = obj[k] || [];\n if (concat) obj[k] = obj[k].concat(newValue);\n if (!concat) obj[k].push(newValue);\n}\nfunction getPath(object, path) {\n var _getLastOfPath3 = getLastOfPath(object, path),\n obj = _getLastOfPath3.obj,\n k = _getLastOfPath3.k;\n\n if (!obj) return undefined;\n return obj[k];\n}\nfunction getPathWithDefaults(data, defaultData, key) {\n var value = getPath(data, key);\n\n if (value !== undefined) {\n return value;\n }\n\n return getPath(defaultData, key);\n}\nfunction deepExtend(target, source, overwrite) {\n for (var prop in source) {\n if (prop !== '__proto__' && prop !== 'constructor') {\n if (prop in target) {\n if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n if (overwrite) target[prop] = source[prop];\n } else {\n deepExtend(target[prop], source[prop], overwrite);\n }\n } else {\n target[prop] = source[prop];\n }\n }\n }\n\n return target;\n}\nfunction regexEscape(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\nvar _entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n};\nfunction escape(data) {\n if (typeof data === 'string') {\n return data.replace(/[&<>\"'\\/]/g, function (s) {\n return _entityMap[s];\n });\n }\n\n return data;\n}\nvar isIE10 = typeof window !== 'undefined' && window.navigator && typeof window.navigator.userAgentData === 'undefined' && window.navigator.userAgent && window.navigator.userAgent.indexOf('MSIE') > -1;\nvar chars = [' ', ',', '?', '!', ';'];\nfunction looksLikeObjectPath(key, nsSeparator, keySeparator) {\n nsSeparator = nsSeparator || '';\n keySeparator = keySeparator || '';\n var possibleChars = chars.filter(function (c) {\n return nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0;\n });\n if (possibleChars.length === 0) return true;\n var r = new RegExp(\"(\".concat(possibleChars.map(function (c) {\n return c === '?' ? '\\\\?' : c;\n }).join('|'), \")\"));\n var matched = !r.test(key);\n\n if (!matched) {\n var ki = key.indexOf(keySeparator);\n\n if (ki > 0 && !r.test(key.substring(0, ki))) {\n matched = true;\n }\n }\n\n return matched;\n}\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction deepFind(obj, path) {\n var keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n if (!obj) return undefined;\n if (obj[path]) return obj[path];\n var paths = path.split(keySeparator);\n var current = obj;\n\n for (var i = 0; i < paths.length; ++i) {\n if (!current) return undefined;\n\n if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) {\n return undefined;\n }\n\n if (current[paths[i]] === undefined) {\n var j = 2;\n var p = paths.slice(i, i + j).join(keySeparator);\n var mix = current[p];\n\n while (mix === undefined && paths.length > i + j) {\n j++;\n p = paths.slice(i, i + j).join(keySeparator);\n mix = current[p];\n }\n\n if (mix === undefined) return undefined;\n if (mix === null) return null;\n\n if (path.endsWith(p)) {\n if (typeof mix === 'string') return mix;\n if (p && typeof mix[p] === 'string') return mix[p];\n }\n\n var joinedPath = paths.slice(i + j).join(keySeparator);\n if (joinedPath) return deepFind(mix, joinedPath, keySeparator);\n return undefined;\n }\n\n current = current[paths[i]];\n }\n\n return current;\n}\n\nvar ResourceStore = function (_EventEmitter) {\n _inherits(ResourceStore, _EventEmitter);\n\n var _super = _createSuper(ResourceStore);\n\n function ResourceStore(data) {\n var _this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n ns: ['translation'],\n defaultNS: 'translation'\n };\n\n _classCallCheck(this, ResourceStore);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.data = data || {};\n _this.options = options;\n\n if (_this.options.keySeparator === undefined) {\n _this.options.keySeparator = '.';\n }\n\n if (_this.options.ignoreJSONStructure === undefined) {\n _this.options.ignoreJSONStructure = true;\n }\n\n return _this;\n }\n\n _createClass(ResourceStore, [{\n key: \"addNamespaces\",\n value: function addNamespaces(ns) {\n if (this.options.ns.indexOf(ns) < 0) {\n this.options.ns.push(ns);\n }\n }\n }, {\n key: \"removeNamespaces\",\n value: function removeNamespaces(ns) {\n var index = this.options.ns.indexOf(ns);\n\n if (index > -1) {\n this.options.ns.splice(index, 1);\n }\n }\n }, {\n key: \"getResource\",\n value: function getResource(lng, ns, key) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n var ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n var path = [lng, ns];\n if (key && typeof key !== 'string') path = path.concat(key);\n if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n }\n\n var result = getPath(this.data, path);\n if (result || !ignoreJSONStructure || typeof key !== 'string') return result;\n return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n }\n }, {\n key: \"addResource\",\n value: function addResource(lng, ns, key, value) {\n var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n silent: false\n };\n var keySeparator = this.options.keySeparator;\n if (keySeparator === undefined) keySeparator = '.';\n var path = [lng, ns];\n if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n value = ns;\n ns = path[1];\n }\n\n this.addNamespaces(ns);\n setPath(this.data, path, value);\n if (!options.silent) this.emit('added', lng, ns, key, value);\n }\n }, {\n key: \"addResources\",\n value: function addResources(lng, ns, resources) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n silent: false\n };\n\n for (var m in resources) {\n if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], {\n silent: true\n });\n }\n\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n }, {\n key: \"addResourceBundle\",\n value: function addResourceBundle(lng, ns, resources, deep, overwrite) {\n var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n silent: false\n };\n var path = [lng, ns];\n\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n deep = resources;\n resources = ns;\n ns = path[1];\n }\n\n this.addNamespaces(ns);\n var pack = getPath(this.data, path) || {};\n\n if (deep) {\n deepExtend(pack, resources, overwrite);\n } else {\n pack = _objectSpread$1(_objectSpread$1({}, pack), resources);\n }\n\n setPath(this.data, path, pack);\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n }, {\n key: \"removeResourceBundle\",\n value: function removeResourceBundle(lng, ns) {\n if (this.hasResourceBundle(lng, ns)) {\n delete this.data[lng][ns];\n }\n\n this.removeNamespaces(ns);\n this.emit('removed', lng, ns);\n }\n }, {\n key: \"hasResourceBundle\",\n value: function hasResourceBundle(lng, ns) {\n return this.getResource(lng, ns) !== undefined;\n }\n }, {\n key: \"getResourceBundle\",\n value: function getResourceBundle(lng, ns) {\n if (!ns) ns = this.options.defaultNS;\n if (this.options.compatibilityAPI === 'v1') return _objectSpread$1(_objectSpread$1({}, {}), this.getResource(lng, ns));\n return this.getResource(lng, ns);\n }\n }, {\n key: \"getDataByLanguage\",\n value: function getDataByLanguage(lng) {\n return this.data[lng];\n }\n }, {\n key: \"hasLanguageSomeTranslations\",\n value: function hasLanguageSomeTranslations(lng) {\n var data = this.getDataByLanguage(lng);\n var n = data && Object.keys(data) || [];\n return !!n.find(function (v) {\n return data[v] && Object.keys(data[v]).length > 0;\n });\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return this.data;\n }\n }]);\n\n return ResourceStore;\n}(EventEmitter);\n\nvar postProcessor = {\n processors: {},\n addPostProcessor: function addPostProcessor(module) {\n this.processors[module.name] = module;\n },\n handle: function handle(processors, value, key, options, translator) {\n var _this = this;\n\n processors.forEach(function (processor) {\n if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n });\n return value;\n }\n};\n\nfunction ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$1() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nvar checkedLoadedFor = {};\n\nvar Translator = function (_EventEmitter) {\n _inherits(Translator, _EventEmitter);\n\n var _super = _createSuper$1(Translator);\n\n function Translator(services) {\n var _this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Translator);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, _assertThisInitialized(_this));\n _this.options = options;\n\n if (_this.options.keySeparator === undefined) {\n _this.options.keySeparator = '.';\n }\n\n _this.logger = baseLogger.create('translator');\n return _this;\n }\n\n _createClass(Translator, [{\n key: \"changeLanguage\",\n value: function changeLanguage(lng) {\n if (lng) this.language = lng;\n }\n }, {\n key: \"exists\",\n value: function exists(key) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n\n if (key === undefined || key === null) {\n return false;\n }\n\n var resolved = this.resolve(key, options);\n return resolved && resolved.res !== undefined;\n }\n }, {\n key: \"extractFromKey\",\n value: function extractFromKey(key, options) {\n var nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n if (nsSeparator === undefined) nsSeparator = ':';\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n var namespaces = options.ns || this.options.defaultNS || [];\n var wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n var seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n\n if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n var m = key.match(this.interpolator.nestingRegexp);\n\n if (m && m.length > 0) {\n return {\n key: key,\n namespaces: namespaces\n };\n }\n\n var parts = key.split(nsSeparator);\n if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n key = parts.join(keySeparator);\n }\n\n if (typeof namespaces === 'string') namespaces = [namespaces];\n return {\n key: key,\n namespaces: namespaces\n };\n }\n }, {\n key: \"translate\",\n value: function translate(keys, options, lastKey) {\n var _this2 = this;\n\n if (_typeof(options) !== 'object' && this.options.overloadTranslationOptionHandler) {\n options = this.options.overloadTranslationOptionHandler(arguments);\n }\n\n if (!options) options = {};\n if (keys === undefined || keys === null) return '';\n if (!Array.isArray(keys)) keys = [String(keys)];\n var returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n var keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n\n var _this$extractFromKey = this.extractFromKey(keys[keys.length - 1], options),\n key = _this$extractFromKey.key,\n namespaces = _this$extractFromKey.namespaces;\n\n var namespace = namespaces[namespaces.length - 1];\n var lng = options.lng || this.language;\n var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n\n if (lng && lng.toLowerCase() === 'cimode') {\n if (appendNamespaceToCIMode) {\n var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n\n if (returnDetails) {\n resolved.res = \"\".concat(namespace).concat(nsSeparator).concat(key);\n return resolved;\n }\n\n return \"\".concat(namespace).concat(nsSeparator).concat(key);\n }\n\n if (returnDetails) {\n resolved.res = key;\n return resolved;\n }\n\n return key;\n }\n\n var resolved = this.resolve(keys, options);\n var res = resolved && resolved.res;\n var resUsedKey = resolved && resolved.usedKey || key;\n var resExactUsedKey = resolved && resolved.exactUsedKey || key;\n var resType = Object.prototype.toString.apply(res);\n var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n var handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n var handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number';\n\n if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) {\n if (!options.returnObjects && !this.options.returnObjects) {\n if (!this.options.returnedObjectHandler) {\n this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n }\n\n var r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, _objectSpread$2(_objectSpread$2({}, options), {}, {\n ns: namespaces\n })) : \"key '\".concat(key, \" (\").concat(this.language, \")' returned an object instead of string.\");\n\n if (returnDetails) {\n resolved.res = r;\n return resolved;\n }\n\n return r;\n }\n\n if (keySeparator) {\n var resTypeIsArray = resType === '[object Array]';\n var copy = resTypeIsArray ? [] : {};\n var newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n\n for (var m in res) {\n if (Object.prototype.hasOwnProperty.call(res, m)) {\n var deepKey = \"\".concat(newKeyToUse).concat(keySeparator).concat(m);\n copy[m] = this.translate(deepKey, _objectSpread$2(_objectSpread$2({}, options), {\n joinArrays: false,\n ns: namespaces\n }));\n if (copy[m] === deepKey) copy[m] = res[m];\n }\n }\n\n res = copy;\n }\n } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') {\n res = res.join(joinArrays);\n if (res) res = this.extendTranslation(res, keys, options, lastKey);\n } else {\n var usedDefault = false;\n var usedKey = false;\n var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n var hasDefaultValue = Translator.hasDefaultValue(options);\n var defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n var defaultValue = options[\"defaultValue\".concat(defaultValueSuffix)] || options.defaultValue;\n\n if (!this.isValidLookup(res) && hasDefaultValue) {\n usedDefault = true;\n res = defaultValue;\n }\n\n if (!this.isValidLookup(res)) {\n usedKey = true;\n res = key;\n }\n\n var missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n var resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n var updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n\n if (usedKey || usedDefault || updateMissing) {\n this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n\n if (keySeparator) {\n var fk = this.resolve(key, _objectSpread$2(_objectSpread$2({}, options), {}, {\n keySeparator: false\n }));\n if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n }\n\n var lngs = [];\n var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n\n if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n for (var i = 0; i < fallbackLngs.length; i++) {\n lngs.push(fallbackLngs[i]);\n }\n } else if (this.options.saveMissingTo === 'all') {\n lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n } else {\n lngs.push(options.lng || this.language);\n }\n\n var send = function send(l, k, specificDefaultValue) {\n var defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n\n if (_this2.options.missingKeyHandler) {\n _this2.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n } else if (_this2.backendConnector && _this2.backendConnector.saveMissing) {\n _this2.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n }\n\n _this2.emit('missingKey', l, namespace, k, res);\n };\n\n if (this.options.saveMissing) {\n if (this.options.saveMissingPlurals && needsPluralHandling) {\n lngs.forEach(function (language) {\n _this2.pluralResolver.getSuffixes(language, options).forEach(function (suffix) {\n send([language], key + suffix, options[\"defaultValue\".concat(suffix)] || defaultValue);\n });\n });\n } else {\n send(lngs, key, defaultValue);\n }\n }\n }\n\n res = this.extendTranslation(res, keys, options, resolved, lastKey);\n if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = \"\".concat(namespace, \":\").concat(key);\n\n if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n if (this.options.compatibilityAPI !== 'v1') {\n res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? \"\".concat(namespace, \":\").concat(key) : key, usedDefault ? res : undefined);\n } else {\n res = this.options.parseMissingKeyHandler(res);\n }\n }\n }\n\n if (returnDetails) {\n resolved.res = res;\n return resolved;\n }\n\n return res;\n }\n }, {\n key: \"extendTranslation\",\n value: function extendTranslation(res, key, options, resolved, lastKey) {\n var _this3 = this;\n\n if (this.i18nFormat && this.i18nFormat.parse) {\n res = this.i18nFormat.parse(res, _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), options), resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n resolved: resolved\n });\n } else if (!options.skipInterpolation) {\n if (options.interpolation) this.interpolator.init(_objectSpread$2(_objectSpread$2({}, options), {\n interpolation: _objectSpread$2(_objectSpread$2({}, this.options.interpolation), options.interpolation)\n }));\n var skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n var nestBef;\n\n if (skipOnVariables) {\n var nb = res.match(this.interpolator.nestingRegexp);\n nestBef = nb && nb.length;\n }\n\n var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n if (this.options.interpolation.defaultVariables) data = _objectSpread$2(_objectSpread$2({}, this.options.interpolation.defaultVariables), data);\n res = this.interpolator.interpolate(res, data, options.lng || this.language, options);\n\n if (skipOnVariables) {\n var na = res.match(this.interpolator.nestingRegexp);\n var nestAft = na && na.length;\n if (nestBef < nestAft) options.nest = false;\n }\n\n if (options.nest !== false) res = this.interpolator.nest(res, function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (lastKey && lastKey[0] === args[0] && !options.context) {\n _this3.logger.warn(\"It seems you are nesting recursively key: \".concat(args[0], \" in key: \").concat(key[0]));\n\n return null;\n }\n\n return _this3.translate.apply(_this3, args.concat([key]));\n }, options);\n if (options.interpolation) this.interpolator.reset();\n }\n\n var postProcess = options.postProcess || this.options.postProcess;\n var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? _objectSpread$2({\n i18nResolved: resolved\n }, options) : options, this);\n }\n\n return res;\n }\n }, {\n key: \"resolve\",\n value: function resolve(keys) {\n var _this4 = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var found;\n var usedKey;\n var exactUsedKey;\n var usedLng;\n var usedNS;\n if (typeof keys === 'string') keys = [keys];\n keys.forEach(function (k) {\n if (_this4.isValidLookup(found)) return;\n\n var extracted = _this4.extractFromKey(k, options);\n\n var key = extracted.key;\n usedKey = key;\n var namespaces = extracted.namespaces;\n if (_this4.options.fallbackNS) namespaces = namespaces.concat(_this4.options.fallbackNS);\n var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n\n var needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && _this4.pluralResolver.shouldUseIntlApi();\n\n var needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== '';\n var codes = options.lngs ? options.lngs : _this4.languageUtils.toResolveHierarchy(options.lng || _this4.language, options.fallbackLng);\n namespaces.forEach(function (ns) {\n if (_this4.isValidLookup(found)) return;\n usedNS = ns;\n\n if (!checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] && _this4.utils && _this4.utils.hasLoadedNamespace && !_this4.utils.hasLoadedNamespace(usedNS)) {\n checkedLoadedFor[\"\".concat(codes[0], \"-\").concat(ns)] = true;\n\n _this4.logger.warn(\"key \\\"\".concat(usedKey, \"\\\" for languages \\\"\").concat(codes.join(', '), \"\\\" won't get resolved as namespace \\\"\").concat(usedNS, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n }\n\n codes.forEach(function (code) {\n if (_this4.isValidLookup(found)) return;\n usedLng = code;\n var finalKeys = [key];\n\n if (_this4.i18nFormat && _this4.i18nFormat.addLookupKeys) {\n _this4.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n } else {\n var pluralSuffix;\n if (needsPluralHandling) pluralSuffix = _this4.pluralResolver.getSuffix(code, options.count, options);\n var zeroSuffix = \"\".concat(_this4.options.pluralSeparator, \"zero\");\n\n if (needsPluralHandling) {\n finalKeys.push(key + pluralSuffix);\n\n if (needsZeroSuffixLookup) {\n finalKeys.push(key + zeroSuffix);\n }\n }\n\n if (needsContextHandling) {\n var contextKey = \"\".concat(key).concat(_this4.options.contextSeparator).concat(options.context);\n finalKeys.push(contextKey);\n\n if (needsPluralHandling) {\n finalKeys.push(contextKey + pluralSuffix);\n\n if (needsZeroSuffixLookup) {\n finalKeys.push(contextKey + zeroSuffix);\n }\n }\n }\n }\n\n var possibleKey;\n\n while (possibleKey = finalKeys.pop()) {\n if (!_this4.isValidLookup(found)) {\n exactUsedKey = possibleKey;\n found = _this4.getResource(code, ns, possibleKey, options);\n }\n }\n });\n });\n });\n return {\n res: found,\n usedKey: usedKey,\n exactUsedKey: exactUsedKey,\n usedLng: usedLng,\n usedNS: usedNS\n };\n }\n }, {\n key: \"isValidLookup\",\n value: function isValidLookup(res) {\n return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n }\n }, {\n key: \"getResource\",\n value: function getResource(code, ns, key) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n return this.resourceStore.getResource(code, ns, key, options);\n }\n }], [{\n key: \"hasDefaultValue\",\n value: function hasDefaultValue(options) {\n var prefix = 'defaultValue';\n\n for (var option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n return true;\n }\n }\n\n return false;\n }\n }]);\n\n return Translator;\n}(EventEmitter);\n\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n function LanguageUtil(options) {\n _classCallCheck(this, LanguageUtil);\n\n this.options = options;\n this.supportedLngs = this.options.supportedLngs || false;\n this.logger = baseLogger.create('languageUtils');\n }\n\n _createClass(LanguageUtil, [{\n key: \"getScriptPartFromCode\",\n value: function getScriptPartFromCode(code) {\n if (!code || code.indexOf('-') < 0) return null;\n var p = code.split('-');\n if (p.length === 2) return null;\n p.pop();\n if (p[p.length - 1].toLowerCase() === 'x') return null;\n return this.formatLanguageCode(p.join('-'));\n }\n }, {\n key: \"getLanguagePartFromCode\",\n value: function getLanguagePartFromCode(code) {\n if (!code || code.indexOf('-') < 0) return code;\n var p = code.split('-');\n return this.formatLanguageCode(p[0]);\n }\n }, {\n key: \"formatLanguageCode\",\n value: function formatLanguageCode(code) {\n if (typeof code === 'string' && code.indexOf('-') > -1) {\n var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n var p = code.split('-');\n\n if (this.options.lowerCaseLng) {\n p = p.map(function (part) {\n return part.toLowerCase();\n });\n } else if (p.length === 2) {\n p[0] = p[0].toLowerCase();\n p[1] = p[1].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n } else if (p.length === 3) {\n p[0] = p[0].toLowerCase();\n if (p[1].length === 2) p[1] = p[1].toUpperCase();\n if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n }\n\n return p.join('-');\n }\n\n return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n }\n }, {\n key: \"isSupportedCode\",\n value: function isSupportedCode(code) {\n if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n code = this.getLanguagePartFromCode(code);\n }\n\n return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n }\n }, {\n key: \"getBestMatchFromCodes\",\n value: function getBestMatchFromCodes(codes) {\n var _this = this;\n\n if (!codes) return null;\n var found;\n codes.forEach(function (code) {\n if (found) return;\n\n var cleanedLng = _this.formatLanguageCode(code);\n\n if (!_this.options.supportedLngs || _this.isSupportedCode(cleanedLng)) found = cleanedLng;\n });\n\n if (!found && this.options.supportedLngs) {\n codes.forEach(function (code) {\n if (found) return;\n\n var lngOnly = _this.getLanguagePartFromCode(code);\n\n if (_this.isSupportedCode(lngOnly)) return found = lngOnly;\n found = _this.options.supportedLngs.find(function (supportedLng) {\n if (supportedLng.indexOf(lngOnly) === 0) return supportedLng;\n });\n });\n }\n\n if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n return found;\n }\n }, {\n key: \"getFallbackCodes\",\n value: function getFallbackCodes(fallbacks, code) {\n if (!fallbacks) return [];\n if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n if (typeof fallbacks === 'string') fallbacks = [fallbacks];\n if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks;\n if (!code) return fallbacks[\"default\"] || [];\n var found = fallbacks[code];\n if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n if (!found) found = fallbacks[this.formatLanguageCode(code)];\n if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n if (!found) found = fallbacks[\"default\"];\n return found || [];\n }\n }, {\n key: \"toResolveHierarchy\",\n value: function toResolveHierarchy(code, fallbackCode) {\n var _this2 = this;\n\n var fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n var codes = [];\n\n var addCode = function addCode(c) {\n if (!c) return;\n\n if (_this2.isSupportedCode(c)) {\n codes.push(c);\n } else {\n _this2.logger.warn(\"rejecting language code not found in supportedLngs: \".concat(c));\n }\n };\n\n if (typeof code === 'string' && code.indexOf('-') > -1) {\n if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n } else if (typeof code === 'string') {\n addCode(this.formatLanguageCode(code));\n }\n\n fallbackCodes.forEach(function (fc) {\n if (codes.indexOf(fc) < 0) addCode(_this2.formatLanguageCode(fc));\n });\n return codes;\n }\n }]);\n\n return LanguageUtil;\n}();\n\nvar sets = [{\n lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n nr: [1, 2],\n fc: 1\n}, {\n lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n nr: [1, 2],\n fc: 2\n}, {\n lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n nr: [1],\n fc: 3\n}, {\n lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n nr: [1, 2, 5],\n fc: 4\n}, {\n lngs: ['ar'],\n nr: [0, 1, 2, 3, 11, 100],\n fc: 5\n}, {\n lngs: ['cs', 'sk'],\n nr: [1, 2, 5],\n fc: 6\n}, {\n lngs: ['csb', 'pl'],\n nr: [1, 2, 5],\n fc: 7\n}, {\n lngs: ['cy'],\n nr: [1, 2, 3, 8],\n fc: 8\n}, {\n lngs: ['fr'],\n nr: [1, 2],\n fc: 9\n}, {\n lngs: ['ga'],\n nr: [1, 2, 3, 7, 11],\n fc: 10\n}, {\n lngs: ['gd'],\n nr: [1, 2, 3, 20],\n fc: 11\n}, {\n lngs: ['is'],\n nr: [1, 2],\n fc: 12\n}, {\n lngs: ['jv'],\n nr: [0, 1],\n fc: 13\n}, {\n lngs: ['kw'],\n nr: [1, 2, 3, 4],\n fc: 14\n}, {\n lngs: ['lt'],\n nr: [1, 2, 10],\n fc: 15\n}, {\n lngs: ['lv'],\n nr: [1, 2, 0],\n fc: 16\n}, {\n lngs: ['mk'],\n nr: [1, 2],\n fc: 17\n}, {\n lngs: ['mnk'],\n nr: [0, 1, 2],\n fc: 18\n}, {\n lngs: ['mt'],\n nr: [1, 2, 11, 20],\n fc: 19\n}, {\n lngs: ['or'],\n nr: [2, 1],\n fc: 2\n}, {\n lngs: ['ro'],\n nr: [1, 2, 20],\n fc: 20\n}, {\n lngs: ['sl'],\n nr: [5, 1, 2, 3],\n fc: 21\n}, {\n lngs: ['he', 'iw'],\n nr: [1, 2, 20, 21],\n fc: 22\n}];\nvar _rulesPluralsTypes = {\n 1: function _(n) {\n return Number(n > 1);\n },\n 2: function _(n) {\n return Number(n != 1);\n },\n 3: function _(n) {\n return 0;\n },\n 4: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 5: function _(n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n },\n 6: function _(n) {\n return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n },\n 7: function _(n) {\n return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 8: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n },\n 9: function _(n) {\n return Number(n >= 2);\n },\n 10: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n },\n 11: function _(n) {\n return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n },\n 12: function _(n) {\n return Number(n % 10 != 1 || n % 100 == 11);\n },\n 13: function _(n) {\n return Number(n !== 0);\n },\n 14: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n },\n 15: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n },\n 16: function _(n) {\n return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n },\n 17: function _(n) {\n return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1);\n },\n 18: function _(n) {\n return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n },\n 19: function _(n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n },\n 20: function _(n) {\n return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n },\n 21: function _(n) {\n return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n },\n 22: function _(n) {\n return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);\n }\n};\nvar deprecatedJsonVersions = ['v1', 'v2', 'v3'];\nvar suffixesOrder = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 4,\n other: 5\n};\n\nfunction createRules() {\n var rules = {};\n sets.forEach(function (set) {\n set.lngs.forEach(function (l) {\n rules[l] = {\n numbers: set.nr,\n plurals: _rulesPluralsTypes[set.fc]\n };\n });\n });\n return rules;\n}\n\nvar PluralResolver = function () {\n function PluralResolver(languageUtils) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, PluralResolver);\n\n this.languageUtils = languageUtils;\n this.options = options;\n this.logger = baseLogger.create('pluralResolver');\n\n if ((!this.options.compatibilityJSON || this.options.compatibilityJSON === 'v4') && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n this.options.compatibilityJSON = 'v3';\n this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n }\n\n this.rules = createRules();\n }\n\n _createClass(PluralResolver, [{\n key: \"addRule\",\n value: function addRule(lng, obj) {\n this.rules[lng] = obj;\n }\n }, {\n key: \"getRule\",\n value: function getRule(code) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (this.shouldUseIntlApi()) {\n try {\n return new Intl.PluralRules(code, {\n type: options.ordinal ? 'ordinal' : 'cardinal'\n });\n } catch (_unused) {\n return;\n }\n }\n\n return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n }\n }, {\n key: \"needsPlural\",\n value: function needsPlural(code) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var rule = this.getRule(code, options);\n\n if (this.shouldUseIntlApi()) {\n return rule && rule.resolvedOptions().pluralCategories.length > 1;\n }\n\n return rule && rule.numbers.length > 1;\n }\n }, {\n key: \"getPluralFormsOfKey\",\n value: function getPluralFormsOfKey(code, key) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return this.getSuffixes(code, options).map(function (suffix) {\n return \"\".concat(key).concat(suffix);\n });\n }\n }, {\n key: \"getSuffixes\",\n value: function getSuffixes(code) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var rule = this.getRule(code, options);\n\n if (!rule) {\n return [];\n }\n\n if (this.shouldUseIntlApi()) {\n return rule.resolvedOptions().pluralCategories.sort(function (pluralCategory1, pluralCategory2) {\n return suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2];\n }).map(function (pluralCategory) {\n return \"\".concat(_this.options.prepend).concat(pluralCategory);\n });\n }\n\n return rule.numbers.map(function (number) {\n return _this.getSuffix(code, number, options);\n });\n }\n }, {\n key: \"getSuffix\",\n value: function getSuffix(code, count) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var rule = this.getRule(code, options);\n\n if (rule) {\n if (this.shouldUseIntlApi()) {\n return \"\".concat(this.options.prepend).concat(rule.select(count));\n }\n\n return this.getSuffixRetroCompatible(rule, count);\n }\n\n this.logger.warn(\"no plural rule found for: \".concat(code));\n return '';\n }\n }, {\n key: \"getSuffixRetroCompatible\",\n value: function getSuffixRetroCompatible(rule, count) {\n var _this2 = this;\n\n var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n var suffix = rule.numbers[idx];\n\n if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n if (suffix === 2) {\n suffix = 'plural';\n } else if (suffix === 1) {\n suffix = '';\n }\n }\n\n var returnSuffix = function returnSuffix() {\n return _this2.options.prepend && suffix.toString() ? _this2.options.prepend + suffix.toString() : suffix.toString();\n };\n\n if (this.options.compatibilityJSON === 'v1') {\n if (suffix === 1) return '';\n if (typeof suffix === 'number') return \"_plural_\".concat(suffix.toString());\n return returnSuffix();\n } else if (this.options.compatibilityJSON === 'v2') {\n return returnSuffix();\n } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n return returnSuffix();\n }\n\n return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n }\n }, {\n key: \"shouldUseIntlApi\",\n value: function shouldUseIntlApi() {\n return !deprecatedJsonVersions.includes(this.options.compatibilityJSON);\n }\n }]);\n\n return PluralResolver;\n}();\n\nfunction ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar Interpolator = function () {\n function Interpolator() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Interpolator);\n\n this.logger = baseLogger.create('interpolator');\n this.options = options;\n\n this.format = options.interpolation && options.interpolation.format || function (value) {\n return value;\n };\n\n this.init(options);\n }\n\n _createClass(Interpolator, [{\n key: \"init\",\n value: function init() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!options.interpolation) options.interpolation = {\n escapeValue: true\n };\n var iOpts = options.interpolation;\n this.escape = iOpts.escape !== undefined ? iOpts.escape : escape;\n this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true;\n this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false;\n this.prefix = iOpts.prefix ? regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n this.suffix = iOpts.suffix ? regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n this.nestingPrefix = iOpts.nestingPrefix ? regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape('$t(');\n this.nestingSuffix = iOpts.nestingSuffix ? regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape(')');\n this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ',';\n this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000;\n this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false;\n this.resetRegExp();\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (this.options) this.init(this.options);\n }\n }, {\n key: \"resetRegExp\",\n value: function resetRegExp() {\n var regexpStr = \"\".concat(this.prefix, \"(.+?)\").concat(this.suffix);\n this.regexp = new RegExp(regexpStr, 'g');\n var regexpUnescapeStr = \"\".concat(this.prefix).concat(this.unescapePrefix, \"(.+?)\").concat(this.unescapeSuffix).concat(this.suffix);\n this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n var nestingRegexpStr = \"\".concat(this.nestingPrefix, \"(.+?)\").concat(this.nestingSuffix);\n this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n }\n }, {\n key: \"interpolate\",\n value: function interpolate(str, data, lng, options) {\n var _this = this;\n\n var match;\n var value;\n var replaces;\n var defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n\n function regexSafe(val) {\n return val.replace(/\\$/g, '$$$$');\n }\n\n var handleFormat = function handleFormat(key) {\n if (key.indexOf(_this.formatSeparator) < 0) {\n var path = getPathWithDefaults(data, defaultData, key);\n return _this.alwaysFormat ? _this.format(path, undefined, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n interpolationkey: key\n })) : path;\n }\n\n var p = key.split(_this.formatSeparator);\n var k = p.shift().trim();\n var f = p.join(_this.formatSeparator).trim();\n return _this.format(getPathWithDefaults(data, defaultData, k), f, lng, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, options), data), {}, {\n interpolationkey: k\n }));\n };\n\n this.resetRegExp();\n var missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n var skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n var todos = [{\n regex: this.regexpUnescape,\n safeValue: function safeValue(val) {\n return regexSafe(val);\n }\n }, {\n regex: this.regexp,\n safeValue: function safeValue(val) {\n return _this.escapeValue ? regexSafe(_this.escape(val)) : regexSafe(val);\n }\n }];\n todos.forEach(function (todo) {\n replaces = 0;\n\n while (match = todo.regex.exec(str)) {\n var matchedVar = match[1].trim();\n value = handleFormat(matchedVar);\n\n if (value === undefined) {\n if (typeof missingInterpolationHandler === 'function') {\n var temp = missingInterpolationHandler(str, match, options);\n value = typeof temp === 'string' ? temp : '';\n } else if (options && options.hasOwnProperty(matchedVar)) {\n value = '';\n } else if (skipOnVariables) {\n value = match[0];\n continue;\n } else {\n _this.logger.warn(\"missed to pass in variable \".concat(matchedVar, \" for interpolating \").concat(str));\n\n value = '';\n }\n } else if (typeof value !== 'string' && !_this.useRawValueToEscape) {\n value = makeString(value);\n }\n\n var safeValue = todo.safeValue(value);\n str = str.replace(match[0], safeValue);\n\n if (skipOnVariables) {\n todo.regex.lastIndex += value.length;\n todo.regex.lastIndex -= match[0].length;\n } else {\n todo.regex.lastIndex = 0;\n }\n\n replaces++;\n\n if (replaces >= _this.maxReplaces) {\n break;\n }\n }\n });\n return str;\n }\n }, {\n key: \"nest\",\n value: function nest(str, fc) {\n var _this2 = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var match;\n var value;\n\n var clonedOptions = _objectSpread$3({}, options);\n\n clonedOptions.applyPostProcessor = false;\n delete clonedOptions.defaultValue;\n\n function handleHasOptions(key, inheritedOptions) {\n var sep = this.nestingOptionsSeparator;\n if (key.indexOf(sep) < 0) return key;\n var c = key.split(new RegExp(\"\".concat(sep, \"[ ]*{\")));\n var optionsString = \"{\".concat(c[1]);\n key = c[0];\n optionsString = this.interpolate(optionsString, clonedOptions);\n var matchedSingleQuotes = optionsString.match(/'/g);\n var matchedDoubleQuotes = optionsString.match(/\"/g);\n\n if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n optionsString = optionsString.replace(/'/g, '\"');\n }\n\n try {\n clonedOptions = JSON.parse(optionsString);\n if (inheritedOptions) clonedOptions = _objectSpread$3(_objectSpread$3({}, inheritedOptions), clonedOptions);\n } catch (e) {\n this.logger.warn(\"failed parsing options string in nesting for key \".concat(key), e);\n return \"\".concat(key).concat(sep).concat(optionsString);\n }\n\n delete clonedOptions.defaultValue;\n return key;\n }\n\n while (match = this.nestingRegexp.exec(str)) {\n var formatters = [];\n var doReduce = false;\n\n if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n var r = match[1].split(this.formatSeparator).map(function (elem) {\n return elem.trim();\n });\n match[1] = r.shift();\n formatters = r;\n doReduce = true;\n }\n\n value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n if (value && match[0] === str && typeof value !== 'string') return value;\n if (typeof value !== 'string') value = makeString(value);\n\n if (!value) {\n this.logger.warn(\"missed to resolve \".concat(match[1], \" for nesting \").concat(str));\n value = '';\n }\n\n if (doReduce) {\n value = formatters.reduce(function (v, f) {\n return _this2.format(v, f, options.lng, _objectSpread$3(_objectSpread$3({}, options), {}, {\n interpolationkey: match[1].trim()\n }));\n }, value.trim());\n }\n\n str = str.replace(match[0], value);\n this.regexp.lastIndex = 0;\n }\n\n return str;\n }\n }]);\n\n return Interpolator;\n}();\n\nfunction ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction parseFormatStr(formatStr) {\n var formatName = formatStr.toLowerCase().trim();\n var formatOptions = {};\n\n if (formatStr.indexOf('(') > -1) {\n var p = formatStr.split('(');\n formatName = p[0].toLowerCase().trim();\n var optStr = p[1].substring(0, p[1].length - 1);\n\n if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n if (!formatOptions.range) formatOptions.range = optStr.trim();\n } else {\n var opts = optStr.split(';');\n opts.forEach(function (opt) {\n if (!opt) return;\n\n var _opt$split = opt.split(':'),\n _opt$split2 = _toArray(_opt$split),\n key = _opt$split2[0],\n rest = _opt$split2.slice(1);\n\n var val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val;\n if (val === 'false') formatOptions[key.trim()] = false;\n if (val === 'true') formatOptions[key.trim()] = true;\n if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10);\n });\n }\n }\n\n return {\n formatName: formatName,\n formatOptions: formatOptions\n };\n}\n\nfunction createCachedFormatter(fn) {\n var cache = {};\n return function invokeFormatter(val, lng, options) {\n var key = lng + JSON.stringify(options);\n var formatter = cache[key];\n\n if (!formatter) {\n formatter = fn(lng, options);\n cache[key] = formatter;\n }\n\n return formatter(val);\n };\n}\n\nvar Formatter = function () {\n function Formatter() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Formatter);\n\n this.logger = baseLogger.create('formatter');\n this.options = options;\n this.formats = {\n number: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.NumberFormat(lng, options);\n return function (val) {\n return formatter.format(val);\n };\n }),\n currency: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.NumberFormat(lng, _objectSpread$4(_objectSpread$4({}, options), {}, {\n style: 'currency'\n }));\n return function (val) {\n return formatter.format(val);\n };\n }),\n datetime: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.DateTimeFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val);\n };\n }),\n relativetime: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.RelativeTimeFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val, options.range || 'day');\n };\n }),\n list: createCachedFormatter(function (lng, options) {\n var formatter = new Intl.ListFormat(lng, _objectSpread$4({}, options));\n return function (val) {\n return formatter.format(val);\n };\n })\n };\n this.init(options);\n }\n\n _createClass(Formatter, [{\n key: \"init\",\n value: function init(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n var iOpts = options.interpolation;\n this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ',';\n }\n }, {\n key: \"add\",\n value: function add(name, fc) {\n this.formats[name.toLowerCase().trim()] = fc;\n }\n }, {\n key: \"addCached\",\n value: function addCached(name, fc) {\n this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n }\n }, {\n key: \"format\",\n value: function format(value, _format, lng, options) {\n var _this = this;\n\n var formats = _format.split(this.formatSeparator);\n\n var result = formats.reduce(function (mem, f) {\n var _parseFormatStr = parseFormatStr(f),\n formatName = _parseFormatStr.formatName,\n formatOptions = _parseFormatStr.formatOptions;\n\n if (_this.formats[formatName]) {\n var formatted = mem;\n\n try {\n var valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n var l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n formatted = _this.formats[formatName](mem, l, _objectSpread$4(_objectSpread$4(_objectSpread$4({}, formatOptions), options), valOptions));\n } catch (error) {\n _this.logger.warn(error);\n }\n\n return formatted;\n } else {\n _this.logger.warn(\"there was no format function for \".concat(formatName));\n }\n\n return mem;\n }, value);\n return result;\n }\n }]);\n\n return Formatter;\n}();\n\nfunction ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$2() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction removePending(q, name) {\n if (q.pending[name] !== undefined) {\n delete q.pending[name];\n q.pendingCount--;\n }\n}\n\nvar Connector = function (_EventEmitter) {\n _inherits(Connector, _EventEmitter);\n\n var _super = _createSuper$2(Connector);\n\n function Connector(backend, store, services) {\n var _this;\n\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n _classCallCheck(this, Connector);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.backend = backend;\n _this.store = store;\n _this.services = services;\n _this.languageUtils = services.languageUtils;\n _this.options = options;\n _this.logger = baseLogger.create('backendConnector');\n _this.waitingReads = [];\n _this.maxParallelReads = options.maxParallelReads || 10;\n _this.readingCalls = 0;\n _this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n _this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n _this.state = {};\n _this.queue = [];\n\n if (_this.backend && _this.backend.init) {\n _this.backend.init(services, options.backend, options);\n }\n\n return _this;\n }\n\n _createClass(Connector, [{\n key: \"queueLoad\",\n value: function queueLoad(languages, namespaces, options, callback) {\n var _this2 = this;\n\n var toLoad = {};\n var pending = {};\n var toLoadLanguages = {};\n var toLoadNamespaces = {};\n languages.forEach(function (lng) {\n var hasAllNamespaces = true;\n namespaces.forEach(function (ns) {\n var name = \"\".concat(lng, \"|\").concat(ns);\n\n if (!options.reload && _this2.store.hasResourceBundle(lng, ns)) {\n _this2.state[name] = 2;\n } else if (_this2.state[name] < 0) ; else if (_this2.state[name] === 1) {\n if (pending[name] === undefined) pending[name] = true;\n } else {\n _this2.state[name] = 1;\n hasAllNamespaces = false;\n if (pending[name] === undefined) pending[name] = true;\n if (toLoad[name] === undefined) toLoad[name] = true;\n if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n }\n });\n if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n });\n\n if (Object.keys(toLoad).length || Object.keys(pending).length) {\n this.queue.push({\n pending: pending,\n pendingCount: Object.keys(pending).length,\n loaded: {},\n errors: [],\n callback: callback\n });\n }\n\n return {\n toLoad: Object.keys(toLoad),\n pending: Object.keys(pending),\n toLoadLanguages: Object.keys(toLoadLanguages),\n toLoadNamespaces: Object.keys(toLoadNamespaces)\n };\n }\n }, {\n key: \"loaded\",\n value: function loaded(name, err, data) {\n var s = name.split('|');\n var lng = s[0];\n var ns = s[1];\n if (err) this.emit('failedLoading', lng, ns, err);\n\n if (data) {\n this.store.addResourceBundle(lng, ns, data);\n }\n\n this.state[name] = err ? -1 : 2;\n var loaded = {};\n this.queue.forEach(function (q) {\n pushPath(q.loaded, [lng], ns);\n removePending(q, name);\n if (err) q.errors.push(err);\n\n if (q.pendingCount === 0 && !q.done) {\n Object.keys(q.loaded).forEach(function (l) {\n if (!loaded[l]) loaded[l] = {};\n var loadedKeys = q.loaded[l];\n\n if (loadedKeys.length) {\n loadedKeys.forEach(function (ns) {\n if (loaded[l][ns] === undefined) loaded[l][ns] = true;\n });\n }\n });\n q.done = true;\n\n if (q.errors.length) {\n q.callback(q.errors);\n } else {\n q.callback();\n }\n }\n });\n this.emit('loaded', loaded);\n this.queue = this.queue.filter(function (q) {\n return !q.done;\n });\n }\n }, {\n key: \"read\",\n value: function read(lng, ns, fcName) {\n var _this3 = this;\n\n var tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n var callback = arguments.length > 5 ? arguments[5] : undefined;\n if (!lng.length) return callback(null, {});\n\n if (this.readingCalls >= this.maxParallelReads) {\n this.waitingReads.push({\n lng: lng,\n ns: ns,\n fcName: fcName,\n tried: tried,\n wait: wait,\n callback: callback\n });\n return;\n }\n\n this.readingCalls++;\n return this.backend[fcName](lng, ns, function (err, data) {\n _this3.readingCalls--;\n\n if (_this3.waitingReads.length > 0) {\n var next = _this3.waitingReads.shift();\n\n _this3.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n }\n\n if (err && data && tried < _this3.maxRetries) {\n setTimeout(function () {\n _this3.read.call(_this3, lng, ns, fcName, tried + 1, wait * 2, callback);\n }, wait);\n return;\n }\n\n callback(err, data);\n });\n }\n }, {\n key: \"prepareLoading\",\n value: function prepareLoading(languages, namespaces) {\n var _this4 = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = arguments.length > 3 ? arguments[3] : undefined;\n\n if (!this.backend) {\n this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n return callback && callback();\n }\n\n if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages);\n if (typeof namespaces === 'string') namespaces = [namespaces];\n var toLoad = this.queueLoad(languages, namespaces, options, callback);\n\n if (!toLoad.toLoad.length) {\n if (!toLoad.pending.length) callback();\n return null;\n }\n\n toLoad.toLoad.forEach(function (name) {\n _this4.loadOne(name);\n });\n }\n }, {\n key: \"load\",\n value: function load(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {}, callback);\n }\n }, {\n key: \"reload\",\n value: function reload(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {\n reload: true\n }, callback);\n }\n }, {\n key: \"loadOne\",\n value: function loadOne(name) {\n var _this5 = this;\n\n var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var s = name.split('|');\n var lng = s[0];\n var ns = s[1];\n this.read(lng, ns, 'read', undefined, undefined, function (err, data) {\n if (err) _this5.logger.warn(\"\".concat(prefix, \"loading namespace \").concat(ns, \" for language \").concat(lng, \" failed\"), err);\n if (!err && data) _this5.logger.log(\"\".concat(prefix, \"loaded namespace \").concat(ns, \" for language \").concat(lng), data);\n\n _this5.loaded(name, err, data);\n });\n }\n }, {\n key: \"saveMissing\",\n value: function saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n\n if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n this.logger.warn(\"did not save key \\\"\".concat(key, \"\\\" as the namespace \\\"\").concat(namespace, \"\\\" was not yet loaded\"), 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n return;\n }\n\n if (key === undefined || key === null || key === '') return;\n\n if (this.backend && this.backend.create) {\n this.backend.create(languages, namespace, key, fallbackValue, null, _objectSpread$5(_objectSpread$5({}, options), {}, {\n isUpdate: isUpdate\n }));\n }\n\n if (!languages || !languages[0]) return;\n this.store.addResource(languages[0], namespace, key, fallbackValue);\n }\n }]);\n\n return Connector;\n}(EventEmitter);\n\nfunction get() {\n return {\n debug: false,\n initImmediate: true,\n ns: ['translation'],\n defaultNS: ['translation'],\n fallbackLng: ['dev'],\n fallbackNS: false,\n supportedLngs: false,\n nonExplicitSupportedLngs: false,\n load: 'all',\n preload: false,\n simplifyPluralSuffix: true,\n keySeparator: '.',\n nsSeparator: ':',\n pluralSeparator: '_',\n contextSeparator: '_',\n partialBundledLanguages: false,\n saveMissing: false,\n updateMissing: false,\n saveMissingTo: 'fallback',\n saveMissingPlurals: true,\n missingKeyHandler: false,\n missingInterpolationHandler: false,\n postProcess: false,\n postProcessPassResolved: false,\n returnNull: true,\n returnEmptyString: true,\n returnObjects: false,\n joinArrays: false,\n returnedObjectHandler: false,\n parseMissingKeyHandler: false,\n appendNamespaceToMissingKey: false,\n appendNamespaceToCIMode: false,\n overloadTranslationOptionHandler: function handle(args) {\n var ret = {};\n if (_typeof(args[1]) === 'object') ret = args[1];\n if (typeof args[1] === 'string') ret.defaultValue = args[1];\n if (typeof args[2] === 'string') ret.tDescription = args[2];\n\n if (_typeof(args[2]) === 'object' || _typeof(args[3]) === 'object') {\n var options = args[3] || args[2];\n Object.keys(options).forEach(function (key) {\n ret[key] = options[key];\n });\n }\n\n return ret;\n },\n interpolation: {\n escapeValue: true,\n format: function format(value, _format, lng, options) {\n return value;\n },\n prefix: '{{',\n suffix: '}}',\n formatSeparator: ',',\n unescapePrefix: '-',\n nestingPrefix: '$t(',\n nestingSuffix: ')',\n nestingOptionsSeparator: ',',\n maxReplaces: 1000,\n skipOnVariables: true\n }\n };\n}\nfunction transformOptions(options) {\n if (typeof options.ns === 'string') options.ns = [options.ns];\n if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n options.supportedLngs = options.supportedLngs.concat(['cimode']);\n }\n\n return options;\n}\n\nfunction ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper$3(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct$3() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction noop() {}\n\nfunction bindMemberFunctions(inst) {\n var mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n mems.forEach(function (mem) {\n if (typeof inst[mem] === 'function') {\n inst[mem] = inst[mem].bind(inst);\n }\n });\n}\n\nvar I18n = function (_EventEmitter) {\n _inherits(I18n, _EventEmitter);\n\n var _super = _createSuper$3(I18n);\n\n function I18n() {\n var _this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n _classCallCheck(this, I18n);\n\n _this = _super.call(this);\n\n if (isIE10) {\n EventEmitter.call(_assertThisInitialized(_this));\n }\n\n _this.options = transformOptions(options);\n _this.services = {};\n _this.logger = baseLogger;\n _this.modules = {\n external: []\n };\n bindMemberFunctions(_assertThisInitialized(_this));\n\n if (callback && !_this.isInitialized && !options.isClone) {\n if (!_this.options.initImmediate) {\n _this.init(options, callback);\n\n return _possibleConstructorReturn(_this, _assertThisInitialized(_this));\n }\n\n setTimeout(function () {\n _this.init(options, callback);\n }, 0);\n }\n\n return _this;\n }\n\n _createClass(I18n, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n if (typeof options.ns === 'string') {\n options.defaultNS = options.ns;\n } else if (options.ns.indexOf('translation') < 0) {\n options.defaultNS = options.ns[0];\n }\n }\n\n var defOpts = get();\n this.options = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, defOpts), this.options), transformOptions(options));\n\n if (this.options.compatibilityAPI !== 'v1') {\n this.options.interpolation = _objectSpread$6(_objectSpread$6({}, defOpts.interpolation), this.options.interpolation);\n }\n\n if (options.keySeparator !== undefined) {\n this.options.userDefinedKeySeparator = options.keySeparator;\n }\n\n if (options.nsSeparator !== undefined) {\n this.options.userDefinedNsSeparator = options.nsSeparator;\n }\n\n function createClassOnDemand(ClassOrObject) {\n if (!ClassOrObject) return null;\n if (typeof ClassOrObject === 'function') return new ClassOrObject();\n return ClassOrObject;\n }\n\n if (!this.options.isClone) {\n if (this.modules.logger) {\n baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n } else {\n baseLogger.init(null, this.options);\n }\n\n var formatter;\n\n if (this.modules.formatter) {\n formatter = this.modules.formatter;\n } else if (typeof Intl !== 'undefined') {\n formatter = Formatter;\n }\n\n var lu = new LanguageUtil(this.options);\n this.store = new ResourceStore(this.options.resources, this.options);\n var s = this.services;\n s.logger = baseLogger;\n s.resourceStore = this.store;\n s.languageUtils = lu;\n s.pluralResolver = new PluralResolver(lu, {\n prepend: this.options.pluralSeparator,\n compatibilityJSON: this.options.compatibilityJSON,\n simplifyPluralSuffix: this.options.simplifyPluralSuffix\n });\n\n if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n s.formatter = createClassOnDemand(formatter);\n s.formatter.init(s, this.options);\n this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n }\n\n s.interpolator = new Interpolator(this.options);\n s.utils = {\n hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n };\n s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n s.backendConnector.on('*', function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n _this2.emit.apply(_this2, [event].concat(args));\n });\n\n if (this.modules.languageDetector) {\n s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n s.languageDetector.init(s, this.options.detection, this.options);\n }\n\n if (this.modules.i18nFormat) {\n s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n if (s.i18nFormat.init) s.i18nFormat.init(this);\n }\n\n this.translator = new Translator(this.services, this.options);\n this.translator.on('*', function (event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n _this2.emit.apply(_this2, [event].concat(args));\n });\n this.modules.external.forEach(function (m) {\n if (m.init) m.init(_this2);\n });\n }\n\n this.format = this.options.interpolation.format;\n if (!callback) callback = noop;\n\n if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n var codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n }\n\n if (!this.services.languageDetector && !this.options.lng) {\n this.logger.warn('init: no languageDetector is used and no lng is defined');\n }\n\n var storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n storeApi.forEach(function (fcName) {\n _this2[fcName] = function () {\n var _this2$store;\n\n return (_this2$store = _this2.store)[fcName].apply(_this2$store, arguments);\n };\n });\n var storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n storeApiChained.forEach(function (fcName) {\n _this2[fcName] = function () {\n var _this2$store2;\n\n (_this2$store2 = _this2.store)[fcName].apply(_this2$store2, arguments);\n\n return _this2;\n };\n });\n var deferred = defer();\n\n var load = function load() {\n var finish = function finish(err, t) {\n if (_this2.isInitialized && !_this2.initializedStoreOnce) _this2.logger.warn('init: i18next is already initialized. You should call init just once!');\n _this2.isInitialized = true;\n if (!_this2.options.isClone) _this2.logger.log('initialized', _this2.options);\n\n _this2.emit('initialized', _this2.options);\n\n deferred.resolve(t);\n callback(err, t);\n };\n\n if (_this2.languages && _this2.options.compatibilityAPI !== 'v1' && !_this2.isInitialized) return finish(null, _this2.t.bind(_this2));\n\n _this2.changeLanguage(_this2.options.lng, finish);\n };\n\n if (this.options.resources || !this.options.initImmediate) {\n load();\n } else {\n setTimeout(load, 0);\n }\n\n return deferred;\n }\n }, {\n key: \"loadResources\",\n value: function loadResources(language) {\n var _this3 = this;\n\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n var usedCallback = callback;\n var usedLng = typeof language === 'string' ? language : this.language;\n if (typeof language === 'function') usedCallback = language;\n\n if (!this.options.resources || this.options.partialBundledLanguages) {\n if (usedLng && usedLng.toLowerCase() === 'cimode') return usedCallback();\n var toLoad = [];\n\n var append = function append(lng) {\n if (!lng) return;\n\n var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n\n lngs.forEach(function (l) {\n if (toLoad.indexOf(l) < 0) toLoad.push(l);\n });\n };\n\n if (!usedLng) {\n var fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n fallbacks.forEach(function (l) {\n return append(l);\n });\n } else {\n append(usedLng);\n }\n\n if (this.options.preload) {\n this.options.preload.forEach(function (l) {\n return append(l);\n });\n }\n\n this.services.backendConnector.load(toLoad, this.options.ns, function (e) {\n if (!e && !_this3.resolvedLanguage && _this3.language) _this3.setResolvedLanguage(_this3.language);\n usedCallback(e);\n });\n } else {\n usedCallback(null);\n }\n }\n }, {\n key: \"reloadResources\",\n value: function reloadResources(lngs, ns, callback) {\n var deferred = defer();\n if (!lngs) lngs = this.languages;\n if (!ns) ns = this.options.ns;\n if (!callback) callback = noop;\n this.services.backendConnector.reload(lngs, ns, function (err) {\n deferred.resolve();\n callback(err);\n });\n return deferred;\n }\n }, {\n key: \"use\",\n value: function use(module) {\n if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n\n if (module.type === 'backend') {\n this.modules.backend = module;\n }\n\n if (module.type === 'logger' || module.log && module.warn && module.error) {\n this.modules.logger = module;\n }\n\n if (module.type === 'languageDetector') {\n this.modules.languageDetector = module;\n }\n\n if (module.type === 'i18nFormat') {\n this.modules.i18nFormat = module;\n }\n\n if (module.type === 'postProcessor') {\n postProcessor.addPostProcessor(module);\n }\n\n if (module.type === 'formatter') {\n this.modules.formatter = module;\n }\n\n if (module.type === '3rdParty') {\n this.modules.external.push(module);\n }\n\n return this;\n }\n }, {\n key: \"setResolvedLanguage\",\n value: function setResolvedLanguage(l) {\n if (!l || !this.languages) return;\n if (['cimode', 'dev'].indexOf(l) > -1) return;\n\n for (var li = 0; li < this.languages.length; li++) {\n var lngInLngs = this.languages[li];\n if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n\n if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n this.resolvedLanguage = lngInLngs;\n break;\n }\n }\n }\n }, {\n key: \"changeLanguage\",\n value: function changeLanguage(lng, callback) {\n var _this4 = this;\n\n this.isLanguageChangingTo = lng;\n var deferred = defer();\n this.emit('languageChanging', lng);\n\n var setLngProps = function setLngProps(l) {\n _this4.language = l;\n _this4.languages = _this4.services.languageUtils.toResolveHierarchy(l);\n _this4.resolvedLanguage = undefined;\n\n _this4.setResolvedLanguage(l);\n };\n\n var done = function done(err, l) {\n if (l) {\n setLngProps(l);\n\n _this4.translator.changeLanguage(l);\n\n _this4.isLanguageChangingTo = undefined;\n\n _this4.emit('languageChanged', l);\n\n _this4.logger.log('languageChanged', l);\n } else {\n _this4.isLanguageChangingTo = undefined;\n }\n\n deferred.resolve(function () {\n return _this4.t.apply(_this4, arguments);\n });\n if (callback) callback(err, function () {\n return _this4.t.apply(_this4, arguments);\n });\n };\n\n var setLng = function setLng(lngs) {\n if (!lng && !lngs && _this4.services.languageDetector) lngs = [];\n var l = typeof lngs === 'string' ? lngs : _this4.services.languageUtils.getBestMatchFromCodes(lngs);\n\n if (l) {\n if (!_this4.language) {\n setLngProps(l);\n }\n\n if (!_this4.translator.language) _this4.translator.changeLanguage(l);\n if (_this4.services.languageDetector) _this4.services.languageDetector.cacheUserLanguage(l);\n }\n\n _this4.loadResources(l, function (err) {\n done(err, l);\n });\n };\n\n if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n setLng(this.services.languageDetector.detect());\n } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n this.services.languageDetector.detect(setLng);\n } else {\n setLng(lng);\n }\n\n return deferred;\n }\n }, {\n key: \"getFixedT\",\n value: function getFixedT(lng, ns, keyPrefix) {\n var _this5 = this;\n\n var fixedT = function fixedT(key, opts) {\n var options;\n\n if (_typeof(opts) !== 'object') {\n for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n rest[_key3 - 2] = arguments[_key3];\n }\n\n options = _this5.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n } else {\n options = _objectSpread$6({}, opts);\n }\n\n options.lng = options.lng || fixedT.lng;\n options.lngs = options.lngs || fixedT.lngs;\n options.ns = options.ns || fixedT.ns;\n options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n var keySeparator = _this5.options.keySeparator || '.';\n var resultKey = options.keyPrefix ? \"\".concat(options.keyPrefix).concat(keySeparator).concat(key) : key;\n return _this5.t(resultKey, options);\n };\n\n if (typeof lng === 'string') {\n fixedT.lng = lng;\n } else {\n fixedT.lngs = lng;\n }\n\n fixedT.ns = ns;\n fixedT.keyPrefix = keyPrefix;\n return fixedT;\n }\n }, {\n key: \"t\",\n value: function t() {\n var _this$translator;\n\n return this.translator && (_this$translator = this.translator).translate.apply(_this$translator, arguments);\n }\n }, {\n key: \"exists\",\n value: function exists() {\n var _this$translator2;\n\n return this.translator && (_this$translator2 = this.translator).exists.apply(_this$translator2, arguments);\n }\n }, {\n key: \"setDefaultNamespace\",\n value: function setDefaultNamespace(ns) {\n this.options.defaultNS = ns;\n }\n }, {\n key: \"hasLoadedNamespace\",\n value: function hasLoadedNamespace(ns) {\n var _this6 = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!this.isInitialized) {\n this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n return false;\n }\n\n if (!this.languages || !this.languages.length) {\n this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n return false;\n }\n\n var lng = this.resolvedLanguage || this.languages[0];\n var fallbackLng = this.options ? this.options.fallbackLng : false;\n var lastLng = this.languages[this.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n\n var loadNotPending = function loadNotPending(l, n) {\n var loadState = _this6.services.backendConnector.state[\"\".concat(l, \"|\").concat(n)];\n\n return loadState === -1 || loadState === 2;\n };\n\n if (options.precheck) {\n var preResult = options.precheck(this, loadNotPending);\n if (preResult !== undefined) return preResult;\n }\n\n if (this.hasResourceBundle(lng, ns)) return true;\n if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n }\n }, {\n key: \"loadNamespaces\",\n value: function loadNamespaces(ns, callback) {\n var _this7 = this;\n\n var deferred = defer();\n\n if (!this.options.ns) {\n callback && callback();\n return Promise.resolve();\n }\n\n if (typeof ns === 'string') ns = [ns];\n ns.forEach(function (n) {\n if (_this7.options.ns.indexOf(n) < 0) _this7.options.ns.push(n);\n });\n this.loadResources(function (err) {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n }, {\n key: \"loadLanguages\",\n value: function loadLanguages(lngs, callback) {\n var deferred = defer();\n if (typeof lngs === 'string') lngs = [lngs];\n var preloaded = this.options.preload || [];\n var newLngs = lngs.filter(function (lng) {\n return preloaded.indexOf(lng) < 0;\n });\n\n if (!newLngs.length) {\n if (callback) callback();\n return Promise.resolve();\n }\n\n this.options.preload = preloaded.concat(newLngs);\n this.loadResources(function (err) {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n }, {\n key: \"dir\",\n value: function dir(lng) {\n if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n if (!lng) return 'rtl';\n var rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n }\n }, {\n key: \"cloneInstance\",\n value: function cloneInstance() {\n var _this8 = this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n\n var mergedOptions = _objectSpread$6(_objectSpread$6(_objectSpread$6({}, this.options), options), {\n isClone: true\n });\n\n var clone = new I18n(mergedOptions);\n\n if (options.debug !== undefined || options.prefix !== undefined) {\n clone.logger = clone.logger.clone(options);\n }\n\n var membersToCopy = ['store', 'services', 'language'];\n membersToCopy.forEach(function (m) {\n clone[m] = _this8[m];\n });\n clone.services = _objectSpread$6({}, this.services);\n clone.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n clone.translator = new Translator(clone.services, clone.options);\n clone.translator.on('*', function (event) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n\n clone.emit.apply(clone, [event].concat(args));\n });\n clone.init(mergedOptions, callback);\n clone.translator.options = clone.options;\n clone.translator.backendConnector.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n return clone;\n }\n }, {\n key: \"toJSON\",\n value: function toJSON() {\n return {\n options: this.options,\n store: this.store,\n language: this.language,\n languages: this.languages,\n resolvedLanguage: this.resolvedLanguage\n };\n }\n }]);\n\n return I18n;\n}(EventEmitter);\n\n_defineProperty(I18n, \"createInstance\", function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var callback = arguments.length > 1 ? arguments[1] : undefined;\n return new I18n(options, callback);\n});\n\nvar instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nvar createInstance = instance.createInstance;\nvar init = instance.init;\nvar loadResources = instance.loadResources;\nvar reloadResources = instance.reloadResources;\nvar use = instance.use;\nvar changeLanguage = instance.changeLanguage;\nvar getFixedT = instance.getFixedT;\nvar t = instance.t;\nvar exists = instance.exists;\nvar setDefaultNamespace = instance.setDefaultNamespace;\nvar hasLoadedNamespace = instance.hasLoadedNamespace;\nvar loadNamespaces = instance.loadNamespaces;\nvar loadLanguages = instance.loadLanguages;\n\nexport default instance;\nexport { changeLanguage, createInstance, exists, getFixedT, hasLoadedNamespace, init, loadLanguages, loadNamespaces, loadResources, reloadResources, setDefaultNamespace, t, use };\n","import i18next from \"i18next\";\nimport { COUNT_FIELD_ID } from \"../constants\";\nimport { IRow, Filters, IMutField, IViewField } from \"../interfaces\";\ninterface NRReturns {\n normalizedData: IRow[];\n maxMeasures: IRow;\n minMeasures: IRow;\n totalMeasures: IRow;\n}\nfunction normalizeRecords(dataSource: IRow[], measures: string[]): NRReturns {\n const maxMeasures: IRow = {};\n const minMeasures: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n maxMeasures[mea] = -Infinity;\n minMeasures[mea] = Infinity;\n totalMeasures[mea] = 0;\n });\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n maxMeasures[mea] = Math.max(record[mea], maxMeasures[mea]);\n minMeasures[mea] = Math.min(record[mea], minMeasures[mea]);\n });\n });\n const newData: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n totalMeasures[mea] += Math.abs(norRecord[mea]);\n });\n newData.push(norRecord);\n });\n newData.forEach((record) => {\n measures.forEach((mea) => {\n record[mea] /= totalMeasures[mea];\n });\n });\n return {\n normalizedData: newData,\n maxMeasures,\n minMeasures,\n totalMeasures,\n };\n}\n\nfunction normalize2PositiveRecords(dataSource: IRow[], measures: string[]): NRReturns {\n const maxMeasures: IRow = {};\n const minMeasures: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n maxMeasures[mea] = -Infinity;\n minMeasures[mea] = Infinity;\n totalMeasures[mea] = 0;\n });\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n maxMeasures[mea] = Math.max(record[mea], maxMeasures[mea]);\n minMeasures[mea] = Math.min(record[mea], minMeasures[mea]);\n });\n });\n const newData: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n norRecord[mea] = norRecord[mea] - minMeasures[mea];\n totalMeasures[mea] += norRecord[mea];\n });\n newData.push(norRecord);\n });\n newData.forEach((record) => {\n measures.forEach((mea) => {\n record[mea] /= totalMeasures[mea];\n });\n });\n return {\n normalizedData: newData,\n maxMeasures,\n minMeasures,\n totalMeasures,\n };\n}\n\nexport function checkMajorFactor(\n data: IRow[],\n childrenData: Map<any, IRow[]>,\n dimensions: string[],\n measures: string[]\n): { majorKey: string; majorSum: number } {\n const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalizeRecords(data, measures);\n let majorSum = Infinity;\n let majorKey = \"\";\n for (let [key, childData] of childrenData) {\n let sum = 0;\n for (let record of normalizedData) {\n let target = childData.find((childRecord) => {\n return dimensions.every((dim) => record[dim] === childRecord[dim]);\n });\n if (target) {\n measures.forEach((mea) => {\n let targetValue = typeof target![mea] === \"number\" && !isNaN(target![mea]) ? target![mea] : 0;\n targetValue = targetValue / totalMeasures[mea];\n sum += Math.abs(record[mea] - targetValue);\n });\n } else {\n measures.forEach((mea) => {\n sum += Math.abs(record[mea]);\n });\n }\n }\n if (sum < majorSum) {\n majorSum = sum;\n majorKey = key;\n }\n }\n majorSum /= measures.length * 2;\n return { majorKey, majorSum };\n}\n\nexport function checkChildOutlier(\n data: IRow[],\n childrenData: Map<any, IRow[]>,\n dimensions: string[],\n measures: string[]\n): { outlierKey: string; outlierSum: number } {\n // const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalize2PositiveRecords(data, measures);\n const { normalizedData, maxMeasures, minMeasures, totalMeasures } = normalizeRecords(data, measures);\n let outlierSum = -Infinity;\n let outlierKey = \"\";\n for (let [key, childData] of childrenData) {\n // const { normalizedData: normalizedChildData } = normalize2PositiveRecords(childData, measures);\n const { normalizedData: normalizedChildData } = normalizeRecords(childData, measures);\n let sum = 0;\n for (let record of normalizedData) {\n let target = normalizedChildData.find((childRecord) => {\n return dimensions.every((dim) => record[dim] === childRecord[dim]);\n });\n if (target) {\n measures.forEach((mea) => {\n let targetValue = typeof target![mea] === \"number\" && !isNaN(target![mea]) ? target![mea] : 0;\n sum += Math.abs(record[mea] - targetValue);\n });\n } else {\n measures.forEach((mea) => {\n sum += Math.abs(record[mea]);\n });\n }\n }\n if (sum > outlierSum) {\n outlierSum = sum;\n outlierKey = key;\n }\n }\n outlierSum /= measures.length * 2;\n return { outlierKey, outlierSum };\n}\nexport interface IPredicate {\n key: string;\n type: \"discrete\" | \"continuous\";\n range: Set<any> | [number, number];\n}\nexport function getPredicates(selection: IRow[], dimensions: string[], measures: string[]): IPredicate[] {\n const predicates: IPredicate[] = [];\n dimensions.forEach((dim) => {\n predicates.push({\n key: dim,\n type: \"discrete\",\n range: new Set(),\n });\n });\n measures.forEach((mea) => {\n predicates.push({\n key: mea,\n type: \"continuous\",\n range: [Infinity, -Infinity],\n });\n });\n selection.forEach((record) => {\n dimensions.forEach((dim, index) => {\n (predicates[index].range as Set<any>).add(record[dim]);\n });\n measures.forEach((mea, index) => {\n (predicates[index].range as [number, number])[0] = Math.min(\n (predicates[index].range as [number, number])[0],\n record[mea]\n );\n (predicates[index].range as [number, number])[1] = Math.max(\n (predicates[index].range as [number, number])[1],\n record[mea]\n );\n });\n });\n return predicates;\n}\n\nexport function getPredicatesFromVegaSignals(signals: Filters, dimensions: string[], measures: string[]): IPredicate[] {\n const predicates: IPredicate[] = [];\n dimensions.forEach((dim) => {\n predicates.push({\n type: \"discrete\",\n range: new Set(signals[dim]),\n key: dim,\n });\n });\n return predicates;\n}\n\nexport function filterByPredicates(data: IRow[], predicates: IPredicate[]): IRow[] {\n const filterData = data.filter((record) => {\n return predicates.every((pre) => {\n if (pre.type === \"continuous\") {\n return (\n record[pre.key] >= (pre.range as [number, number])[0] &&\n record[pre.key] <= (pre.range as [number, number])[1]\n );\n } else {\n return (pre.range as Set<any>).has(record[pre.key]);\n }\n });\n });\n return filterData;\n}\n\nexport function applyFilters(dataSource: IRow[], filters: Filters): IRow[] {\n let filterKeys = Object.keys(filters);\n return dataSource.filter((record) => {\n let keep = true;\n for (let filterKey of filterKeys) {\n if (filters[filterKey].length > 0) {\n if (!filters[filterKey].includes(record[filterKey])) {\n keep = false;\n break;\n }\n }\n }\n return keep;\n });\n}\n\nexport function createCountField(): IViewField {\n return {\n // viewId: \"\",\n dragId: COUNT_FIELD_ID,\n fid: COUNT_FIELD_ID,\n name: i18next.t(\"constant.row_count\"),\n analyticType: \"measure\",\n semanticType: \"quantitative\",\n aggName: 'sum',\n computed: true,\n expressoion: {\n op: 'one',\n params: [],\n as: COUNT_FIELD_ID,\n }\n };\n}\n\nexport function getRange (nums: number[]): [number, number] {\n let _min = Infinity;\n let _max = -Infinity;\n for (let i = 0; i < nums.length; i++) {\n _min = Math.min(_min, nums[i]);\n _max = Math.max(_max, nums[i]);\n }\n return [_min, _max];\n}\n\nexport function makeNumbersBeautiful (nums: number[]): number[] {\n const [min, max] = getRange(nums);\n const range = max - min;\n const step = Math.pow(10, Math.floor(Math.log10(range)));\n return nums.map((num) => {\n return Math.round(num / step) * step;\n })\n}\n\nexport function classNames(...classes: string[]) {\n return classes.filter(Boolean).join(' ')\n}","const JOIN_SYMBOL = '_';\nconst MAGIC_NUMBER = 5;\nfunction deepcopy(data) {\n return JSON.parse(JSON.stringify(data));\n}\nfunction copyData(data) {\n return data.map(r => ({\n ...r\n }));\n}\nfunction isFieldCategory(dataSource, fieldName) {\n return dataSource.every(record => {\n return typeof record[fieldName] === 'string'\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction isFieldContinous(dataSource, fieldName) {\n return dataSource.every(record => {\n return !isNaN(+record[fieldName])\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction isFieldNumeric(dataSource, fieldName) {\n return dataSource.every(record => {\n return !isNaN(record[fieldName])\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nconst TIME_RULES = [\n /^[0-9]{2,4}[-/][0-9]{1,2}([-/][0-9]{1,2})?$/,\n /^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{2,4}$/,\n /^[0-9]{4}[0-9]{2}[0-9]{2}$/,\n /^[0-9]{2,4}[-/][0-9]{1,2}[-/][0-9]{1,2} [0-9]{1,2}:[0-9]{1-2}:[0-9]{1-2}$/ // YYYY-MM-DD HH:mm:ss\n];\nfunction isFieldTime(dataSource, fieldName) {\n return dataSource.every(record => {\n // todo: tmp solotion here.\n if (!isNaN(Number(record[fieldName])) && Number(record[fieldName]) >= 1800 && Number(record[fieldName]) <= 2200) {\n return true;\n }\n return (typeof record[fieldName] === 'string'\n // && /^[0-9]{0,4}[-/][0-9]{0,2}([-/][0-9]{0,2}$)?/.test(record[fieldName]))\n && TIME_RULES.some(rule => rule.test(record[fieldName])))\n || typeof record[fieldName] === 'undefined'\n || record[fieldName] === null;\n });\n}\nfunction aggregate({ dataSource, fields, bys, method = 'sum' }) {\n let tmp = [];\n for (let by of bys) {\n let map = new Map();\n for (let record of dataSource) {\n let key = JSON.stringify(fields.map(field => record[field]));\n if (!map.has(key)) {\n map.set(key, 0);\n }\n map.set(key, map.get(key) + record[by]);\n }\n for (let [key, value] of map) {\n let row = {\n index: key,\n [by]: value\n };\n let dims = JSON.parse(key);\n for (let i = 0; i < fields.length; i++) {\n row[fields[i]] = dims[i];\n }\n tmp.push(row);\n }\n }\n let ans = new Map();\n for (let record of tmp) {\n if (!ans.has(record.index)) {\n ans.set(record.index, {});\n }\n ans.set(record.index, { ...ans.get(record.index), ...record });\n }\n return [...ans.values()];\n}\nfunction memberCount(dataSource, field) {\n const counter = new Map();\n for (let row of dataSource) {\n let member = row[field];\n if (!counter.has(member)) {\n counter.set(member, 0);\n }\n counter.set(member, counter.get(member) + 1);\n }\n return [...counter.entries()];\n}\nfunction groupContinousField({ dataSource, field, newField = `${field}(con-group)`, groupNumber }) {\n // const members = memberCount(dataSource, field);\n // todo: outlier detection\n const values = dataSource.map(item => item[field]);\n const max = Math.max(...values); // Number.EPSILON * ;\n const min = Math.min(...values);\n const segWidth = (max - min) / groupNumber;\n let ranges = [];\n for (let i = 0; i < groupNumber; i++) {\n let left = min + i * segWidth;\n let right = min + (i + 1) * segWidth;\n ranges.push([left, right]);\n }\n ranges[0][0] = -Infinity;\n ranges[ranges.length - 1][1] = Infinity;\n let precision = Math.max(1, Math.log10(Math.abs(min)) - Math.log10(segWidth)) + 1;\n for (let i = 0; i < dataSource.length; i++) {\n let record = dataSource[i];\n let rangeIndex = ranges.findIndex(r => (r[0] <= record[field] && record[field] < r[1]));\n let range = ranges[rangeIndex];\n if (typeof range !== 'undefined') {\n record[newField] = `${rangeIndex + 1}:[${Number(range[0].toPrecision(precision))}, ${Number(range[1].toPrecision(precision))})`;\n }\n else {\n record[newField] = 'null';\n }\n }\n return dataSource;\n}\nfunction groupCategoryField({ dataSource, field, newField = `${field}(cat-group)`, groupNumber }) {\n // auto category should obey Power law distrubution.\n let members = memberCount(dataSource, field);\n members.sort((a, b) => b[1] - a[1]);\n let sum = members.map(v => v[1]);\n groupNumber = members.length;\n for (let i = sum.length - 2; i >= 0; i--) {\n sum[i] = sum[i + 1] + sum[i];\n }\n for (let i = 0; i < members.length - 2; i++) {\n // strict mode\n // if (members[i][1] >= sum[i + 1] && members[i + 1][1] < sum[i + 2]) {\n if (members[i][1] * MAGIC_NUMBER >= sum[i + 1] && members[i + 1][1] / MAGIC_NUMBER < sum[i + 2]) {\n groupNumber = i + 2;\n break;\n }\n }\n // groupNumber = Math.max(Math.round(Math.sqrt(members.length)), groupNumber)\n if (groupNumber === members.length) {\n return dataSource.map(record => {\n return {\n ...record,\n [newField]: record[field]\n };\n });\n }\n let set = new Set();\n for (let i = groupNumber - 1; i < members.length; i++) {\n set.add(members[i][0]);\n }\n for (let record of dataSource) {\n if (set.has(record[field])) {\n record[newField] = 'others';\n }\n else {\n record[newField] = record[field];\n }\n }\n return dataSource;\n}\n/**\n * Kullback–Leibler divergence\n * @param p1List\n * @param p2List\n *\n */\nfunction DKL(p1List, p2List) {\n let sum = 0;\n const len = Math.max(p1List.length, p2List.length);\n for (let i = 0; i < len; i++) {\n let p1 = p1List[i] || 0;\n let p2 = p2List[i] || 0;\n sum += p1 * Math.log2(p1 / p2);\n }\n return sum;\n}\nfunction isFieldUnique(dataSource, field) {\n let set = new Set();\n let validCount = 0;\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n if (dataSource[i][field] !== undefined && dataSource[i][field] !== null && dataSource[i][field] !== '') {\n validCount++;\n set.add(dataSource[i][field]);\n }\n }\n if (set.size === validCount)\n return true;\n return false;\n}\nexport { deepcopy, copyData, memberCount, groupCategoryField, groupContinousField, aggregate, isFieldCategory, isFieldContinous, isFieldTime, isFieldNumeric, JOIN_SYMBOL, DKL, isFieldUnique };\n","/**\n * chiSquared implementation using adjacency list(spare graph), which is ableto handle fields with large cardinality.\n * @param nestTree hash tree with depth = 2, represents the relationship between var x and var y.\n * @param xSet value set of var x.\n * @param ySet value set of var y.\n */\nexport function chiSquared(nestTree, xSet, ySet) {\n if (typeof nestTree === 'undefined' || typeof xSet === 'undefined' || typeof ySet === 'undefined') {\n return 0;\n }\n let rowSums = new Map();\n let colSums = new Map();\n let totalSum = 0;\n for (let x of xSet) {\n rowSums.set(x, 0);\n }\n for (let y of ySet) {\n colSums.set(y, 0);\n }\n for (let [x, node] of nestTree) {\n for (let [y, counter] of node) {\n rowSums.set(x, rowSums.get(x) + counter);\n colSums.set(y, colSums.get(y) + counter);\n totalSum += counter;\n }\n }\n let chis = 0;\n for (let [x, node] of nestTree) {\n for (let [y, observed] of node) {\n let expected = rowSums.get(x) * colSums.get(y) / totalSum;\n chis += (observed - expected) ** 2 / expected;\n }\n }\n return chis;\n}\n/**\n * crammersV implementation using adjacency list(spare graph), which is ableto handle fields with large cardinality.\n * @param dataSource array of records.\n * @param fieldX field key of var X.\n * @param fieldY field key of varY.\n */\nexport const crammersV = (dataSource, fieldX, fieldY) => {\n const xSet = new Set();\n const ySet = new Set();\n const nestTree = new Map();\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n let record = dataSource[i];\n xSet.add(record[fieldX]);\n ySet.add(record[fieldY]);\n if (!nestTree.has(record[fieldX])) {\n nestTree.set(record[fieldX], new Map());\n }\n let node = nestTree.get(record[fieldX]);\n if (!node.has(record[fieldY])) {\n node.set(record[fieldY], 0);\n }\n node.set(record[fieldY], node.get(record[fieldY]) + 1);\n }\n const chis = chiSquared(nestTree, xSet, ySet);\n const V = Math.sqrt(chis / (dataSource.length * Math.min(xSet.size - 1, ySet.size - 1)));\n return V;\n};\nexport function chiSquaredFromDataSource(dataSource, fieldX, fieldY) {\n const xSet = new Set();\n const ySet = new Set();\n const nestTree = new Map();\n let len = dataSource.length;\n for (let i = 0; i < len; i++) {\n let record = dataSource[i];\n xSet.add(record[fieldX]);\n ySet.add(record[fieldY]);\n if (!nestTree.has(record[fieldX])) {\n nestTree.set(record[fieldX], new Map());\n }\n let node = nestTree.get(record[fieldX]);\n if (!node.has(record[fieldY])) {\n node.set(record[fieldY], 0);\n }\n node.set(record[fieldY], node.get(record[fieldY]) + 1);\n }\n const chis = chiSquared(nestTree, xSet, ySet);\n return chis;\n}\n/**\n * Pearson correlation coefficient\n * @param dataSource array of records\n * @param fieldX field key of var X.\n * @param fieldY field key of var Y.\n */\nexport const pearsonCC = (dataSource, fieldX, fieldY) => {\n let r = 0;\n let xBar = sum(dataSource.map(row => row[fieldX])) / dataSource.length;\n let yBar = sum(dataSource.map(row => row[fieldY])) / dataSource.length;\n r = sum(dataSource.map(row => (row[fieldX] - xBar) * (row[fieldY] - yBar))) /\n Math.sqrt(sum(dataSource.map(row => Math.pow(row[fieldX] - xBar, 2))) * sum(dataSource.map(row => Math.pow(row[fieldY] - yBar, 2))));\n return r;\n};\nfunction sum(arr) {\n let s = 0;\n for (let i = 0, len = arr.length; i < len; i++) {\n // if (typeof dataSource[i][field])\n s += arr[i];\n }\n return s;\n}\n// can be used for test. do not delete these code. it is implementation with adj matrix. can be faster in dense graph cases.\n// export function crammersV(dataSource: DataSource, fieldX: string, fieldY: string): number {\n// const xSet = new Set(dataSource.map(d => d[fieldX]))\n// const ySet = new Set(dataSource.map(d => d[fieldY]))\n// const xMembers = [...xSet];\n// const yMembers = [...ySet];\n// let xDict = {};\n// let yDict = {};\n// for (let i = 0; i < xMembers.length; i++) {\n// xDict[xMembers[i]] = i;\n// }\n// for (let i = 0; i < yMembers.length; i++) {\n// yDict[yMembers[i]] = i;\n// }\n// // let matrix: number[][] = xMembers.map(x => yMembers.map(y => 0));\n// let matrix: number[][] = [];\n// for (let i = 0; i < xMembers.length; i++) {\n// matrix.push([]);\n// for (let j = 0; j < yMembers.length; j++) {\n// matrix[i].push(0);\n// }\n// }\n// for (let record of dataSource) {\n// matrix[xDict[record[fieldX]]][yDict[record[fieldY]]]++;\n// }\n// const chis = chiSquared(matrix);\n// const V = Math.sqrt(chis / (dataSource.length * Math.min(xMembers.length - 1, yMembers.length - 1)))\n// return V;\n// }\n// export function chiSquared(matrix: number[][] = [[]]): number {\n// let rowSums = matrix.map(m => 0);\n// let colSums = matrix[0].map(m => 0);\n// let totalSum = 0;\n// for (let i = 0; i < matrix.length; i++) {\n// for (let j = 0; j < matrix[i].length; j++) {\n// rowSums[i] += matrix[i][j];\n// colSums[j] += matrix[i][j];\n// totalSum += matrix[i][j];\n// }\n// }\n// let chis = 0;\n// for (let i = 0; i < matrix.length; i++) {\n// for (let j = 0; j < matrix[i].length; j++) {\n// let observed = matrix[i][j];\n// let expected = rowSums[i] * colSums[j] / totalSum;\n// chis += (observed - expected) ** 2 / expected;\n// }\n// }\n// return chis;\n// }\n","export function linearMapPositive(arr) {\n let min = Math.min(...arr);\n return arr.map(a => a - min + 1);\n}\nexport function mapPositive(arr) {\n return arr.map(a => Math.abs(a)).filter(a => a !== 0);\n}\nexport function getCombination(elements, start = 1, end = elements.length) {\n let ans = [];\n const combine = (step, set, size) => {\n if (set.length === size) {\n ans.push([...set]);\n return;\n }\n if (step >= elements.length) {\n return;\n }\n combine(step + 1, [...set, elements[step]], size);\n combine(step + 1, set, size);\n };\n for (let i = start; i <= end; i++) {\n combine(0, [], i);\n }\n return ans;\n}\nexport function normalize(frequencyList) {\n let sum = 0;\n for (let f of frequencyList) {\n sum += f;\n }\n return frequencyList.map(f => f / sum);\n}\nexport const entropy = (probabilityList) => {\n let sum = 0;\n for (let p of probabilityList) {\n sum += p * Math.log2(p);\n }\n return -sum;\n};\nexport const gini = (probabilityList) => {\n let sum = 0;\n for (let p of probabilityList) {\n sum += p * (1 - p);\n }\n return sum;\n};\nexport function getRangeBy(dataSource, by) {\n let maxValue = -Infinity;\n let minValue = Infinity;\n for (let row of dataSource) {\n maxValue = Math.max(row[by], maxValue);\n minValue = Math.min(row[by], minValue);\n }\n return [minValue, maxValue];\n}\n","export class oneDLinearRegression {\n constructor(dataSource, X, Y) {\n this.dataSource = dataSource;\n this.X = X;\n this.Y = Y;\n this.normalizedDataSource = dataSource;\n }\n normalizeDimensions(dimensions) {\n this.normalizedDataSource = [];\n this.valueSets = [];\n dimensions.forEach(() => {\n this.valueSets.push(new Map());\n });\n this.dataSource.forEach(record => {\n dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n if (!this.valueSets[index].has(value)) {\n this.valueSets[index].set(value, this.valueSets[index].size);\n }\n });\n });\n this.dataSource.forEach(record => {\n let normalizedRecord = this.normalizeRecord(record, dimensions);\n this.normalizedDataSource.push(normalizedRecord);\n });\n return this.normalizedDataSource;\n }\n normalizeRecord(record, dimensions) {\n let normalizedRecord = {};\n Object.keys(record).forEach(mea => {\n normalizedRecord[mea] = record[mea];\n });\n dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n normalizedRecord[dim] = this.valueSets[index].get(value);\n });\n return normalizedRecord;\n }\n mean() {\n let meanX = 0;\n let meanY = 0;\n if (this.normalizedDataSource.length === 0)\n return [meanX, meanY];\n this.normalizedDataSource.forEach((record, index) => {\n meanX += record[this.X];\n meanY += record[this.Y];\n });\n meanX /= this.normalizedDataSource.length;\n meanY /= this.normalizedDataSource.length;\n return [meanX, meanY];\n }\n getRegressionEquation() {\n if (this.normalizedDataSource.length === 0)\n return [0, 0];\n const [meanX, meanY] = this.mean();\n let beta = 0;\n let alpha = 0;\n let numerator = 0;\n let denominator = 0;\n this.normalizedDataSource.forEach(record => {\n numerator += (record[this.X] - meanX) * (record[this.Y] - meanY);\n denominator += (record[this.X] - meanX) ** 2;\n });\n beta = numerator / denominator;\n alpha = meanY - meanX * beta;\n return [alpha, beta];\n }\n r_squared() {\n const [, meanY] = this.mean();\n const [alpha, beta] = this.getRegressionEquation();\n let SSR = 0;\n let SST = 0;\n this.normalizedDataSource.forEach(record => {\n let x = record[this.X];\n let y = record[this.Y];\n let yHat = x * beta + alpha;\n SSR += (yHat - meanY) ** 2;\n SST += (y - meanY) ** 2;\n });\n return SSR / SST;\n }\n cumulativeLogisticDistribution(x) {\n const lambda = 2;\n const mu = 0.2;\n return 1 / (1 + Math.pow(Math.E, -(x - mu) / lambda));\n }\n pValue() {\n const [, beta] = this.getRegressionEquation();\n const value = this.cumulativeLogisticDistribution(Math.abs(beta));\n if (value > 0.5) {\n return 2 * (1 - value);\n }\n else {\n return 2 * value;\n }\n }\n significance() {\n let r_squared = this.r_squared();\n let p_value = this.pValue();\n return r_squared * (1 - p_value);\n }\n}\n","/**\n * [Simple linear regression](http://en.wikipedia.org/wiki/Simple_linear_regression)\n * is a simple way to find a fitted line\n * between a set of coordinates. This algorithm finds the slope and y-intercept of a regression line\n * using the least sum of squares.\n *\n * @param {Array<Array<number>>} data an array of two-element of arrays,\n * like `[[0, 1], [2, 3]]`\n * @returns {Object} object containing slope and intersect of regression line\n * @example\n * linearRegression([[0, 0], [1, 1]]); // => { m: 1, b: 0 }\n */\nfunction linearRegression(data) {\n var m, b;\n\n // Store data length in a local variable to reduce\n // repeated object property lookups\n var dataLength = data.length;\n\n //if there's only one point, arbitrarily choose a slope of 0\n //and a y-intercept of whatever the y of the initial point is\n if (dataLength === 1) {\n m = 0;\n b = data[0][1];\n } else {\n // Initialize our sums and scope the `m` and `b`\n // variables that define the line.\n var sumX = 0,\n sumY = 0,\n sumXX = 0,\n sumXY = 0;\n\n // Use local variables to grab point values\n // with minimal object property lookups\n var point, x, y;\n\n // Gather the sum of all x values, the sum of all\n // y values, and the sum of x^2 and (x*y) for each\n // value.\n //\n // In math notation, these would be SS_x, SS_y, SS_xx, and SS_xy\n for (var i = 0; i < dataLength; i++) {\n point = data[i];\n x = point[0];\n y = point[1];\n\n sumX += x;\n sumY += y;\n\n sumXX += x * x;\n sumXY += x * y;\n }\n\n // `m` is the slope of the regression line\n m =\n (dataLength * sumXY - sumX * sumY) /\n (dataLength * sumXX - sumX * sumX);\n\n // `b` is the y-intercept of the line.\n b = sumY / dataLength - (m * sumX) / dataLength;\n }\n\n // Return both values as an object.\n return {\n m: m,\n b: b\n };\n}\n\n/**\n * Given the output of `linearRegression`: an object\n * with `m` and `b` values indicating slope and intercept,\n * respectively, generate a line function that translates\n * x values into y values.\n *\n * @param {Object} mb object with `m` and `b` members, representing\n * slope and intersect of desired line\n * @returns {Function} method that computes y-value at any given\n * x-value on the line.\n * @example\n * var l = linearRegressionLine(linearRegression([[0, 0], [1, 1]]));\n * l(0) // = 0\n * l(2) // = 2\n * linearRegressionLine({ b: 0, m: 1 })(1); // => 1\n * linearRegressionLine({ b: 1, m: 1 })(1); // => 2\n */\nfunction linearRegressionLine(mb /*: { b: number, m: number }*/) {\n // Return a function that computes a `y` value for each\n // x value it is given, based on the values of `b` and `a`\n // that we just computed.\n return function (x) {\n return mb.b + mb.m * x;\n };\n}\n\n/**\n * Our default sum is the [Kahan-Babuska algorithm](https://pdfs.semanticscholar.org/1760/7d467cda1d0277ad272deb2113533131dc09.pdf).\n * This method is an improvement over the classical\n * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm).\n * It aims at computing the sum of a list of numbers while correcting for\n * floating-point errors. Traditionally, sums are calculated as many\n * successive additions, each one with its own floating-point roundoff. These\n * losses in precision add up as the number of numbers increases. This alternative\n * algorithm is more accurate than the simple way of calculating sums by simple\n * addition.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sum([1, 2, 3]); // => 6\n */\nfunction sum(x) {\n // If the array is empty, we needn't bother computing its sum\n if (x.length === 0) {\n return 0;\n }\n\n // Initializing the sum as the first number in the array\n var sum = x[0];\n\n // Keeping track of the floating-point error correction\n var correction = 0;\n\n var transition;\n\n if (typeof sum !== \"number\") {\n return NaN;\n }\n\n for (var i = 1; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return NaN;\n }\n transition = sum + x[i];\n\n // Here we need to update the correction in a different fashion\n // if the new absolute value is greater than the absolute sum\n if (Math.abs(sum) >= Math.abs(x[i])) {\n correction += sum - transition + x[i];\n } else {\n correction += x[i] - transition + sum;\n }\n\n sum = transition;\n }\n\n // Returning the corrected sum\n return sum + correction;\n}\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction mean(x) {\n if (x.length === 0) {\n throw new Error(\"mean requires at least one data point\");\n }\n\n return sum(x) / x.length;\n}\n\n/**\n * The sum of deviations to the Nth power.\n * When n=2 it's the sum of squared deviations.\n * When n=3 it's the sum of cubed deviations.\n *\n * @param {Array<number>} x\n * @param {number} n power\n * @returns {number} sum of nth power deviations\n *\n * @example\n * var input = [1, 2, 3];\n * // since the variance of a set is the mean squared\n * // deviations, we can calculate that with sumNthPowerDeviations:\n * sumNthPowerDeviations(input, 2) / input.length;\n */\nfunction sumNthPowerDeviations(x, n) {\n var meanValue = mean(x);\n var sum = 0;\n var tempValue;\n var i;\n\n // This is an optimization: when n is 2 (we're computing a number squared),\n // multiplying the number by itself is significantly faster than using\n // the Math.pow method.\n if (n === 2) {\n for (i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sum += tempValue * tempValue;\n }\n } else {\n for (i = 0; i < x.length; i++) {\n sum += Math.pow(x[i] - meanValue, n);\n }\n }\n\n return sum;\n}\n\n/**\n * The [variance](http://en.wikipedia.org/wiki/Variance)\n * is the sum of squared deviations from the mean.\n *\n * This is an implementation of variance, not sample variance:\n * see the `sampleVariance` method if you want a sample measure.\n *\n * @param {Array<number>} x a population of one or more data points\n * @returns {number} variance: a value greater than or equal to zero.\n * zero indicates that all values are identical.\n * @throws {Error} if x's length is 0\n * @example\n * variance([1, 2, 3, 4, 5, 6]); // => 2.9166666666666665\n */\nfunction variance(x) {\n if (x.length === 0) {\n throw new Error(\"variance requires at least one data point\");\n }\n\n // Find the mean of squared deviations between the\n // mean value and each value.\n return sumNthPowerDeviations(x, 2) / x.length;\n}\n\n/**\n * The [standard deviation](http://en.wikipedia.org/wiki/Standard_deviation)\n * is the square root of the variance. This is also known as the population\n * standard deviation. It's useful for measuring the amount\n * of variation or dispersion in a set of values.\n *\n * Standard deviation is only appropriate for full-population knowledge: for\n * samples of a population, {@link sampleStandardDeviation} is\n * more appropriate.\n *\n * @param {Array<number>} x input\n * @returns {number} standard deviation\n * @example\n * variance([2, 4, 4, 4, 5, 5, 7, 9]); // => 4\n * standardDeviation([2, 4, 4, 4, 5, 5, 7, 9]); // => 2\n */\nfunction standardDeviation(x) {\n if (x.length === 1) {\n return 0;\n }\n var v = variance(x);\n return Math.sqrt(v);\n}\n\n/**\n * The [R Squared](http://en.wikipedia.org/wiki/Coefficient_of_determination)\n * value of data compared with a function `f`\n * is the sum of the squared differences between the prediction\n * and the actual value.\n *\n * @param {Array<Array<number>>} x input data: this should be doubly-nested\n * @param {Function} func function called on `[i][0]` values within the dataset\n * @returns {number} r-squared value\n * @example\n * var samples = [[0, 0], [1, 1]];\n * var regressionLine = linearRegressionLine(linearRegression(samples));\n * rSquared(samples, regressionLine); // = 1 this line is a perfect fit\n */\nfunction rSquared(x, func) {\n if (x.length < 2) {\n return 1;\n }\n\n // Compute the average y value for the actual\n // data set in order to compute the\n // _total sum of squares_\n var sum = 0;\n for (var i = 0; i < x.length; i++) {\n sum += x[i][1];\n }\n var average = sum / x.length;\n\n // Compute the total sum of squares - the\n // squared difference between each point\n // and the average of all points.\n var sumOfSquares = 0;\n for (var j = 0; j < x.length; j++) {\n sumOfSquares += Math.pow(average - x[j][1], 2);\n }\n\n // Finally estimate the error: the squared\n // difference between the estimate and the actual data\n // value at each point.\n var err = 0;\n for (var k = 0; k < x.length; k++) {\n err += Math.pow(x[k][1] - func(x[k][0]), 2);\n }\n\n // As the error grows larger, its ratio to the\n // sum of squares increases and the r squared\n // value grows lower.\n return 1 - err / sumOfSquares;\n}\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)` because the input is sorted.\n *\n * @param {Array<number>} sorted a sample of one or more data points\n * @returns {number} mode\n * @throws {Error} if sorted is empty\n * @example\n * modeSorted([0, 0, 1]); // => 0\n */\nfunction modeSorted(sorted) {\n // Handle edge cases:\n // The mode of an empty list is undefined\n if (sorted.length === 0) {\n throw new Error(\"mode requires at least one data point\");\n } else if (sorted.length === 1) {\n return sorted[0];\n }\n\n // This assumes it is dealing with an array of size > 1, since size\n // 0 and 1 are handled immediately. Hence it starts at index 1 in the\n // array.\n var last = sorted[0],\n // store the mode as we find new modes\n value = NaN,\n // store how many times we've seen the mode\n maxSeen = 0,\n // how many times the current candidate for the mode\n // has been seen\n seenThis = 1;\n\n // end at sorted.length + 1 to fix the case in which the mode is\n // the highest number that occurs in the sequence. the last iteration\n // compares sorted[i], which is undefined, to the highest number\n // in the series\n for (var i = 1; i < sorted.length + 1; i++) {\n // we're seeing a new number pass by\n if (sorted[i] !== last) {\n // the last number is the new mode since we saw it more\n // often than the old one\n if (seenThis > maxSeen) {\n maxSeen = seenThis;\n value = last;\n }\n seenThis = 1;\n last = sorted[i];\n // if this isn't a new number, it's one more occurrence of\n // the potential mode\n } else {\n seenThis++;\n }\n }\n return value;\n}\n\n/**\n * Sort an array of numbers by their numeric value, ensuring that the\n * array is not changed in place.\n *\n * This is necessary because the default behavior of .sort\n * in JavaScript is to sort arrays as string values\n *\n * [1, 10, 12, 102, 20].sort()\n * // output\n * [1, 10, 102, 12, 20]\n *\n * @param {Array<number>} x input array\n * @return {Array<number>} sorted array\n * @private\n * @example\n * numericSort([3, 2, 1]) // => [1, 2, 3]\n */\nfunction numericSort(x) {\n return (\n x\n // ensure the array is not changed in-place\n .slice()\n // comparator function that treats input as numeric\n .sort(function (a, b) {\n return a - b;\n })\n );\n}\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n log(n))` because it needs to sort the array internally\n * before running an `O(n)` search to find the mode.\n *\n * @param {Array<number>} x input\n * @returns {number} mode\n * @example\n * mode([0, 0, 1]); // => 0\n */\nfunction mode(x) {\n // Sorting the array lets us iterate through it below and be sure\n // that every time we see a new number it's new and we'll never\n // see the same number twice\n return modeSorted(numericSort(x));\n}\n\n/* globals Map: false */\n\n/**\n * The [mode](https://en.wikipedia.org/wiki/Mode_%28statistics%29) is the number\n * that appears in a list the highest number of times.\n * There can be multiple modes in a list: in the event of a tie, this\n * algorithm will return the most recently seen mode.\n *\n * modeFast uses a Map object to keep track of the mode, instead of the approach\n * used with `mode`, a sorted array. As a result, it is faster\n * than `mode` and supports any data type that can be compared with `==`.\n * It also requires a\n * [JavaScript environment with support for Map](https://kangax.github.io/compat-table/es6/#test-Map),\n * and will throw an error if Map is not available.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * @param {Array<*>} x a sample of one or more data points\n * @returns {?*} mode\n * @throws {ReferenceError} if the JavaScript environment doesn't support Map\n * @throws {Error} if x is empty\n * @example\n * modeFast(['rabbits', 'rabbits', 'squirrels']); // => 'rabbits'\n */\nfunction modeFast(x) {\n // This index will reflect the incidence of different values, indexing\n // them like\n // { value: count }\n var index = new Map();\n\n // A running `mode` and the number of times it has been encountered.\n var mode;\n var modeCount = 0;\n\n for (var i = 0; i < x.length; i++) {\n var newCount = index.get(x[i]);\n if (newCount === undefined) {\n newCount = 1;\n } else {\n newCount++;\n }\n if (newCount > modeCount) {\n mode = x[i];\n modeCount = newCount;\n }\n index.set(x[i], newCount);\n }\n\n if (modeCount === 0) {\n throw new Error(\"mode requires at last one data point\");\n }\n\n return mode;\n}\n\n/**\n * The min is the lowest number in the array.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} minimum value\n * @example\n * min([1, 5, -10, 100, 2]); // => -10\n */\nfunction min(x) {\n if (x.length === 0) {\n throw new Error(\"min requires at least one data point\");\n }\n\n var value = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] < value) {\n value = x[i];\n }\n }\n return value;\n}\n\n/**\n * This computes the maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * max([1, 2, 3, 4]);\n * // => 4\n */\nfunction max(x) {\n if (x.length === 0) {\n throw new Error(\"max requires at least one data point\");\n }\n\n var value = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] > value) {\n value = x[i];\n }\n }\n return value;\n}\n\n/**\n * This computes the minimum & maximum number in an array.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {Array<number>} minimum & maximum value\n * @throws {Error} if the length of x is less than one\n * @example\n * extent([1, 2, 3, 4]);\n * // => [1, 4]\n */\nfunction extent(x) {\n if (x.length === 0) {\n throw new Error(\"extent requires at least one data point\");\n }\n\n var min = x[0];\n var max = x[0];\n for (var i = 1; i < x.length; i++) {\n if (x[i] > max) {\n max = x[i];\n }\n if (x[i] < min) {\n min = x[i];\n }\n }\n return [min, max];\n}\n\n/**\n * The minimum is the lowest number in the array. With a sorted array,\n * the first element in the array is always the smallest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} minimum value\n * @example\n * minSorted([-100, -10, 1, 2, 5]); // => -100\n */\nfunction minSorted(x) {\n return x[0];\n}\n\n/**\n * The maximum is the highest number in the array. With a sorted array,\n * the last element in the array is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {number} maximum value\n * @example\n * maxSorted([-100, -10, 1, 2, 5]); // => 5\n */\nfunction maxSorted(x) {\n return x[x.length - 1];\n}\n\n/**\n * The extent is the lowest & highest number in the array. With a sorted array,\n * the first element in the array is always the lowest while the last element is always the largest, so this calculation\n * can be done in one step, or constant time.\n *\n * @param {Array<number>} x input\n * @returns {Array<number>} minimum & maximum value\n * @example\n * extentSorted([-100, -10, 1, 2, 5]); // => [-100, 5]\n */\nfunction extentSorted(x) {\n return [x[0], x[x.length - 1]];\n}\n\n/**\n * The simple [sum](https://en.wikipedia.org/wiki/Summation) of an array\n * is the result of adding all numbers together, starting from zero.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} sum of all input numbers\n * @example\n * sumSimple([1, 2, 3]); // => 6\n */\nfunction sumSimple(x) {\n var value = 0;\n for (var i = 0; i < x.length; i++) {\n if (typeof x[i] !== \"number\") {\n return NaN;\n }\n value += x[i];\n }\n return value;\n}\n\n/**\n * The [product](https://en.wikipedia.org/wiki/Product_(mathematics)) of an array\n * is the result of multiplying all numbers together, starting using one as the multiplicative identity.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x input\n * @return {number} product of all input numbers\n * @example\n * product([1, 2, 3, 4]); // => 24\n */\nfunction product(x) {\n var value = 1;\n for (var i = 0; i < x.length; i++) {\n value *= x[i];\n }\n return value;\n}\n\n/**\n * This is the internal implementation of quantiles: when you know\n * that the order is sorted, you don't need to re-sort it, and the computations\n * are faster.\n *\n * @param {Array<number>} x sample of one or more data points\n * @param {number} p desired quantile: a number between 0 to 1, inclusive\n * @returns {number} quantile value\n * @throws {Error} if p ix outside of the range from 0 to 1\n * @throws {Error} if x is empty\n * @example\n * quantileSorted([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantileSorted(x, p) {\n var idx = x.length * p;\n if (x.length === 0) {\n throw new Error(\"quantile requires at least one data point.\");\n } else if (p < 0 || p > 1) {\n throw new Error(\"quantiles must be between 0 and 1\");\n } else if (p === 1) {\n // If p is 1, directly return the last element\n return x[x.length - 1];\n } else if (p === 0) {\n // If p is 0, directly return the first element\n return x[0];\n } else if (idx % 1 !== 0) {\n // If p is not integer, return the next element in array\n return x[Math.ceil(idx) - 1];\n } else if (x.length % 2 === 0) {\n // If the list has even-length, we'll take the average of this number\n // and the next value, if there is one\n return (x[idx - 1] + x[idx]) / 2;\n } else {\n // Finally, in the simple case of an integer value\n // with an odd-length list, return the x value at the index.\n return x[idx];\n }\n}\n\n/**\n * Rearrange items in `arr` so that all items in `[left, k]` range are the smallest.\n * The `k`-th element will have the `(k - left + 1)`-th smallest value in `[left, right]`.\n *\n * Implements Floyd-Rivest selection algorithm https://en.wikipedia.org/wiki/Floyd-Rivest_algorithm\n *\n * @param {Array<number>} arr input array\n * @param {number} k pivot index\n * @param {number} [left] left index\n * @param {number} [right] right index\n * @returns {void} mutates input array\n * @example\n * var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];\n * quickselect(arr, 8);\n * // = [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]\n */\nfunction quickselect(arr, k, left, right) {\n left = left || 0;\n right = right || arr.length - 1;\n\n while (right > left) {\n // 600 and 0.5 are arbitrary constants chosen in the original paper to minimize execution time\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp((2 * z) / 3);\n var sd = 0.5 * Math.sqrt((z * s * (n - s)) / n);\n if (m - n / 2 < 0) { sd *= -1; }\n var newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd));\n var newRight = Math.min(\n right,\n Math.floor(k + ((n - m) * s) / n + sd)\n );\n quickselect(arr, k, newLeft, newRight);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (arr[right] > t) { swap(arr, left, right); }\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (arr[i] < t) { i++; }\n while (arr[j] > t) { j--; }\n }\n\n if (arr[left] === t) { swap(arr, left, j); }\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) { left = j + 1; }\n if (k <= j) { right = j - 1; }\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n/**\n * The [quantile](https://en.wikipedia.org/wiki/Quantile):\n * this is a population quantile, since we assume to know the entire\n * dataset in this library. This is an implementation of the\n * [Quantiles of a Population](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population)\n * algorithm from wikipedia.\n *\n * Sample is a one-dimensional array of numbers,\n * and p is either a decimal number from 0 to 1 or an array of decimal\n * numbers from 0 to 1.\n * In terms of a k/q quantile, p = k/q - it's just dealing with fractions or dealing\n * with decimal values.\n * When p is an array, the result of the function is also an array containing the appropriate\n * quantiles in input order\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {Array<number> | number} p the desired quantile, as a number between 0 and 1\n * @returns {number} quantile\n * @example\n * quantile([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20], 0.5); // => 9\n */\nfunction quantile(x, p) {\n var copy = x.slice();\n\n if (Array.isArray(p)) {\n // rearrange elements so that each element corresponding to a requested\n // quantile is on a place it would be if the array was fully sorted\n multiQuantileSelect(copy, p);\n // Initialize the result array\n var results = [];\n // For each requested quantile\n for (var i = 0; i < p.length; i++) {\n results[i] = quantileSorted(copy, p[i]);\n }\n return results;\n } else {\n var idx = quantileIndex(copy.length, p);\n quantileSelect(copy, idx, 0, copy.length - 1);\n return quantileSorted(copy, p);\n }\n}\n\nfunction quantileSelect(arr, k, left, right) {\n if (k % 1 === 0) {\n quickselect(arr, k, left, right);\n } else {\n k = Math.floor(k);\n quickselect(arr, k, left, right);\n quickselect(arr, k + 1, k + 1, right);\n }\n}\n\nfunction multiQuantileSelect(arr, p) {\n var indices = [0];\n for (var i = 0; i < p.length; i++) {\n indices.push(quantileIndex(arr.length, p[i]));\n }\n indices.push(arr.length - 1);\n indices.sort(compare);\n\n var stack = [0, indices.length - 1];\n\n while (stack.length) {\n var r = Math.ceil(stack.pop());\n var l = Math.floor(stack.pop());\n if (r - l <= 1) { continue; }\n\n var m = Math.floor((l + r) / 2);\n quantileSelect(\n arr,\n indices[m],\n Math.floor(indices[l]),\n Math.ceil(indices[r])\n );\n\n stack.push(l, m, m, r);\n }\n}\n\nfunction compare(a, b) {\n return a - b;\n}\n\nfunction quantileIndex(len, p) {\n var idx = len * p;\n if (p === 1) {\n // If p is 1, directly return the last index\n return len - 1;\n } else if (p === 0) {\n // If p is 0, directly return the first index\n return 0;\n } else if (idx % 1 !== 0) {\n // If index is not integer, return the next index in array\n return Math.ceil(idx) - 1;\n } else if (len % 2 === 0) {\n // If the list has even-length, we'll return the middle of two indices\n // around quantile to indicate that we need an average value of the two\n return idx - 0.5;\n } else {\n // Finally, in the simple case of an integer index\n // with an odd-length list, return the index\n return idx;\n }\n}\n\n/* eslint no-bitwise: 0 */\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. With a sorted array, leveraging binary search, we can find\n * this information in logarithmic time.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRankSorted([1, 2, 3, 4], 3); // => 0.75\n * quantileRankSorted([1, 2, 3, 3, 4], 3); // => 0.7\n * quantileRankSorted([1, 2, 3, 4], 6); // => 1\n * quantileRankSorted([1, 2, 3, 3, 5], 4); // => 0.8\n */\nfunction quantileRankSorted(x, value) {\n // Value is lesser than any value in the array\n if (value < x[0]) {\n return 0;\n }\n\n // Value is greater than any value in the array\n if (value > x[x.length - 1]) {\n return 1;\n }\n\n var l = lowerBound(x, value);\n\n // Value is not in the array\n if (x[l] !== value) {\n return l / x.length;\n }\n\n l++;\n\n var u = upperBound(x, value);\n\n // The value exists only once in the array\n if (u === l) {\n return l / x.length;\n }\n\n // Here, we are basically computing the mean of the range of indices\n // containing our searched value. But, instead, of initializing an\n // array and looping over it, there is a dedicated math formula that\n // we apply below to get the result.\n var r = u - l + 1;\n var sum = (r * (u + l)) / 2;\n var mean = sum / r;\n\n return mean / x.length;\n}\n\nfunction lowerBound(x, value) {\n var mid = 0;\n var lo = 0;\n var hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value <= x[mid]) {\n hi = mid;\n } else {\n lo = -~mid;\n }\n }\n\n return lo;\n}\n\nfunction upperBound(x, value) {\n var mid = 0;\n var lo = 0;\n var hi = x.length;\n\n while (lo < hi) {\n mid = (lo + hi) >>> 1;\n\n if (value >= x[mid]) {\n lo = -~mid;\n } else {\n hi = mid;\n }\n }\n\n return lo;\n}\n\n/**\n * This function returns the quantile in which one would find the given value in\n * the given array. It will copy and sort your array before each run, so\n * if you know your array is already sorted, you should use `quantileRankSorted`\n * instead.\n *\n * @param {Array<number>} x input\n * @returns {number} value value\n * @example\n * quantileRank([4, 3, 1, 2], 3); // => 0.75\n * quantileRank([4, 3, 2, 3, 1], 3); // => 0.7\n * quantileRank([2, 4, 1, 3], 6); // => 1\n * quantileRank([5, 3, 1, 2, 3], 4); // => 0.8\n */\nfunction quantileRank(x, value) {\n // Cloning and sorting the array\n var sortedCopy = numericSort(x);\n\n return quantileRankSorted(sortedCopy, value);\n}\n\n/**\n * The [Interquartile range](http://en.wikipedia.org/wiki/Interquartile_range) is\n * a measure of statistical dispersion, or how scattered, spread, or\n * concentrated a distribution is. It's computed as the difference between\n * the third quartile and first quartile.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @returns {number} interquartile range: the span between lower and upper quartile,\n * 0.25 and 0.75\n * @example\n * interquartileRange([0, 1, 2, 3]); // => 2\n */\nfunction interquartileRange(x) {\n // Interquartile range is the span between the upper quartile,\n // at `0.75`, and lower quartile, `0.25`\n var q1 = quantile(x, 0.75);\n var q2 = quantile(x, 0.25);\n\n if (typeof q1 === \"number\" && typeof q2 === \"number\") {\n return q1 - q2;\n }\n}\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} x input\n * @returns {number} median value\n * @example\n * median([10, 2, 5, 100, 2, 1]); // => 3.5\n */\nfunction median(x) {\n return +quantile(x, 0.5);\n}\n\n/**\n * The [Median Absolute Deviation](http://en.wikipedia.org/wiki/Median_absolute_deviation) is\n * a robust measure of statistical\n * dispersion. It is more resilient to outliers than the standard deviation.\n *\n * @param {Array<number>} x input array\n * @returns {number} median absolute deviation\n * @example\n * medianAbsoluteDeviation([1, 1, 2, 2, 4, 6, 9]); // => 1\n */\nfunction medianAbsoluteDeviation(x) {\n var medianValue = median(x);\n var medianAbsoluteDeviations = [];\n\n // Make a list of absolute deviations from the median\n for (var i = 0; i < x.length; i++) {\n medianAbsoluteDeviations.push(Math.abs(x[i] - medianValue));\n }\n\n // Find the median value of that list\n return median(medianAbsoluteDeviations);\n}\n\n/**\n * Split an array into chunks of a specified size. This function\n * has the same behavior as [PHP's array_chunk](http://php.net/manual/en/function.array-chunk.php)\n * function, and thus will insert smaller-sized chunks at the end if\n * the input size is not divisible by the chunk size.\n *\n * `x` is expected to be an array, and `chunkSize` a number.\n * The `x` array can contain any kind of data.\n *\n * @param {Array} x a sample\n * @param {number} chunkSize size of each output array. must be a positive integer\n * @returns {Array<Array>} a chunked array\n * @throws {Error} if chunk size is less than 1 or not an integer\n * @example\n * chunk([1, 2, 3, 4, 5, 6], 2);\n * // => [[1, 2], [3, 4], [5, 6]]\n */\nfunction chunk(x, chunkSize) {\n // a list of result chunks, as arrays in an array\n var output = [];\n\n // `chunkSize` must be zero or higher - otherwise the loop below,\n // in which we call `start += chunkSize`, will loop infinitely.\n // So, we'll detect and throw in that case to indicate\n // invalid input.\n if (chunkSize < 1) {\n throw new Error(\"chunk size must be a positive number\");\n }\n\n if (Math.floor(chunkSize) !== chunkSize) {\n throw new Error(\"chunk size must be an integer\");\n }\n\n // `start` is the index at which `.slice` will start selecting\n // new array elements\n for (var start = 0; start < x.length; start += chunkSize) {\n // for each chunk, slice that part of the array and add it\n // to the output. The `.slice` function does not change\n // the original array.\n output.push(x.slice(start, start + chunkSize));\n }\n return output;\n}\n\n/**\n * Sampling with replacement is a type of sampling that allows the same\n * item to be picked out of a population more than once.\n *\n * @param {Array<*>} x an array of any kind of value\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} n sampled items from the population\n * @example\n * var values = [1, 2, 3, 4];\n * sampleWithReplacement(values, 2); // returns 2 random values, like [2, 4];\n */\nfunction sampleWithReplacement(x, n, randomSource) {\n if (x.length === 0) {\n return [];\n }\n\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n var length = x.length;\n var sample = [];\n\n for (var i = 0; i < n; i++) {\n var index = Math.floor(randomSource() * length);\n\n sample.push(x[index]);\n }\n\n return sample;\n}\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * in-place - which means that it **will change the order of the original\n * array by reference**.\n *\n * This is an algorithm that generates a random [permutation](https://en.wikipedia.org/wiki/Permutation)\n * of a set.\n *\n * @param {Array} x sample of one or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @returns {Array} x\n * @example\n * var x = [1, 2, 3, 4];\n * shuffleInPlace(x);\n * // x is shuffled to a value like [2, 1, 4, 3]\n */\nfunction shuffleInPlace(x, randomSource) {\n // a custom random number source can be provided if you want to use\n // a fixed seed or another random number generator, like\n // [random-js](https://www.npmjs.org/package/random-js)\n randomSource = randomSource || Math.random;\n\n // store the current length of the x to determine\n // when no elements remain to shuffle.\n var length = x.length;\n\n // temporary is used to hold an item when it is being\n // swapped between indices.\n var temporary;\n\n // The index to swap at each stage.\n var index;\n\n // While there are still items to shuffle\n while (length > 0) {\n // choose a random index within the subset of the array\n // that is not yet shuffled\n index = Math.floor(randomSource() * length--);\n\n // store the value that we'll move temporarily\n temporary = x[length];\n\n // swap the value at `x[length]` with `x[index]`\n x[length] = x[index];\n x[index] = temporary;\n }\n\n return x;\n}\n\n/**\n * A [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)\n * is a fast way to create a random permutation of a finite set. This is\n * a function around `shuffle_in_place` that adds the guarantee that\n * it will not modify its input.\n *\n * @param {Array} x sample of 0 or more numbers\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} shuffled version of input\n * @example\n * var shuffled = shuffle([1, 2, 3, 4]);\n * shuffled; // = [2, 3, 1, 4] or any other random permutation\n */\nfunction shuffle(x, randomSource) {\n // slice the original array so that it is not modified\n var sample = x.slice();\n\n // and then shuffle that shallow-copied array, in place\n return shuffleInPlace(sample, randomSource);\n}\n\n/**\n * Create a [simple random sample](http://en.wikipedia.org/wiki/Simple_random_sample)\n * from a given array of `n` elements.\n *\n * The sampled values will be in any order, not necessarily the order\n * they appear in the input.\n *\n * @param {Array<any>} x input array. can contain any type\n * @param {number} n count of how many elements to take\n * @param {Function} [randomSource=Math.random] an optional entropy source that\n * returns numbers between 0 inclusive and 1 exclusive: the range [0, 1)\n * @return {Array} subset of n elements in original array\n *\n * @example\n * var values = [1, 2, 4, 5, 6, 7, 8, 9];\n * sample(values, 3); // returns 3 random values, like [2, 5, 8];\n */\nfunction sample(x, n, randomSource) {\n // shuffle the original array using a fisher-yates shuffle\n var shuffled = shuffle(x, randomSource);\n\n // and then return a subset of it - the first `n` elements.\n return shuffled.slice(0, n);\n}\n\n/**\n * Create a new column x row matrix.\n *\n * @private\n * @param {number} columns\n * @param {number} rows\n * @return {Array<Array<number>>} matrix\n * @example\n * makeMatrix(10, 10);\n */\nfunction makeMatrix(columns, rows) {\n var matrix = [];\n for (var i = 0; i < columns; i++) {\n var column = [];\n for (var j = 0; j < rows; j++) {\n column.push(0);\n }\n matrix.push(column);\n }\n return matrix;\n}\n\n/**\n * For a sorted input, counting the number of unique values\n * is possible in constant time and constant memory. This is\n * a simple implementation of the algorithm.\n *\n * Values are compared with `===`, so objects and non-primitive objects\n * are not handled in any special way.\n *\n * @param {Array<*>} x an array of any kind of value\n * @returns {number} count of unique values\n * @example\n * uniqueCountSorted([1, 2, 3]); // => 3\n * uniqueCountSorted([1, 1, 1]); // => 1\n */\nfunction uniqueCountSorted(x) {\n var uniqueValueCount = 0,\n lastSeenValue;\n for (var i = 0; i < x.length; i++) {\n if (i === 0 || x[i] !== lastSeenValue) {\n lastSeenValue = x[i];\n uniqueValueCount++;\n }\n }\n return uniqueValueCount;\n}\n\n/**\n * Generates incrementally computed values based on the sums and sums of\n * squares for the data array\n *\n * @private\n * @param {number} j\n * @param {number} i\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n * @return {number}\n * @example\n * ssq(0, 1, [-1, 0, 2], [1, 1, 5]);\n */\nfunction ssq(j, i, sums, sumsOfSquares) {\n var sji; // s(j, i)\n if (j > 0) {\n var muji = (sums[i] - sums[j - 1]) / (i - j + 1); // mu(j, i)\n sji =\n sumsOfSquares[i] - sumsOfSquares[j - 1] - (i - j + 1) * muji * muji;\n } else {\n sji = sumsOfSquares[i] - (sums[i] * sums[i]) / (i + 1);\n }\n if (sji < 0) {\n return 0;\n }\n return sji;\n}\n\n/**\n * Function that recursively divides and conquers computations\n * for cluster j\n *\n * @private\n * @param {number} iMin Minimum index in cluster to be computed\n * @param {number} iMax Maximum index in cluster to be computed\n * @param {number} cluster Index of the cluster currently being computed\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n * @param {Array<number>} sums\n * @param {Array<number>} sumsOfSquares\n */\nfunction fillMatrixColumn(\n iMin,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n) {\n if (iMin > iMax) {\n return;\n }\n\n // Start at midpoint between iMin and iMax\n var i = Math.floor((iMin + iMax) / 2);\n\n matrix[cluster][i] = matrix[cluster - 1][i - 1];\n backtrackMatrix[cluster][i] = i;\n\n var jlow = cluster; // the lower end for j\n\n if (iMin > cluster) {\n jlow = Math.max(jlow, backtrackMatrix[cluster][iMin - 1] || 0);\n }\n jlow = Math.max(jlow, backtrackMatrix[cluster - 1][i] || 0);\n\n var jhigh = i - 1; // the upper end for j\n if (iMax < matrix[0].length - 1) {\n jhigh = Math.min(jhigh, backtrackMatrix[cluster][iMax + 1] || 0);\n }\n\n var sji;\n var sjlowi;\n var ssqjlow;\n var ssqj;\n for (var j = jhigh; j >= jlow; --j) {\n sji = ssq(j, i, sums, sumsOfSquares);\n\n if (sji + matrix[cluster - 1][jlow - 1] >= matrix[cluster][i]) {\n break;\n }\n\n // Examine the lower bound of the cluster border\n sjlowi = ssq(jlow, i, sums, sumsOfSquares);\n\n ssqjlow = sjlowi + matrix[cluster - 1][jlow - 1];\n\n if (ssqjlow < matrix[cluster][i]) {\n // Shrink the lower bound\n matrix[cluster][i] = ssqjlow;\n backtrackMatrix[cluster][i] = jlow;\n }\n jlow++;\n\n ssqj = sji + matrix[cluster - 1][j - 1];\n if (ssqj < matrix[cluster][i]) {\n matrix[cluster][i] = ssqj;\n backtrackMatrix[cluster][i] = j;\n }\n }\n\n fillMatrixColumn(\n iMin,\n i - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n fillMatrixColumn(\n i + 1,\n iMax,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n}\n\n/**\n * Initializes the main matrices used in Ckmeans and kicks\n * off the divide and conquer cluster computation strategy\n *\n * @private\n * @param {Array<number>} data sorted array of values\n * @param {Array<Array<number>>} matrix\n * @param {Array<Array<number>>} backtrackMatrix\n */\nfunction fillMatrices(data, matrix, backtrackMatrix) {\n var nValues = matrix[0].length;\n\n // Shift values by the median to improve numeric stability\n var shift = data[Math.floor(nValues / 2)];\n\n // Cumulative sum and cumulative sum of squares for all values in data array\n var sums = [];\n var sumsOfSquares = [];\n\n // Initialize first column in matrix & backtrackMatrix\n for (var i = 0, shiftedValue = (void 0); i < nValues; ++i) {\n shiftedValue = data[i] - shift;\n if (i === 0) {\n sums.push(shiftedValue);\n sumsOfSquares.push(shiftedValue * shiftedValue);\n } else {\n sums.push(sums[i - 1] + shiftedValue);\n sumsOfSquares.push(\n sumsOfSquares[i - 1] + shiftedValue * shiftedValue\n );\n }\n\n // Initialize for cluster = 0\n matrix[0][i] = ssq(0, i, sums, sumsOfSquares);\n backtrackMatrix[0][i] = 0;\n }\n\n // Initialize the rest of the columns\n var iMin;\n for (var cluster = 1; cluster < matrix.length; ++cluster) {\n if (cluster < matrix.length - 1) {\n iMin = cluster;\n } else {\n // No need to compute matrix[K-1][0] ... matrix[K-1][N-2]\n iMin = nValues - 1;\n }\n\n fillMatrixColumn(\n iMin,\n nValues - 1,\n cluster,\n matrix,\n backtrackMatrix,\n sums,\n sumsOfSquares\n );\n }\n}\n\n/**\n * Ckmeans clustering is an improvement on heuristic-based clustering\n * approaches like Jenks. The algorithm was developed in\n * [Haizhou Wang and Mingzhou Song](http://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf)\n * as a [dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming) approach\n * to the problem of clustering numeric data into groups with the least\n * within-group sum-of-squared-deviations.\n *\n * Minimizing the difference within groups - what Wang & Song refer to as\n * `withinss`, or within sum-of-squares, means that groups are optimally\n * homogenous within and the data is split into representative groups.\n * This is very useful for visualization, where you may want to represent\n * a continuous variable in discrete color or style groups. This function\n * can provide groups that emphasize differences between data.\n *\n * Being a dynamic approach, this algorithm is based on two matrices that\n * store incrementally-computed values for squared deviations and backtracking\n * indexes.\n *\n * This implementation is based on Ckmeans 3.4.6, which introduced a new divide\n * and conquer approach that improved runtime from O(kn^2) to O(kn log(n)).\n *\n * Unlike the [original implementation](https://cran.r-project.org/web/packages/Ckmeans.1d.dp/index.html),\n * this implementation does not include any code to automatically determine\n * the optimal number of clusters: this information needs to be explicitly\n * provided.\n *\n * ### References\n * _Ckmeans.1d.dp: Optimal k-means Clustering in One Dimension by Dynamic\n * Programming_ Haizhou Wang and Mingzhou Song ISSN 2073-4859\n *\n * from The R Journal Vol. 3/2, December 2011\n * @param {Array<number>} x input data, as an array of number values\n * @param {number} nClusters number of desired classes. This cannot be\n * greater than the number of values in the data array.\n * @returns {Array<Array<number>>} clustered input\n * @throws {Error} if the number of requested clusters is higher than the size of the data\n * @example\n * ckmeans([-1, 2, -1, 2, 4, 5, 6, -1, 2, -1], 3);\n * // The input, clustered into groups of similar numbers.\n * //= [[-1, -1, -1, -1], [2, 2, 2], [4, 5, 6]]);\n */\nfunction ckmeans(x, nClusters) {\n if (nClusters > x.length) {\n throw new Error(\n \"cannot generate more classes than there are data values\"\n );\n }\n\n var sorted = numericSort(x);\n // we'll use this as the maximum number of clusters\n var uniqueCount = uniqueCountSorted(sorted);\n\n // if all of the input values are identical, there's one cluster\n // with all of the input in it.\n if (uniqueCount === 1) {\n return [sorted];\n }\n\n // named 'S' originally\n var matrix = makeMatrix(nClusters, sorted.length);\n // named 'J' originally\n var backtrackMatrix = makeMatrix(nClusters, sorted.length);\n\n // This is a dynamic programming way to solve the problem of minimizing\n // within-cluster sum of squares. It's similar to linear regression\n // in this way, and this calculation incrementally computes the\n // sum of squares that are later read.\n fillMatrices(sorted, matrix, backtrackMatrix);\n\n // The real work of Ckmeans clustering happens in the matrix generation:\n // the generated matrices encode all possible clustering combinations, and\n // once they're generated we can solve for the best clustering groups\n // very quickly.\n var clusters = [];\n var clusterRight = backtrackMatrix[0].length - 1;\n\n // Backtrack the clusters from the dynamic programming matrix. This\n // starts at the bottom-right corner of the matrix (if the top-left is 0, 0),\n // and moves the cluster target with the loop.\n for (var cluster = backtrackMatrix.length - 1; cluster >= 0; cluster--) {\n var clusterLeft = backtrackMatrix[cluster][clusterRight];\n\n // fill the cluster from the sorted input by taking a slice of the\n // array. the backtrack matrix makes this easy - it stores the\n // indexes where the cluster should start and end.\n clusters[cluster] = sorted.slice(clusterLeft, clusterRight + 1);\n\n if (cluster > 0) {\n clusterRight = clusterLeft - 1;\n }\n }\n\n return clusters;\n}\n\n/*\n * Pull Breaks Values for Jenks\n *\n * the second part of the jenks recipe: take the calculated matrices\n * and derive an array of n breaks.\n *\n * @private\n */\nfunction jenksBreaks(data, lowerClassLimits, nClasses) {\n var k = data.length;\n var kclass = [];\n var countNum = nClasses;\n\n // the calculation of classes will never include the upper\n // bound, so we need to explicitly set it\n kclass[nClasses] = data[data.length - 1];\n\n // the lowerClassLimits matrix is used as indices into itself\n // here: the `k` variable is reused in each iteration.\n while (countNum > 0) {\n kclass[countNum - 1] = data[lowerClassLimits[k][countNum] - 1];\n k = lowerClassLimits[k][countNum] - 1;\n countNum--;\n }\n\n return kclass;\n}\n\n/*\n * Compute Matrices for Jenks\n *\n * Compute the matrices required for Jenks breaks. These matrices\n * can be used for any classing of data with `classes <= nClasses`\n *\n * @private\n */\nfunction jenksMatrices(data, nClasses) {\n // in the original implementation, these matrices are referred to\n // as `LC` and `OP`\n //\n // * lowerClassLimits (LC): optimal lower class limits\n // * varianceCombinations (OP): optimal variance combinations for all classes\n var lowerClassLimits = [];\n var varianceCombinations = [];\n // loop counters\n var i, j;\n // the variance, as computed at each step in the calculation\n var variance = 0;\n\n // Initialize and fill each matrix with zeroes\n for (i = 0; i < data.length + 1; i++) {\n var tmp1 = [];\n var tmp2 = [];\n // despite these arrays having the same values, we need\n // to keep them separate so that changing one does not change\n // the other\n for (j = 0; j < nClasses + 1; j++) {\n tmp1.push(0);\n tmp2.push(0);\n }\n lowerClassLimits.push(tmp1);\n varianceCombinations.push(tmp2);\n }\n\n for (i = 1; i < nClasses + 1; i++) {\n lowerClassLimits[1][i] = 1;\n varianceCombinations[1][i] = 0;\n // in the original implementation, 9999999 is used but\n // since Javascript has `Infinity`, we use that.\n for (j = 2; j < data.length + 1; j++) {\n varianceCombinations[j][i] = Infinity;\n }\n }\n\n for (var l = 2; l < data.length + 1; l++) {\n // `SZ` originally. this is the sum of the values seen thus\n // far when calculating variance.\n var sum = 0;\n // `ZSQ` originally. the sum of squares of values seen\n // thus far\n var sumSquares = 0;\n // `WT` originally. This is the number of\n var w = 0;\n // `IV` originally\n var i4 = 0;\n\n // in several instances, you could say `Math.pow(x, 2)`\n // instead of `x * x`, but this is slower in some browsers\n // introduces an unnecessary concept.\n for (var m = 1; m < l + 1; m++) {\n // `III` originally\n var lowerClassLimit = l - m + 1;\n var val = data[lowerClassLimit - 1];\n\n // here we're estimating variance for each potential classing\n // of the data, for each potential number of classes. `w`\n // is the number of data points considered so far.\n w++;\n\n // increase the current sum and sum-of-squares\n sum += val;\n sumSquares += val * val;\n\n // the variance at this point in the sequence is the difference\n // between the sum of squares and the total x 2, over the number\n // of samples.\n variance = sumSquares - (sum * sum) / w;\n\n i4 = lowerClassLimit - 1;\n\n if (i4 !== 0) {\n for (j = 2; j < nClasses + 1; j++) {\n // if adding this element to an existing class\n // will increase its variance beyond the limit, break\n // the class at this point, setting the `lowerClassLimit`\n // at this point.\n if (\n varianceCombinations[l][j] >=\n variance + varianceCombinations[i4][j - 1]\n ) {\n lowerClassLimits[l][j] = lowerClassLimit;\n varianceCombinations[l][j] =\n variance + varianceCombinations[i4][j - 1];\n }\n }\n }\n }\n\n lowerClassLimits[l][1] = 1;\n varianceCombinations[l][1] = variance;\n }\n\n // return the two matrices. for just providing breaks, only\n // `lowerClassLimits` is needed, but variances can be useful to\n // evaluate goodness of fit.\n return {\n lowerClassLimits: lowerClassLimits,\n varianceCombinations: varianceCombinations\n };\n}\n\n/**\n * The **[jenks natural breaks optimization](http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization)**\n * is an algorithm commonly used in cartography and visualization to decide\n * upon groupings of data values that minimize variance within themselves\n * and maximize variation between themselves.\n *\n * For instance, cartographers often use jenks in order to choose which\n * values are assigned to which colors in a [choropleth](https://en.wikipedia.org/wiki/Choropleth_map)\n * map.\n *\n * @param {Array<number>} data input data, as an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * // split data into 3 break points\n * jenks([1, 2, 4, 5, 7, 9, 10, 20], 3) // = [1, 7, 20, 20]\n */\nfunction jenks(data, nClasses) {\n if (nClasses > data.length) {\n return null;\n }\n\n // sort data in numerical order, since this is expected\n // by the matrices function\n data = data.slice().sort(function (a, b) {\n return a - b;\n });\n\n // get our basic matrices\n var matrices = jenksMatrices(data, nClasses);\n // we only need lower class limits here\n var lowerClassLimits = matrices.lowerClassLimits;\n\n // extract nClasses out of the computed matrices\n return jenksBreaks(data, lowerClassLimits, nClasses);\n}\n\n/**\n * Given an array of x, this will find the extent of the\n * x and return an array of breaks that can be used\n * to categorize the x into a number of classes. The\n * returned array will always be 1 longer than the number of\n * classes because it includes the minimum value.\n *\n * @param {Array<number>} x an array of number values\n * @param {number} nClasses number of desired classes\n * @returns {Array<number>} array of class break positions\n * @example\n * equalIntervalBreaks([1, 2, 3, 4, 5, 6], 4); // => [1, 2.25, 3.5, 4.75, 6]\n */\nfunction equalIntervalBreaks(x, nClasses) {\n if (x.length < 2) {\n return x;\n }\n\n var theMin = min(x);\n var theMax = max(x);\n\n // the first break will always be the minimum value\n // in the xset\n var breaks = [theMin];\n\n // The size of each break is the full range of the x\n // divided by the number of classes requested\n var breakSize = (theMax - theMin) / nClasses;\n\n // In the case of nClasses = 1, this loop won't run\n // and the returned breaks will be [min, max]\n for (var i = 1; i < nClasses; i++) {\n breaks.push(breaks[0] + breakSize * i);\n }\n\n // the last break will always be the\n // maximum.\n breaks.push(theMax);\n\n return breaks;\n}\n\n/**\n * [Sample covariance](https://en.wikipedia.org/wiki/Sample_mean_and_covariance) of two datasets:\n * how much do the two datasets move together?\n * x and y are two datasets, represented as arrays of numbers.\n *\n * @param {Array<number>} x a sample of two or more data points\n * @param {Array<number>} y a sample of two or more data points\n * @throws {Error} if x and y do not have equal lengths\n * @throws {Error} if x or y have length of one or less\n * @returns {number} sample covariance\n * @example\n * sampleCovariance([1, 2, 3, 4, 5, 6], [6, 5, 4, 3, 2, 1]); // => -3.5\n */\nfunction sampleCovariance(x, y) {\n // The two datasets must have the same length which must be more than 1\n if (x.length !== y.length) {\n throw new Error(\"sampleCovariance requires samples with equal lengths\");\n }\n\n if (x.length < 2) {\n throw new Error(\n \"sampleCovariance requires at least two data points in each sample\"\n );\n }\n\n // determine the mean of each dataset so that we can judge each\n // value of the dataset fairly as the difference from the mean. this\n // way, if one dataset is [1, 2, 3] and [2, 3, 4], their covariance\n // does not suffer because of the difference in absolute values\n var xmean = mean(x);\n var ymean = mean(y);\n var sum = 0;\n\n // for each pair of values, the covariance increases when their\n // difference from the mean is associated - if both are well above\n // or if both are well below\n // the mean, the covariance increases significantly.\n for (var i = 0; i < x.length; i++) {\n sum += (x[i] - xmean) * (y[i] - ymean);\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // the covariance is weighted by the length of the datasets.\n return sum / besselsCorrection;\n}\n\n/**\n * The [sample variance](https://en.wikipedia.org/wiki/Variance#Sample_variance)\n * is the sum of squared deviations from the mean. The sample variance\n * is distinguished from the variance by the usage of [Bessel's Correction](https://en.wikipedia.org/wiki/Bessel's_correction):\n * instead of dividing the sum of squared deviations by the length of the input,\n * it is divided by the length minus one. This corrects the bias in estimating\n * a value from a set that you don't know if full.\n *\n * References:\n * * [Wolfram MathWorld on Sample Variance](http://mathworld.wolfram.com/SampleVariance.html)\n *\n * @param {Array<number>} x a sample of two or more data points\n * @throws {Error} if the length of x is less than 2\n * @return {number} sample variance\n * @example\n * sampleVariance([1, 2, 3, 4, 5]); // => 2.5\n */\nfunction sampleVariance(x) {\n if (x.length < 2) {\n throw new Error(\"sampleVariance requires at least two data points\");\n }\n\n var sumSquaredDeviationsValue = sumNthPowerDeviations(x, 2);\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n return sumSquaredDeviationsValue / besselsCorrection;\n}\n\n/**\n * The [sample standard deviation](http://en.wikipedia.org/wiki/Standard_deviation#Sample_standard_deviation)\n * is the square root of the sample variance.\n *\n * @param {Array<number>} x input array\n * @returns {number} sample standard deviation\n * @example\n * sampleStandardDeviation([2, 4, 4, 4, 5, 5, 7, 9]).toFixed(2);\n * // => '2.14'\n */\nfunction sampleStandardDeviation(x) {\n var sampleVarianceX = sampleVariance(x);\n return Math.sqrt(sampleVarianceX);\n}\n\n/**\n * The [correlation](http://en.wikipedia.org/wiki/Correlation_and_dependence) is\n * a measure of how correlated two datasets are, between -1 and 1\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample correlation\n * @example\n * sampleCorrelation([1, 2, 3, 4, 5, 6], [2, 2, 3, 4, 5, 60]).toFixed(2);\n * // => '0.69'\n */\nfunction sampleCorrelation(x, y) {\n var cov = sampleCovariance(x, y);\n var xstd = sampleStandardDeviation(x);\n var ystd = sampleStandardDeviation(y);\n\n return cov / xstd / ystd;\n}\n\n/**\n * The [rank correlation](https://en.wikipedia.org/wiki/Rank_correlation) is\n * a measure of the strength of monotonic relationship between two arrays\n *\n * @param {Array<number>} x first input\n * @param {Array<number>} y second input\n * @returns {number} sample rank correlation\n */\nfunction sampleRankCorrelation(x, y) {\n var xIndexes = x\n .map(function (value, index) { return [value, index]; })\n .sort(function (a, b) { return a[0] - b[0]; })\n .map(function (pair) { return pair[1]; });\n var yIndexes = y\n .map(function (value, index) { return [value, index]; })\n .sort(function (a, b) { return a[0] - b[0]; })\n .map(function (pair) { return pair[1]; });\n\n // At this step, we have an array of indexes\n // that map from sorted numbers to their original indexes. We reverse\n // that so that it is an array of the sorted destination index.\n var xRanks = Array(xIndexes.length);\n var yRanks = Array(xIndexes.length);\n for (var i = 0; i < xIndexes.length; i++) {\n xRanks[xIndexes[i]] = i;\n yRanks[yIndexes[i]] = i;\n }\n\n return sampleCorrelation(xRanks, yRanks);\n}\n\n/**\n * [Skewness](http://en.wikipedia.org/wiki/Skewness) is\n * a measure of the extent to which a probability distribution of a\n * real-valued random variable \"leans\" to one side of the mean.\n * The skewness value can be positive or negative, or even undefined.\n *\n * Implementation is based on the adjusted Fisher-Pearson standardized\n * moment coefficient, which is the version found in Excel and several\n * statistical packages including Minitab, SAS and SPSS.\n *\n * @since 4.1.0\n * @param {Array<number>} x a sample of 3 or more data points\n * @returns {number} sample skewness\n * @throws {Error} if x has length less than 3\n * @example\n * sampleSkewness([2, 4, 6, 3, 1]); // => 0.590128656384365\n */\nfunction sampleSkewness(x) {\n if (x.length < 3) {\n throw new Error(\"sampleSkewness requires at least three data points\");\n }\n\n var meanValue = mean(x);\n var tempValue;\n var sumSquaredDeviations = 0;\n var sumCubedDeviations = 0;\n\n for (var i = 0; i < x.length; i++) {\n tempValue = x[i] - meanValue;\n sumSquaredDeviations += tempValue * tempValue;\n sumCubedDeviations += tempValue * tempValue * tempValue;\n }\n\n // this is Bessels' Correction: an adjustment made to sample statistics\n // that allows for the reduced degree of freedom entailed in calculating\n // values from samples rather than complete populations.\n var besselsCorrection = x.length - 1;\n\n // Find the mean value of that list\n var theSampleStandardDeviation = Math.sqrt(\n sumSquaredDeviations / besselsCorrection\n );\n\n var n = x.length;\n var cubedS = Math.pow(theSampleStandardDeviation, 3);\n\n return (n * sumCubedDeviations) / ((n - 1) * (n - 2) * cubedS);\n}\n\n/**\n * [Kurtosis](http://en.wikipedia.org/wiki/Kurtosis) is\n * a measure of the heaviness of a distribution's tails relative to its\n * variance. The kurtosis value can be positive or negative, or even undefined.\n *\n * Implementation is based on Fisher's excess kurtosis definition and uses\n * unbiased moment estimators. This is the version found in Excel and available\n * in several statistical packages, including SAS and SciPy.\n *\n * @param {Array<number>} x a sample of 4 or more data points\n * @returns {number} sample kurtosis\n * @throws {Error} if x has length less than 4\n * @example\n * sampleKurtosis([1, 2, 2, 3, 5]); // => 1.4555765595463122\n */\nfunction sampleKurtosis(x) {\n var n = x.length;\n\n if (n < 4) {\n throw new Error(\"sampleKurtosis requires at least four data points\");\n }\n\n var meanValue = mean(x);\n var tempValue;\n var secondCentralMoment = 0;\n var fourthCentralMoment = 0;\n\n for (var i = 0; i < n; i++) {\n tempValue = x[i] - meanValue;\n secondCentralMoment += tempValue * tempValue;\n fourthCentralMoment += tempValue * tempValue * tempValue * tempValue;\n }\n\n return (\n ((n - 1) / ((n - 2) * (n - 3))) *\n ((n * (n + 1) * fourthCentralMoment) /\n (secondCentralMoment * secondCentralMoment) -\n 3 * (n - 1))\n );\n}\n\n/**\n * Implementation of [Heap's Algorithm](https://en.wikipedia.org/wiki/Heap%27s_algorithm)\n * for generating permutations.\n *\n * @param {Array} elements any type of data\n * @returns {Array<Array>} array of permutations\n */\nfunction permutationsHeap(elements) {\n var indexes = new Array(elements.length);\n var permutations = [elements.slice()];\n\n for (var i = 0; i < elements.length; i++) {\n indexes[i] = 0;\n }\n\n for (var i$1 = 0; i$1 < elements.length; ) {\n if (indexes[i$1] < i$1) {\n // At odd indexes, swap from indexes[i] instead\n // of from the beginning of the array\n var swapFrom = 0;\n if (i$1 % 2 !== 0) {\n swapFrom = indexes[i$1];\n }\n\n // swap between swapFrom and i, using\n // a temporary variable as storage.\n var temp = elements[swapFrom];\n elements[swapFrom] = elements[i$1];\n elements[i$1] = temp;\n\n permutations.push(elements.slice());\n indexes[i$1]++;\n i$1 = 0;\n } else {\n indexes[i$1] = 0;\n i$1++;\n }\n }\n\n return permutations;\n}\n\n/**\n * Implementation of Combinations\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * https://en.wikipedia.org/wiki/Combination\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinations([1, 2, 3], 2); // => [[1,2], [1,3], [2,3]]\n */\n\nfunction combinations(x, k) {\n var i;\n var subI;\n var combinationList = [];\n var subsetCombinations;\n var next;\n\n for (i = 0; i < x.length; i++) {\n if (k === 1) {\n combinationList.push([x[i]]);\n } else {\n subsetCombinations = combinations(x.slice(i + 1, x.length), k - 1);\n for (subI = 0; subI < subsetCombinations.length; subI++) {\n next = subsetCombinations[subI];\n next.unshift(x[i]);\n combinationList.push(next);\n }\n }\n }\n return combinationList;\n}\n\n/**\n * Implementation of [Combinations](https://en.wikipedia.org/wiki/Combination) with replacement\n * Combinations are unique subsets of a collection - in this case, k x from a collection at a time.\n * 'With replacement' means that a given element can be chosen multiple times.\n * Unlike permutation, order doesn't matter for combinations.\n *\n * @param {Array} x any type of data\n * @param {int} k the number of objects in each group (without replacement)\n * @returns {Array<Array>} array of permutations\n * @example\n * combinationsReplacement([1, 2], 2); // => [[1, 1], [1, 2], [2, 2]]\n */\nfunction combinationsReplacement(x, k) {\n var combinationList = [];\n\n for (var i = 0; i < x.length; i++) {\n if (k === 1) {\n // If we're requested to find only one element, we don't need\n // to recurse: just push `x[i]` onto the list of combinations.\n combinationList.push([x[i]]);\n } else {\n // Otherwise, recursively find combinations, given `k - 1`. Note that\n // we request `k - 1`, so if you were looking for k=3 combinations, we're\n // requesting k=2. This -1 gets reversed in the for loop right after this\n // code, since we concatenate `x[i]` onto the selected combinations,\n // bringing `k` back up to your requested level.\n // This recursion may go many levels deep, since it only stops once\n // k=1.\n var subsetCombinations = combinationsReplacement(\n x.slice(i, x.length),\n k - 1\n );\n\n for (var j = 0; j < subsetCombinations.length; j++) {\n combinationList.push([x[i]].concat(subsetCombinations[j]));\n }\n }\n }\n\n return combinationList;\n}\n\n/**\n * When adding a new value to a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the new\n * value to add.\n *\n * @since 2.5.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} newValue the added value\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean, n, newValue) {\n return mean + (newValue - mean) / (n + 1);\n}\n\n/**\n * When combining two lists of values for which one already knows the means,\n * one does not have to necessary recompute the mean of the combined lists in\n * linear time. They can instead use this function to compute the combined\n * mean by providing the mean & number of values of the first list and the mean\n * & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineMeans(5, 3, 4, 3); // => 4.5\n */\nfunction combineMeans(mean1, n1, mean2, n2) {\n return (mean1 * n1 + mean2 * n2) / (n1 + n2);\n}\n\n/**\n * When combining two lists of values for which one already knows the variances,\n * one does not have to necessary recompute the variance of the combined lists\n * in linear time. They can instead use this function to compute the combined\n * variance by providing the variance, mean & number of values of the first list\n * and the variance, mean & number of values of the second list.\n *\n * @since 3.0.0\n * @param {number} variance1 variance of the first list\n * @param {number} mean1 mean of the first list\n * @param {number} n1 number of items in the first list\n * @param {number} variance2 variance of the second list\n * @param {number} mean2 mean of the second list\n * @param {number} n2 number of items in the second list\n * @returns {number} the combined mean\n *\n * @example\n * combineVariances(14 / 3, 5, 3, 8 / 3, 4, 3); // => 47 / 12\n */\nfunction combineVariances(variance1, mean1, n1, variance2, mean2, n2) {\n var newMean = combineMeans(mean1, n1, mean2, n2);\n\n return (\n (n1 * (variance1 + Math.pow(mean1 - newMean, 2)) +\n n2 * (variance2 + Math.pow(mean2 - newMean, 2))) /\n (n1 + n2)\n );\n}\n\n/**\n * The [Geometric Mean](https://en.wikipedia.org/wiki/Geometric_mean) is\n * a mean function that is more useful for numbers in different\n * ranges.\n *\n * This is the nth root of the input numbers multiplied by each other.\n *\n * The geometric mean is often useful for\n * **[proportional growth](https://en.wikipedia.org/wiki/Geometric_mean#Proportional_growth)**: given\n * growth rates for multiple years, like _80%, 16.66% and 42.85%_, a simple\n * mean will incorrectly estimate an average growth rate, whereas a geometric\n * mean will correctly estimate a growth rate that, over those years,\n * will yield the same end value.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * var growthRates = [1.80, 1.166666, 1.428571];\n * var averageGrowth = ss.geometricMean(growthRates);\n * var averageGrowthRates = [averageGrowth, averageGrowth, averageGrowth];\n * var startingValue = 10;\n * var startingValueMean = 10;\n * growthRates.forEach(function(rate) {\n * startingValue *= rate;\n * });\n * averageGrowthRates.forEach(function(rate) {\n * startingValueMean *= rate;\n * });\n * startingValueMean === startingValue;\n */\nfunction geometricMean(x) {\n if (x.length === 0) {\n throw new Error(\"geometricMean requires at least one data point\");\n }\n\n // the starting value.\n var value = 1;\n\n for (var i = 0; i < x.length; i++) {\n // the geometric mean is only valid for positive numbers\n if (x[i] < 0) {\n throw new Error(\n \"geometricMean requires only non-negative numbers as input\"\n );\n }\n\n // repeatedly multiply the value by each number\n value *= x[i];\n }\n\n return Math.pow(value, 1 / x.length);\n}\n\n/**\n * The [log average](https://en.wikipedia.org/wiki/https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_logarithms)\n * is an equivalent way of computing the geometric mean of an array suitable for large or small products.\n *\n * It's found by calculating the average logarithm of the elements and exponentiating.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} geometric mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n */\nfunction logAverage(x) {\n if (x.length === 0) {\n throw new Error(\"logAverage requires at least one data point\");\n }\n\n var value = 0;\n for (var i = 0; i < x.length; i++) {\n if (x[i] < 0) {\n throw new Error(\n \"logAverage requires only non-negative numbers as input\"\n );\n }\n value += Math.log(x[i]);\n }\n\n return Math.exp(value / x.length);\n}\n\n/**\n * The [Harmonic Mean](https://en.wikipedia.org/wiki/Harmonic_mean) is\n * a mean function typically used to find the average of rates.\n * This mean is calculated by taking the reciprocal of the arithmetic mean\n * of the reciprocals of the input numbers.\n *\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x sample of one or more data points\n * @returns {number} harmonic mean\n * @throws {Error} if x is empty\n * @throws {Error} if x contains a negative number\n * @example\n * harmonicMean([2, 3]).toFixed(2) // => '2.40'\n */\nfunction harmonicMean(x) {\n if (x.length === 0) {\n throw new Error(\"harmonicMean requires at least one data point\");\n }\n\n var reciprocalSum = 0;\n\n for (var i = 0; i < x.length; i++) {\n // the harmonic mean is only valid for positive numbers\n if (x[i] <= 0) {\n throw new Error(\n \"harmonicMean requires only positive numbers as input\"\n );\n }\n\n reciprocalSum += 1 / x[i];\n }\n\n // divide n by the reciprocal sum\n return x.length / reciprocalSum;\n}\n\n/**\n * The mean, _also known as average_,\n * is the sum of all values over the number of values.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The simple mean uses the successive addition method internally\n * to calculate it's result. Errors in floating-point addition are\n * not accounted for, so if precision is required, the standard {@link mean}\n * method should be used instead.\n *\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n *\n * @param {Array<number>} x sample of one or more data points\n * @throws {Error} if the length of x is less than one\n * @returns {number} mean\n * @example\n * mean([0, 10]); // => 5\n */\nfunction meanSimple(x) {\n if (x.length === 0) {\n throw new Error(\"meanSimple requires at least one data point\");\n }\n\n return sumSimple(x) / x.length;\n}\n\n/**\n * The [median](http://en.wikipedia.org/wiki/Median) is\n * the middle number of a list. This is often a good indicator of 'the middle'\n * when there are outliers that skew the `mean()` value.\n * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency):\n * a method of finding a typical or central value of a set of numbers.\n *\n * The median isn't necessarily one of the elements in the list: the value\n * can be the average of two elements if the list has an even length\n * and the two central values are different.\n *\n * @param {Array<number>} sorted input\n * @returns {number} median value\n * @example\n * medianSorted([10, 2, 5, 100, 2, 1]); // => 52.5\n */\nfunction medianSorted(sorted) {\n return quantileSorted(sorted, 0.5);\n}\n\n/**\n * When removing a value from a list, one does not have to necessary\n * recompute the mean of the list in linear time. They can instead use\n * this function to compute the new mean by providing the current mean,\n * the number of elements in the list that produced it and the value to remove.\n *\n * @since 3.0.0\n * @param {number} mean current mean\n * @param {number} n number of items in the list\n * @param {number} value the value to remove\n * @returns {number} the new mean\n *\n * @example\n * subtractFromMean(20.5, 6, 53); // => 14\n */\nfunction subtractFromMean(mean, n, value) {\n return (mean * n - value) / (n - 1);\n}\n\n/**\n * The Root Mean Square (RMS) is\n * a mean function used as a measure of the magnitude of a set\n * of numbers, regardless of their sign.\n * This is the square root of the mean of the squares of the\n * input numbers.\n * This runs in `O(n)`, linear time, with respect to the length of the array.\n *\n * @param {Array<number>} x a sample of one or more data points\n * @returns {number} root mean square\n * @throws {Error} if x is empty\n * @example\n * rootMeanSquare([-1, 1, -1, 1]); // => 1\n */\nfunction rootMeanSquare(x) {\n if (x.length === 0) {\n throw new Error(\"rootMeanSquare requires at least one data point\");\n }\n\n var sumOfSquares = 0;\n for (var i = 0; i < x.length; i++) {\n sumOfSquares += Math.pow(x[i], 2);\n }\n\n return Math.sqrt(sumOfSquares / x.length);\n}\n\n/**\n * The`coefficient of variation`_ is the ratio of the standard deviation to the mean.\n * .._`coefficient of variation`: https://en.wikipedia.org/wiki/Coefficient_of_variation\n *\n *\n * @param {Array} x input\n * @returns {number} coefficient of variation\n * @example\n * coefficientOfVariation([1, 2, 3, 4]).toFixed(3); // => 0.516\n * coefficientOfVariation([1, 2, 3, 4, 5]).toFixed(3); // => 0.527\n * coefficientOfVariation([-1, 0, 1, 2, 3, 4]).toFixed(3); // => 1.247\n */\nfunction coefficientOfVariation(x) {\n return sampleStandardDeviation(x) / mean(x);\n}\n\n/**\n * This is to compute [a one-sample t-test](https://en.wikipedia.org/wiki/Student%27s_t-test#One-sample_t-test), comparing the mean\n * of a sample to a known value, x.\n *\n * in this case, we're trying to determine whether the\n * population mean is equal to the value that we know, which is `x`\n * here. Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * @param {Array<number>} x sample of one or more numbers\n * @param {number} expectedValue expected value of the population mean\n * @returns {number} value\n * @example\n * tTest([1, 2, 3, 4, 5, 6], 3.385).toFixed(2); // => '0.16'\n */\nfunction tTest(x, expectedValue) {\n // The mean of the sample\n var sampleMean = mean(x);\n\n // The standard deviation of the sample\n var sd = standardDeviation(x);\n\n // Square root the length of the sample\n var rootN = Math.sqrt(x.length);\n\n // returning the t value\n return (sampleMean - expectedValue) / (sd / rootN);\n}\n\n/**\n * This is to compute [two sample t-test](http://en.wikipedia.org/wiki/Student's_t-test).\n * Tests whether \"mean(X)-mean(Y) = difference\", (\n * in the most common case, we often have `difference == 0` to test if two samples\n * are likely to be taken from populations with the same mean value) with\n * no prior knowledge on standard deviations of both samples\n * other than the fact that they have the same standard deviation.\n *\n * Usually the results here are used to look up a\n * [p-value](http://en.wikipedia.org/wiki/P-value), which, for\n * a certain level of significance, will let you determine that the\n * null hypothesis can or cannot be rejected.\n *\n * `diff` can be omitted if it equals 0.\n *\n * [This is used to reject](https://en.wikipedia.org/wiki/Exclusion_of_the_null_hypothesis)\n * a null hypothesis that the two populations that have been sampled into\n * `sampleX` and `sampleY` are equal to each other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @param {number} [difference=0]\n * @returns {number|null} test result\n *\n * @example\n * tTestTwoSample([1, 2, 3, 4], [3, 4, 5, 6], 0); // => -2.1908902300206643\n */\nfunction tTestTwoSample(sampleX, sampleY, difference) {\n var n = sampleX.length;\n var m = sampleY.length;\n\n // If either sample doesn't actually have any values, we can't\n // compute this at all, so we return `null`.\n if (!n || !m) {\n return null;\n }\n\n // default difference (mu) is zero\n if (!difference) {\n difference = 0;\n }\n\n var meanX = mean(sampleX);\n var meanY = mean(sampleY);\n var sampleVarianceX = sampleVariance(sampleX);\n var sampleVarianceY = sampleVariance(sampleY);\n\n if (\n typeof meanX === \"number\" &&\n typeof meanY === \"number\" &&\n typeof sampleVarianceX === \"number\" &&\n typeof sampleVarianceY === \"number\"\n ) {\n var weightedVariance =\n ((n - 1) * sampleVarianceX + (m - 1) * sampleVarianceY) /\n (n + m - 2);\n\n return (\n (meanX - meanY - difference) /\n Math.sqrt(weightedVariance * (1 / n + 1 / m))\n );\n }\n}\n\n/**\n * This function calculates the Wilcoxon rank sum statistic for the first sample\n * with respect to the second. The Wilcoxon rank sum test is a non-parametric\n * alternative to the t-test which is equivalent to the\n * [Mann-Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test).\n * The statistic is calculated by pooling all the observations together, ranking them,\n * and then summing the ranks associated with one of the samples. If this rank sum is\n * sufficiently large or small we reject the hypothesis that the two samples come\n * from the same distribution in favor of the alternative that one is shifted with\n * respect to the other.\n *\n * @param {Array<number>} sampleX a sample as an array of numbers\n * @param {Array<number>} sampleY a sample as an array of numbers\n * @returns {number} rank sum for sampleX\n *\n * @example\n * wilcoxonRankSum([1, 4, 8], [9, 12, 15]); // => 6\n */\nfunction wilcoxonRankSum(sampleX, sampleY) {\n if (!sampleX.length || !sampleY.length) {\n throw new Error(\"Neither sample can be empty\");\n }\n\n var pooledSamples = sampleX\n .map(function (x) { return ({ label: \"x\", value: x }); })\n .concat(sampleY.map(function (y) { return ({ label: \"y\", value: y }); }))\n .sort(function (a, b) { return a.value - b.value; });\n\n for (var rank = 0; rank < pooledSamples.length; rank++) {\n pooledSamples[rank].rank = rank;\n }\n\n var tiedRanks = [pooledSamples[0].rank];\n for (var i = 1; i < pooledSamples.length; i++) {\n if (pooledSamples[i].value === pooledSamples[i - 1].value) {\n tiedRanks.push(pooledSamples[i].rank);\n if (i === pooledSamples.length - 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n }\n } else if (tiedRanks.length > 1) {\n replaceRanksInPlace(pooledSamples, tiedRanks);\n } else {\n tiedRanks = [pooledSamples[i].rank];\n }\n }\n\n function replaceRanksInPlace(pooledSamples, tiedRanks) {\n var average = (tiedRanks[0] + tiedRanks[tiedRanks.length - 1]) / 2;\n for (var i = 0; i < tiedRanks.length; i++) {\n pooledSamples[tiedRanks[i]].rank = average;\n }\n }\n\n var rankSum = 0;\n\n for (var i$1 = 0; i$1 < pooledSamples.length; i$1++) {\n var sample = pooledSamples[i$1];\n if (sample.label === \"x\") {\n rankSum += sample.rank + 1;\n }\n }\n\n return rankSum;\n}\n\n/**\n * [Bayesian Classifier](http://en.wikipedia.org/wiki/Naive_Bayes_classifier)\n *\n * This is a naïve bayesian classifier that takes\n * singly-nested objects.\n *\n * @class\n * @example\n * var bayes = new BayesianClassifier();\n * bayes.train({\n * species: 'Cat'\n * }, 'animal');\n * var result = bayes.score({\n * species: 'Cat'\n * })\n * // result\n * // {\n * // animal: 1\n * // }\n */\nvar BayesianClassifier = function BayesianClassifier() {\n // The number of items that are currently\n // classified in the model\n this.totalCount = 0;\n // Every item classified in the model\n this.data = {};\n};\n\n/**\n * Train the classifier with a new item, which has a single\n * dimension of Javascript literal keys and values.\n *\n * @param {Object} item an object with singly-deep properties\n * @param {string} category the category this item belongs to\n * @return {undefined} adds the item to the classifier\n */\nBayesianClassifier.prototype.train = function train (item, category) {\n // If the data object doesn't have any values\n // for this category, create a new object for it.\n if (!this.data[category]) {\n this.data[category] = {};\n }\n\n // Iterate through each key in the item.\n for (var k in item) {\n var v = item[k];\n // Initialize the nested object `data[category][k][item[k]]`\n // with an object of keys that equal 0.\n if (this.data[category][k] === undefined) {\n this.data[category][k] = {};\n }\n if (this.data[category][k][v] === undefined) {\n this.data[category][k][v] = 0;\n }\n\n // And increment the key for this key/value combination.\n this.data[category][k][v]++;\n }\n\n // Increment the number of items classified\n this.totalCount++;\n};\n\n/**\n * Generate a score of how well this item matches all\n * possible categories based on its attributes\n *\n * @param {Object} item an item in the same format as with train\n * @returns {Object} of probabilities that this item belongs to a\n * given category.\n */\nBayesianClassifier.prototype.score = function score (item) {\n // Initialize an empty array of odds per category.\n var odds = {};\n var category;\n // Iterate through each key in the item,\n // then iterate through each category that has been used\n // in previous calls to `.train()`\n for (var k in item) {\n var v = item[k];\n for (category in this.data) {\n // Create an empty object for storing key - value combinations\n // for this category.\n odds[category] = {};\n\n // If this item doesn't even have a property, it counts for nothing,\n // but if it does have the property that we're looking for from\n // the item to categorize, it counts based on how popular it is\n // versus the whole population.\n if (this.data[category][k]) {\n odds[category][k + \"_\" + v] =\n (this.data[category][k][v] || 0) / this.totalCount;\n } else {\n odds[category][k + \"_\" + v] = 0;\n }\n }\n }\n\n // Set up a new object that will contain sums of these odds by category\n var oddsSums = {};\n\n for (category in odds) {\n // Tally all of the odds for each category-combination pair -\n // the non-existence of a category does not add anything to the\n // score.\n oddsSums[category] = 0;\n for (var combination in odds[category]) {\n oddsSums[category] += odds[category][combination];\n }\n }\n\n return oddsSums;\n};\n\n/**\n * This is a single-layer [Perceptron Classifier](http://en.wikipedia.org/wiki/Perceptron) that takes\n * arrays of numbers and predicts whether they should be classified\n * as either 0 or 1 (negative or positive examples).\n * @class\n * @example\n * // Create the model\n * var p = new PerceptronModel();\n * // Train the model with input with a diagonal boundary.\n * for (var i = 0; i < 5; i++) {\n * p.train([1, 1], 1);\n * p.train([0, 1], 0);\n * p.train([1, 0], 0);\n * p.train([0, 0], 0);\n * }\n * p.predict([0, 0]); // 0\n * p.predict([0, 1]); // 0\n * p.predict([1, 0]); // 0\n * p.predict([1, 1]); // 1\n */\nvar PerceptronModel = function PerceptronModel() {\n // The weights, or coefficients of the model;\n // weights are only populated when training with data.\n this.weights = [];\n // The bias term, or intercept; it is also a weight but\n // it's stored separately for convenience as it is always\n // multiplied by one.\n this.bias = 0;\n};\n/**\n * **Predict**: Use an array of features with the weight array and bias\n * to predict whether an example is labeled 0 or 1.\n *\n * @param {Array<number>} features an array of features as numbers\n * @returns {number} 1 if the score is over 0, otherwise 0\n */\nPerceptronModel.prototype.predict = function predict (features) {\n // Only predict if previously trained\n // on the same size feature array(s).\n if (features.length !== this.weights.length) {\n return null;\n }\n\n // Calculate the sum of features times weights,\n // with the bias added (implicitly times one).\n var score = 0;\n for (var i = 0; i < this.weights.length; i++) {\n score += this.weights[i] * features[i];\n }\n score += this.bias;\n\n // Classify as 1 if the score is over 0, otherwise 0.\n if (score > 0) {\n return 1;\n } else {\n return 0;\n }\n};\n\n/**\n * **Train** the classifier with a new example, which is\n * a numeric array of features and a 0 or 1 label.\n *\n * @param {Array<number>} features an array of features as numbers\n * @param {number} label either 0 or 1\n * @returns {PerceptronModel} this\n */\nPerceptronModel.prototype.train = function train (features, label) {\n // Require that only labels of 0 or 1 are considered.\n if (label !== 0 && label !== 1) {\n return null;\n }\n // The length of the feature array determines\n // the length of the weight array.\n // The perceptron will continue learning as long as\n // it keeps seeing feature arrays of the same length.\n // When it sees a new data shape, it initializes.\n if (features.length !== this.weights.length) {\n this.weights = features;\n this.bias = 1;\n }\n // Make a prediction based on current weights.\n var prediction = this.predict(features);\n // Update the weights if the prediction is wrong.\n if (typeof prediction === \"number\" && prediction !== label) {\n var gradient = label - prediction;\n for (var i = 0; i < this.weights.length; i++) {\n this.weights[i] += gradient * features[i];\n }\n this.bias += gradient;\n }\n return this;\n};\n\n/**\n * We use `ε`, epsilon, as a stopping criterion when we want to iterate\n * until we're \"close enough\". Epsilon is a very small number: for\n * simple statistics, that number is **0.0001**\n *\n * This is used in calculations like the binomialDistribution, in which\n * the process of finding a value is [iterative](https://en.wikipedia.org/wiki/Iterative_method):\n * it progresses until it is close enough.\n *\n * Below is an example of using epsilon in [gradient descent](https://en.wikipedia.org/wiki/Gradient_descent),\n * where we're trying to find a local minimum of a function's derivative,\n * given by the `fDerivative` method.\n *\n * @example\n * // From calculation, we expect that the local minimum occurs at x=9/4\n * var x_old = 0;\n * // The algorithm starts at x=6\n * var x_new = 6;\n * var stepSize = 0.01;\n *\n * function fDerivative(x) {\n * return 4 * Math.pow(x, 3) - 9 * Math.pow(x, 2);\n * }\n *\n * // The loop runs until the difference between the previous\n * // value and the current value is smaller than epsilon - a rough\n * // meaure of 'close enough'\n * while (Math.abs(x_new - x_old) > ss.epsilon) {\n * x_old = x_new;\n * x_new = x_old - stepSize * fDerivative(x_old);\n * }\n *\n * console.log('Local minimum occurs at', x_new);\n */\nvar epsilon = 0.0001;\n\n/**\n * A [Factorial](https://en.wikipedia.org/wiki/Factorial), usually written n!, is the product of all positive\n * integers less than or equal to n. Often factorial is implemented\n * recursively, but this iterative approach is significantly faster\n * and simpler.\n *\n * @param {number} n input, must be an integer number 1 or greater\n * @returns {number} factorial: n!\n * @throws {Error} if n is less than 0 or not an integer\n * @example\n * factorial(5); // => 120\n */\nfunction factorial(n) {\n // factorial is mathematically undefined for negative numbers\n if (n < 0) {\n throw new Error(\"factorial requires a non-negative value\");\n }\n\n if (Math.floor(n) !== n) {\n throw new Error(\"factorial requires an integer input\");\n }\n\n // typically you'll expand the factorial function going down, like\n // 5! = 5 * 4 * 3 * 2 * 1. This is going in the opposite direction,\n // counting from 2 up to the number in question, and since anything\n // multiplied by 1 is itself, the loop only needs to start at 2.\n var accumulator = 1;\n for (var i = 2; i <= n; i++) {\n // for each number up to and including the number `n`, multiply\n // the accumulator my that number.\n accumulator *= i;\n }\n return accumulator;\n}\n\n/**\n * Compute the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Nemes' approximation.\n * The gamma of n is equivalent to (n-1)!, but unlike the factorial function, gamma is defined for all real n except zero\n * and negative integers (where NaN is returned). Note, the gamma function is also well-defined for complex numbers,\n * though this implementation currently does not handle complex numbers as input values.\n * Nemes' approximation is defined [here](https://arxiv.org/abs/1003.6020) as Theorem 2.2.\n * Negative values use [Euler's reflection formula](https://en.wikipedia.org/wiki/Gamma_function#Properties) for computation.\n *\n * @param {number} n Any real number except for zero and negative integers.\n * @returns {number} The gamma of the input value.\n *\n * @example\n * gamma(11.5); // 11899423.084037038\n * gamma(-11.5); // 2.29575810481609e-8\n * gamma(5); // 24\n */\nfunction gamma(n) {\n if (Number.isInteger(n)) {\n if (n <= 0) {\n // gamma not defined for zero or negative integers\n return NaN;\n } else {\n // use factorial for integer inputs\n return factorial(n - 1);\n }\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n if (n < 0) {\n // Use Euler's reflection formula for negative inputs\n // see: https://en.wikipedia.org/wiki/Gamma_function#Properties\n return Math.PI / (Math.sin(Math.PI * -n) * gamma(-n));\n } else {\n // Nemes' expansion approximation\n var seriesCoefficient =\n Math.pow(n / Math.E, n) * Math.sqrt(2 * Math.PI * (n + 1 / 6));\n\n var seriesDenom = n + 1 / 4;\n\n var seriesExpansion =\n 1 +\n 1 / 144 / Math.pow(seriesDenom, 2) -\n 1 / 12960 / Math.pow(seriesDenom, 3) -\n 257 / 207360 / Math.pow(seriesDenom, 4) -\n 52 / 2612736 / Math.pow(seriesDenom, 5) +\n 5741173 / 9405849600 / Math.pow(seriesDenom, 6) +\n 37529 / 18811699200 / Math.pow(seriesDenom, 7);\n\n return seriesCoefficient * seriesExpansion;\n }\n}\n\n// Define series coefficients\nvar COEFFICIENTS = [\n 0.99999999999999709182, 57.156235665862923517, -59.597960355475491248,\n 14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4,\n 0.46523628927048575665e-4, -0.98374475304879564677e-4,\n 0.15808870322491248884e-3, -0.21026444172410488319e-3,\n 0.2174396181152126432e-3, -0.16431810653676389022e-3,\n 0.84418223983852743293e-4, -0.2619083840158140867e-4,\n 0.36899182659531622704e-5\n];\n\nvar g = 607 / 128;\nvar LOGSQRT2PI = Math.log(Math.sqrt(2 * Math.PI));\n\n/**\n * Compute the logarithm of the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) of a value using Lanczos' approximation.\n * This function takes as input any real-value n greater than 0.\n * This function is useful for values of n too large for the normal gamma function (n > 165).\n * The code is based on Lanczo's Gamma approximation, defined [here](http://my.fit.edu/~gabdo/gamma.txt).\n *\n * @param {number} n Any real number greater than zero.\n * @returns {number} The logarithm of gamma of the input value.\n *\n * @example\n * gammaln(500); // 2605.1158503617335\n * gammaln(2.4); // 0.21685932244884043\n */\nfunction gammaln(n) {\n // Return infinity if value not in domain\n if (n <= 0) {\n return Infinity;\n }\n\n // Decrement n, because approximation is defined for n - 1\n n--;\n\n // Create series approximation\n var a = COEFFICIENTS[0];\n\n for (var i = 1; i < 15; i++) {\n a += COEFFICIENTS[i] / (n + i);\n }\n\n var tmp = g + 0.5 + n;\n\n // Return natural logarithm of gamma(n)\n return LOGSQRT2PI + Math.log(a) - tmp + (n + 0.5) * Math.log(tmp);\n}\n\n/**\n * The [Bernoulli distribution](http://en.wikipedia.org/wiki/Bernoulli_distribution)\n * is the probability discrete\n * distribution of a random variable which takes value 1 with success\n * probability `p` and value 0 with failure\n * probability `q` = 1 - `p`. It can be used, for example, to represent the\n * toss of a coin, where \"1\" is defined to mean \"heads\" and \"0\" is defined\n * to mean \"tails\" (or vice versa). It is\n * a special case of a Binomial Distribution\n * where `n` = 1.\n *\n * @param {number} p input value, between 0 and 1 inclusive\n * @returns {number[]} values of bernoulli distribution at this point\n * @throws {Error} if p is outside 0 and 1\n * @example\n * bernoulliDistribution(0.3); // => [0.7, 0.3]\n */\nfunction bernoulliDistribution(p) /*: number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1)\n if (p < 0 || p > 1) {\n throw new Error(\n \"bernoulliDistribution requires probability to be between 0 and 1 inclusive\"\n );\n }\n\n return [1 - p, p];\n}\n\n/**\n * The [Binomial Distribution](http://en.wikipedia.org/wiki/Binomial_distribution) is the discrete probability\n * distribution of the number of successes in a sequence of n independent yes/no experiments, each of which yields\n * success with probability `probability`. Such a success/failure experiment is also called a Bernoulli experiment or\n * Bernoulli trial; when trials = 1, the Binomial Distribution is a Bernoulli Distribution.\n *\n * @param {number} trials number of trials to simulate\n * @param {number} probability\n * @returns {number[]} output\n */\nfunction binomialDistribution(trials, probability) /*: ?number[] */ {\n // Check that `p` is a valid probability (0 ≤ p ≤ 1),\n // that `n` is an integer, strictly positive.\n if (probability < 0 || probability > 1 || trials <= 0 || trials % 1 !== 0) {\n return undefined;\n }\n\n // We initialize `x`, the random variable, and `accumulator`, an accumulator\n // for the cumulative distribution function to 0. `distribution_functions`\n // is the object we'll return with the `probability_of_x` and the\n // `cumulativeProbability_of_x`, as well as the calculated mean &\n // variance. We iterate until the `cumulativeProbability_of_x` is\n // within `epsilon` of 1.0.\n var x = 0;\n var cumulativeProbability = 0;\n var cells = [];\n var binomialCoefficient = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] =\n binomialCoefficient *\n Math.pow(probability, x) *\n Math.pow(1 - probability, trials - x);\n cumulativeProbability += cells[x];\n x++;\n binomialCoefficient = (binomialCoefficient * (trials - x + 1)) / x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\n/**\n * The [Poisson Distribution](http://en.wikipedia.org/wiki/Poisson_distribution)\n * is a discrete probability distribution that expresses the probability\n * of a given number of events occurring in a fixed interval of time\n * and/or space if these events occur with a known average rate and\n * independently of the time since the last event.\n *\n * The Poisson Distribution is characterized by the strictly positive\n * mean arrival or occurrence rate, `λ`.\n *\n * @param {number} lambda location poisson distribution\n * @returns {number[]} values of poisson distribution at that point\n */\nfunction poissonDistribution(lambda) /*: ?number[] */ {\n // Check that lambda is strictly positive\n if (lambda <= 0) {\n return undefined;\n }\n\n // our current place in the distribution\n var x = 0;\n // and we keep track of the current cumulative probability, in\n // order to know when to stop calculating chances.\n var cumulativeProbability = 0;\n // the calculated cells to be returned\n var cells = [];\n var factorialX = 1;\n\n // This algorithm iterates through each potential outcome,\n // until the `cumulativeProbability` is very close to 1, at\n // which point we've defined the vast majority of outcomes\n do {\n // a [probability mass function](https://en.wikipedia.org/wiki/Probability_mass_function)\n cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;\n cumulativeProbability += cells[x];\n x++;\n factorialX *= x;\n // when the cumulativeProbability is nearly 1, we've calculated\n // the useful range of this distribution\n } while (cumulativeProbability < 1 - epsilon);\n\n return cells;\n}\n\n/**\n * **Percentage Points of the χ2 (Chi-Squared) Distribution**\n *\n * The [χ2 (Chi-Squared) Distribution](http://en.wikipedia.org/wiki/Chi-squared_distribution) is used in the common\n * chi-squared tests for goodness of fit of an observed distribution to a theoretical one, the independence of two\n * criteria of classification of qualitative data, and in confidence interval estimation for a population standard\n * deviation of a normal distribution from a sample standard deviation.\n *\n * Values from Appendix 1, Table III of William W. Hines & Douglas C. Montgomery, \"Probability and Statistics in\n * Engineering and Management Science\", Wiley (1980).\n */\nvar chiSquaredDistributionTable = {\n 1: {\n 0.995: 0,\n 0.99: 0,\n 0.975: 0,\n 0.95: 0,\n 0.9: 0.02,\n 0.5: 0.45,\n 0.1: 2.71,\n 0.05: 3.84,\n 0.025: 5.02,\n 0.01: 6.63,\n 0.005: 7.88\n },\n 2: {\n 0.995: 0.01,\n 0.99: 0.02,\n 0.975: 0.05,\n 0.95: 0.1,\n 0.9: 0.21,\n 0.5: 1.39,\n 0.1: 4.61,\n 0.05: 5.99,\n 0.025: 7.38,\n 0.01: 9.21,\n 0.005: 10.6\n },\n 3: {\n 0.995: 0.07,\n 0.99: 0.11,\n 0.975: 0.22,\n 0.95: 0.35,\n 0.9: 0.58,\n 0.5: 2.37,\n 0.1: 6.25,\n 0.05: 7.81,\n 0.025: 9.35,\n 0.01: 11.34,\n 0.005: 12.84\n },\n 4: {\n 0.995: 0.21,\n 0.99: 0.3,\n 0.975: 0.48,\n 0.95: 0.71,\n 0.9: 1.06,\n 0.5: 3.36,\n 0.1: 7.78,\n 0.05: 9.49,\n 0.025: 11.14,\n 0.01: 13.28,\n 0.005: 14.86\n },\n 5: {\n 0.995: 0.41,\n 0.99: 0.55,\n 0.975: 0.83,\n 0.95: 1.15,\n 0.9: 1.61,\n 0.5: 4.35,\n 0.1: 9.24,\n 0.05: 11.07,\n 0.025: 12.83,\n 0.01: 15.09,\n 0.005: 16.75\n },\n 6: {\n 0.995: 0.68,\n 0.99: 0.87,\n 0.975: 1.24,\n 0.95: 1.64,\n 0.9: 2.2,\n 0.5: 5.35,\n 0.1: 10.65,\n 0.05: 12.59,\n 0.025: 14.45,\n 0.01: 16.81,\n 0.005: 18.55\n },\n 7: {\n 0.995: 0.99,\n 0.99: 1.25,\n 0.975: 1.69,\n 0.95: 2.17,\n 0.9: 2.83,\n 0.5: 6.35,\n 0.1: 12.02,\n 0.05: 14.07,\n 0.025: 16.01,\n 0.01: 18.48,\n 0.005: 20.28\n },\n 8: {\n 0.995: 1.34,\n 0.99: 1.65,\n 0.975: 2.18,\n 0.95: 2.73,\n 0.9: 3.49,\n 0.5: 7.34,\n 0.1: 13.36,\n 0.05: 15.51,\n 0.025: 17.53,\n 0.01: 20.09,\n 0.005: 21.96\n },\n 9: {\n 0.995: 1.73,\n 0.99: 2.09,\n 0.975: 2.7,\n 0.95: 3.33,\n 0.9: 4.17,\n 0.5: 8.34,\n 0.1: 14.68,\n 0.05: 16.92,\n 0.025: 19.02,\n 0.01: 21.67,\n 0.005: 23.59\n },\n 10: {\n 0.995: 2.16,\n 0.99: 2.56,\n 0.975: 3.25,\n 0.95: 3.94,\n 0.9: 4.87,\n 0.5: 9.34,\n 0.1: 15.99,\n 0.05: 18.31,\n 0.025: 20.48,\n 0.01: 23.21,\n 0.005: 25.19\n },\n 11: {\n 0.995: 2.6,\n 0.99: 3.05,\n 0.975: 3.82,\n 0.95: 4.57,\n 0.9: 5.58,\n 0.5: 10.34,\n 0.1: 17.28,\n 0.05: 19.68,\n 0.025: 21.92,\n 0.01: 24.72,\n 0.005: 26.76\n },\n 12: {\n 0.995: 3.07,\n 0.99: 3.57,\n 0.975: 4.4,\n 0.95: 5.23,\n 0.9: 6.3,\n 0.5: 11.34,\n 0.1: 18.55,\n 0.05: 21.03,\n 0.025: 23.34,\n 0.01: 26.22,\n 0.005: 28.3\n },\n 13: {\n 0.995: 3.57,\n 0.99: 4.11,\n 0.975: 5.01,\n 0.95: 5.89,\n 0.9: 7.04,\n 0.5: 12.34,\n 0.1: 19.81,\n 0.05: 22.36,\n 0.025: 24.74,\n 0.01: 27.69,\n 0.005: 29.82\n },\n 14: {\n 0.995: 4.07,\n 0.99: 4.66,\n 0.975: 5.63,\n 0.95: 6.57,\n 0.9: 7.79,\n 0.5: 13.34,\n 0.1: 21.06,\n 0.05: 23.68,\n 0.025: 26.12,\n 0.01: 29.14,\n 0.005: 31.32\n },\n 15: {\n 0.995: 4.6,\n 0.99: 5.23,\n 0.975: 6.27,\n 0.95: 7.26,\n 0.9: 8.55,\n 0.5: 14.34,\n 0.1: 22.31,\n 0.05: 25,\n 0.025: 27.49,\n 0.01: 30.58,\n 0.005: 32.8\n },\n 16: {\n 0.995: 5.14,\n 0.99: 5.81,\n 0.975: 6.91,\n 0.95: 7.96,\n 0.9: 9.31,\n 0.5: 15.34,\n 0.1: 23.54,\n 0.05: 26.3,\n 0.025: 28.85,\n 0.01: 32,\n 0.005: 34.27\n },\n 17: {\n 0.995: 5.7,\n 0.99: 6.41,\n 0.975: 7.56,\n 0.95: 8.67,\n 0.9: 10.09,\n 0.5: 16.34,\n 0.1: 24.77,\n 0.05: 27.59,\n 0.025: 30.19,\n 0.01: 33.41,\n 0.005: 35.72\n },\n 18: {\n 0.995: 6.26,\n 0.99: 7.01,\n 0.975: 8.23,\n 0.95: 9.39,\n 0.9: 10.87,\n 0.5: 17.34,\n 0.1: 25.99,\n 0.05: 28.87,\n 0.025: 31.53,\n 0.01: 34.81,\n 0.005: 37.16\n },\n 19: {\n 0.995: 6.84,\n 0.99: 7.63,\n 0.975: 8.91,\n 0.95: 10.12,\n 0.9: 11.65,\n 0.5: 18.34,\n 0.1: 27.2,\n 0.05: 30.14,\n 0.025: 32.85,\n 0.01: 36.19,\n 0.005: 38.58\n },\n 20: {\n 0.995: 7.43,\n 0.99: 8.26,\n 0.975: 9.59,\n 0.95: 10.85,\n 0.9: 12.44,\n 0.5: 19.34,\n 0.1: 28.41,\n 0.05: 31.41,\n 0.025: 34.17,\n 0.01: 37.57,\n 0.005: 40\n },\n 21: {\n 0.995: 8.03,\n 0.99: 8.9,\n 0.975: 10.28,\n 0.95: 11.59,\n 0.9: 13.24,\n 0.5: 20.34,\n 0.1: 29.62,\n 0.05: 32.67,\n 0.025: 35.48,\n 0.01: 38.93,\n 0.005: 41.4\n },\n 22: {\n 0.995: 8.64,\n 0.99: 9.54,\n 0.975: 10.98,\n 0.95: 12.34,\n 0.9: 14.04,\n 0.5: 21.34,\n 0.1: 30.81,\n 0.05: 33.92,\n 0.025: 36.78,\n 0.01: 40.29,\n 0.005: 42.8\n },\n 23: {\n 0.995: 9.26,\n 0.99: 10.2,\n 0.975: 11.69,\n 0.95: 13.09,\n 0.9: 14.85,\n 0.5: 22.34,\n 0.1: 32.01,\n 0.05: 35.17,\n 0.025: 38.08,\n 0.01: 41.64,\n 0.005: 44.18\n },\n 24: {\n 0.995: 9.89,\n 0.99: 10.86,\n 0.975: 12.4,\n 0.95: 13.85,\n 0.9: 15.66,\n 0.5: 23.34,\n 0.1: 33.2,\n 0.05: 36.42,\n 0.025: 39.36,\n 0.01: 42.98,\n 0.005: 45.56\n },\n 25: {\n 0.995: 10.52,\n 0.99: 11.52,\n 0.975: 13.12,\n 0.95: 14.61,\n 0.9: 16.47,\n 0.5: 24.34,\n 0.1: 34.28,\n 0.05: 37.65,\n 0.025: 40.65,\n 0.01: 44.31,\n 0.005: 46.93\n },\n 26: {\n 0.995: 11.16,\n 0.99: 12.2,\n 0.975: 13.84,\n 0.95: 15.38,\n 0.9: 17.29,\n 0.5: 25.34,\n 0.1: 35.56,\n 0.05: 38.89,\n 0.025: 41.92,\n 0.01: 45.64,\n 0.005: 48.29\n },\n 27: {\n 0.995: 11.81,\n 0.99: 12.88,\n 0.975: 14.57,\n 0.95: 16.15,\n 0.9: 18.11,\n 0.5: 26.34,\n 0.1: 36.74,\n 0.05: 40.11,\n 0.025: 43.19,\n 0.01: 46.96,\n 0.005: 49.65\n },\n 28: {\n 0.995: 12.46,\n 0.99: 13.57,\n 0.975: 15.31,\n 0.95: 16.93,\n 0.9: 18.94,\n 0.5: 27.34,\n 0.1: 37.92,\n 0.05: 41.34,\n 0.025: 44.46,\n 0.01: 48.28,\n 0.005: 50.99\n },\n 29: {\n 0.995: 13.12,\n 0.99: 14.26,\n 0.975: 16.05,\n 0.95: 17.71,\n 0.9: 19.77,\n 0.5: 28.34,\n 0.1: 39.09,\n 0.05: 42.56,\n 0.025: 45.72,\n 0.01: 49.59,\n 0.005: 52.34\n },\n 30: {\n 0.995: 13.79,\n 0.99: 14.95,\n 0.975: 16.79,\n 0.95: 18.49,\n 0.9: 20.6,\n 0.5: 29.34,\n 0.1: 40.26,\n 0.05: 43.77,\n 0.025: 46.98,\n 0.01: 50.89,\n 0.005: 53.67\n },\n 40: {\n 0.995: 20.71,\n 0.99: 22.16,\n 0.975: 24.43,\n 0.95: 26.51,\n 0.9: 29.05,\n 0.5: 39.34,\n 0.1: 51.81,\n 0.05: 55.76,\n 0.025: 59.34,\n 0.01: 63.69,\n 0.005: 66.77\n },\n 50: {\n 0.995: 27.99,\n 0.99: 29.71,\n 0.975: 32.36,\n 0.95: 34.76,\n 0.9: 37.69,\n 0.5: 49.33,\n 0.1: 63.17,\n 0.05: 67.5,\n 0.025: 71.42,\n 0.01: 76.15,\n 0.005: 79.49\n },\n 60: {\n 0.995: 35.53,\n 0.99: 37.48,\n 0.975: 40.48,\n 0.95: 43.19,\n 0.9: 46.46,\n 0.5: 59.33,\n 0.1: 74.4,\n 0.05: 79.08,\n 0.025: 83.3,\n 0.01: 88.38,\n 0.005: 91.95\n },\n 70: {\n 0.995: 43.28,\n 0.99: 45.44,\n 0.975: 48.76,\n 0.95: 51.74,\n 0.9: 55.33,\n 0.5: 69.33,\n 0.1: 85.53,\n 0.05: 90.53,\n 0.025: 95.02,\n 0.01: 100.42,\n 0.005: 104.22\n },\n 80: {\n 0.995: 51.17,\n 0.99: 53.54,\n 0.975: 57.15,\n 0.95: 60.39,\n 0.9: 64.28,\n 0.5: 79.33,\n 0.1: 96.58,\n 0.05: 101.88,\n 0.025: 106.63,\n 0.01: 112.33,\n 0.005: 116.32\n },\n 90: {\n 0.995: 59.2,\n 0.99: 61.75,\n 0.975: 65.65,\n 0.95: 69.13,\n 0.9: 73.29,\n 0.5: 89.33,\n 0.1: 107.57,\n 0.05: 113.14,\n 0.025: 118.14,\n 0.01: 124.12,\n 0.005: 128.3\n },\n 100: {\n 0.995: 67.33,\n 0.99: 70.06,\n 0.975: 74.22,\n 0.95: 77.93,\n 0.9: 82.36,\n 0.5: 99.33,\n 0.1: 118.5,\n 0.05: 124.34,\n 0.025: 129.56,\n 0.01: 135.81,\n 0.005: 140.17\n }\n};\n\n/**\n * The [χ2 (Chi-Squared) Goodness-of-Fit Test](http://en.wikipedia.org/wiki/Goodness_of_fit#Pearson.27s_chi-squared_test)\n * uses a measure of goodness of fit which is the sum of differences between observed and expected outcome frequencies\n * (that is, counts of observations), each squared and divided by the number of observations expected given the\n * hypothesized distribution. The resulting χ2 statistic, `chiSquared`, can be compared to the chi-squared distribution\n * to determine the goodness of fit. In order to determine the degrees of freedom of the chi-squared distribution, one\n * takes the total number of observed frequencies and subtracts the number of estimated parameters. The test statistic\n * follows, approximately, a chi-square distribution with (k − c) degrees of freedom where `k` is the number of non-empty\n * cells and `c` is the number of estimated parameters for the distribution.\n *\n * @param {Array<number>} data\n * @param {Function} distributionType a function that returns a point in a distribution:\n * for instance, binomial, bernoulli, or poisson\n * @param {number} significance\n * @returns {number} chi squared goodness of fit\n * @example\n * // Data from Poisson goodness-of-fit example 10-19 in William W. Hines & Douglas C. Montgomery,\n * // \"Probability and Statistics in Engineering and Management Science\", Wiley (1980).\n * var data1019 = [\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n * 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n * 2, 2, 2, 2, 2, 2, 2, 2, 2,\n * 3, 3, 3, 3\n * ];\n * ss.chiSquaredGoodnessOfFit(data1019, ss.poissonDistribution, 0.05); //= false\n */\nfunction chiSquaredGoodnessOfFit(data, distributionType, significance) {\n // Estimate from the sample data, a weighted mean.\n var inputMean = mean(data);\n // Calculated value of the χ2 statistic.\n var chiSquared = 0;\n // Number of hypothesized distribution parameters estimated, expected to be supplied in the distribution test.\n // Lose one degree of freedom for estimating `lambda` from the sample data.\n var c = 1;\n // The hypothesized distribution.\n // Generate the hypothesized distribution.\n var hypothesizedDistribution = distributionType(inputMean);\n var observedFrequencies = [];\n var expectedFrequencies = [];\n\n // Create an array holding a histogram from the sample data, of\n // the form `{ value: numberOfOcurrences }`\n for (var i = 0; i < data.length; i++) {\n if (observedFrequencies[data[i]] === undefined) {\n observedFrequencies[data[i]] = 0;\n }\n observedFrequencies[data[i]]++;\n }\n\n // The histogram we created might be sparse - there might be gaps\n // between values. So we iterate through the histogram, making\n // sure that instead of undefined, gaps have 0 values.\n for (var i$1 = 0; i$1 < observedFrequencies.length; i$1++) {\n if (observedFrequencies[i$1] === undefined) {\n observedFrequencies[i$1] = 0;\n }\n }\n\n // Create an array holding a histogram of expected data given the\n // sample size and hypothesized distribution.\n for (var k in hypothesizedDistribution) {\n if (k in observedFrequencies) {\n expectedFrequencies[+k] = hypothesizedDistribution[k] * data.length;\n }\n }\n\n // Working backward through the expected frequencies, collapse classes\n // if less than three observations are expected for a class.\n // This transformation is applied to the observed frequencies as well.\n for (var k$1 = expectedFrequencies.length - 1; k$1 >= 0; k$1--) {\n if (expectedFrequencies[k$1] < 3) {\n expectedFrequencies[k$1 - 1] += expectedFrequencies[k$1];\n expectedFrequencies.pop();\n\n observedFrequencies[k$1 - 1] += observedFrequencies[k$1];\n observedFrequencies.pop();\n }\n }\n\n // Iterate through the squared differences between observed & expected\n // frequencies, accumulating the `chiSquared` statistic.\n for (var k$2 = 0; k$2 < observedFrequencies.length; k$2++) {\n chiSquared +=\n Math.pow(observedFrequencies[k$2] - expectedFrequencies[k$2], 2) /\n expectedFrequencies[k$2];\n }\n\n // Calculate degrees of freedom for this test and look it up in the\n // `chiSquaredDistributionTable` in order to\n // accept or reject the goodness-of-fit of the hypothesized distribution.\n // Degrees of freedom, calculated as (number of class intervals -\n // number of hypothesized distribution parameters estimated - 1)\n var degreesOfFreedom = observedFrequencies.length - c - 1;\n return (\n chiSquaredDistributionTable[degreesOfFreedom][significance] < chiSquared\n );\n}\n\nvar SQRT_2PI$1 = Math.sqrt(2 * Math.PI);\n\n/**\n * [Well-known kernels](https://en.wikipedia.org/wiki/Kernel_(statistics)#Kernel_functions_in_common_use)\n * @private\n */\nvar kernels = {\n /**\n * The gaussian kernel.\n * @private\n */\n gaussian: function (u) {\n return Math.exp(-0.5 * u * u) / SQRT_2PI$1;\n }\n};\n\n/**\n * Well known bandwidth selection methods\n * @private\n */\nvar bandwidthMethods = {\n /**\n * The [\"normal reference distribution\"\n * rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html),\n * a commonly used version of [Silverman's\n * rule-of-thumb](https://en.wikipedia.org/wiki/Kernel_density_estimation#A_rule-of-thumb_bandwidth_estimator).\n * @private\n */\n nrd: function (x) {\n var s = sampleStandardDeviation(x);\n var iqr = interquartileRange(x);\n if (typeof iqr === \"number\") {\n s = Math.min(s, iqr / 1.34);\n }\n return 1.06 * s * Math.pow(x.length, -0.2);\n }\n};\n\n/**\n * [Kernel density estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation)\n * is a useful tool for, among other things, estimating the shape of the\n * underlying probability distribution from a sample.\n *\n * @name kernelDensityEstimation\n * @param X sample values\n * @param kernel The kernel function to use. If a function is provided, it should return non-negative values and integrate to 1. Defaults to 'gaussian'.\n * @param bandwidthMethod The \"bandwidth selection\" method to use, or a fixed bandwidth value. Defaults to \"nrd\", the commonly-used [\"normal reference distribution\" rule-of-thumb](https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/bandwidth.nrd.html).\n * @returns {Function} An estimated [probability density function](https://en.wikipedia.org/wiki/Probability_density_function) for the given sample. The returned function runs in `O(X.length)`.\n */\nfunction kernelDensityEstimation(X, kernel, bandwidthMethod) {\n var kernelFn;\n if (kernel === undefined) {\n kernelFn = kernels.gaussian;\n } else if (typeof kernel === \"string\") {\n if (!kernels[kernel]) {\n throw new Error('Unknown kernel \"' + kernel + '\"');\n }\n kernelFn = kernels[kernel];\n } else {\n kernelFn = kernel;\n }\n\n var bandwidth;\n if (typeof bandwidthMethod === \"undefined\") {\n bandwidth = bandwidthMethods.nrd(X);\n } else if (typeof bandwidthMethod === \"string\") {\n if (!bandwidthMethods[bandwidthMethod]) {\n throw new Error(\n 'Unknown bandwidth method \"' + bandwidthMethod + '\"'\n );\n }\n bandwidth = bandwidthMethods[bandwidthMethod](X);\n } else {\n bandwidth = bandwidthMethod;\n }\n\n return function (x) {\n var i = 0;\n var sum = 0;\n for (i = 0; i < X.length; i++) {\n sum += kernelFn((x - X[i]) / bandwidth);\n }\n return sum / bandwidth / X.length;\n };\n}\n\n/**\n * The [Z-Score, or Standard Score](http://en.wikipedia.org/wiki/Standard_score).\n *\n * The standard score is the number of standard deviations an observation\n * or datum is above or below the mean. Thus, a positive standard score\n * represents a datum above the mean, while a negative standard score\n * represents a datum below the mean. It is a dimensionless quantity\n * obtained by subtracting the population mean from an individual raw\n * score and then dividing the difference by the population standard\n * deviation.\n *\n * The z-score is only defined if one knows the population parameters;\n * if one only has a sample set, then the analogous computation with\n * sample mean and sample standard deviation yields the\n * Student's t-statistic.\n *\n * @param {number} x\n * @param {number} mean\n * @param {number} standardDeviation\n * @return {number} z score\n * @example\n * zScore(78, 80, 5); // => -0.4\n */\nfunction zScore(x, mean, standardDeviation) {\n return (x - mean) / standardDeviation;\n}\n\nvar SQRT_2PI = Math.sqrt(2 * Math.PI);\n\nfunction cumulativeDistribution(z) {\n var sum = z,\n tmp = z;\n\n // 15 iterations are enough for 4-digit precision\n for (var i = 1; i < 15; i++) {\n tmp *= (z * z) / (2 * i + 1);\n sum += tmp;\n }\n return (\n Math.round((0.5 + (sum / SQRT_2PI) * Math.exp((-z * z) / 2)) * 1e4) /\n 1e4\n );\n}\n\n/**\n * A standard normal table, also called the unit normal table or Z table,\n * is a mathematical table for the values of Φ (phi), which are the values of\n * the [cumulative distribution function](https://en.wikipedia.org/wiki/Normal_distribution#Cumulative_distribution_function)\n * of the normal distribution. It is used to find the probability that a\n * statistic is observed below, above, or between values on the standard\n * normal distribution, and by extension, any normal distribution.\n */\nvar standardNormalTable = [];\n\nfor (var z = 0; z <= 3.09; z += 0.01) {\n standardNormalTable.push(cumulativeDistribution(z));\n}\n\n/**\n * **[Cumulative Standard Normal Probability](http://en.wikipedia.org/wiki/Standard_normal_table)**\n *\n * Since probability tables cannot be\n * printed for every normal distribution, as there are an infinite variety\n * of normal distributions, it is common practice to convert a normal to a\n * standard normal and then use the standard normal table to find probabilities.\n *\n * You can use `.5 + .5 * errorFunction(x / Math.sqrt(2))` to calculate the probability\n * instead of looking it up in a table.\n *\n * @param {number} z\n * @returns {number} cumulative standard normal probability\n */\nfunction cumulativeStdNormalProbability(z) {\n // Calculate the position of this value.\n var absZ = Math.abs(z);\n // Each row begins with a different\n // significant digit: 0.5, 0.6, 0.7, and so on. Each value in the table\n // corresponds to a range of 0.01 in the input values, so the value is\n // multiplied by 100.\n var index = Math.min(\n Math.round(absZ * 100),\n standardNormalTable.length - 1\n );\n\n // The index we calculate must be in the table as a positive value,\n // but we still pay attention to whether the input is positive\n // or negative, and flip the output value as a last step.\n if (z >= 0) {\n return standardNormalTable[index];\n } else {\n // due to floating-point arithmetic, values in the table with\n // 4 significant figures can nevertheless end up as repeating\n // fractions when they're computed here.\n return +(1 - standardNormalTable[index]).toFixed(4);\n }\n}\n\n/**\n * **[Logistic Cumulative Distribution Function](https://en.wikipedia.org/wiki/Logistic_distribution)**\n *\n * @param {number} x\n * @returns {number} cumulative standard logistic probability\n */\nfunction cumulativeStdLogisticProbability(x) {\n return 1 / (Math.exp(-x) + 1);\n}\n\n/**\n * **[Gaussian error function](http://en.wikipedia.org/wiki/Error_function)**\n *\n * The `errorFunction(x/(sd * Math.sqrt(2)))` is the probability that a value in a\n * normal distribution with standard deviation sd is within x of the mean.\n *\n * This function returns a numerical approximation to the exact value.\n * It uses Horner's method to evaluate the polynomial of τ (tau).\n *\n * @param {number} x input\n * @return {number} error estimation\n * @example\n * errorFunction(1).toFixed(2); // => '0.84'\n */\nfunction errorFunction(x) {\n var t = 1 / (1 + 0.5 * Math.abs(x));\n var tau =\n t *\n Math.exp(\n -x * x +\n ((((((((0.17087277 * t - 0.82215223) * t + 1.48851587) * t -\n 1.13520398) *\n t +\n 0.27886807) *\n t -\n 0.18628806) *\n t +\n 0.09678418) *\n t +\n 0.37409196) *\n t +\n 1.00002368) *\n t -\n 1.26551223\n );\n if (x >= 0) {\n return 1 - tau;\n } else {\n return tau - 1;\n }\n}\n\n/**\n * The Inverse [Gaussian error function](http://en.wikipedia.org/wiki/Error_function)\n * returns a numerical approximation to the value that would have caused\n * `errorFunction()` to return x.\n *\n * @param {number} x value of error function\n * @returns {number} estimated inverted value\n */\nfunction inverseErrorFunction(x) {\n var a = (8 * (Math.PI - 3)) / (3 * Math.PI * (4 - Math.PI));\n\n var inv = Math.sqrt(\n Math.sqrt(\n Math.pow(2 / (Math.PI * a) + Math.log(1 - x * x) / 2, 2) -\n Math.log(1 - x * x) / a\n ) -\n (2 / (Math.PI * a) + Math.log(1 - x * x) / 2)\n );\n\n if (x >= 0) {\n return inv;\n } else {\n return -inv;\n }\n}\n\n/**\n * The [Probit](http://en.wikipedia.org/wiki/Probit)\n * is the inverse of cumulativeStdNormalProbability(),\n * and is also known as the normal quantile function.\n *\n * It returns the number of standard deviations from the mean\n * where the p'th quantile of values can be found in a normal distribution.\n * So, for example, probit(0.5 + 0.6827/2) ≈ 1 because 68.27% of values are\n * normally found within 1 standard deviation above or below the mean.\n *\n * @param {number} p\n * @returns {number} probit\n */\nfunction probit(p) {\n if (p === 0) {\n p = epsilon;\n } else if (p >= 1) {\n p = 1 - epsilon;\n }\n return Math.sqrt(2) * inverseErrorFunction(2 * p - 1);\n}\n\n/**\n * The [Logit](https://en.wikipedia.org/wiki/Logit)\n * is the inverse of cumulativeStdLogisticProbability,\n * and is also known as the logistic quantile function.\n *\n * @param {number} p\n * @returns {number} logit\n */\nfunction logit(p) {\n if (p <= 0 || p >= 1) {\n throw new Error(\"p must be strictly between zero and one\");\n }\n return Math.log(p / (1 - p));\n}\n\n/**\n * Conducts a [permutation test](https://en.wikipedia.org/wiki/Resampling_(statistics)#Permutation_tests)\n * to determine if two data sets are *significantly* different from each other, using\n * the difference of means between the groups as the test statistic.\n * The function allows for the following hypotheses:\n * - two_tail = Null hypothesis: the two distributions are equal.\n * - greater = Null hypothesis: observations from sampleX tend to be smaller than those from sampleY.\n * - less = Null hypothesis: observations from sampleX tend to be greater than those from sampleY.\n * [Learn more about one-tail vs two-tail tests.](https://en.wikipedia.org/wiki/One-_and_two-tailed_tests)\n *\n * @param {Array<number>} sampleX first dataset (e.g. treatment data)\n * @param {Array<number>} sampleY second dataset (e.g. control data)\n * @param {string} alternative alternative hypothesis, either 'two_sided' (default), 'greater', or 'less'\n * @param {number} k number of values in permutation distribution.\n * @param {Function} [randomSource=Math.random] an optional entropy source\n * @returns {number} p-value The probability of observing the difference between groups (as or more extreme than what we did), assuming the null hypothesis.\n *\n * @example\n * var control = [2, 5, 3, 6, 7, 2, 5];\n * var treatment = [20, 5, 13, 12, 7, 2, 2];\n * permutationTest(control, treatment); // ~0.1324\n */\nfunction permutationTest(sampleX, sampleY, alternative, k, randomSource) {\n // Set default arguments\n if (k === undefined) {\n k = 10000;\n }\n if (alternative === undefined) {\n alternative = \"two_side\";\n }\n if (\n alternative !== \"two_side\" &&\n alternative !== \"greater\" &&\n alternative !== \"less\"\n ) {\n throw new Error(\n \"`alternative` must be either 'two_side', 'greater', or 'less'.\"\n );\n }\n\n // get means for each sample\n var meanX = mean(sampleX);\n var meanY = mean(sampleY);\n\n // calculate initial test statistic. This will be our point of comparison with\n // the generated test statistics.\n var testStatistic = meanX - meanY;\n\n // create test-statistic distribution\n var testStatDsn = new Array(k);\n\n // combine datsets so we can easily shuffle later\n var allData = sampleX.concat(sampleY);\n var midIndex = Math.floor(allData.length / 2);\n\n for (var i = 0; i < k; i++) {\n // 1. shuffle data assignments\n shuffleInPlace(allData, randomSource);\n var permLeft = allData.slice(0, midIndex);\n var permRight = allData.slice(midIndex, allData.length);\n\n // 2.re-calculate test statistic\n var permTestStatistic = mean(permLeft) - mean(permRight);\n\n // 3. store test statistic to build test statistic distribution\n testStatDsn[i] = permTestStatistic;\n }\n\n // Calculate p-value depending on alternative\n // For this test, we calculate the percentage of 'extreme' test statistics (subject to our hypothesis)\n // more info on permutation test p-value calculations: https://onlinecourses.science.psu.edu/stat464/node/35\n var numExtremeTStats = 0;\n if (alternative === \"two_side\") {\n for (var i$1 = 0; i$1 <= k; i$1++) {\n if (Math.abs(testStatDsn[i$1]) >= Math.abs(testStatistic)) {\n numExtremeTStats += 1;\n }\n }\n } else if (alternative === \"greater\") {\n for (var i$2 = 0; i$2 <= k; i$2++) {\n if (testStatDsn[i$2] >= testStatistic) {\n numExtremeTStats += 1;\n }\n }\n } else {\n // alternative === 'less'\n for (var i$3 = 0; i$3 <= k; i$3++) {\n if (testStatDsn[i$3] <= testStatistic) {\n numExtremeTStats += 1;\n }\n }\n }\n\n return numExtremeTStats / k;\n}\n\n/**\n * [Sign](https://en.wikipedia.org/wiki/Sign_function) is a function\n * that extracts the sign of a real number\n *\n * @param {number} x input value\n * @returns {number} sign value either 1, 0 or -1\n * @throws {TypeError} if the input argument x is not a number\n * @private\n *\n * @example\n * sign(2); // => 1\n */\nfunction sign(x) {\n if (typeof x === \"number\") {\n if (x < 0) {\n return -1;\n } else if (x === 0) {\n return 0;\n } else {\n return 1;\n }\n } else {\n throw new TypeError(\"not a number\");\n }\n}\n\n/**\n * [Bisection method](https://en.wikipedia.org/wiki/Bisection_method) is a root-finding\n * method that repeatedly bisects an interval to find the root.\n *\n * This function returns a numerical approximation to the exact value.\n *\n * @param {Function} func input function\n * @param {number} start - start of interval\n * @param {number} end - end of interval\n * @param {number} maxIterations - the maximum number of iterations\n * @param {number} errorTolerance - the error tolerance\n * @returns {number} estimated root value\n * @throws {TypeError} Argument func must be a function\n *\n * @example\n * bisect(Math.cos,0,4,100,0.003); // => 1.572265625\n */\nfunction bisect(func, start, end, maxIterations, errorTolerance) {\n if (typeof func !== \"function\")\n { throw new TypeError(\"func must be a function\"); }\n\n for (var i = 0; i < maxIterations; i++) {\n var output = (start + end) / 2;\n\n if (\n func(output) === 0 ||\n Math.abs((end - start) / 2) < errorTolerance\n ) {\n return output;\n }\n\n if (sign(func(output)) === sign(func(start))) {\n start = output;\n } else {\n end = output;\n }\n }\n\n throw new Error(\"maximum number of iterations exceeded\");\n}\n\n/**\n * Calculate Euclidean distance between two points.\n * @param {Array<number>} left First N-dimensional point.\n * @param {Array<number>} right Second N-dimensional point.\n * @returns {number} Distance.\n */\nfunction euclideanDistance(left, right) {\n var sum = 0;\n for (var i = 0; i < left.length; i++) {\n var diff = left[i] - right[i];\n sum += diff * diff;\n }\n return Math.sqrt(sum);\n}\n\n/**\n * @typedef {Object} kMeansReturn\n * @property {Array<number>} labels The labels.\n * @property {Array<Array<number>>} centroids The cluster centroids.\n */\n\n/**\n * Perform k-means clustering.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points to be clustered.\n * @param {number} numCluster How many clusters to create.\n * @param {Function} randomSource An optional entropy source that generates uniform values in [0, 1).\n * @return {kMeansReturn} Labels (same length as data) and centroids (same length as numCluster).\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n *\n * @example\n * kMeansCluster([[0.0, 0.5], [1.0, 0.5]], 2); // => {labels: [0, 1], centroids: [[0.0, 0.5], [1.0 0.5]]}\n */\nfunction kMeansCluster(points, numCluster, randomSource) {\n if ( randomSource === void 0 ) randomSource = Math.random;\n\n var oldCentroids = null;\n var newCentroids = sample(points, numCluster, randomSource);\n var labels = null;\n var change = Number.MAX_VALUE;\n while (change !== 0) {\n labels = labelPoints(points, newCentroids);\n oldCentroids = newCentroids;\n newCentroids = calculateCentroids(points, labels, numCluster);\n change = calculateChange(newCentroids, oldCentroids);\n }\n return {\n labels: labels,\n centroids: newCentroids\n };\n}\n\n/**\n * Label each point according to which centroid it is closest to.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<Array<number>>} centroids Current centroids.\n * @return {Array<number>} Group labels.\n */\nfunction labelPoints(points, centroids) {\n return points.map(function (p) {\n var minDist = Number.MAX_VALUE;\n var label = -1;\n for (var i = 0; i < centroids.length; i++) {\n var dist = euclideanDistance(p, centroids[i]);\n if (dist < minDist) {\n minDist = dist;\n label = i;\n }\n }\n return label;\n });\n}\n\n/**\n * Calculate centroids for points given labels.\n *\n * @private\n * @param {Array<Array<number>>} points Array of XY coordinates.\n * @param {Array<number>} labels Which groups points belong to.\n * @param {number} numCluster Number of clusters being created.\n * @return {Array<Array<number>>} Centroid for each group.\n * @throws {Error} If any centroids wind up friendless (i.e., without associated points).\n */\nfunction calculateCentroids(points, labels, numCluster) {\n // Initialize accumulators.\n var dimension = points[0].length;\n var centroids = makeMatrix(numCluster, dimension);\n var counts = Array(numCluster).fill(0);\n\n // Add points to centroids' accumulators and count points per centroid.\n var numPoints = points.length;\n for (var i = 0; i < numPoints; i++) {\n var point = points[i];\n var label = labels[i];\n var current = centroids[label];\n for (var j = 0; j < dimension; j++) {\n current[j] += point[j];\n }\n counts[label] += 1;\n }\n\n // Rescale centroids, checking for any that have no points.\n for (var i$1 = 0; i$1 < numCluster; i$1++) {\n if (counts[i$1] === 0) {\n throw new Error((\"Centroid \" + i$1 + \" has no friends\"));\n }\n var centroid = centroids[i$1];\n for (var j$1 = 0; j$1 < dimension; j$1++) {\n centroid[j$1] /= counts[i$1];\n }\n }\n\n return centroids;\n}\n\n/**\n * Calculate the difference between old centroids and new centroids.\n *\n * @private\n * @param {Array<Array<number>>} left One list of centroids.\n * @param {Array<Array<number>>} right Another list of centroids.\n * @return {number} Distance between centroids.\n */\nfunction calculateChange(left, right) {\n var total = 0;\n for (var i = 0; i < left.length; i++) {\n total += euclideanDistance(left[i], right[i]);\n }\n return total;\n}\n\n/**\n * Calculate the [silhouette values](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for clustered data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<number>} The silhouette value for each point.\n *\n * @example\n * silhouette([[0.25], [0.75]], [0, 0]); // => [1.0, 1.0]\n */\nfunction silhouette(points, labels) {\n if (points.length !== labels.length) {\n throw new Error(\"must have exactly as many labels as points\");\n }\n var groupings = createGroups(labels);\n var distances = calculateAllDistances(points);\n var result = [];\n for (var i = 0; i < points.length; i++) {\n var s = 0;\n if (groupings[labels[i]].length > 1) {\n var a = meanDistanceFromPointToGroup(\n i,\n groupings[labels[i]],\n distances\n );\n var b = meanDistanceToNearestGroup(\n i,\n labels,\n groupings,\n distances\n );\n s = (b - a) / Math.max(a, b);\n }\n result.push(s);\n }\n return result;\n}\n\n/**\n * Create a lookup table mapping group IDs to point IDs.\n *\n * @private\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {Array<Array<number>>} An array of length G, each of whose entries is an array\n * containing the indices of the points in that group.\n */\nfunction createGroups(labels) {\n var numGroups = 1 + max(labels);\n var result = Array(numGroups);\n for (var i = 0; i < labels.length; i++) {\n var label = labels[i];\n if (result[label] === undefined) {\n result[label] = [];\n }\n result[label].push(i);\n }\n return result;\n}\n\n/**\n * Create a lookup table of all inter-point distances.\n *\n * @private\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @return {Array<Array<number>>} A symmetric square array of inter-point distances\n * (zero on the diagonal).\n */\nfunction calculateAllDistances(points) {\n var numPoints = points.length;\n var result = makeMatrix(numPoints, numPoints);\n for (var i = 0; i < numPoints; i++) {\n for (var j = 0; j < i; j++) {\n result[i][j] = euclideanDistance(points[i], points[j]);\n result[j][i] = result[i][j];\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between this point and all the points in the\n * nearest group (as determined by which point in another group is closest).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} labels Labels of points.\n * @param {Array<Array<number>>} groupings An array whose entries are arrays\n * containing the indices of the points in that group.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the nearest\n * group.\n */\nfunction meanDistanceToNearestGroup(which, labels, groupings, distances) {\n var label = labels[which];\n var result = Number.MAX_VALUE;\n for (var i = 0; i < groupings.length; i++) {\n if (i !== label) {\n var d = meanDistanceFromPointToGroup(\n which,\n groupings[i],\n distances\n );\n if (d < result) {\n result = d;\n }\n }\n }\n return result;\n}\n\n/**\n * Calculate the mean distance between a point and all the points in a group\n * (possibly its own).\n *\n * @private\n * @param {number} which The index of this point.\n * @param {Array<number>} group The indices of all the points in the group in\n * question.\n * @param {Array<Array<number>>} distances A symmetric square array of inter-point\n * distances.\n * @return {number} The mean distance from this point to others in the\n * specified group.\n */\nfunction meanDistanceFromPointToGroup(which, group, distances) {\n var total = 0;\n for (var i = 0; i < group.length; i++) {\n total += distances[which][group[i]];\n }\n return total / group.length;\n}\n\n/**\n * Calculate the [silhouette metric](https://en.wikipedia.org/wiki/Silhouette_(clustering))\n * for a set of N-dimensional points arranged in groups. The metric is the largest\n * individual silhouette value for the data.\n *\n * @param {Array<Array<number>>} points N-dimensional coordinates of points.\n * @param {Array<number>} labels Labels of points. This must be the same length as `points`,\n * and values must lie in [0..G-1], where G is the number of groups.\n * @return {number} The silhouette metric for the groupings.\n *\n * @example\n * silhouetteMetric([[0.25], [0.75]], [0, 0]); // => 1.0\n */\nfunction silhouetteMetric(points, labels) {\n var values = silhouette(points, labels);\n return max(values);\n}\n\n/**\n * Relative error.\n *\n * This is more difficult to calculate than it first appears [1,2]. The usual\n * formula for the relative error between an actual value A and an expected\n * value E is `|(A-E)/E|`, but:\n *\n * 1. If the expected value is 0, any other value has infinite relative error,\n * which is counter-intuitive: if the expected voltage is 0, getting 1/10th\n * of a volt doesn't feel like an infinitely large error.\n *\n * 2. This formula does not satisfy the mathematical definition of a metric [3].\n * [4] solved this problem by defining the relative error as `|ln(|A/E|)|`,\n * but that formula only works if all values are positive: for example, it\n * reports the relative error of -10 and 10 as 0.\n *\n * Our implementation sticks with convention and returns:\n *\n * - 0 if the actual and expected values are both zero\n * - Infinity if the actual value is non-zero and the expected value is zero\n * - `|(A-E)/E|` in all other cases\n *\n * [1] https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero\n * [2] https://en.wikipedia.org/wiki/Relative_change_and_difference\n * [3] https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition\n * [4] F.W.J. Olver: \"A New Approach to Error Arithmetic.\" SIAM Journal on\n * Numerical Analysis, 15(2), 1978, 10.1137/0715024.\n *\n * @param {number} actual The actual value.\n * @param {number} expected The expected value.\n * @return {number} The relative error.\n */\nfunction relativeError(actual, expected) {\n if (actual === 0 && expected === 0) {\n return 0;\n }\n return Math.abs((actual - expected) / expected);\n}\n\n/**\n * Approximate equality.\n *\n * @param {number} actual The value to be tested.\n * @param {number} expected The reference value.\n * @param {number} tolerance The acceptable relative difference.\n * @return {boolean} Whether numbers are within tolerance.\n */\nfunction approxEqual(actual, expected, tolerance) {\n if ( tolerance === void 0 ) tolerance = epsilon;\n\n return relativeError(actual, expected) <= tolerance;\n}\n\nexport { BayesianClassifier, PerceptronModel, addToMean, approxEqual, mean as average, meanSimple as averageSimple, BayesianClassifier as bayesian, bernoulliDistribution, binomialDistribution, bisect, chiSquaredDistributionTable, chiSquaredGoodnessOfFit, chunk, ckmeans, coefficientOfVariation, combinations, combinationsReplacement, combineMeans, combineVariances, cumulativeStdLogisticProbability, cumulativeStdNormalProbability, epsilon, equalIntervalBreaks, errorFunction as erf, errorFunction, extent, extentSorted, factorial, gamma, gammaln, geometricMean, harmonicMean, interquartileRange, inverseErrorFunction, interquartileRange as iqr, jenks, kMeansCluster, kernelDensityEstimation as kde, kernelDensityEstimation, linearRegression, linearRegressionLine, logAverage, logit, medianAbsoluteDeviation as mad, max, maxSorted, mean, meanSimple, median, medianAbsoluteDeviation, medianSorted, min, minSorted, mode, modeFast, modeSorted, numericSort, PerceptronModel as perceptron, permutationTest, permutationsHeap, poissonDistribution, probit, product, quantile, quantileRank, quantileRankSorted, quantileSorted, quickselect, rSquared, relativeError, rootMeanSquare as rms, rootMeanSquare, sample, sampleCorrelation, sampleCovariance, sampleKurtosis, sampleRankCorrelation, sampleSkewness, sampleStandardDeviation, sampleVariance, sampleWithReplacement, shuffle, shuffleInPlace, sign, silhouette, silhouetteMetric, standardDeviation, standardNormalTable, subtractFromMean, sum, sumNthPowerDeviations, sumSimple, tTest, tTestTwoSample, uniqueCountSorted, variance, wilcoxonRankSum, zScore };\n//# sourceMappingURL=simple-statistics.mjs.map\n","export const CHANNEL = {\n maxDimensionNumber: 8,\n maxMeasureNumber: 6\n};\nexport const EULER = 0.5772156649;\nexport const PERCENT_THRESHOLD_AS_UNIQUE_INDEX = 0.95;\nexport const DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP = 40;\nexport const DEFAULT_BIN_NUM = 8;\nexport const BIN_NUM_FOR_ANALYTIC = DEFAULT_BIN_NUM * 2;\nexport const VERSION = '0.7.5';\n","import { DEFAULT_BIN_NUM } from '../constant';\n/**\n * 只针对 stdAggregateFromCuboid 设计的写法,其他地方不要使用,不具备通用型。\n * @param rows\n * @param colKey\n * @param opKey\n * @returns\n */\nexport function sumByCol(rows, colKey, opKey) {\n let _sum = 0;\n for (let i = 0; i < rows.length; i++) {\n _sum += rows[i].stat[colKey][opKey];\n }\n return _sum;\n}\n// for cases when all values are same\nfunction fixRange(originalRange) {\n if (originalRange[0] === originalRange[1]) {\n return [originalRange[0], originalRange[1] + 0.1];\n }\n return originalRange;\n}\nexport const dist = function (values, originalRange) {\n const range = fixRange(originalRange);\n const step = (range[1] - range[0]) / DEFAULT_BIN_NUM;\n const bins = new Array(DEFAULT_BIN_NUM + 1).fill(0);\n for (let value of values) {\n const vIndex = Math.floor((value - range[0]) / step);\n bins[vIndex]++;\n }\n bins[DEFAULT_BIN_NUM - 1] += bins[DEFAULT_BIN_NUM];\n return bins.slice(0, -1);\n};\nexport function distMergeBy(rows, colKey, opKey) {\n const bins = new Array(DEFAULT_BIN_NUM).fill(0);\n for (let i = 0; i < rows.length; i++) {\n const recordBins = rows[i].stat[colKey][opKey];\n for (let j = 0; j < bins.length; j++) {\n bins[j] += recordBins[j];\n }\n }\n return bins;\n}\n","import { min, max, sum, mean } from 'simple-statistics';\nimport { distMergeBy, sumByCol } from './aggregators';\nconst SPLITOR = '_join_';\nconst count = function (x) {\n return x.length;\n};\nexport const SFMapper = {\n sum,\n max,\n mean,\n min,\n count\n};\nexport function getAggregator(op) {\n const func = SFMapper[op] || sum;\n return func;\n}\nexport function groupBy(rows, by) {\n const groups = new Map();\n for (let record of rows) {\n const key = by.map((d) => record[d]).join(SPLITOR);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key).push(record);\n }\n return groups;\n}\nexport function simpleAggregate(props) {\n const { dataSource, dimensions, measures, ops } = props;\n const groups = groupBy(dataSource, dimensions);\n const result = [];\n for (let [key, group] of groups) {\n const aggs = {};\n measures.forEach((mea, meaIndex) => {\n const opFunc = getAggregator(ops[meaIndex]);\n aggs[mea] = opFunc(group.map(r => r[mea]));\n });\n const dimValues = key.split(SPLITOR);\n dimensions.forEach((dim, dimIndex) => {\n aggs[dim] = dimValues[dimIndex];\n });\n result.push(aggs);\n }\n return result;\n}\nexport function stdAggregate(props) {\n const { dataSource, dimensions, measures, ops } = props;\n const groups = groupBy(dataSource, dimensions);\n const result = [];\n for (let [key, group] of groups) {\n const aggs = {\n groupDict: {},\n stat: {}\n };\n measures.forEach((mea, meaIndex) => {\n aggs.stat[mea] = {};\n ops.forEach(op => {\n const opFunc = getAggregator(op);\n aggs.stat[mea][op] = opFunc(group.map((r) => r[mea]));\n });\n });\n const dimValues = key.split(SPLITOR);\n dimensions.forEach((dim, dimIndex) => {\n aggs.groupDict[dim] = dimValues[dimIndex];\n });\n result.push(aggs);\n }\n return result;\n}\nexport function getAggHashKey(values) {\n return values.join(SPLITOR);\n}\nfunction cuboidStateGroupBy(state, by) {\n const groups = new Map();\n for (let record of state) {\n const key = by.map((d) => record.groupDict[d]).join(SPLITOR);\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key).push(record);\n }\n return groups;\n}\nexport function stdAggregateFromCuboid(props) {\n const { cuboidState, dimensions, measures, ops } = props;\n const groups = cuboidStateGroupBy(cuboidState, dimensions);\n const result = [];\n // TODO: need a formal solution for distributive\\algebraic\\holistic aggregators.\n const generalOpNames = ops.filter(op => !(['sum', 'count', 'mean', 'dist'].includes(op)));\n const generalOps = generalOpNames.map(opName => getAggregator(opName));\n for (let [key, group] of groups) {\n const aggs = {\n groupDict: {},\n stat: {}\n };\n for (let meaIndex = 0; meaIndex < measures.length; meaIndex++) {\n const mea = measures[meaIndex];\n aggs.stat[mea] = {};\n generalOps.forEach((op, opIndex) => {\n const opName = generalOpNames[opIndex];\n aggs.stat[mea][opName] = op(group.map((r) => r.stat[mea][opName]));\n });\n // 讨论:描述的简洁性 vs 性能\n aggs.stat[mea][\"sum\"] = sumByCol(group, mea, 'sum');\n aggs.stat[mea][\"count\"] = sumByCol(group, mea, 'count');\n // aggs[mea][\"sum\"] = getAggregator('sum')(group.map((r) => r[mea][\"sum\"]));\n // aggs[mea][\"count\"] = getAggregator('sum')(group.map((r) => r[mea]['count']));\n aggs.stat[mea][\"mean\"] = aggs.stat[mea]['sum'] / aggs.stat[mea]['count'];\n aggs.stat[mea]['dist'] = distMergeBy(group, mea, 'dist');\n }\n const dimValues = key.split(SPLITOR);\n for (let dimIndex = 0; dimIndex < dimensions.length; dimIndex++) {\n aggs.groupDict[dimensions[dimIndex]] = dimValues[dimIndex];\n }\n result.push(aggs);\n }\n return result;\n}\n","export const TopKSingleField = 6;\nexport const TopKView = 15;\nexport const Depth = 4;\nexport const VisualLimit = 8;\nexport const TopKPercentField = 0.8;\nexport const CrammersVThreshold = 0.3;\nexport const PearsonCorrelation = {\n strong: 0.5,\n weak: 0.3\n};\n","/**\n *\n * @param matrix adjmatrix\n */\nfunction turnAdjMatrix2List(matrix) {\n // only for the special matrix here(corelational matrix)\n let edges = [];\n for (let i = 0; i < matrix.length; i++) {\n for (let j = i + 1; j < matrix[i].length; j++) {\n edges.push([[i, j], Math.abs(matrix[i][j])]);\n }\n }\n return edges;\n}\nfunction find(parents, n) {\n return parents[n] === n ? n : parents[n] = find(parents, parents[n]);\n}\nfunction union(parents, n1, n2) {\n let p1 = find(parents, n1);\n let p2 = find(parents, n2);\n parents[p1] = p2;\n // I'm too tired. this is just a tmp lazy solution.... will be fixed later.\n // may check and prove whether it's necessary.\n find(parents, n1);\n find(parents, n2);\n}\nfunction findWithEffect(parents, sizes, n) {\n if (parents[n] === n) {\n return n;\n }\n parents[n] = findWithEffect(parents, sizes, parents[n]);\n sizes[n] = sizes[parents[n]];\n return parents[n];\n}\nfunction unionWithEffect(parents, sizes, n1, n2) {\n let p1 = findWithEffect(parents, sizes, n1);\n let p2 = findWithEffect(parents, sizes, n2);\n let size1 = sizes[p1];\n let size2 = sizes[p2];\n parents[p1] = p2;\n sizes[p1] = sizes[p2] = size1 + size2;\n findWithEffect(parents, sizes, n1);\n findWithEffect(parents, sizes, n2);\n}\n/**\n * maxiumn spanning tree\n * @param matrix adjmatrix\n * @param groupNumber number of group generated by clustering\n */\nfunction kruskal(matrix, groupNumber, threshold = 0) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const parents = matrix.map((m, i) => i);\n for (let edge of edges) {\n if (find(parents, edge[0][0]) !== find(parents, edge[0][1])) {\n union(parents, edge[0][0], edge[0][1]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = find(parents, i);\n }\n let set = new Set(parents);\n if (set.size <= groupNumber || edge[1] < threshold) {\n break;\n }\n }\n let groups = new Map();\n for (let i = 0; i < parents.length; i++) {\n if (!groups.has(parents[i])) {\n groups.set(parents[i], []);\n }\n groups.get(parents[i]).push(i);\n }\n return groups;\n}\n// todo: delete kruskal with limit size, use largest size to limit it(uncontrolled group number but better), need discuss.\n/**\n *\n * @param matrix\n * @param limitSize max size of each group\n */\nfunction kruskalWithLimitSize(matrix, limitSize) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const parents = matrix.map((m, i) => i);\n const sizes = matrix.map(() => 1);\n for (let edge of edges) {\n if (findWithEffect(parents, sizes, edge[0][0]) !== findWithEffect(parents, sizes, edge[0][1])) {\n if (sizes[edge[0][0]] + sizes[edge[0][1]] > limitSize) {\n continue;\n }\n unionWithEffect(parents, sizes, edge[0][0], edge[0][1]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = findWithEffect(parents, sizes, i);\n }\n let set = new Set(parents);\n if (set.size === 1) {\n break;\n }\n }\n let groups = new Map();\n for (let i = 0; i < parents.length; i++) {\n if (!groups.has(parents[i])) {\n groups.set(parents[i], []);\n }\n groups.get(parents[i]).push(i);\n }\n return groups;\n}\nexport function kruskalMSTWithLimitSize(matrix, limitSize = 4) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const edgesInMST = [];\n const parents = matrix.map((m, i) => i);\n const cloneParents = matrix.map((m, i) => i);\n const sizes = matrix.map(() => 1);\n for (let edge of edges) {\n if (findWithEffect(parents, sizes, edge[0][0]) !== findWithEffect(parents, sizes, edge[0][1])) {\n if (sizes[edge[0][0]] + sizes[edge[0][1]] > limitSize) {\n if (find(cloneParents, edge[0][0]) !== find(cloneParents, edge[0][1])) {\n edgesInMST.push([edge[0], edge[1], true]);\n union(cloneParents, edge[0][0], edge[0][1]);\n }\n continue;\n }\n unionWithEffect(parents, sizes, edge[0][0], edge[0][1]);\n // fuck typescript\n // edgesInMST.push([...edge, inCutEdge]);\n edgesInMST.push([edge[0], edge[1], false]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = findWithEffect(parents, sizes, i);\n cloneParents[i] = find(cloneParents, i);\n }\n let set = new Set(parents);\n if (set.size === 1) {\n break;\n }\n }\n return { edgesInMST, groups: parents };\n}\n/**\n *\n * @param matrix\n * @param groupNumber number of group generated by clustering\n */\nexport function kruskalMST(matrix, groupNumber = 4, threshold = 0) {\n const edges = turnAdjMatrix2List(matrix);\n edges.sort((a, b) => b[1] - a[1]);\n const edgesInMST = [];\n const parents = matrix.map((m, i) => i);\n let groups = [...parents];\n let inCutEdge = false;\n for (let edge of edges) {\n if (find(parents, edge[0][0]) !== find(parents, edge[0][1])) {\n union(parents, edge[0][0], edge[0][1]);\n // fuck typescript\n // edgesInMST.push([...edge, inCutEdge]);\n edgesInMST.push([edge[0], edge[1], inCutEdge]);\n }\n for (let i = 0; i < parents.length; i++) {\n parents[i] = find(parents, i);\n }\n let set = new Set(parents);\n // TODO:\n // + use kruskalMST instead of kruskal.\n if (set.size <= groupNumber || edge[1] < threshold) {\n inCutEdge = true;\n }\n else {\n groups = [...parents];\n }\n if (set.size === 1) {\n break;\n }\n }\n return { edgesInMST, groups };\n}\nfunction cluster({ matrix, measures, method = 'kruskal', groupMaxSize = 4, limitSize = false, threshold = 0 }) {\n // const groups = kruskal({ matrix, groupMaxSize });\n let groups;\n if (limitSize) {\n groups = kruskalWithLimitSize(matrix, groupMaxSize);\n }\n else {\n groups = kruskal(matrix, groupMaxSize, threshold);\n }\n let ans = [];\n for (let meas of groups.values()) {\n ans.push(meas.map(meaIndex => measures[meaIndex]));\n }\n return ans;\n}\nexport default cluster;\n","/**\n * todo reservoir sampling is better to support stream data\n * Algorithm R:\n * Vitter, Jeffrey S. (1 March 1985). \"Random sampling with a reservoir\" (PDF). ACM Transactions on Mathematical Software. 11 (1): 37–57. CiteSeerX 10.1.1.138.784. doi:10.1145/3147.3165.\n */\nexport function reservoirSampling(dataSource, size = 500) {\n if (dataSource.length <= size)\n return dataSource;\n let sampleSpace = dataSource.slice(0, size);\n let len = dataSource.length;\n for (let i = size + 1; i < len; i++) {\n let pos = Math.round(Math.random() * i);\n if (pos < size) {\n sampleSpace[pos] = dataSource[i];\n }\n }\n return sampleSpace;\n}\nfunction linearCongruentialGenerator(size, seed) {\n if (size === 0)\n return [];\n const m = 2147483647;\n const a = 1103515245;\n const c = 12345;\n let ans = [seed];\n for (let i = 1; i < size; i++) {\n ans.push(((ans[i - 1] * a + c) % m));\n }\n return ans.map(v => v / m);\n}\nexport function uniformSampling(dataSource, size) {\n let sampleIndexes = linearCongruentialGenerator(size, Math.random() * 2147483647);\n let ans = [];\n for (let i = 0; i < size; i++) {\n let index = Math.floor(sampleIndexes[i] * size) % size;\n ans.push(dataSource[index]);\n }\n return ans;\n}\n","import { uniformSampling } from \"../../sampling\";\nimport { EULER } from \"../../constant\";\nexport class IsolationForest {\n constructor(dimensions, measures, dataSource, treeNumber = 100, Psi = 256) {\n this.dimensions = dimensions;\n this.measures = measures;\n this.dataSource = dataSource;\n if (dataSource.length < Psi) {\n this.treeNumber = Math.max(1, Math.ceil(Psi / 50));\n this.sampleSize = Math.max(2, Math.floor(dataSource.length / 2));\n }\n else {\n this.treeNumber = treeNumber;\n this.sampleSize = Psi;\n }\n this.limitHeight = Math.ceil(Math.log2(this.sampleSize));\n this.iForest = [];\n this.normalizeDimensions();\n }\n normalizeDimensions() {\n this.normalizedDataSource = [];\n this.valueSets = [];\n this.ranges = [];\n this.dimensions.forEach(() => {\n this.valueSets.push(new Map());\n });\n this.measures.forEach(() => {\n this.ranges.push([Infinity, -Infinity]);\n });\n this.dataSource.forEach(record => {\n this.dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n if (!this.valueSets[index].has(value)) {\n this.valueSets[index].set(value, this.valueSets[index].size);\n }\n });\n this.measures.forEach((mea, index) => {\n let value = record[mea];\n if (typeof value === 'number') {\n this.ranges[index][0] = Math.min(this.ranges[index][0], value);\n this.ranges[index][1] = Math.max(this.ranges[index][1], value);\n }\n });\n });\n this.dataSource.forEach(record => {\n let normalizedRecord = this.normalizeRecord(record);\n this.normalizedDataSource.push(normalizedRecord);\n });\n return this.normalizedDataSource;\n }\n normalizeRecord(record) {\n let normalizedRecord = {};\n this.measures.forEach(mea => {\n normalizedRecord[mea] = record[mea];\n });\n this.dimensions.forEach((dim, index) => {\n let value = (record[dim] || 'others').toString();\n normalizedRecord[dim] = this.valueSets[index].get(value);\n });\n return normalizedRecord;\n }\n buildIsolationTree(normalizedSampleData, depth) {\n if (depth >= this.limitHeight || normalizedSampleData.length <= 1) {\n return null;\n }\n else {\n let rand = Math.random();\n let randField = this.measures[0] || this.dimensions[0];\n let dimLength = this.dimensions.length;\n let meaLength = this.measures.length;\n let randValue = 0;\n if (rand >= dimLength / (dimLength + meaLength)) {\n let index = Math.floor(Math.random() * meaLength) % meaLength;\n randField = this.measures[index];\n randValue = this.ranges[index][0] + (this.ranges[index][1] - this.ranges[index][0]) * Math.random();\n }\n else {\n let index = Math.floor(Math.random() * dimLength) % dimLength;\n randField = this.dimensions[index];\n randValue = Math.floor(this.valueSets[index].size * Math.random()) % this.valueSets[index].size;\n }\n // random in range not in distribution.\n // let randValue = normalizedSampleData[Math.floor(Math.random() * normalizedSampleData.length) % normalizedSampleData.length][randField];\n let leftSubData = [];\n let rightSubData = [];\n for (let record of normalizedSampleData) {\n if (record[randField] < randValue) {\n leftSubData.push(record);\n }\n else {\n rightSubData.push(record);\n }\n }\n let node = {\n field: randField,\n value: randValue,\n size: normalizedSampleData.length\n };\n node.left = this.buildIsolationTree(leftSubData, depth + 1);\n node.right = this.buildIsolationTree(rightSubData, depth + 1);\n return node;\n }\n }\n /**\n * average unsuccessful searches in BST (Preiss, 1999)\n * @param Psi\n */\n AFS(Psi) {\n if (Psi > 2)\n return 2 * (Math.log(Psi - 1) + EULER) - 2 * (Psi - 1) / Psi;\n if (Psi === 2)\n return 1;\n return 0;\n }\n getPathLength(record, iTree, pathLength, nodeSize) {\n if (iTree === null) {\n return pathLength + this.AFS(nodeSize);\n }\n let value = record[iTree.field];\n if (value < iTree.value) {\n return this.getPathLength(record, iTree.left, pathLength + 1, iTree.size);\n }\n else {\n return this.getPathLength(record, iTree.right, pathLength + 1, iTree.size);\n }\n }\n buildIsolationForest() {\n this.iForest = [];\n for (let i = 0; i < this.treeNumber; i++) {\n let samples = uniformSampling(this.normalizedDataSource, this.sampleSize);\n let iTree = this.buildIsolationTree(samples, 0);\n this.iForest.push(iTree);\n }\n return this.iForest;\n }\n // public evaluate (record: Record): number {\n // }\n estimateOutierScore() {\n this.recordScoreList = [];\n this.normalizedDataSource.forEach(record => {\n let recordScore = 0;\n let avgPathLength = 0;\n this.iForest.forEach(iTree => {\n avgPathLength += this.getPathLength(record, iTree, 0, this.sampleSize);\n });\n avgPathLength /= this.iForest.length;\n recordScore = Math.pow(2, -(avgPathLength / this.AFS(this.sampleSize)));\n this.recordScoreList.push(recordScore);\n });\n return this.recordScoreList;\n }\n}\n","import * as Cluster from './cluster/index';\nimport { KNN } from './classification/knn';\nimport { IsolationForest } from './outlier/isolationForest';\nconst Outier = {\n IsolationForest\n};\nconst Classification = {\n KNN\n};\nexport { Cluster, Outier, Classification };\n","import { crammersV, getCombination, pearsonCC } from '../statistics/index';\nimport { CrammersVThreshold, PearsonCorrelation } from './config';\nimport { Cluster } from '../ml/index';\nimport { CHANNEL } from '../constant';\n// insights like outlier and trend both request high impurity of dimension.\nexport function getDimCorrelationMatrix(dataSource, dimensions) {\n let matrix = dimensions.map(d => dimensions.map(d => 0));\n for (let i = 0; i < dimensions.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < dimensions.length; j++) {\n matrix[i][j] = matrix[j][i] = crammersV(dataSource, dimensions[i], dimensions[j]);\n }\n }\n return matrix;\n}\nexport function getMeaCorrelationMatrix(dataSource, measures) {\n let matrix = measures.map(i => measures.map(j => 0));\n for (let i = 0; i < measures.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < measures.length; j++) {\n let r = pearsonCC(dataSource, measures[i], measures[j]);\n matrix[j][i] = matrix[i][j] = r;\n }\n }\n return matrix;\n}\nexport function getDimClusterGroups(dataSource, dimensions, threshold = CrammersVThreshold, max_number_of_group) {\n const maxDimNumberInView = 4;\n let dimCorrelationMatrix = getDimCorrelationMatrix(dataSource, dimensions);\n // groupMaxSize here means group number.\n let groups = Cluster.kruskal({\n matrix: dimCorrelationMatrix,\n measures: dimensions,\n groupMaxSize: max_number_of_group ? max_number_of_group : Math.round(dimensions.length / maxDimNumberInView),\n threshold,\n });\n return groups;\n}\nexport function getDimSetsBasedOnClusterGroups(dataSource, dimensions, correlation_threshold, max_dimensions_in_space) {\n let dimSets = [];\n let groups = getDimClusterGroups(dataSource, dimensions, correlation_threshold);\n for (let group of groups) {\n let combineDimSet = getCombination(group, 1, max_dimensions_in_space ? max_dimensions_in_space : CHANNEL.maxDimensionNumber);\n dimSets.push(...combineDimSet);\n }\n return dimSets;\n}\n/**\n *\n * @param dataSource\n * @param measures\n * @param correlation_threshold a threshold of correlation used to define min correlation value in a cluster of measure.\n * @param max_measure_in_view\n */\nexport function getMeaSetsBasedOnClusterGroups(dataSource, measures, correlation_threshold, max_number_of_group = 3) {\n const soft_max_measures_in_view = 3;\n let correlationMatrix = getMeaCorrelationMatrix(dataSource, measures);\n let groups = Cluster.kruskal({\n matrix: correlationMatrix,\n measures: measures,\n groupMaxSize: max_number_of_group ? max_number_of_group : Math.round(measures.length / soft_max_measures_in_view),\n threshold: correlation_threshold ? correlation_threshold : PearsonCorrelation.strong\n });\n return groups;\n}\nexport function subspaceSearching(dataSource, dimensions, should_dimensions_correlated = true) {\n if (should_dimensions_correlated) {\n return getDimSetsBasedOnClusterGroups(dataSource, dimensions);\n }\n else {\n return getCombination(dimensions);\n }\n}\nexport function getRelatedVertices(adjMatrix, vertices, verticesInGraph, topK) {\n let verStatus = vertices.map(v => verticesInGraph.includes(v));\n let edges = [];\n let ans = [];\n for (let i = 0; i < adjMatrix.length; i++) {\n // if vertex in graph, then check all the edges from this vertex\n if (verStatus[i]) {\n for (let j = 0; j < adjMatrix[i].length; j++) {\n if (!verStatus[j]) {\n edges.push([adjMatrix[i][j], [i, j]]);\n }\n }\n }\n }\n edges.sort((a, b) => {\n return b[0] - a[0];\n });\n for (let i = 0; i < edges.length; i++) {\n let targetVertexIndex = edges[i][1][1];\n if (!verStatus[targetVertexIndex]) {\n verStatus[targetVertexIndex] = true;\n ans.push({\n field: vertices[targetVertexIndex],\n corValue: edges[i][0]\n });\n }\n }\n return ans.slice(0, topK ? topK : ans.length);\n}\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Node = /** @class */ (function () {\n function Node(aggFunc) {\n this.children = new Map();\n this._rawData = [];\n this.aggFunc = aggFunc;\n this.cache = false;\n }\n Node.prototype.push = function () {\n var _a;\n var params = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n (_a = this._rawData).push.apply(_a, __spread(params));\n };\n Node.prototype.aggData = function (measures) {\n if (measures === void 0) { measures = []; }\n if (!this.cache) {\n this._aggData = this.aggFunc(this.rawData, measures);\n this.cache = true;\n }\n return this._aggData;\n };\n Node.prototype.clearCache = function () {\n this.cache = false;\n };\n Object.defineProperty(Node.prototype, \"rawData\", {\n get: function () {\n var e_1, _a;\n if (!this.cache) {\n if (this.children.size !== 0) {\n var children = this.children.values();\n var rawData = [];\n try {\n for (var children_1 = __values(children), children_1_1 = children_1.next(); !children_1_1.done; children_1_1 = children_1.next()) {\n var child = children_1_1.value;\n var i = void 0;\n var data = child.rawData;\n var len = data.length;\n for (i = 0; i < len; i++) {\n rawData.push(data[i]);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (children_1_1 && !children_1_1.done && (_a = children_1.return)) _a.call(children_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n this._rawData = rawData;\n }\n this.cache = true;\n }\n return this._rawData;\n },\n enumerable: true,\n configurable: true\n });\n Node.prototype.getNode = function (dimensions) {\n var search = function (node, level) {\n var e_2, _a;\n if (level === dimensions.length) {\n return node;\n }\n var children = node.children.entries();\n try {\n for (var children_2 = __values(children), children_2_1 = children_2.next(); !children_2_1.done; children_2_1 = children_2.next()) {\n var _b = __read(children_2_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (children_2_1 && !children_2_1.done && (_a = children_2.return)) _a.call(children_2);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return null;\n };\n return search(this, 0);\n };\n return Node;\n}());\nvar periodCube = /** @class */ (function () {\n function periodCube(props) {\n this.aggFunc = props.aggFunc;\n this.factTable = props.factTable;\n this.dimensions = props.dimensions;\n this.measures = props.measures;\n }\n periodCube.prototype.get = function (dimensions) {\n var _a = this, tree = _a.tree, aggFunc = _a.aggFunc, measures = _a.measures;\n var search = function (node, level) {\n var e_3, _a;\n if (level === dimensions.length) {\n return node.aggData(measures);\n }\n var children = node.children.entries();\n try {\n for (var children_3 = __values(children), children_3_1 = children_3.next(); !children_3_1.done; children_3_1 = children_3.next()) {\n var _b = __read(children_3_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (children_3_1 && !children_3_1.done && (_a = children_3.return)) _a.call(children_3);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return false;\n };\n return search(tree, 0);\n };\n periodCube.prototype.getNode = function (dimensions) {\n var tree = this.tree;\n return tree.getNode(dimensions);\n };\n periodCube.prototype.buildTree = function () {\n var tree = new Node(this.aggFunc);\n var len = this.factTable.length, i;\n for (i = 0; i < len; i++) {\n this.insertNode(this.factTable[i], tree, 0);\n }\n this.tree = tree;\n return tree;\n };\n periodCube.prototype.insertNode = function (record, node, level) {\n node.push(record);\n node.cache = false;\n if (level < this.dimensions.length) {\n var member = record[this.dimensions[level]];\n if (!node.children.has(member)) {\n node.children.set(member, new Node(this.aggFunc));\n }\n this.insertNode(record, node.children.get(member), level + 1);\n }\n };\n periodCube.prototype.aggTree = function (node) {\n var e_4, _a;\n if (node === void 0) { node = this.tree; }\n var children = node.children.values();\n try {\n for (var children_4 = __values(children), children_4_1 = children_4.next(); !children_4_1.done; children_4_1 = children_4.next()) {\n var child = children_4_1.value;\n this.aggTree(child);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (children_4_1 && !children_4_1.done && (_a = children_4.return)) _a.call(children_4);\n }\n finally { if (e_4) throw e_4.error; }\n }\n node.aggData(this.measures);\n return node;\n };\n periodCube.prototype.aggNode = function (node) {\n var e_5, _a;\n if (node === void 0) { node = this.tree; }\n var children = node.children.values();\n try {\n for (var children_5 = __values(children), children_5_1 = children_5.next(); !children_5_1.done; children_5_1 = children_5.next()) {\n var child = children_5_1.value;\n this.aggTree(child);\n }\n }\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\n finally {\n try {\n if (children_5_1 && !children_5_1.done && (_a = children_5.return)) _a.call(children_5);\n }\n finally { if (e_5) throw e_5.error; }\n }\n node.aggData(this.measures);\n return node;\n };\n return periodCube;\n}());\nexports.default = periodCube;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Node = /** @class */ (function () {\n function Node() {\n this.children = new Map();\n this.rawData = [];\n }\n Node.prototype.push = function () {\n var _a;\n var params = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n (_a = this.rawData).push.apply(_a, __spread(params));\n };\n Node.prototype.aggData = function (aggFunc, measures) {\n if (measures === void 0) { measures = []; }\n this._aggData = aggFunc(this.rawData, measures);\n return this._aggData;\n };\n Node.prototype.getNode = function (dimensions) {\n var search = function (node, level) {\n var e_1, _a;\n if (level === dimensions.length) {\n return node;\n }\n var children = node.children.entries();\n try {\n for (var children_1 = __values(children), children_1_1 = children_1.next(); !children_1_1.done; children_1_1 = children_1.next()) {\n var _b = __read(children_1_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (children_1_1 && !children_1_1.done && (_a = children_1.return)) _a.call(children_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return null;\n };\n return search(this, 0);\n };\n return Node;\n}());\nexports.Node = Node;\nvar momentCube = /** @class */ (function () {\n function momentCube(props) {\n this.aggFunc = props.aggFunc;\n this.factTable = props.factTable;\n this.dimensions = props.dimensions;\n this.measures = props.measures;\n this.buildTree();\n this.aggTree();\n }\n momentCube.prototype.get = function (dimensions) {\n var _a = this, tree = _a.tree, aggFunc = _a.aggFunc, measures = _a.measures;\n var search = function (node, level) {\n var e_2, _a;\n if (level === dimensions.length) {\n return node.aggData(aggFunc, measures);\n }\n var children = node.children.entries();\n try {\n for (var children_2 = __values(children), children_2_1 = children_2.next(); !children_2_1.done; children_2_1 = children_2.next()) {\n var _b = __read(children_2_1.value, 2), childName = _b[0], child = _b[1];\n if (childName === dimensions[level]) {\n return search(child, level + 1);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (children_2_1 && !children_2_1.done && (_a = children_2.return)) _a.call(children_2);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return false;\n };\n return search(tree, 0);\n };\n momentCube.prototype.getNode = function (dimensions) {\n var tree = this.tree;\n return tree.getNode(dimensions);\n };\n momentCube.prototype.setData = function (props) {\n var _a = props.aggFunc, aggFunc = _a === void 0 ? this.aggFunc : _a, _b = props.factTable, factTable = _b === void 0 ? this.factTable : _b, _c = props.dimensions, dimensions = _c === void 0 ? this.dimensions : _c, _d = props.measures, measures = _d === void 0 ? this.measures : _d;\n if (dimensions !== this.dimensions || factTable !== this.factTable) {\n this.dimensions = dimensions;\n this.factTable = factTable;\n this.measures = measures;\n this.aggFunc = aggFunc;\n this.buildTree();\n this.aggTree();\n }\n else if (measures !== this.measures || aggFunc !== this.aggFunc) {\n this.measures = measures;\n this.aggFunc = aggFunc;\n this.aggTree();\n }\n };\n momentCube.prototype.buildTree = function () {\n var tree = new Node();\n var len = this.factTable.length, i;\n for (i = 0; i < len; i++) {\n this.insertNode(this.factTable[i], tree, 0);\n }\n this.tree = tree;\n return tree;\n };\n momentCube.prototype.insertNode = function (record, node, level) {\n if (level === this.dimensions.length) {\n node.push(record);\n }\n else {\n var member = record[this.dimensions[level]];\n if (!node.children.has(member)) {\n node.children.set(member, new Node());\n }\n this.insertNode(record, node.children.get(member), level + 1);\n }\n };\n momentCube.prototype.aggTree = function (node) {\n var e_3, _a;\n if (node === void 0) { node = this.tree; }\n if (node.children.size > 0) {\n node.rawData = [];\n var children = node.children.values();\n try {\n for (var children_3 = __values(children), children_3_1 = children_3.next(); !children_3_1.done; children_3_1 = children_3.next()) {\n var child = children_3_1.value;\n var i = void 0;\n var data = this.aggTree(child).rawData;\n var len = data.length;\n for (i = 0; i < len; i++) {\n node.rawData.push(data[i]);\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (children_3_1 && !children_3_1.done && (_a = children_3.return)) _a.call(children_3);\n }\n finally { if (e_3) throw e_3.error; }\n }\n }\n node.aggData(this.aggFunc, this.measures);\n return node;\n };\n return momentCube;\n}());\nexports.default = momentCube;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar periodCube_1 = require(\"./periodCube\");\nexports.periodCube = periodCube_1.default;\nvar momentCube_1 = require(\"./momentCube\");\nexports.momentCube = momentCube_1.default;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tree2Table(props) {\n var dimensions = props.dimensions, measures = props.measures, cube = props.cube;\n var aggFunc = cube.aggFunc;\n var table = [];\n function dfs(node, record, level) {\n var e_1, _a, _b;\n if (node.children.size === 0) {\n var values = node._aggData;\n table.push(__assign(__assign({}, record), values));\n return;\n }\n try {\n for (var _c = __values(node.children.entries()), _d = _c.next(); !_d.done; _d = _c.next()) {\n var _e = __read(_d.value, 2), childName = _e[0], child = _e[1];\n var r = __assign(__assign({}, record), (_b = {}, _b[dimensions[level]] = childName, _b));\n dfs(child, r, level + 1);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n dfs(cube.tree, {}, 0);\n return table;\n}\nexports.tree2Table = tree2Table;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sum_unsafe = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_1 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += subset[i][mea];\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_1(i, len);\n }\n return sums;\n};\nexports.sum = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_2 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += Number(subset[i][mea]) || 0;\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_2(i, len);\n }\n return sums;\n};\nexports.count = function (subset, MEASURES) {\n var cnts = {};\n MEASURES.forEach(function (mea) {\n cnts[mea] = 0;\n });\n for (var i = 0, len = subset.length; i < len; i++) {\n MEASURES.forEach(function (mea) {\n cnts[mea]++;\n });\n }\n return cnts;\n};\nexports.mean = function (subset, measures) {\n var sums = {};\n measures.forEach(function (mea) {\n sums[mea] = 0;\n });\n var _loop_3 = function (i, len) {\n measures.forEach(function (mea) {\n sums[mea] += Number(subset[i][mea]) || 0;\n });\n };\n for (var i = 0, len = subset.length; i < len; i++) {\n _loop_3(i, len);\n }\n measures.forEach(function (mea) {\n sums[mea] /= subset.length;\n });\n return sums;\n};\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar index_1 = require(\"./core/index\");\n// import { JsonRecord } from './types';\nvar transform_1 = require(\"./utils/transform\");\nvar aggregation_1 = require(\"./utils/aggregation\");\nvar operatorMap = {\n 'sum': aggregation_1.sum_unsafe,\n 'mean': aggregation_1.mean,\n 'count': aggregation_1.count,\n};\nfunction copyDataSource(data) {\n return data.map(function (row) {\n return __assign({}, row);\n });\n}\nfunction aggregate(props) {\n var dimensions = props.dimensions, measures = props.measures, asFields = props.asFields, operator = props.operator, dataSource = props.dataSource;\n var data = [];\n var cube = createCube({\n type: 'moment',\n aggFunc: operatorMap[operator] || aggregation_1.count,\n dimensions: dimensions,\n measures: measures,\n factTable: dataSource\n });\n var table = transform_1.tree2Table({ dimensions: dimensions, measures: measures, cube: cube });\n table.forEach(function (row) {\n asFields.forEach(function (as, i) {\n row[as] = row[measures[i]];\n });\n });\n return table;\n}\nfunction createCube(_a) {\n var type = _a.type, _b = _a.aggFunc, aggFunc = _b === void 0 ? aggregation_1.count : _b, _c = _a.factTable, factTable = _c === void 0 ? [] : _c, _d = _a.dimensions, dimensions = _d === void 0 ? [] : _d, _e = _a.measures, measures = _e === void 0 ? [] : _e;\n switch (type) {\n case \"period\":\n return new index_1.periodCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n case \"moment\":\n return new index_1.momentCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n default:\n return new index_1.momentCube({\n aggFunc: aggFunc,\n factTable: factTable,\n dimensions: dimensions,\n measures: measures\n });\n }\n}\nexports.createCube = createCube;\nexports.default = aggregate;\n__export(require(\"./utils/aggregation\"));\n","import { getMeaSetsBasedOnClusterGroups, getDimClusterGroups } from './subspaces';\nimport { CrammersVThreshold, PearsonCorrelation } from './config';\nimport { Outier } from '../ml/index';\nimport { getCombination, mapPositive } from '../statistics/index';\nimport { CHANNEL } from '../constant';\nimport { entropy, normalize } from '../statistics/index';\nimport aggregate from 'cube-core';\nimport { oneDLinearRegression } from '../statistics/index';\nimport { GroupIntention } from \"./intention/groups\";\nconst SPLITER = '=;=';\nfunction crossGroups(dimensionGroups, measureGroups) {\n let viewSpaces = [];\n for (let dimensions of dimensionGroups) {\n for (let measures of measureGroups) {\n viewSpaces.push({\n dimensions,\n measures\n });\n }\n }\n return viewSpaces;\n}\nfunction getDimSetsFromClusterGroups(groups) {\n let dimSets = [];\n for (let group of groups) {\n let combineDimSet = getCombination(group, 1, CHANNEL.maxDimensionNumber);\n dimSets.push(...combineDimSet);\n }\n return dimSets;\n}\nfunction getCombinationFromClusterGroups(groups, limitSize = CHANNEL.maxDimensionNumber) {\n let fieldSets = [];\n for (let group of groups) {\n let combineFieldSet = getCombination(group, 1, limitSize);\n fieldSets.push(...combineFieldSet);\n }\n return fieldSets;\n}\nexport const getGeneralIntentionSpace = async function (aggData, dimensions, measures) {\n let score = 0;\n let significance = 0;\n for (let mea of measures) {\n let fL = aggData.map(r => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n score += value;\n significance += value / Math.log2(fL.length);\n }\n score /= measures.length;\n significance /= measures.length;\n significance = 1 - significance;\n return {\n dimensions,\n measures,\n type: 'default_general',\n score,\n impurity: score,\n significance,\n order: 'asc'\n };\n};\nexport const getOutlierIntentionSpace = async function getOutlierIntentionSpace(aggData, dimensions, measures) {\n let iForest = new Outier.IsolationForest([], measures, aggData);\n iForest.buildIsolationForest();\n let scoreList = iForest.estimateOutierScore();\n let maxIndex = 0;\n let score = 0;\n for (let i = 0; i < scoreList.length; i++) {\n if (scoreList[i] > score) {\n score = scoreList[i];\n maxIndex = i;\n }\n }\n let des = {};\n dimensions.concat(measures).forEach(mea => { des[mea] = aggData[maxIndex][mea]; });\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc',\n description: des\n };\n};\nexport const getTrendIntentionSpace = async function (aggData, dimensions, measures) {\n if (dimensions.length !== 1)\n return null;\n let orderedData = [...aggData];\n orderedData.sort((a, b) => {\n if (a[dimensions[0]] > b[dimensions[0]])\n return 1;\n if (a[dimensions[0]] === b[dimensions[0]])\n return 0;\n if (a[dimensions[0]] < b[dimensions[0]])\n return -1;\n });\n let score = 0;\n for (let mea of measures) {\n let linearModel = new oneDLinearRegression(orderedData, dimensions[0], mea);\n linearModel.normalizeDimensions(dimensions);\n score += linearModel.significance();\n }\n score /= measures.length;\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc'\n };\n};\nexport const getGroupIntentionSpace = async function (aggData, dimensions, measures) {\n if (dimensions.length < 2)\n return null;\n let score = 0;\n let groupIntention = new GroupIntention({\n dataSource: aggData,\n dimensions,\n measures,\n K: 8\n });\n score = groupIntention.getSignificance(measures.concat(dimensions.slice(0, -1)), dimensions.slice(-1));\n return {\n dimensions,\n measures,\n score,\n significance: score,\n order: 'desc'\n };\n};\n// export const IntentionWorkerCollection: Map<string, IntentionWorker> = new Map();\nexport var DefaultIWorker;\n(function (DefaultIWorker) {\n DefaultIWorker[\"outlier\"] = \"default_outlier\";\n DefaultIWorker[\"cluster\"] = \"default_group\";\n DefaultIWorker[\"trend\"] = \"default_trend\";\n})(DefaultIWorker || (DefaultIWorker = {}));\nexport class IntentionWorkerCollection {\n constructor() {\n this.workers = new Map();\n }\n register(name, iWorker) {\n if (this.workers.has(name)) {\n throw new Error(`There has been a worker named: ${name} already.`);\n }\n else {\n this.workers.set(name, [true, iWorker]);\n }\n }\n enable(name, status) {\n if (!this.workers.has(name)) {\n throw new Error(`Intention Worker \"${name}\" does not exist.`);\n }\n else {\n let iWorkerWithStatus = this.workers.get(name);\n iWorkerWithStatus[0] = status;\n this.workers.set(name, iWorkerWithStatus);\n }\n }\n each(func) {\n for (let [name, iWorker] of this.workers) {\n if (iWorker[0]) {\n func(iWorker[1], name);\n }\n }\n }\n static init(props = { withDefaultIWorkers: true }) {\n const { withDefaultIWorkers = true } = props;\n if (!IntentionWorkerCollection.colletion) {\n IntentionWorkerCollection.colletion = new IntentionWorkerCollection();\n if (withDefaultIWorkers) {\n IntentionWorkerCollection.colletion.register(DefaultIWorker.outlier, getOutlierIntentionSpace);\n IntentionWorkerCollection.colletion.register(DefaultIWorker.cluster, getGroupIntentionSpace);\n IntentionWorkerCollection.colletion.register(DefaultIWorker.trend, getTrendIntentionSpace);\n }\n }\n for (let key in DefaultIWorker) {\n IntentionWorkerCollection.colletion.enable(DefaultIWorker[key], withDefaultIWorkers);\n }\n return IntentionWorkerCollection.colletion;\n }\n}\nexport async function getIntentionSpaces(cubePool, viewSpaces, Collection) {\n let ansSpace = [];\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n let key = dimensions.join(SPLITER);\n if (cubePool.has(key)) {\n let aggData = cubePool.get(key);\n let generalSpace = await getGeneralIntentionSpace(aggData, dimensions, measures);\n Collection.each(async (iWorker, name) => {\n try {\n let iSpace = await iWorker(aggData, dimensions, measures);\n if (iSpace !== null) {\n iSpace.type = name;\n iSpace.impurity = generalSpace.impurity;\n ansSpace.push(iSpace);\n }\n }\n catch (error) {\n console.error('worker failed', { dimensions, measures, aggData }, error);\n }\n });\n }\n }\n return ansSpace;\n}\nexport async function getVisSpaces(props) {\n const { dataSource, dimensions, measures, collection, dimension_correlation_threshold = CrammersVThreshold, measure_correlation_threshold = PearsonCorrelation.strong, max_dimension_num_in_view = 3, max_measure_num_in_view = 3, } = props;\n // 1. get dimension cluster groups.\n // 2. get measure cluster groups.\n // 3. get dimension groups * measure groups = subspaces + aggregate\n // 4. calculate each subspace intention score (entropy, outlier, trend for temporal & oridinal field)\n // 5. filter each intend subspaces with threadshold\n // 6.manage those spaces / order them.\n let visableDimensions = dimensions; //.filter(dim => !isFieldUnique(dataSource, dim));\n let dimensionGroups = getDimClusterGroups(dataSource, visableDimensions, dimension_correlation_threshold);\n // let dimensionSets = getDimSetsFromClusterGroups(dimensionGroups);\n let dimensionSets = getCombinationFromClusterGroups(dimensionGroups, max_dimension_num_in_view);\n let measureGroups = getMeaSetsBasedOnClusterGroups(dataSource, measures, measure_correlation_threshold);\n let measureSets = getCombinationFromClusterGroups(measureGroups, max_measure_num_in_view);\n let viewSpaces = crossGroups(dimensionSets, measureSets);\n let cubePool = new Map();\n // for (let group of dimensionGroups) {\n // todo: similar cuboids computation using cube-core\n let t0 = new Date().getTime();\n for (let group of dimensionSets) {\n let key = group.join(SPLITER);\n let aggData = aggregate({\n dataSource,\n dimensions: group,\n measures,\n asFields: measures,\n operator: 'sum'\n });\n cubePool.set(key, aggData);\n }\n let t1 = new Date().getTime();\n console.log('cube cost', t1 - t0);\n cubePool.set('*', dataSource);\n const usedCollection = collection || IntentionWorkerCollection.init();\n ;\n // usedCollection.enable(DefaultIWorker.cluster, false);\n let ansSpace = await getIntentionSpaces(cubePool, viewSpaces, usedCollection);\n return ansSpace;\n}\n","import { isFieldTime, isFieldContinous, memberCount, isFieldCategory, deepcopy, groupContinousField, groupCategoryField } from '../utils/index';\nimport { normalize, entropy } from '../statistics/index';\nimport { isUniformDistribution } from '../distribution';\nimport { BIN_NUM_FOR_ANALYTIC } from '../constant';\nconst MIN_QUAN_MEMBER_SIZE = BIN_NUM_FOR_ANALYTIC;\n/**\n *\n * @param dataSource\n * @param field\n * todo: should accept BIField type and calculate the semantic type basic on it.\n */\nexport function getFieldType(dataSource, field) {\n if (isFieldTime(dataSource, field)) {\n return 'temporal';\n }\n else if (isFieldContinous(dataSource, field)) {\n // Todo:\n // here is only a tmp solution. we still hope to divided ordinal type and quantitative type.\n // if (memberCount(dataSource, field).length > MIN_QUAN_MEMBER_SIZE) {\n // return 'quantitative'\n // } else {\n // return 'ordinal';\n // }\n // TODO: 讨论这里的严格逻辑\n // [2022.2.8] 由ordinal字段被当做quantitative字段处理导致的效果变差的问题。\n // 参考 https://ewgw6z7tk0.feishu.cn/docs/doccnfuCntXAx5K0SA9jOxgKxYe\n if (memberCount(dataSource, field).length > MIN_QUAN_MEMBER_SIZE) {\n return 'quantitative';\n }\n else {\n return 'ordinal';\n }\n return 'quantitative';\n }\n else if (isFieldCategory(dataSource, field)) {\n // isFieldCategory is a safety checking here, for sometimes dirty data value can be object.\n return 'nominal';\n }\n else {\n // todo do something(like cleaning)\n return 'nominal';\n }\n}\nexport function getAllFieldTypes(dataSource, fields) {\n let fieldsWithType = [];\n for (let field of fields) {\n fieldsWithType.push({\n name: field,\n type: getFieldType(dataSource, field)\n });\n }\n return fieldsWithType;\n}\nexport function getFieldDistribution(dataSource, field) {\n let members = memberCount(dataSource, field);\n // members.sort((a, b) => a[1] - b[1]);\n return members.map(m => {\n return { memberName: m[0], count: m[1] };\n });\n}\nexport function getAllFieldsDistribution(dataSource, fields) {\n let fieldsDistribution = [];\n for (let field of fields) {\n fieldsDistribution.push({\n fieldName: field,\n distribution: getFieldDistribution(dataSource, field)\n });\n }\n return fieldsDistribution;\n}\nexport function getFieldEntropy(dataSource, field) {\n const members = memberCount(dataSource, field);\n const frequencyList = members.map(m => m[1]);\n const probabilityList = normalize(frequencyList);\n const fieldEntropy = entropy(probabilityList);\n const maxEntropy = Math.log2(members.length);\n return {\n fieldName: field,\n entropy: fieldEntropy,\n maxEntropy\n };\n}\nexport function getFloatFieldEntropy(dataSource, field) {\n let _max = -Infinity;\n let _min = Infinity;\n for (let i = 0; i < dataSource.length; i++) {\n _max = Math.max(_max, dataSource[i][field]);\n _min = Math.min(_min, dataSource[i][field]);\n }\n const rangeStep = (_max - _min) / BIN_NUM_FOR_ANALYTIC;\n const rangeCounts = new Array(BIN_NUM_FOR_ANALYTIC + 1).fill(0);\n for (let i = 0; i < dataSource.length; i++) {\n const value = dataSource[i][field];\n const valueIndex = Math.floor((value - _min) / rangeStep);\n rangeCounts[valueIndex]++;\n }\n rangeCounts[BIN_NUM_FOR_ANALYTIC - 1] += rangeCounts[BIN_NUM_FOR_ANALYTIC];\n const pl = normalize(rangeCounts.slice(0, BIN_NUM_FOR_ANALYTIC));\n const fieldEntropy = entropy(pl);\n const maxEntropy = Math.log2(BIN_NUM_FOR_ANALYTIC);\n return {\n fieldName: field,\n entropy: fieldEntropy,\n maxEntropy\n };\n}\nexport function getAllFieldsEntropy(dataSource, fields) {\n let fieldEntropyList = [];\n for (let field of fields) {\n fieldEntropyList.push(getFieldEntropy(dataSource, field));\n }\n return fieldEntropyList;\n}\nexport function groupFields(dataSource, fields) {\n let groupedData = deepcopy(dataSource);\n let newFields = [];\n for (let field of fields) {\n let newFieldName = `${field.name}(group)`;\n if (field.type === 'quantitative' && memberCount(dataSource, field.name).length > MIN_QUAN_MEMBER_SIZE * 2) {\n if (!isUniformDistribution(dataSource, field.name)) {\n groupedData = groupContinousField({\n dataSource: groupedData,\n field: field.name,\n newField: newFieldName,\n groupNumber: 8\n });\n newFields.push({\n name: newFieldName,\n type: 'ordinal'\n });\n }\n }\n else if ((field.type === 'ordinal' || field.type === 'nominal') && memberCount(dataSource, field.name).length > MIN_QUAN_MEMBER_SIZE) {\n if (!isUniformDistribution(dataSource, field.name)) {\n groupedData = groupCategoryField({\n dataSource: groupedData,\n field: field.name,\n newField: newFieldName,\n groupNumber: 8\n });\n newFields.push({\n name: newFieldName,\n type: field.type\n });\n }\n }\n }\n return {\n groupedData,\n fields,\n newFields\n };\n}\n","import { getFieldEntropy, getFieldType, getFloatFieldEntropy } from '../../univariateSummary';\nimport { BIN_NUM_FOR_ANALYTIC } from '../../constant';\nconst TESTS = {\n boolean(x) {\n return x === 'true' || x === 'false' || x === true || x === false;\n },\n integer(x) {\n return TESTS.number(x) && (x = +x) === ~~x;\n },\n number(x) {\n return !isNaN(+x);\n },\n date(x) {\n return !isNaN(Date.parse(x));\n },\n};\nfunction isValid(obj) {\n return obj != null && obj === obj;\n}\nexport function inferDataType(values) {\n // types to test for, in precedence order\n const types = ['boolean', 'integer', 'number', 'date'];\n for (let value of values) {\n // test value against remaining types\n for (let j = 0; j < types.length; ++j) {\n if (isValid(value) && !TESTS[types[j]](value)) {\n types.splice(j, 1);\n j -= 1;\n }\n }\n // if no types left, return 'string'\n if (types.length === 0)\n return 'string';\n }\n return types[0];\n}\n// 实现约束:必须保证fieldKeys与fields的顺序相同。engine依赖了这样的顺序,否则会产生逻辑错误。\nexport function getFieldsSummary(fieldKeys, dataSource) {\n const fields = [];\n const dictonary = new Map();\n for (let f of fieldKeys) {\n const valueMap = new Map();\n dataSource.forEach(row => {\n if (!valueMap.has(row[f])) {\n valueMap.set(row[f], 0);\n }\n valueMap.set(row[f], valueMap.get(row[f]) + 1);\n });\n const dataType = inferDataType([...valueMap.keys()]);\n const semanticType = getFieldType(dataSource, f);\n let maxEntropy = Math.log2(valueMap.size);\n let entropy = maxEntropy;\n let analyticType = 'dimension';\n let useFloatEntropy = false;\n if ((dataType === 'integer' || dataType === 'number') && semanticType !== 'ordinal') {\n analyticType = 'measure';\n if (valueMap.size > BIN_NUM_FOR_ANALYTIC) {\n let info = getFloatFieldEntropy(dataSource, f);\n entropy = info.entropy;\n maxEntropy = info.maxEntropy;\n useFloatEntropy = true;\n }\n }\n if (!useFloatEntropy) {\n let info = getFieldEntropy(dataSource, f);\n entropy = info.entropy;\n maxEntropy = info.maxEntropy;\n }\n let field = {\n key: f,\n analyticType,\n semanticType,\n dataType,\n features: {\n unique: valueMap.size,\n size: dataSource.length,\n entropy,\n maxEntropy\n }\n };\n fields.push(field);\n dictonary.set(field.key, field);\n }\n return {\n fields,\n dictonary\n };\n}\n","import { crammersV, pearsonCC } from \"../../statistics\";\nimport { getDimClusterGroups, getMeaSetsBasedOnClusterGroups } from \"../subspaces\";\nimport { CrammersVThreshold, PearsonCorrelation } from \"../config\";\nexport class DataGraph {\n constructor(dimensions, measures) {\n this.DIMENSION_CORRELATION_THRESHOLD = CrammersVThreshold;\n this.MEASURE_CORRELATION_THRESHOLD = PearsonCorrelation.strong;\n this.dimensions = dimensions;\n this.measures = measures;\n // this.computeDGraph(dataSource);\n // this.computeMGraph(dataSource);\n }\n computeGraph(dataSource, fields, cc) {\n let matrix = fields.map((f) => fields.map(() => 0));\n for (let i = 0; i < fields.length; i++) {\n matrix[i][i] = 1;\n for (let j = i + 1; j < fields.length; j++) {\n matrix[i][j] = matrix[j][i] = cc(dataSource, fields[i], fields[j]);\n }\n }\n return matrix;\n }\n computeDGraph(dataSource, cc = crammersV) {\n this.DG = this.computeGraph(dataSource, this.dimensions, cc);\n return this.DG;\n }\n computeMGraph(dataSource, cc = pearsonCC) {\n this.MG = this.computeGraph(dataSource, this.measures, cc);\n return this.MG;\n }\n clusterDGraph(dataSource, CORRELATION_THRESHOLD) {\n const { dimensions, DIMENSION_CORRELATION_THRESHOLD } = this;\n this.DClusters = getDimClusterGroups(dataSource, dimensions, CORRELATION_THRESHOLD || DIMENSION_CORRELATION_THRESHOLD);\n return this.DClusters;\n }\n clusterMGraph(dataSource, CORRELATION_THRESHOLD) {\n const { measures, MEASURE_CORRELATION_THRESHOLD } = this;\n this.MClusters = getMeaSetsBasedOnClusterGroups(dataSource, measures, CORRELATION_THRESHOLD || MEASURE_CORRELATION_THRESHOLD);\n return this.MClusters;\n }\n}\n","import { getAggHashKey, groupBy, stdAggregate, stdAggregateFromCuboid } from \"../statistics\";\nimport { dist } from \"../statistics/aggregators\";\nconst DEFAULT_OPS = ['max', 'min', 'sum', 'mean', 'count', 'dist'];\nexport class Cuboid {\n constructor(props) {\n const { dimensions, measures, ops = DEFAULT_OPS, ranges } = props;\n this.dimensions = dimensions;\n this.measures = measures;\n this.ops = ops;\n this.state = [];\n this.ranges = ranges;\n }\n setState(state) {\n this.state = state;\n }\n setData(dataSource) {\n this.state = stdAggregate({\n dimensions: this.dimensions,\n measures: this.measures,\n ops: this.ops,\n dataSource\n });\n const { state, dimensions, measures, ranges } = this;\n const groups = groupBy(dataSource, dimensions);\n for (let row of state) {\n const hashKey = getAggHashKey(dimensions.map(d => row.groupDict[d]));\n const groupValues = groups.get(hashKey);\n for (let mea of measures) {\n const range = ranges.get(mea);\n row.stat[mea]['dist'] = dist(groupValues.map(v => v[mea]), range);\n }\n }\n return this.state;\n }\n computeFromCuboid(cuboid) {\n const { ops, measures, dimensions } = this;\n this.state = stdAggregateFromCuboid({\n dimensions,\n measures,\n ops,\n cuboidState: cuboid.getRawState()\n });\n return this.state;\n }\n get size() {\n return this.state.length;\n }\n getAggregatedRows(measures, operatorOfMeasures) {\n let data = [];\n const { state, dimensions } = this;\n for (let row of state) {\n let newRow = {};\n for (let dim of dimensions) {\n newRow[dim] = row.groupDict[dim];\n }\n for (let i = 0; i < measures.length; i++) {\n const mea = measures[i];\n const op = operatorOfMeasures[i];\n newRow[mea] = row.stat[mea][op];\n }\n data.push(newRow);\n }\n return data;\n }\n getRawState() {\n return this.state;\n }\n}\n","// import { DataSource, Record} from \"../commonTypes\";\n// import { Cuboid } from \"./cuboid\";\nimport { getRangeBy } from \"../statistics\";\nimport { Cuboid } from \"./cuboid\";\n// interface QueryNode {\n// dimCode: string;\n// dimValue: string\n// }\n// export type QueryPath = QueryNode[];\n// interface CuboidNode extends Map<string, CuboidNode | Record> {}\n// function contains (arr1: any[], arr2: any[]): boolean {\n// if (arr1.length < arr2.length) return false;\n// let sets = new Set(arr1);\n// for (let ele of arr2) {\n// if (!sets.has(ele)) {\n// return false;\n// }\n// }\n// return true;\n// }\n// // todo query path support array\n// export class Cube {\n// private computeCuboid: (\n// path: QueryPath,\n// measures: string[]\n// ) => Promise<DataSource>;\n// private cuboids: Map<string, Cuboid>;\n// private inferableDistance: number;\n// public readonly holistic: boolean;\n// constructor(props: {\n// computeCuboid: (path: QueryPath, measures: string[]) => Promise<DataSource>;\n// inferableDistance?: number;\n// holistic?\n// }) {\n// this.computeCuboid = props.computeCuboid;\n// this.cuboids = new Map();\n// this.inferableDistance = props.inferableDistance ? props.inferableDistance : Infinity;\n// this.holistic = props.holistic || false;\n// }\n// /**\n// * check whether the cuboid made of given dimensions can be infered by current diemnsions.\n// * @param dimensions \n// */\n// private isCuboidInferable (dimensions: string[]): Cuboid | null {\n// for (let cuboid of this.cuboids.values()) {\n// let distance = cuboid.dimensions.length - dimensions.length;\n// if (distance < this.inferableDistance && contains(cuboid.dimensions, dimensions)) {\n// return cuboid;\n// }\n// }\n// return null;\n// }\n// private getClosestCuboid (dimensions: string[]): Cuboid | null {\n// let minDis = Infinity;\n// let targetCuboid: Cuboid | null = null;\n// for (let cuboid of this.cuboids.values()) {\n// let distance = cuboid.dimensions.length - dimensions.length;\n// if (distance < this.inferableDistance && contains(cuboid.dimensions, dimensions)) {\n// if (distance < minDis) {\n// minDis = distance;\n// targetCuboid = cuboid;\n// }\n// }\n// }\n// return targetCuboid;\n// }\n// public async getCuboid(\n// dimSet: string[],\n// measures: string[]\n// ): Promise<Cuboid> {\n// const key = dimSet.join(\";\");\n// if (this.holistic) {\n// if (this.cuboids.has(key)) {\n// return this.cuboids.get(key);\n// }\n// } else {\n// let inferedCuboid = this.isCuboidInferable(dimSet);\n// if (inferedCuboid) {\n// return inferedCuboid;\n// }\n// }\n// const path: QueryPath = dimSet.map((d) => {\n// return {\n// dimCode: d,\n// dimValue: \"*\",\n// };\n// });\n// const cuboidDataSource = await this.computeCuboid(path, measures);\n// const cuboid = new Cuboid({\n// dimensions: dimSet,\n// dataSource: cuboidDataSource,\n// });\n// this.cuboids.set(key, cuboid);\n// return cuboid;\n// }\n// }\n// // todo\n// // 至少返回的因该是一个DataFrame,而不应该是当前cuboid粒度的明细。\n// // case: 第一个请求的cuboid是明细粒度,则\nconst CUBOID_KEY_SPLITOR = '_join_';\nconst DEFAULT_OPS = [\"max\", \"min\", \"sum\", \"mean\", \"count\", 'dist'];\nexport class Cube {\n constructor(props) {\n const { dimensions, measures, dataSource, ops = DEFAULT_OPS } = props;\n this.dimensions = dimensions;\n this.measures = measures;\n this.dataSource = dataSource;\n this.ops = ops;\n this.dimOrder = new Map();\n dimensions.forEach((dim, i) => {\n this.dimOrder.set(dim, i);\n });\n this.cuboids = new Map();\n this.ranges = new Map();\n }\n // public contains(dimensions: string[]): boolean {\n // if (dimensions.length > )\n // }\n sortDimension(dimensions) {\n const orderedDims = [...dimensions];\n orderedDims.sort((d1, d2) => {\n return this.dimOrder.get(d1) - this.dimOrder.get(d2);\n });\n return orderedDims;\n }\n getCuboid(dimensions) {\n const orderedDims = this.sortDimension(dimensions);\n const dimKey = orderedDims.join(CUBOID_KEY_SPLITOR);\n // this.cuboids.get(dimKey)\n if (this.cuboids.has(dimKey)) {\n return this.cuboids.get(dimKey);\n }\n // does not get cuboid\n let currDimSet = new Set(dimensions);\n const existingParentKeys = [];\n const nullParentKeys = [];\n for (let dim of this.dimensions) {\n if (!currDimSet.has(dim)) {\n // use insert O(n) instead of sort O(nlogn)\n const parentDimensions = this.sortDimension([...orderedDims, dim]);\n const parentKey = parentDimensions.join(CUBOID_KEY_SPLITOR);\n if (this.cuboids.has(parentKey))\n existingParentKeys.push(parentKey);\n else {\n nullParentKeys.push(parentKey);\n }\n }\n }\n let minCost = Infinity;\n let minCuboidKey = this.dimensions.join(CUBOID_KEY_SPLITOR);\n if (existingParentKeys.length > 0) {\n for (let key of existingParentKeys) {\n const pCuboid = this.cuboids.get(key);\n if (pCuboid.size < minCost) {\n minCost = pCuboid.size;\n minCuboidKey = key;\n }\n }\n }\n else if (nullParentKeys.length > 0) {\n minCuboidKey = nullParentKeys[0];\n }\n const parentCuboid = this.getCuboid(minCuboidKey.split(CUBOID_KEY_SPLITOR));\n // console.log('based on parents cube: ', minCuboidKey)\n // todo: 递归构建相关的cuboid,可能要依赖field dict来判断递归的路径\n let cuboid = new Cuboid({\n dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n // cuboid.setData(parentCuboid.state);\n cuboid.computeFromCuboid(parentCuboid);\n this.cuboids.set(dimKey, cuboid);\n return cuboid;\n }\n computeRanges() {\n const { measures, dataSource } = this;\n for (let mea of measures) {\n this.ranges.set(mea, getRangeBy(dataSource, mea));\n }\n }\n buildCuboidOnCluster(dimensions) {\n let clusterCuboid = new Cuboid({\n dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n const baseCuboid = this.cuboids.get(this.dimensions.join(CUBOID_KEY_SPLITOR));\n // clusterCuboid.setData(this.dataSource)\n clusterCuboid.computeFromCuboid(baseCuboid);\n this.cuboids.set(dimensions.join(CUBOID_KEY_SPLITOR), clusterCuboid);\n }\n buildBaseCuboid() {\n this.computeRanges();\n let baseCuboid = new Cuboid({\n dimensions: this.dimensions,\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n baseCuboid.setData(this.dataSource);\n this.cuboids.set(this.dimensions.join(CUBOID_KEY_SPLITOR), baseCuboid);\n return baseCuboid;\n }\n loadCuboid(cuboidKey, cuboidState) {\n const cuboid = new Cuboid({\n dimensions: cuboidKey.split(CUBOID_KEY_SPLITOR),\n measures: this.measures,\n ops: this.ops,\n ranges: this.ranges\n });\n cuboid.setState(cuboidState);\n this.cuboids.set(cuboidKey, cuboid);\n }\n exportCuboids() {\n const cbs = {};\n for (let [ck, cb] of this.cuboids) {\n cbs[ck] = cb.getRawState();\n }\n return cbs;\n }\n get baseCuboid() {\n const baseKey = this.dimensions.join(CUBOID_KEY_SPLITOR);\n if (!this.cuboids.has(baseKey)) {\n return this.buildBaseCuboid();\n }\n return this.cuboids.get(baseKey);\n }\n}\n","import { Outier } from \"../../ml\";\nexport const IForestOutlierWorker = async (aggData, dimensions, measures) => {\n let iForest = new Outier.IsolationForest([], measures, aggData);\n iForest.buildIsolationForest();\n let scoreList = iForest.estimateOutierScore();\n let maxIndex = 0;\n let score = 0;\n for (let i = 0; i < scoreList.length; i++) {\n if (scoreList[i] > score) {\n score = scoreList[i];\n maxIndex = i;\n }\n }\n let des = {};\n dimensions.concat(measures).forEach((mea) => {\n des[mea] = aggData[maxIndex][mea];\n });\n return {\n dimensions,\n measures,\n significance: score,\n description: des,\n };\n};\n","import { oneDLinearRegression } from '../../statistics/index';\nexport const LRTrendWorker = async (aggData, dimensions, measures) => {\n if (dimensions.length !== 1)\n return null;\n let orderedData = [...aggData];\n orderedData.sort((a, b) => {\n if (a[dimensions[0]] > b[dimensions[0]])\n return 1;\n if (a[dimensions[0]] === b[dimensions[0]])\n return 0;\n else\n return -1;\n });\n let sig = 0;\n for (let mea of measures) {\n let linearModel = new oneDLinearRegression(orderedData, dimensions[0], mea);\n linearModel.normalizeDimensions(dimensions);\n sig += linearModel.significance();\n }\n sig /= measures.length;\n return {\n dimensions,\n measures,\n significance: sig\n };\n};\n","import { IForestOutlierWorker } from '../workers/IForestOutlier';\nimport { LRTrendWorker } from '../workers/LRTrend';\nexport var DefaultIWorker;\n(function (DefaultIWorker) {\n DefaultIWorker[\"outlier\"] = \"default_outlier\";\n // cluster = 'default_group',\n DefaultIWorker[\"trend\"] = \"default_trend\";\n})(DefaultIWorker || (DefaultIWorker = {}));\n/**\n * collection of insight workers. it helps to manage all the workers in a centralized way.\n */\nexport class InsightWorkerCollection {\n constructor() {\n this.workers = new Map();\n }\n register(name, iWorker) {\n if (this.workers.has(name)) {\n throw new Error(`There has been a worker named: ${name} already.`);\n }\n else {\n this.workers.set(name, [true, iWorker]);\n }\n }\n /**\n * set a existed worker's status.\n * @param name insight worker's name used for register.\n * @param status whether the worker should be used.\n */\n enable(name, status) {\n if (!this.workers.has(name)) {\n throw new Error(`Intention Worker \"${name}\" does not exist.`);\n }\n else {\n let iWorkerWithStatus = this.workers.get(name);\n iWorkerWithStatus[0] = status;\n this.workers.set(name, iWorkerWithStatus);\n }\n }\n /**\n * enumerate all enabled insight workers.\n * @param func (what is going to be done with the given worker)\n */\n each(func) {\n for (let [name, iWorker] of this.workers) {\n if (iWorker[0]) {\n func(iWorker[1], name);\n }\n }\n }\n static init(props = { withDefaultIWorkers: true }) {\n const { withDefaultIWorkers = true } = props;\n if (!InsightWorkerCollection.colletion) {\n InsightWorkerCollection.colletion = new InsightWorkerCollection();\n if (withDefaultIWorkers) {\n InsightWorkerCollection.colletion.register(DefaultIWorker.outlier, IForestOutlierWorker);\n // InsightWorkerCollection.colletion.register(DefaultIWorker.cluster, KNNClusterWorker)\n InsightWorkerCollection.colletion.register(DefaultIWorker.trend, LRTrendWorker);\n }\n }\n Object.values(DefaultIWorker).forEach(workerName => {\n InsightWorkerCollection.colletion.enable(workerName, withDefaultIWorkers);\n });\n return InsightWorkerCollection.colletion;\n }\n}\n","export const geomTypes = {\n interval: [0, 10],\n line: [11, Infinity],\n area: [11, Infinity],\n point: [0, 1000],\n path: [0, 100],\n density: [1001, Infinity],\n};\nfunction getVisualElements() {\n return {\n position: 2,\n color: 1,\n size: 1,\n shape: 1,\n opacity: 1,\n facets: 2,\n page: 1,\n filter: 1,\n highFacets: 1000\n };\n}\nfunction findBestField(type, fieldRankList) {\n for (let i = fieldRankList.length - 1; i >= 0; i--) {\n if (fieldRankList[i].semanticType === type && !fieldRankList[i].choosen) {\n return fieldRankList[i];\n }\n }\n return false;\n}\nexport function encoding(fields) {\n let spec = {};\n let visualElements = getVisualElements();\n let fieldRankList = fields.map((field) => {\n return {\n ...field,\n choosen: false,\n };\n });\n const priority = [\n [\"quantitative\", [\"position\", \"size\", \"color\", \"opacity\", \"highFacets\", \"filter\"]],\n [\"temporal\", [\"position\", \"size\", \"opacity\", \"filter\"]],\n [\"ordinal\", [\"position\", \"color\", \"opacity\", \"facets\", \"size\", \"filter\", \"highFacets\"]],\n [\"nominal\", [\"position\", \"color\", \"facets\", \"shape\", \"filter\", \"hightFacets\"]],\n ];\n let fieldLeft = fieldRankList.length;\n for (let typeIndex = 0; typeIndex < priority.length && fieldLeft > 0; typeIndex++) {\n let type = priority[typeIndex][0];\n let channelList = priority[typeIndex][1];\n for (let i = 0; i < channelList.length && fieldLeft > 0; i++) {\n let channel = channelList[i];\n let field;\n while (visualElements[channel] > 0 && (field = findBestField(type, fieldRankList))) {\n if (typeof spec[channel] === \"undefined\") {\n spec[channel] = [];\n }\n spec[channel].push(field.key);\n visualElements[channel]--;\n fieldLeft--;\n field.choosen = true;\n }\n }\n }\n return spec;\n}\nexport function specification(fields, dataView) {\n let rankedFields = fields.sort((a, b) => a.impurity - b.impurity);\n let spec = encoding(rankedFields);\n const dimensions = new Set(fields.filter(f => f.analyticType === 'dimension').map(f => f.key));\n const measures = new Set(fields.filter(f => f.analyticType === 'measure').map(f => f.key));\n // todo: design a better rule for choosing geom type.\n if (spec.position && spec.position.length === 2) {\n if ((dimensions.has(spec.position[0]) && measures.has(spec.position[1])) ||\n (dimensions.has(spec.position[1]) && measures.has(spec.position[0]))) {\n const dimIndex = dimensions.has(spec.position[0]) ? 0 : 1;\n const dim = spec.position[dimIndex];\n const mea = spec.position[(dimIndex + 1) % 2];\n spec.position = [dim, mea];\n const originDimField = fields.find((f) => f.key === dim);\n const dimCardinality = originDimField ? originDimField.features.unique : 0;\n spec.geomType = [\"interval\", \"line\", \"area\"].filter((geom) => {\n return dimCardinality >= geomTypes[geom][0] && dimCardinality <= geomTypes[geom][1];\n });\n if (originDimField.semanticType === 'nominal') {\n spec.geomType = [\"interval\"];\n }\n }\n else {\n // ['point', 'path', 'heatmap']\n spec.geomType = [\"point\", \"density\"].filter((geom) => {\n return dataView.length >= geomTypes[geom][0] && dataView.length <= geomTypes[geom][1];\n });\n }\n }\n else {\n spec.geomType = [\"point\"];\n }\n return { schema: spec, dataView };\n}\n","const FULL_FIELD_USE_THRESHOLD = 25;\nconst PARTS_FIELD_THRESHOLD = 500;\nconst fixOmiga = Math.round((100 - FULL_FIELD_USE_THRESHOLD) ** 2 / PARTS_FIELD_THRESHOLD);\nexport function autoFieldSelect(_fields) {\n const x = _fields.length;\n const fields = [..._fields];\n fields.sort((fa, fb) => fa.features.entropy - fb.features.entropy);\n if (x < FULL_FIELD_USE_THRESHOLD)\n return fields;\n if (x < PARTS_FIELD_THRESHOLD) {\n return fields.slice(0, Math.round(Math.sqrt(fixOmiga * (x - FULL_FIELD_USE_THRESHOLD)) + FULL_FIELD_USE_THRESHOLD));\n }\n else {\n return fields.slice(0, 100);\n }\n}\nexport function fieldSelectByPercent(_fields, percent) {\n const x = _fields.length;\n const fields = [..._fields];\n fields.sort((fa, fb) => fa.features.entropy - fb.features.entropy);\n return fields.slice(0, Math.round(x * percent));\n}\n","const BIN_SIZE = 8;\nexport function entropyAcc(fl) {\n let total = 0;\n for (let i = 0; i < fl.length; i++) {\n total += fl[i];\n }\n let tLog = Math.log2(total);\n let ent = 0;\n for (let i = 0; i < fl.length; i++) {\n ent = ent + fl[i] * (Math.log2(fl[i]) - tLog) / total;\n }\n return -ent;\n}\nexport function meaImp(dataSource, mea, minValue, maxValue) {\n // const _min = typeof minValue !== 'undefined' ? minValue : Math.min(...dataSource.map(d => d[mea]));\n // const _max = typeof maxValue !== 'undefined' ? maxValue : Math.max(...dataSource.map(d => d[mea]));\n const _min = minValue;\n const _max = maxValue;\n const step = (_max - _min) / BIN_SIZE;\n let dist = new Array(BIN_SIZE + 1).fill(0);\n for (let record of dataSource) {\n let vIndex = Math.floor((record[mea] - _min) / step);\n dist[vIndex]++;\n }\n dist[BIN_SIZE - 1] += dist[BIN_SIZE];\n // const pl = normalize(dist.filter(d => d > 0));\n const ent = entropyAcc(dist.slice(0, BIN_SIZE).filter(d => d > 0));\n return ent;\n}\nexport function viewStrength(dataSource, dimensions, measures) {\n const groups = new Map();\n for (let record of dataSource) {\n const _key = dimensions.map(d => record[d]).join('_');\n if (!groups.has(_key)) {\n groups.set(_key, []);\n }\n groups.get(_key)?.push(record);\n }\n let totalEntLoss = 0;\n for (let mea of measures) {\n const _min = Math.min(...dataSource.map(d => d[mea]));\n const _max = Math.max(...dataSource.map(d => d[mea]));\n ;\n const ent = meaImp(dataSource, mea, _min, _max);\n // conditional ent\n let condEnt = 0;\n let logs = [];\n const entries = [...groups.entries()];\n entries.sort((a, b) => b[1].length - a[1].length);\n for (let i = 0; i < entries.length; i++) {\n if (i >= BIN_SIZE - 1)\n break;\n const groupRows = entries[i][1];\n let groupProb = groupRows.length / dataSource.length;\n const subEnt = meaImp(groupRows, mea, _min, _max);\n condEnt += groupProb * subEnt;\n logs.push([groupProb, subEnt]);\n }\n let noiseGroup = [];\n for (let i = BIN_SIZE - 1; i < entries.length; i++) {\n noiseGroup.push(...entries[i][1]);\n }\n if (noiseGroup.length > 0) {\n let groupProb = noiseGroup.length / dataSource.length;\n const subEnt = meaImp(noiseGroup, mea, _min, _max);\n condEnt += groupProb * subEnt;\n }\n // for (let [groupKey, groupRows] of groups.entries()) {\n // let groupProb = groupRows.length / dataSource.length;\n // const subEnt = meaImp(groupRows, mea, _min, _max);\n // condEnt += groupProb * subEnt;\n // logs.push([groupProb, subEnt])\n // }\n // console.log(logs)\n // console.log('H(X), H(X|Y)]]]]]]', ent, condEnt)\n totalEntLoss += noiseGroup.length > 0 ? (ent - condEnt) / Math.log2(BIN_SIZE) : (ent - condEnt) / Math.log2(groups.size);\n }\n // const groupFL: number[] = [];\n // for (let rows of groups.values()) {\n // groupFL.push(rows.length);\n // }\n // totalEntLoss = totalEntLoss / Math.log2(groups.size)//groups.size;\n // console.log({ dimensions, measures, score: totalEntLoss / measures.length, totalEntLoss })\n return totalEntLoss / measures.length;\n}\n","import { getFieldsSummary } from \"./fieldSummary\";\nimport { DataGraph } from \"./dataGraph\";\nimport { Cube } from \"../../cube\";\nimport { getCombination, normalize, mapPositive, entropy } from \"../../statistics\";\nimport { InsightWorkerCollection } from \"./workerCollection\";\nimport { specification } from './specification/encoding';\nimport { copyData } from \"../../utils\";\nimport { autoFieldSelect, fieldSelectByPercent } from \"./select\";\nimport { DEFAULT_BIN_NUM, DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP, PERCENT_THRESHOLD_AS_UNIQUE_INDEX, VERSION } from \"../../constant\";\nimport { viewStrength, entropyAcc } from \"./patterns/general\";\n// import { SQLInterface } from \"../../SQLInterface\";\nconst MIN_QUAN_MEMBER_SIZE = 50;\nexport class VIEngine {\n constructor() {\n // public cookedDimensions: string[];\n // public cookedMeasures: string[];\n // public cookedFields: IFieldSummary[];\n // protected cookedFieldDictonary: FieldDictonary;\n // private _fieldKeys: string[];\n this._dimensions = [];\n this._measures = [];\n /**\n * number of dimensions appears in a view.\n */\n this.DIMENSION_NUM_IN_VIEW = {\n MAX: 3,\n MIN: 1,\n };\n /**\n * number of measures appears in a view.\n */\n this.MEASURE_NUM_IN_VIEW = {\n MAX: 3,\n MIN: 1,\n };\n this.cube = null;\n this.aggregators = [\"max\", \"min\", \"sum\", \"mean\", \"count\", 'dist'];\n this.workerCollection = InsightWorkerCollection.init();\n }\n serialize() {\n const { fields, dataGraph, subSpaces, insightSpaces, dataSource, rawDataSource, cube } = this;\n const storage = {\n version: VERSION,\n fields,\n dataGraph: {\n MClusters: dataGraph.MClusters,\n DClusters: dataGraph.DClusters,\n DG: dataGraph.DG,\n MG: dataGraph.MG\n },\n subSpaces,\n insightSpaces\n };\n const dataStorage = {\n version: VERSION,\n dataSource: {\n raw: rawDataSource,\n view: dataSource\n },\n cuboids: cube.exportCuboids()\n };\n return {\n storage,\n dataStorage\n };\n }\n deSerialize(storage, dataStorage) {\n this.fields = storage.fields;\n // make fields dict\n if (typeof this.fieldDictonary !== 'undefined' && this.fieldDictonary !== null) {\n this.fieldDictonary.clear();\n }\n else {\n this.fieldDictonary = new Map();\n }\n storage.fields.forEach(f => {\n this.fieldDictonary.set(f.key, f);\n });\n const { dimensions, measures } = this;\n this.dataGraph = new DataGraph(dimensions, measures);\n // this.dat\n this.dataGraph.DG = storage.dataGraph.DG;\n this.dataGraph.MG = storage.dataGraph.MG;\n this.dataGraph.DClusters = storage.dataGraph.DClusters;\n this.dataGraph.MClusters = storage.dataGraph.MClusters;\n this.subSpaces = storage.subSpaces;\n this.insightSpaces = storage.insightSpaces;\n if (dataStorage) {\n const { aggregators } = this;\n this.rawDataSource = dataStorage.dataSource.raw;\n this.dataSource = dataStorage.dataSource.view;\n this.cube = new Cube({\n dataSource: dataStorage.dataSource.view,\n dimensions,\n measures,\n ops: aggregators\n });\n Object.keys(dataStorage.cuboids).forEach(cuboidKey => {\n this.cube.loadCuboid(cuboidKey, dataStorage.cuboids[cuboidKey]);\n });\n }\n }\n /**\n * 为了实现简单,这里加一个隐形约束,必须先setData,才能调用setFields\n *\n * @param mutFields\n */\n setFields(mutFields) {\n this._mutFields = mutFields;\n this.dataSource = copyData(this.rawDataSource);\n const fieldKeys = mutFields.map(f => f.key);\n const { fields, dictonary } = getFieldsSummary(fieldKeys, this.dataSource);\n // 用户指定优先,其次取推荐值\n this.rawFields = fields.map((f, i) => {\n const field = {\n ...f\n };\n if (mutFields[i].dataType !== '?')\n field.dataType = mutFields[i].dataType;\n if (mutFields[i].semanticType !== '?')\n field.semanticType = mutFields[i].semanticType;\n if (mutFields[i].analyticType !== '?')\n field.analyticType = mutFields[i].analyticType;\n return field;\n });\n }\n setData(dataSource) {\n this.rawDataSource = dataSource;\n this.dataSource = copyData(dataSource);\n return this;\n }\n get dimensions() {\n // if (this._dimensions.length > 0) return this._dimensions;\n return this.fields.filter(f => f.analyticType === 'dimension').map(f => f.key);\n // return this._dimensions\n }\n get measures() {\n // if (this._measures.length > 0) return this._measures;\n return this.fields.filter(f => f.analyticType === 'measure').map(f => f.key);\n // return this._measures\n }\n buildfieldsSummary() {\n const fieldKeys = this.fields.map(f => f.key);\n const { fields, dictonary } = getFieldsSummary(fieldKeys, this.dataSource);\n this.fields = fields;\n this.fieldDictonary = dictonary;\n return this;\n }\n univarSelection(selectMode = 'auto', percent = 1) {\n const { rawFields, rawDataSource } = this;\n // 1. trans fields\n // 2. filter fields\n const cookedFieldKeys = [];\n const rawIndices = [];\n // const transedMap: Map<string, string> = new Map();\n for (let i = 0; i < rawFields.length; i++) {\n const field = rawFields[i];\n let transedField = field.key;\n if (field.analyticType === 'dimension') {\n if (field.semanticType === 'quantitative' && field.features.unique > MIN_QUAN_MEMBER_SIZE) {\n // ISSUES [2022.03.07] https://ewgw6z7tk0.feishu.cn/wiki/wikcnnTJjRv9W0p1kae8gK8uzUf?app_id=11\n // if (!isUniformDistribution(rawDataSource, field.key)) {\n // const newFieldKey = `${field.key}(group)`;\n // // const newFieldName = `${field.name}(group)`\n // this.dataSource = groupContinousField({\n // dataSource: rawDataSource,\n // field: field.key,\n // newField: newFieldKey,\n // groupNumber: DEFAULT_BIN_NUM\n // })\n // transedField = newFieldKey\n // // transedMap.set(newFieldKey, field.key);\n // } \n }\n else if (field.semanticType === 'nominal') {\n if (field.features.unique > DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP && field.features.unique > rawDataSource.length * PERCENT_THRESHOLD_AS_UNIQUE_INDEX) {\n continue;\n }\n }\n }\n rawIndices.push(i);\n cookedFieldKeys.push(transedField);\n }\n const { fields: cookedFields, dictonary: cookedFieldDictonary } = getFieldsSummary(cookedFieldKeys, this.dataSource);\n cookedFields.forEach((f, i) => {\n const rawIndex = rawIndices[i];\n f.semanticType = rawFields[rawIndex].semanticType;\n f.dataType = rawFields[rawIndex].dataType;\n f.analyticType = rawFields[rawIndex].analyticType;\n });\n this.fields = selectMode === 'auto' ? autoFieldSelect(cookedFields) : fieldSelectByPercent(cookedFields, percent);\n if (this.fields.findIndex(f => f.analyticType === 'dimension') === -1) {\n // 针对维度较差的情况做的补充。\n const dims = cookedFields.filter(f => f.analyticType === 'dimension');\n // if (dims.length === 0) {\n // throw new Error('提供的数据集中没有维度,暂时不支持这种分析类型。')\n // }\n if (dims.length > 0) {\n dims.sort((a, b) => a.features.entropy - b.features.entropy);\n this.fields.push(dims[0]);\n }\n }\n this.fieldDictonary = cookedFieldDictonary;\n }\n buildGraph() {\n this.dataGraph = new DataGraph(this.dimensions, this.measures);\n this.dataGraph.computeDGraph(this.dataSource);\n this.dataGraph.computeMGraph(this.dataSource);\n return this;\n }\n buildCube() {\n const { measures, dataSource, dataGraph, dimensions, aggregators } = this;\n const cube = new Cube({\n dimensions,\n measures,\n dataSource,\n ops: aggregators,\n });\n cube.buildBaseCuboid();\n // dataGraph.DClusters.forEach((group) => {\n // cube.getCuboid(group);\n // });\n dataGraph.DClusters.forEach((group) => {\n cube.buildCuboidOnCluster(group);\n });\n this.cube = cube;\n return this;\n }\n clusterFields() {\n this.dataGraph.clusterDGraph(this.dataSource);\n this.dataGraph.clusterMGraph(this.dataSource);\n return this;\n }\n static getCombinationFromClusterGroups(groups, limitSize) {\n let fieldSets = [];\n for (let group of groups) {\n let combineFieldSet = getCombination(group, limitSize.MIN, limitSize.MAX);\n fieldSets.push(...combineFieldSet);\n }\n return fieldSets;\n }\n buildSubspaces(DIMENSION_NUM_IN_VIEW = this.DIMENSION_NUM_IN_VIEW, MEASURE_NUM_IN_VIEW = this.MEASURE_NUM_IN_VIEW) {\n // todo: design when to compute clusters.\n const dimensionGroups = this.dataGraph.DClusters;\n const measureGroups = this.dataGraph.MClusters;\n // const dimensionSets = VIEngine.getCombinationFromClusterGroups(\n // dimensionGroups,\n // MAX_DIMENSION_NUM_IN_VIEW\n // );\n const measureSets = VIEngine.getCombinationFromClusterGroups(measureGroups, MEASURE_NUM_IN_VIEW);\n // const subspaces = crossGroups(dimensionSets, measureSets);\n const subspaces = [];\n for (let group of dimensionGroups) {\n const dimSets = getCombination(group, DIMENSION_NUM_IN_VIEW.MIN, DIMENSION_NUM_IN_VIEW.MAX);\n for (let dims of dimSets) {\n for (let meas of measureSets) {\n subspaces.push({\n dimensions: dims,\n measures: meas,\n });\n }\n }\n }\n this.subSpaces = subspaces;\n return this;\n }\n static getSpaceImpurity(dataSource, dimensions, measures) {\n let imp = 0;\n for (let mea of measures) {\n let fL = dataSource.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n imp += value;\n }\n imp /= measures.length;\n return imp;\n }\n async exploreViewsPOC(viewSpaces = this.subSpaces) {\n const context = this;\n let ansSpace = [];\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n const imp = viewStrength(context.dataSource, dimensions, measures);\n ansSpace.push({\n impurity: imp,\n significance: 1,\n dimensions,\n measures\n });\n }\n ansSpace.sort((a, b) => (b.impurity || 0) - (a.impurity || 0));\n return ansSpace;\n }\n async exploreViews(viewSpaces = this.subSpaces) {\n const context = this;\n const { measures: globalMeasures, fieldDictonary, dataSource } = context;\n let ansSpace = [];\n const globalDist = context.cube.getCuboid([]).getAggregatedRows(globalMeasures, globalMeasures.map(() => 'dist'));\n for (let space of viewSpaces) {\n const { dimensions, measures } = space;\n const localDist = context.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'dist'));\n const freqs = context.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'count'));\n let totalEntLoss = 0;\n for (let mea of measures) {\n let ent = 0;\n if (globalDist.length > 0) {\n ent = entropyAcc(globalDist[0][mea].filter(d => d > 0));\n }\n let conEnt = 0;\n const totalCount = fieldDictonary.get(mea).features.size;\n const distList = localDist.map((r, rIndex) => ({\n // TODO: 讨论是否应当直接使用count\n // props: 节省计算量\n // cons: 强依赖于cube必须去计算count\n // freq: r[mea].reduce((total, value) => total + value, 0),\n freq: freqs[rIndex][mea],\n dist: r[mea]\n }));\n distList.sort((a, b) => b.freq - a.freq);\n for (let i = 0; i < distList.length; i++) {\n if (i >= DEFAULT_BIN_NUM - 1)\n break;\n const subEnt1 = entropyAcc(distList[i].dist.filter(d => d > 0));\n conEnt += (distList[i].freq / totalCount) * subEnt1;\n }\n const noiseGroup = new Array(DEFAULT_BIN_NUM).fill(0);\n let noiseFre = 0;\n for (let i = DEFAULT_BIN_NUM - 1; i < distList.length; i++) {\n for (let j = 0; j < noiseGroup.length; j++) {\n noiseGroup[j] += distList[i].dist[j];\n }\n noiseFre += distList[i].freq;\n }\n if (noiseFre > 0) {\n conEnt += (noiseFre / totalCount) * entropyAcc(noiseGroup.filter(d => d > 0));\n }\n totalEntLoss += (ent - conEnt) / Math.log2(Math.min(DEFAULT_BIN_NUM, distList.length));\n }\n totalEntLoss /= measures.length;\n ansSpace.push({\n dimensions,\n measures,\n significance: 1,\n score: totalEntLoss,\n impurity: totalEntLoss\n });\n }\n ansSpace.sort((a, b) => b.impurity - a.impurity);\n return ansSpace;\n }\n searchPointInterests(viewSpace) {\n }\n async insightExtraction(viewSpaces = this.subSpaces) {\n const context = this;\n let ansSpace = [];\n for (let space of viewSpaces) {\n // const t1 = performance.now();\n const { dimensions, measures } = space;\n let cube = context.cube;\n let cuboid = cube.getCuboid(dimensions);\n const aggData = cuboid.getAggregatedRows(measures, measures.map(() => 'sum'));\n // const t2 = performance.now();\n const imp = VIEngine.getSpaceImpurity(aggData, dimensions, measures);\n const jobPool = [];\n this.workerCollection.each((iWorker, name) => {\n // tslint:disable-next-line: no-shadowed-variable\n const job = async (iWorker, name) => {\n try {\n let iSpace = await iWorker(aggData, dimensions, measures, context.fieldDictonary, context);\n if (iSpace !== null) {\n iSpace.type = name;\n iSpace.impurity = imp;\n ansSpace.push(iSpace);\n }\n }\n catch (error) {\n console.error(\"worker failed\", { dimensions, measures, aggData }, error);\n }\n };\n jobPool.push(job(iWorker, name));\n });\n await Promise.all(jobPool);\n // const t3 = performance.now();\n // const per = Math.round(((t3 - t2) / (t3 - t1)) * 100);\n }\n context.insightSpaces = ansSpace;\n this.setInsightScores();\n this.insightSpaces.sort((a, b) => (a.score || 0) - (b.score || 0));\n return this.insightSpaces;\n }\n // todo:\n setInsightScores() {\n const insightSpaces = this.insightSpaces;\n insightSpaces.forEach(space => {\n space.score = space.impurity / space.significance;\n });\n return this;\n }\n getFieldInfoInVis(insightSpace) {\n const fieldsInVis = [];\n const cube = this.cube;\n const fieldDictonary = this.fieldDictonary;\n const { dimensions, measures } = insightSpace;\n dimensions.forEach((dim) => {\n const aggData = cube.getCuboid([dim]).getAggregatedRows(measures, measures.map(() => 'sum'));\n let imp = 0;\n measures.forEach((mea) => {\n let fL = aggData.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n imp += value;\n });\n fieldsInVis.push({\n ...fieldDictonary.get(dim),\n impurity: imp,\n });\n });\n const dAggData = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'sum'));\n measures.forEach((mea) => {\n let fL = dAggData.map((r) => r[mea]);\n let pL = normalize(mapPositive(fL));\n let value = entropy(pL);\n fieldsInVis.push({\n ...fieldDictonary.get(mea),\n impurity: value,\n });\n });\n return fieldsInVis;\n }\n getFieldInfoInVisBeta(insightSpace) {\n const fieldsInVis = [];\n const cube = this.cube;\n const fieldDictonary = this.fieldDictonary;\n const { dimensions, measures } = insightSpace;\n dimensions.forEach((dim) => {\n const fd = fieldDictonary.get(dim);\n fieldsInVis.push({\n ...fd,\n impurity: fd.features.entropy,\n });\n });\n const aggs = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'dist'));\n const freqs = cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'count'));\n measures.forEach((mea) => {\n let conEnt = 0;\n const totalCount = fieldDictonary.get(mea).features.size;\n const distList = aggs.map((r, rIndex) => ({\n // TODO: 讨论是否应当直接使用count\n // props: 节省计算量\n // cons: 强依赖于cube必须去计算count\n // freq: r[mea].reduce((total, value) => total + value, 0),\n freq: freqs[rIndex][mea],\n dist: r[mea]\n }));\n distList.sort((a, b) => b.freq - a.freq);\n for (let i = 0; i < distList.length; i++) {\n if (i >= DEFAULT_BIN_NUM - 1)\n break;\n const subEnt1 = entropyAcc(distList[i].dist.filter(d => d > 0));\n conEnt += (distList[i].freq / totalCount) * subEnt1;\n }\n const noiseGroup = new Array(DEFAULT_BIN_NUM).fill(0);\n let noiseFre = 0;\n for (let i = DEFAULT_BIN_NUM - 1; i < distList.length; i++) {\n for (let j = 0; j < noiseGroup.length; j++) {\n noiseGroup[j] += distList[i].dist[j];\n }\n noiseFre += distList[i].freq;\n }\n if (noiseFre > 0) {\n conEnt += (noiseFre / totalCount) * entropyAcc(noiseGroup.filter(d => d > 0));\n }\n const fd = fieldDictonary.get(mea);\n fieldsInVis.push({\n ...fd,\n impurity: conEnt,\n });\n });\n return fieldsInVis;\n }\n specification(insightSpace) {\n const { dimensions, measures } = insightSpace;\n const fieldsInVis = this.getFieldInfoInVisBeta(insightSpace);\n const dataView = this.cube.getCuboid(dimensions).getAggregatedRows(measures, measures.map(() => 'sum'));\n return specification(fieldsInVis, dataView);\n }\n}\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n };\n return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n var transitional = config.transitional || defaults.transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new Cancel('canceled');\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","module.exports = {\n \"version\": \"0.22.0\"\n};","'use strict';\n\nvar VERSION = require('../env/data').version;\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","module.exports = require('./lib/axios');","import * as Utils from './utils/index';\nimport specification from './specification';\nimport * as Distribution from './distribution';\nimport * as Insight from './insights/index';\nimport * as Cleaner from './cleaner/index';\nimport * as UnivariateSummary from './univariateSummary/index';\nimport * as DashBoard from './dashboard/index';\nimport * as Sampling from './sampling/index';\nimport * as Statistics from './statistics/index';\nimport * as Computation from './computation';\nimport { Cluster, Outier, Classification } from './ml/index';\nexport * from './commonTypes';\nexport * from './insights/InsightFlow/interfaces';\nexport { DashBoard, Sampling, Utils, Statistics, UnivariateSummary, Distribution, specification, Cleaner, Insight, Cluster, Outier, Classification, Computation };\nconsole.log('This is a test version of visual-insights');\n","import { IRow } from \"../interfaces\";\n\nexport function normalizeWithParent(\n data: IRow[],\n parentData: IRow[],\n measures: string[],\n syncScale: boolean\n): {\n normalizedData: IRow[];\n normalizedParentData: IRow[];\n} {\n const totalMeasuresOfParent: IRow = {};\n const totalMeasures: IRow = {};\n measures.forEach((mea) => {\n totalMeasuresOfParent[mea] = 0;\n totalMeasures[mea] = 0;\n });\n parentData.forEach((record) => {\n measures.forEach((mea) => {\n totalMeasuresOfParent[mea] += Math.abs(record[mea]);\n });\n });\n data.forEach((record) => {\n measures.forEach((mea) => {\n totalMeasures[mea] += Math.abs(record[mea]);\n });\n });\n const normalizedParentData: IRow[] = [];\n parentData.forEach((record) => {\n const newRecord = { ...record };\n measures.forEach((mea) => {\n newRecord[mea] /= totalMeasuresOfParent[mea];\n });\n normalizedParentData.push(newRecord);\n });\n const normalizedData: IRow[] = [];\n data.forEach((record) => {\n const newRecord = { ...record };\n measures.forEach((mea) => {\n if (syncScale) {\n newRecord[mea] /= totalMeasuresOfParent[mea];\n } else {\n newRecord[mea] /= totalMeasures[mea];\n }\n });\n normalizedData.push(newRecord);\n });\n return {\n normalizedData,\n normalizedParentData,\n };\n}\n\nexport function compareDistribution(\n distribution1: IRow[],\n distribution2: IRow[],\n dimensions: string[],\n measures: string[]\n): number {\n let score = 0;\n let count = 0;\n const tagsForD2: boolean[] = distribution2.map(() => false);\n for (let record of distribution1) {\n let targetRecordIndex = distribution2.findIndex((r, i) => {\n return !tagsForD2[i] && dimensions.every((dim) => r[dim] === record[dim]);\n });\n if (targetRecordIndex > -1) {\n tagsForD2[targetRecordIndex] = true;\n const targetRecord = distribution2[targetRecordIndex];\n for (let mea of measures) {\n score = Math.max(\n score,\n Math.max(targetRecord[mea], record[mea]) / Math.min(targetRecord[mea], record[mea])\n );\n count++;\n }\n } else {\n for (let mea of measures) {\n score = Math.max(score, record[mea]);\n count++;\n }\n }\n }\n for (let i = 0; i < distribution2.length; i++) {\n if (!tagsForD2[i]) {\n tagsForD2[i] = true;\n for (let mea of measures) {\n score = Math.max(score, distribution2[i][mea]);\n count++;\n }\n }\n }\n return score;\n}\n\nexport function normalizeByMeasures(dataSource: IRow[], measures: string[]) {\n let sums: Map<string, number> = new Map();\n\n measures.forEach((mea) => {\n sums.set(mea, 0);\n });\n\n dataSource.forEach((record) => {\n measures.forEach((mea) => {\n sums.set(mea, sums.get(mea)! + Math.abs(record[mea]));\n });\n });\n\n const ans: IRow[] = [];\n dataSource.forEach((record) => {\n const norRecord: IRow = { ...record };\n measures.forEach((mea) => {\n norRecord[mea] /= sums.get(mea)!;\n });\n ans.push(norRecord);\n });\n return ans;\n}\n\nexport function getDistributionDifference(\n dataSource: IRow[],\n dimensions: string[],\n measure1: string,\n measure2: string\n): number {\n let score = 0;\n for (let record of dataSource) {\n if (record[measure1] === 0 || record[measure2] === 0) continue;\n score += Math.max(record[measure1], record[measure2]) / Math.min(record[measure1], record[measure2]);\n }\n return score;\n}\n\nexport function makeBinField(dataSource: IRow[], fid: string, binFid: string, binSize: number | undefined = 10) {\n let _min = Infinity;\n let _max = -Infinity;\n for (let i = 0; i < dataSource.length; i++) {\n let val = dataSource[i][fid];\n if (val > _max) _max = val;\n if (val < _min) _min = val;\n }\n const step = (_max - _min) / binSize;\n const beaStep = Math.max(-Math.round(Math.log10(_max - _min)) + 2, 0)\n return dataSource.map((r) => {\n let bIndex = Math.floor((r[fid] - _min) / step);\n if (bIndex === binSize) bIndex = binSize - 1;\n return {\n ...r,\n [binFid]: [bIndex * step + _min, (bIndex + 1) * step + _min],\n \n // [binFid]: Number(((bIndex * step + _min)).toFixed(beaStep)),\n };\n });\n}\n\nexport function makeLogField(dataSource: IRow[], fid: string, logFid: string) {\n return dataSource.map((r) => {\n return {\n ...r,\n [logFid]: typeof r[fid] === \"number\" && r[fid] > 0 ? Math.log10(r[fid]) : null,\n };\n });\n}\n","import { IMutField, Insight } from 'visual-insights';\nimport { IRow, IMeasure } from './interfaces';\nimport { checkMajorFactor, filterByPredicates, checkChildOutlier, IPredicate } from './utils';\nimport { normalizeWithParent, compareDistribution, normalizeByMeasures, getDistributionDifference } from './utils/normalization';\nimport { StatFuncName } from 'visual-insights/build/esm/statistics';\nexport interface IExplaination {\n dimensions: string[];\n measures: IMeasure[];\n extendDs: string[];\n extendMs: IMeasure[];\n type: string;\n score: number;\n description: any;\n predicates: IPredicate[];\n}\n\nexport interface IMeasureWithStat extends IMeasure {\n score: number;\n}\nexport class DataExplainer {\n public dataSource: IRow[];\n private engine: Insight.VIEngine;\n private defaultAggs: StatFuncName[] = ['min', 'max', 'sum', 'count', 'mean'];\n constructor (dataSource: IRow[] = []) {\n this.engine = new Insight.VIEngine();\n this.dataSource = dataSource;\n let keys: string[] = [];\n if (dataSource.length > 0) {\n keys = Object.keys(dataSource[0]);\n }\n this.engine.setData(dataSource)\n // .setFieldKeys(keys)\n // .buildfieldsSummary();\n // const newKeys = this.engine.fields.filter(f => f.domain.size < 40).map(f => f.key);\n // this.engine.setFieldKeys(keys);\n // const keys = Object.keys(dataSource[0])\n }\n public setFields(fields: IMutField[]) {\n this.engine.setFields(fields.map(f => ({\n ...f,\n // @ts-ignore\n key: f.key || f.fid\n })));\n this.engine.univarSelection();\n }\n public preAnalysis() {\n console.log('[graphic-walker:preAnalysis]start')\n this.engine.buildGraph();\n this.engine.dataGraph.DIMENSION_CORRELATION_THRESHOLD = 0.6;\n this.engine.dataGraph.MEASURE_CORRELATION_THRESHOLD = 0.8;\n console.log('[graphic-walker:preAnalysis]graph finish')\n this.engine\n .clusterFields();\n console.log('[graphic-walker:preAnalysis]cluster finish')\n this.engine.buildSubspaces({\n MAX: 2,\n MIN: 1\n },\n {\n MAX: 2,\n MIN: 1\n }\n );\n console.log('[graphic-walker:preAnalysis]subspaces finsh. start build-cube')\n this.engine.buildCube();\n console.log('[graphic-walker:preAnalysis]cube finish')\n return this;\n }\n public explain (predicates: IPredicate[], dimensions: string[], measures: IMeasure[], threshold: number = 0.3): IExplaination[] {\n // const predicates = getPredicates(selection, dimensions, measures);\n // 讨论:知道selection,但是分析的维度是什么?\n this.explainConditionalValue(predicates, dimensions, measures);\n const selectAll = dimensions.length === 0 || predicates.length === 0;\n\n const dimSelectionSpaces = selectAll ? [] : this.explainBySelection(\n predicates,\n dimensions,\n measures,\n 10\n );\n const meaSelectionSpaces = selectAll ? [] : this.explainByCorMeasures(\n predicates,\n dimensions,\n measures,\n 10\n );\n const childrenSpaces = this.explainByChildren(\n [],\n dimensions,\n measures,\n 10\n );\n const ansSpaces: IExplaination[] = [];\n dimSelectionSpaces.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'selection_dim_distribution',\n description: space,\n predicates\n });\n });\n meaSelectionSpaces.forEach((space) => {\n ansSpaces.push({\n dimensions: dimensions,\n extendDs: [],\n extendMs: space.measures,\n measures,\n score: space.score,\n type: 'selection_mea_distribution',\n description: space,\n predicates,\n });\n });\n childrenSpaces.majorList.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'children_major_factor',\n description: space,\n predicates\n });\n });\n childrenSpaces.outlierList.forEach((space) => {\n ansSpaces.push({\n dimensions,\n extendDs: space.dimensions,\n measures,\n extendMs: [],\n score: space.score,\n type: 'children_outlier',\n description: space,\n predicates\n });\n });\n return ansSpaces.filter(space => space.score >= threshold);\n }\n\n public explainConditionalValue(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 5) {\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n for (let extendDim of knn) {\n const result = this.explainValue(predicates, [...dimensions, extendDim], measures);\n }\n }\n public explainValue(predicates: IPredicate[], dimensions: string[], measures: IMeasure[]): number[] {\n const measureNames = measures.map(m => m.key);\n const measureOps = measures.map(m => m.op);\n const data = this.engine.cube.getCuboid(dimensions).getAggregatedRows(measureNames, measureOps);\n const selection = filterByPredicates(data, predicates);\n const cmps: number[] = [];\n for (let mea of measureNames) {\n const values = data.map(r => r[mea]);\n values.sort((a, b) => a - b);\n const selectionValues = selection.map(r => r[mea])\n const lowerBoundary: number = values[Math.floor(values.length * 0.15)];\n const higherBoundary: number = values[Math.min(Math.ceil(values.length * 0.85), values.length - 1)];\n if (selectionValues.some(v => v >= higherBoundary)) {\n cmps.push(1);\n } else if (selectionValues.some(v => v <= lowerBoundary)) {\n cmps.push(-1);\n } else {\n cmps.push(0)\n }\n }\n return cmps;\n }\n public explainByChildren(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // 1. find most relative dimensions(topK)\n // 2. for each dimension, we check all the dim member in it. find the member whos distribution is most close to current one.\n // here we do not nomorlize all the dim member's distribution, we use the relative distribution instead.\n // 3. the dim member we found can be used to explain current one as major factor.\n // const predicates: IPredicate[] = selection === 'all' ? [] : getPredicates(selection, dimensions, []);\n const parentCuboid = this.engine.cube.getCuboid(dimensions);\n const measureNames = measures.map(m => m.key);\n const ops = measures.map(m => m.op);\n const parentData = filterByPredicates(parentCuboid.getAggregatedRows(measureNames, ops), predicates);\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n\n const majorList: Array<{key: string; score: number; dimensions: string[]; measures: IMeasure[]}> = [];\n const outlierList: Array<{key: string; score: number; dimensions: string[]; measures: IMeasure[]}> = [];\n for (let extendDim of knn) {\n const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim]);\n const data = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates);\n let groups: Map<any, IRow[]> = new Map();\n for (let record of data) {\n if (!groups.has(record[extendDim])) {\n groups.set(record[extendDim], [])\n }\n groups.get(record[extendDim])?.push(record)\n }\n const { majorKey, majorSum } = checkMajorFactor(parentData, groups, dimensions, measureNames)\n majorList.push({ key: majorKey, score: majorSum, dimensions: [extendDim], measures })\n const { outlierKey, outlierSum } = checkChildOutlier(parentData, groups, dimensions, measureNames);\n outlierList.push({ key: outlierKey, score: outlierSum, dimensions: [extendDim], measures })\n }\n majorList.sort((a, b) => a.score - b.score);\n outlierList.sort((a, b) => b.score - a.score);\n return {\n majorList,\n outlierList\n };\n }\n public explainBySelection(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // const predicates = getPredicates(selection, dimensions, []);\n // const parentCuboid = this.engine.cube.getCuboid()\n const measureNames = measures.map((m) => m.key);\n const ops = measures.map((m) => m.op);\n const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0);\n const outlierList: Array<{ score: number; dimensions: string[]; measures: IMeasure[] }> = [];\n for (let extendDim of knn) {\n const parentCuboid = this.engine.cube.getCuboid([extendDim])\n const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim])\n const overallData = parentCuboid.getAggregatedRows(measureNames, ops);\n const subData = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates);\n\n let outlierNormalization = normalizeWithParent(subData, overallData, measureNames, false);\n\n let outlierScore = compareDistribution(\n outlierNormalization.normalizedData,\n outlierNormalization.normalizedParentData,\n [extendDim],\n measureNames\n );\n // outlierScore /= (measures.length * 2)\n outlierList.push({\n dimensions: [extendDim],\n measures,\n score: outlierScore\n })\n // compare overall and subdata. set score. (major and outlier)\n }\n outlierList.sort((a, b) => b.score - a.score)\n return outlierList;\n }\n public explainByCorMeasures(predicates: IPredicate[], dimensions: string[], measures: IMeasure[], K_Neighbor: number = 3) {\n // const predicates = getPredicates(selection, dimensions, []);\n // const parentCuboid = this.engine.cube.getCuboid()\n const measureNames = measures.map((m) => m.key);\n const ops = measures.map((m) => m.op);\n const knn = this.getGeneralizeKNN('measure', measureNames, K_Neighbor);\n const allMeasureNames = [...measureNames, ...knn];\n // const ops: StatFuncName[] = allMeasures.map(() => 'sum');\n const ans: Array<{ score: number; dimensions: string[]; measures: IMeasure[]; max: number; min: number; intMeasures: IMeasureWithStat[] }> = [];\n const cuboid = this.engine.cube.getCuboid(dimensions);\n // const valueExp = this.explainValue(predicates, dimensions, measures); \n for (let op of this.defaultAggs) {\n const extendMeasureOps = knn.map(() => op);\n const normalizedState = normalizeByMeasures(\n cuboid.getAggregatedRows(allMeasureNames, [...ops, ...extendMeasureOps]),\n allMeasureNames\n );\n for (let extendMea of allMeasureNames) {\n const originMeasure = measures.find(m => m.key === extendMea);\n if (originMeasure && originMeasure.op === op) continue;\n const valueExpOfExtendMea = this.explainValue(predicates, dimensions, [{key: extendMea, op}])\n const intMeasures: IMeasureWithStat[] = [];\n for (let i = 0; i < valueExpOfExtendMea.length; i++) {\n if (valueExpOfExtendMea[i] !== 0) {\n intMeasures.push({\n key: extendMea,\n op,\n score: valueExpOfExtendMea[i]\n })\n }\n }\n if (intMeasures.length === 0) continue;\n if (originMeasure) {\n const norStateWithNewOp = normalizeByMeasures(\n cuboid.getAggregatedRows([extendMea], [op]),\n [extendMea]\n )\n const mergedDataSource = normalizedState.map((record, rIndex) => {\n return {\n ...record,\n [`__${extendMea}`]: norStateWithNewOp[rIndex][extendMea]\n }\n })\n let maxDiff = 0;\n let minDiff = 1;\n for (let baseMeasure of measures) {\n let diffScore =\n getDistributionDifference(\n mergedDataSource,\n dimensions,\n baseMeasure.key,\n `__${extendMea}`\n ) / 2;\n maxDiff = Math.max(maxDiff, diffScore);\n minDiff = Math.min(minDiff, diffScore);\n }\n ans.push({\n dimensions,\n score: Math.max(1 - minDiff, maxDiff),\n measures: [{ key: extendMea, op }],\n max: maxDiff,\n min: minDiff,\n intMeasures\n });\n } else {\n let maxDiff = 0;\n let minDiff = 1;\n for (let baseMeasure of measures) {\n let diffScore =\n getDistributionDifference(\n normalizedState,\n dimensions,\n baseMeasure.key,\n extendMea\n ) / 2;\n maxDiff = Math.max(maxDiff, diffScore);\n minDiff = Math.min(minDiff, diffScore);\n }\n ans.push({\n dimensions,\n score: Math.max(1 - minDiff, maxDiff),\n measures: [{ key: extendMea, op }],\n max: maxDiff,\n min: minDiff,\n intMeasures\n });\n }\n // compare overall and subdata. set score. (major and outlier)\n }\n }\n ans.sort((a, b) => b.score - a.score);\n return ans;\n }\n public getGeneralizeKNN(type: 'dimension' | 'measure', fields: string[], K_Neighbor: number = 3, threshold = 0) {\n if (fields.length === 0) return this.getCenterFields(type, K_Neighbor);\n return this.getKNN(type, fields, K_Neighbor, threshold);\n }\n public getKNN(type: 'dimension' | 'measure', fields: string[], K_Neighbor: number = 3, threshold = 0) {\n const adjMatrix = type === 'dimension' ? this.engine.dataGraph.DG : this.engine.dataGraph.MG;\n const graphFields = type === 'dimension' ? this.engine.dataGraph.dimensions : this.engine.dataGraph.measures;\n const fieldIndices = fields.map(field => {\n let index = graphFields.indexOf(field);\n return index;\n });\n const neighbors: Array<{dis: number, index: number, imp: number}> = [];\n for (let fieldIndex of fieldIndices) {\n for (let i = 0; i < adjMatrix[fieldIndex].length; i++) {\n if (!fieldIndices.includes(i)) {\n const dis = Math.abs(adjMatrix[fieldIndex][i]);\n const fieldKey = graphFields[i];\n const tf = this.engine.fields.find(f => f.key === fieldKey);\n if (dis >= threshold) {\n neighbors.push({\n dis,\n index: i,\n imp: tf?.features.unique || Infinity,\n });\n }\n }\n }\n }\n\n neighbors.sort((a, b) => b.dis / b.imp - a.dis / a.imp);\n return neighbors.slice(0, K_Neighbor).map(f => graphFields[f.index]);\n }\n public getCenterFields (type: 'dimension' | 'measure', num: number = 5): string[] {\n const adjMatrix = type === 'dimension' ? this.engine.dataGraph.DG : this.engine.dataGraph.MG;\n const graphFields = type === 'dimension' ? this.engine.dataGraph.dimensions : this.engine.dataGraph.measures;\n let fieldScores: Array<{field: string; score: number}> = adjMatrix.map((row, rIndex) => {\n return {\n field: graphFields[rIndex],\n score: row.reduce((total, current) => total + Math.abs(current), 0)\n }\n })\n fieldScores.sort((a, b) => b.score - a.score)\n return fieldScores.map(f => f.field).slice(0, num);\n }\n public getVisSpec (spaces: IExplaination[]) {\n const engine = this.engine;\n return spaces.map(space => {\n let visSpace: Insight.InsightSpace;\n const measureNames = space.measures.map(m => m.key);\n const extendMsNames = space.extendMs.map(m => m.key);\n if (space.type === 'children_major_factor' || space.type === 'children_outlier') {\n visSpace = {\n dimensions: [...space.extendDs, ...space.dimensions],\n measures: extendMsNames.length > 0 ? extendMsNames : measureNames,\n significance: space.score,\n score: space.score,\n description: space.description,\n };\n } else {\n visSpace = {\n dimensions: space.extendDs.length > 0 ? space.extendDs : space.dimensions,\n measures: extendMsNames.length > 0 ? extendMsNames : measureNames,\n significance: space.score,\n score: space.score,\n description: space.description,\n };\n }\n const allMeasures = [...space.measures, ...space.extendMs];\n return {\n schema: engine.specification(visSpace).schema,\n dataView: engine.cube.getCuboid([...space.dimensions, ...space.extendDs]).getAggregatedRows(allMeasures.map(m => m.key), allMeasures.map(m => m.op))\n };\n })\n }\n}","/* eslint no-restricted-globals: 0 */\n/* eslint-disable */ \n// import { Record, Filters } from '../interfaces';\nimport { getPredicatesFromVegaSignals } from '../utils';\nimport { DataExplainer } from '../insights';\nconst state = {\n de: null\n};\n\nfunction preAnalysis (props) {\n const { fields, dataSource } = props; // as ReqData;\n const de = new DataExplainer(dataSource);\n de.setFields(fields);\n de.preAnalysis();\n state.de = de;\n return true\n}\n\nfunction getFieldsSummary (props) {\n const de = state.de;\n if (de !== null) {\n return de.engine.fields;\n }\n throw new Error('data explainer is not init.')\n}\nfunction getExplaination(props) {\n\n const { filters = {}, currentSpace } = props; // as ReqData;\n const predicates = getPredicatesFromVegaSignals(filters, currentSpace.dimensions, []);\n const de = state.de;\n const ansSpaces = de.explain(predicates, currentSpace.dimensions, currentSpace.measures);\n const visSpaces = de.getVisSpec(ansSpaces);\n const valueExp = de.explainValue(predicates, currentSpace.dimensions, currentSpace.measures);\n const measureStats = [];\n for (let i = 0; i < valueExp.length; i++) {\n if (valueExp[i] !== 0) {\n measureStats.push({\n ...currentSpace.measures[i],\n score: valueExp[i]\n })\n }\n }\n const fields = de.engine.fields;\n return {\n explainations: ansSpaces,\n visSpaces,\n valueExp: measureStats,\n fieldsWithSemanticType: fields.map(f => ({\n key: f.key,\n type: f.semanticType\n }))\n };\n}\n\nfunction main (e) {\n const { type, data } = e.data;\n let res = false;\n try {\n switch (type) {\n case 'getExplaination':\n res = getExplaination(data);\n break;\n case 'preAnalysis':\n res = preAnalysis(data);\n break;\n default:\n throw new Error(`type ${type} is not supported.`);\n }\n self.postMessage(res);\n } catch (error) {\n console.log(error)\n self.postMessage(false)\n }\n}\n\nself.addEventListener('message', main, false);\n"],"names":["_typeof","obj","_classCallCheck","instance","Constructor","_toPrimitive","input","hint","prim","res","_toPropertyKey","arg","key","toPrimitive","_defineProperties","target","props","i","descriptor","toPropertyKey","_createClass","protoProps","staticProps","_assertThisInitialized","self","_setPrototypeOf","o","p","_inherits","subClass","superClass","setPrototypeOf","_possibleConstructorReturn","call","assertThisInitialized","_getPrototypeOf","_defineProperty","value","_arrayWithHoles","arr","_iterableToArray","iter","_arrayLikeToArray","len","arr2","_unsupportedIterableToArray","minLen","arrayLikeToArray","n","_nonIterableRest","_toArray","arrayWithHoles","iterableToArray","unsupportedIterableToArray","nonIterableRest","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread","source","consoleLogger","args","type","Logger","concreteLogger","options","bool","_len","_key","_len2","_key2","_len3","_key3","_len4","_key4","lvl","prefix","debugOnly","moduleName","baseLogger","EventEmitter","events","listener","_this","event","l","cloned","observer","_cloned","defer","rej","promise","resolve","reject","makeString","copy","a","s","m","getLastOfPath","path","Empty","cleanKey","canNotTraverseDeeper","stack","setPath","newValue","_getLastOfPath","k","pushPath","concat","_getLastOfPath2","getPath","_getLastOfPath3","getPathWithDefaults","data","defaultData","deepExtend","overwrite","prop","regexEscape","str","_entityMap","escape","isIE10","chars","looksLikeObjectPath","nsSeparator","keySeparator","possibleChars","c","matched","ki","ownKeys$1","_objectSpread$1","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","Super","result","NewTarget","deepFind","paths","current","j","mix","joinedPath","ResourceStore","_EventEmitter","_super","ns","index","lng","ignoreJSONStructure","resources","deep","pack","v","postProcessor","module","processors","translator","processor","ownKeys$2","_objectSpread$2","_createSuper$1","_isNativeReflectConstruct$1","checkedLoadedFor","Translator","services","resolved","namespaces","wouldCheckForNsInKey","seemsNaturalLanguage","parts","lastKey","_this2","returnDetails","_this$extractFromKey","namespace","appendNamespaceToCIMode","resUsedKey","resExactUsedKey","resType","noObject","joinArrays","handleAsObjectInI18nFormat","handleAsObject","r","resTypeIsArray","newKeyToUse","deepKey","usedDefault","usedKey","needsPluralHandling","hasDefaultValue","defaultValueSuffix","defaultValue","missingKeyNoValueFallbackToKey","resForMissing","updateMissing","fk","lngs","fallbackLngs","send","specificDefaultValue","defaultForMissing","language","suffix","_this3","skipOnVariables","nestBef","nb","na","nestAft","postProcess","postProcessorNames","_this4","found","exactUsedKey","usedLng","usedNS","extracted","needsZeroSuffixLookup","needsContextHandling","codes","code","finalKeys","pluralSuffix","zeroSuffix","contextKey","possibleKey","option","capitalize","string","LanguageUtil","specialCases","part","cleanedLng","lngOnly","supportedLng","fallbacks","fallbackCode","fallbackCodes","addCode","fc","sets","_rulesPluralsTypes","deprecatedJsonVersions","suffixesOrder","createRules","rules","set","PluralResolver","languageUtils","rule","pluralCategory1","pluralCategory2","pluralCategory","number","count","idx","returnSuffix","ownKeys$3","_objectSpread$3","Interpolator","iOpts","regexpStr","regexpUnescapeStr","nestingRegexpStr","match","replaces","regexSafe","val","handleFormat","f","missingInterpolationHandler","todos","todo","matchedVar","temp","safeValue","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","matchedSingleQuotes","matchedDoubleQuotes","e","formatters","doReduce","elem","ownKeys$4","_objectSpread$4","parseFormatStr","formatStr","formatName","formatOptions","optStr","opts","opt","_opt$split","_opt$split2","rest","createCachedFormatter","fn","cache","formatter","Formatter","name","_format","formats","mem","_parseFormatStr","formatted","valOptions","error","ownKeys$5","_objectSpread$5","_createSuper$2","_isNativeReflectConstruct$2","removePending","q","Connector","backend","store","languages","callback","toLoad","pending","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","err","loaded","loadedKeys","fcName","tried","wait","next","_this5","fallbackValue","isUpdate","get","ret","transformOptions","ownKeys$6","_objectSpread$6","_createSuper$3","_isNativeReflectConstruct$3","noop","bindMemberFunctions","inst","mems","I18n","defOpts","createClassOnDemand","ClassOrObject","lu","storeApi","_this2$store","storeApiChained","_this2$store2","deferred","load","finish","t","usedCallback","append","li","lngInLngs","setLngProps","done","setLng","keyPrefix","fixedT","resultKey","_this$translator","_this$translator2","_this6","fallbackLng","lastLng","loadNotPending","loadState","preResult","_this7","preloaded","newLngs","rtlLngs","_this8","mergedOptions","clone","membersToCopy","normalizeRecords","dataSource","measures","maxMeasures","minMeasures","totalMeasures","mea","record","newData","norRecord","checkMajorFactor","childrenData","dimensions","normalizedData","majorSum","majorKey","childData","sum","childRecord","dim","targetValue","checkChildOutlier","outlierSum","outlierKey","normalizedChildData","getPredicatesFromVegaSignals","signals","predicates","filterByPredicates","pre","copyData","isFieldCategory","fieldName","isFieldContinous","TIME_RULES","isFieldTime","memberCount","field","counter","row","member","chiSquared","nestTree","xSet","ySet","rowSums","colSums","totalSum","x","y","node","chis","observed","expected","crammersV","fieldX","fieldY","pearsonCC","xBar","yBar","mapPositive","getCombination","elements","start","end","ans","combine","step","size","normalize","frequencyList","entropy","probabilityList","getRangeBy","by","maxValue","minValue","oneDLinearRegression","X","Y","normalizedRecord","meanX","meanY","beta","alpha","numerator","denominator","SSR","SST","yHat","r_squared","p_value","correction","transition","mean","min","max","EULER","PERCENT_THRESHOLD_AS_UNIQUE_INDEX","DOMMAIN_SIZE_THRESHOLD_MAYBE_DROP","DEFAULT_BIN_NUM","BIN_NUM_FOR_ANALYTIC","VERSION","sumByCol","rows","colKey","opKey","_sum","fixRange","originalRange","dist","values","range","bins","vIndex","distMergeBy","recordBins","SPLITOR","SFMapper","getAggregator","op","groupBy","groups","d","stdAggregate","ops","group","aggs","meaIndex","opFunc","dimValues","dimIndex","getAggHashKey","cuboidStateGroupBy","state","stdAggregateFromCuboid","cuboidState","generalOpNames","generalOps","opName","opIndex","CrammersVThreshold","PearsonCorrelation","turnAdjMatrix2List","matrix","edges","find","parents","union","n1","n2","p1","p2","findWithEffect","sizes","unionWithEffect","size1","size2","kruskal","groupNumber","threshold","b","edge","kruskalWithLimitSize","limitSize","cluster","method","groupMaxSize","meas","linearCongruentialGenerator","seed","uniformSampling","sampleIndexes","IsolationForest","treeNumber","Psi","normalizedSampleData","depth","rand","randField","dimLength","meaLength","randValue","leftSubData","rightSubData","iTree","pathLength","nodeSize","samples","recordScore","avgPathLength","Outier","getDimCorrelationMatrix","getMeaCorrelationMatrix","getDimClusterGroups","max_number_of_group","dimCorrelationMatrix","Cluster.kruskal","getMeaSetsBasedOnClusterGroups","correlation_threshold","correlationMatrix","__read","this","ar","__spread","__values","periodCube_1","Node","aggFunc","_a","params","_i","e_1","children","rawData","children_1","children_1_1","child","e_1_1","search","level","e_2","children_2","children_2_1","_b","childName","e_2_1","periodCube","tree","e_3","children_3","children_3_1","e_3_1","e_4","children_4","children_4_1","e_4_1","e_5","children_5","children_5_1","e_5_1","periodCube$1","momentCube_1","momentCube$1","momentCube","factTable","_c","_d","core","require$$0","require$$1","__assign","transform","tree2Table","cube","table","dfs","_e","aggregation","subset","sums","_loop_1","_loop_2","MEASURES","cnts","_loop_3","__export","exports","index_1","transform_1","aggregation_1","require$$2","operatorMap","aggregate","asFields","operator","createCube","as","DefaultIWorker","MIN_QUAN_MEMBER_SIZE","getFieldType","getFieldEntropy","members","fieldEntropy","maxEntropy","getFloatFieldEntropy","_max","_min","rangeStep","rangeCounts","valueIndex","pl","TESTS","isValid","inferDataType","types","getFieldsSummary","fieldKeys","fields","dictonary","valueMap","dataType","semanticType","analyticType","useFloatEntropy","info","DataGraph","cc","CORRELATION_THRESHOLD","DIMENSION_CORRELATION_THRESHOLD","MEASURE_CORRELATION_THRESHOLD","DEFAULT_OPS","Cuboid","ranges","hashKey","groupValues","cuboid","operatorOfMeasures","newRow","CUBOID_KEY_SPLITOR","Cube","orderedDims","d1","d2","dimKey","currDimSet","existingParentKeys","nullParentKeys","parentKey","minCost","minCuboidKey","pCuboid","parentCuboid","clusterCuboid","baseCuboid","cuboidKey","cbs","ck","cb","baseKey","IForestOutlierWorker","aggData","iForest","scoreList","maxIndex","score","des","LRTrendWorker","orderedData","sig","linearModel","InsightWorkerCollection","iWorker","status","iWorkerWithStatus","func","withDefaultIWorkers","workerName","geomTypes","getVisualElements","findBestField","fieldRankList","encoding","spec","visualElements","priority","fieldLeft","typeIndex","channelList","channel","specification","dataView","rankedFields","originDimField","dimCardinality","geom","FULL_FIELD_USE_THRESHOLD","PARTS_FIELD_THRESHOLD","fixOmiga","autoFieldSelect","_fields","fa","fb","fieldSelectByPercent","percent","BIN_SIZE","entropyAcc","fl","total","tLog","ent","meaImp","viewStrength","totalEntLoss","condEnt","entries","groupRows","groupProb","subEnt","noiseGroup","VIEngine","dataGraph","subSpaces","insightSpaces","rawDataSource","storage","dataStorage","aggregators","mutFields","selectMode","rawFields","cookedFieldKeys","rawIndices","transedField","cookedFields","cookedFieldDictonary","rawIndex","dims","fieldSets","combineFieldSet","DIMENSION_NUM_IN_VIEW","MEASURE_NUM_IN_VIEW","dimensionGroups","measureGroups","measureSets","subspaces","dimSets","imp","fL","pL","viewSpaces","context","ansSpace","space","globalMeasures","fieldDictonary","globalDist","localDist","freqs","conEnt","totalCount","distList","rIndex","subEnt1","noiseFre","viewSpace","jobPool","job","iSpace","insightSpace","fieldsInVis","dAggData","fd","bind","thisArg","toString","isArray","isUndefined","isBuffer","isArrayBuffer","isFormData","isArrayBufferView","isString","isNumber","isObject","isPlainObject","prototype","isDate","isFile","isBlob","isFunction","isStream","isURLSearchParams","trim","isStandardBrowserEnv","forEach","merge","assignValue","extend","stripBOM","content","utils","encode","buildURL","url","paramsSerializer","serializedParams","hashmarkIndex","InterceptorManager","fulfilled","rejected","InterceptorManager$1","id","h","InterceptorManager_1","normalizeHeaderName","headers","normalizedName","enhanceError","config","request","response","createError","message","settle","validateStatus","cookies","expires","domain","secure","cookie","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","ignoreDuplicateOf","parseHeaders","parsed","line","isURLSameOrigin","msie","urlParsingNode","originURL","resolveURL","href","requestURL","Cancel","Cancel_1","require$$3","require$$4","require$$5","require$$6","require$$7","defaults","require$$8","require$$9","xhr","requestData","requestHeaders","responseType","onCanceled","username","password","fullPath","onloadend","responseHeaders","responseData","timeoutErrorMessage","transitional","xsrfValue","cancel","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","getDefaultAdapter","adapter","stringifySafely","rawValue","parser","encoder","silentJSONParsing","forcedJSONParsing","strictJSONParsing","defaults_1","transformData","fns","isCancel","throwIfCancellationRequested","dispatchRequest","reason","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","configValue","validators","thing","deprecatedWarnings","validators$1","validator","version","formatMessage","desc","assertOptions","schema","allowUnknown","Axios","instanceConfig","Axios$1","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","Axios_1","CancelToken","executor","resolvePromise","token","onfulfilled","_resolve","CancelToken_1","spread","isAxiosError","payload","createInstance","defaultConfig","axios","promises","require$$10","axiosModule","axiosExports","normalizeWithParent","parentData","syncScale","totalMeasuresOfParent","normalizedParentData","newRecord","compareDistribution","distribution1","distribution2","tagsForD2","targetRecordIndex","targetRecord","normalizeByMeasures","getDistributionDifference","measure1","measure2","DataExplainer","__publicField","Insight.VIEngine","selectAll","dimSelectionSpaces","meaSelectionSpaces","childrenSpaces","ansSpaces","K_Neighbor","knn","extendDim","measureNames","measureOps","selection","cmps","selectionValues","lowerBoundary","higherBoundary","majorList","outlierList","overallData","subData","outlierNormalization","outlierScore","allMeasureNames","extendMeasureOps","normalizedState","extendMea","originMeasure","valueExpOfExtendMea","intMeasures","norStateWithNewOp","mergedDataSource","maxDiff","minDiff","baseMeasure","diffScore","adjMatrix","graphFields","fieldIndices","neighbors","fieldIndex","dis","fieldKey","tf","num","fieldScores","spaces","engine","visSpace","extendMsNames","allMeasures","preAnalysis","de","getExplaination","filters","currentSpace","visSpaces","valueExp","measureStats","main"],"mappings":"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"}
|