as the root export. As to no-// them, or TypeScript, we export *both* as the root and as 'default'.\n// See https://github.com/mzabriskie/react-draggable/pull/254\n// and https://github.com/mzabriskie/react-draggable/issues/266\n\n\nmodule.exports = Draggable;\nmodule.exports.default = Draggable;\nmodule.exports.DraggableCore = DraggableCore;","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","\n","\n","\n","\n","\n","// extracted by mini-css-extract-plugin\nexport default {\"Section\":\"Section_Section__TjDMz\"};","import styles from \"./Section.module.css\";\n\nconst Section = (props) => {\n return {props.title}
;\n};\n\nexport default Section;\n","// extracted by mini-css-extract-plugin\nexport default {\"Card\":\"Card_Card__Z9gdG\"};","import styles from \"./Card.module.css\";\n\nconst Card = (props) => {\n return {props.children}
;\n};\n\nexport default Card;\n","// extracted by mini-css-extract-plugin\nexport default {\"Button\":\"Button_Button__T-41v\",\"inline\":\"Button_inline__+XTDp\",\"tooltip\":\"Button_tooltip__MAJLR\"};","import styles from \"./Button.module.css\";\n\nconst Button = (props) => {\n let className = styles.Button;\n if (props.kind === \"inline\") {\n className += \" \" + styles.inline;\n }\n\n let tooltip = \"\";\n if (props.tooltip !== undefined) {\n tooltip = {props.tooltip};\n }\n\n return (\n \n );\n};\n\nexport default Button;\n","// extracted by mini-css-extract-plugin\nexport default {\"PipelineBlock\":\"PipelineBlock_PipelineBlock__uDJMa\",\"PlantNode\":\"PipelineBlock_PlantNode__Ms1c3\",\"ProductNode\":\"PipelineBlock_ProductNode__OA0PF\"};","import React, { useEffect } from \"react\";\nimport ReactFlow, { Background, isNode, Controls } from \"react-flow-renderer\";\nimport Section from \"./Section\";\nimport Card from \"./Card\";\nimport Button from \"./Button\";\nimport styles from \"./PipelineBlock.module.css\";\nimport dagre from \"dagre\";\n\nwindow.nextX = 15;\nwindow.nextY = 15;\n\nexport const randomPosition = () => {\n window.nextY += 60;\n if (window.nextY >= 500) {\n window.nextY = 15;\n window.nextX += 150;\n }\n return [window.nextX, window.nextY];\n};\n\nconst getLayoutedElements = (elements) => {\n const nodeWidth = 125;\n const nodeHeight = 45;\n const dagreGraph = new dagre.graphlib.Graph();\n dagreGraph.setDefaultEdgeLabel(() => ({}));\n dagreGraph.setGraph({ rankdir: \"LR\" });\n elements.forEach((el) => {\n if (isNode(el)) {\n dagreGraph.setNode(el.id, { width: nodeWidth, height: nodeHeight });\n } else {\n dagreGraph.setEdge(el.source, el.target);\n }\n });\n dagre.layout(dagreGraph);\n return elements.map((el) => {\n if (isNode(el)) {\n const n = dagreGraph.node(el.id);\n el.position = {\n x: 15 + n.x - nodeWidth / 2,\n y: 15 + n.y - nodeHeight / 2,\n };\n }\n return el;\n });\n};\n\nconst PipelineBlock = (props) => {\n let elements = [];\n let mapNameToType = {};\n let hasNullPositions = false;\n\n for (const [productName, product] of Object.entries(props.products)) {\n if (!product.x || !product.y) hasNullPositions = true;\n mapNameToType[productName] = \"product\";\n elements.push({\n id: productName,\n data: { label: productName, type: \"product\" },\n position: { x: product.x, y: product.y },\n sourcePosition: \"right\",\n targetPosition: \"left\",\n className: styles.ProductNode,\n });\n }\n\n for (const [plantName, plant] of Object.entries(props.plants)) {\n if (!plant.x || !plant.y) hasNullPositions = true;\n mapNameToType[plantName] = \"plant\";\n elements.push({\n id: plantName,\n data: { label: plantName, type: \"plant\" },\n position: { x: plant.x, y: plant.y },\n sourcePosition: \"right\",\n targetPosition: \"left\",\n className: styles.PlantNode,\n });\n\n if (plant.input !== undefined) {\n elements.push({\n id: `${plant.input}-${plantName}`,\n source: plant.input,\n target: plantName,\n animated: true,\n style: { stroke: \"black\" },\n selectable: false,\n });\n }\n\n for (const [productName] of Object.entries(\n plant[\"outputs (tonne/tonne)\"]\n )) {\n elements.push({\n id: `${plantName}-${productName}`,\n source: plantName,\n target: productName,\n animated: true,\n style: { stroke: \"black\" },\n selectable: false,\n });\n }\n }\n\n const onNodeDoubleClick = (ev, node) => {\n const oldName = node.data.label;\n const newName = window.prompt(\"Enter new name\", oldName);\n if (newName === undefined || newName.length === 0) return;\n if (newName in mapNameToType) return;\n if (node.data.type === \"plant\") {\n props.onRenamePlant(oldName, newName);\n } else {\n props.onRenameProduct(oldName, newName);\n }\n };\n\n const onElementsRemove = (elements) => {\n elements.forEach((el) => {\n if (!(el.id in mapNameToType)) return;\n if (el.data.type === \"plant\") {\n props.onRemovePlant(el.data.label);\n } else {\n props.onRemoveProduct(el.data.label);\n }\n });\n };\n\n const onNodeDragStop = (ev, node) => {\n if (node.data.type === \"plant\") {\n props.onMovePlant(node.data.label, node.position.x, node.position.y);\n } else {\n props.onMoveProduct(node.data.label, node.position.x, node.position.y);\n }\n };\n\n const onConnect = (args) => {\n const sourceType = mapNameToType[args.source];\n const targetType = mapNameToType[args.target];\n if (sourceType === \"product\" && targetType === \"plant\") {\n props.onSetPlantInput(args.target, args.source);\n } else if (sourceType === \"plant\" && targetType === \"product\") {\n props.onAddPlantOutput(args.source, args.target);\n }\n };\n\n const onLayout = () => {\n const layoutedElements = getLayoutedElements(elements);\n layoutedElements.forEach((el) => {\n if (isNode(el)) {\n if (el.data.type === \"plant\") {\n props.onMovePlant(el.data.label, el.position.x, el.position.y);\n } else {\n props.onMoveProduct(el.data.label, el.position.x, el.position.y);\n }\n }\n });\n };\n\n useEffect(() => {\n if (hasNullPositions) onLayout();\n }, [hasNullPositions]);\n\n return (\n <>\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n \n >\n );\n};\n\nexport default PipelineBlock;\n","const VALIDATION_REGEX = {\n int: new RegExp(\"^[0-9]+$\"),\n intList: new RegExp(\"[[0-9]*]$\"),\n float: new RegExp(\"^[0-9]*\\\\.?[0-9]*$\"),\n floatList: new RegExp(\"^[?[0-9,.]*]?$\"),\n};\n\nexport const validate = (kind, value) => {\n if (!VALIDATION_REGEX[kind].test(value)) {\n return false;\n }\n return true;\n};\n\nconst Form = (props) => {\n return <>{props.children}>;\n};\n\nexport default Form;\n","// extracted by mini-css-extract-plugin\nexport default {\"FormRow\":\"Form_FormRow__+cfai\",\"FormRow_unit\":\"Form_FormRow_unit__gGptt\",\"invalid\":\"Form_invalid__kTIKP\"};","import form_styles from \"./Form.module.css\";\nimport Button from \"./Button\";\nimport { validate } from \"./Form\";\nimport React from \"react\";\n\nconst TextInputRow = React.forwardRef((props, ref) => {\n let unit = \"\";\n if (props.unit) {\n unit = ({props.unit});\n }\n\n let tooltip = \"\";\n if (props.tooltip !== undefined) {\n tooltip = ;\n }\n\n let isValid = true;\n if (!props.disabled && props.validate !== undefined) {\n isValid = validate(props.validate, props.value);\n }\n\n let className = \"\";\n if (!isValid) className = form_styles.invalid;\n\n return (\n \n \n props.onChange(e.target.value)}\n ref={ref}\n />\n {tooltip}\n
\n );\n});\n\nexport default TextInputRow;\n","import Section from \"./Section\";\nimport Card from \"./Card\";\nimport Form from \"./Form\";\nimport TextInputRow from \"./TextInputRow\";\n\nconst ParametersBlock = (props) => {\n const onChangeField = (field, val) => {\n props.value[field] = val;\n props.onChange(props.value);\n };\n return (\n <>\n \n \n \n \n >\n );\n};\n\nexport default ParametersBlock;\n","import form_styles from \"./Form.module.css\";\nimport Button from \"./Button\";\nimport { useRef } from \"react\";\n\nconst FileInputRow = (props) => {\n let tooltip = \"\";\n if (props.tooltip !== undefined) {\n tooltip = ;\n }\n\n const fileElem = useRef();\n\n const onClickUpload = () => {\n fileElem.current.click();\n };\n\n const onFileSelected = () => {\n const file = fileElem.current.files[0];\n if (file) {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n props.onFile(reader.result);\n });\n reader.readAsText(file);\n }\n fileElem.current.value = \"\";\n };\n\n return (\n \n \n \n \n \n \n \n {tooltip}\n \n
\n );\n};\n\nexport default FileInputRow;\n","import form_styles from \"./Form.module.css\";\nimport Button from \"./Button\";\nimport { validate } from \"./Form\";\n\nconst DictInputRow = (props) => {\n const dict = { ...props.value };\n if (!props.disableKeys) {\n dict[\"\"] = \"0\";\n }\n\n let unit = \"\";\n if (props.unit) {\n unit = ({props.unit});\n }\n\n let tooltip = \"\";\n if (props.tooltip !== undefined) {\n tooltip = ;\n }\n\n const onChangeValue = (key, v) => {\n const newDict = { ...dict };\n newDict[key] = v;\n props.onChange(newDict);\n };\n\n const onChangeKey = (prevKey, newKey) => {\n const newDict = renameKey(dict, prevKey, newKey);\n if (!(\"\" in newDict)) newDict[\"\"] = \"\";\n props.onChange(newDict);\n };\n\n const form = [];\n Object.keys(dict).forEach((key, index) => {\n let label = (\n \n {props.label} {unit}\n \n );\n if (index > 0) {\n label = \"\";\n }\n\n let isValid = true;\n if (props.validate !== undefined) {\n isValid = validate(props.validate, dict[key]);\n }\n\n let className = \"\";\n if (!isValid) className = form_styles.invalid;\n\n form.push(\n \n \n onChangeKey(key, e.target.value)}\n />\n onChangeValue(key, e.target.value)}\n />\n {tooltip}\n
\n );\n });\n\n return <>{form}>;\n};\n\nexport function renameKey(obj, prevKey, newKey) {\n const keys = Object.keys(obj);\n return keys.reduce((acc, val) => {\n if (val === prevKey) {\n acc[newKey] = obj[prevKey];\n } else {\n acc[val] = obj[val];\n }\n return acc;\n }, {});\n}\n\nexport default DictInputRow;\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\")\n + (this.h || 0) + \", \"\n + (this.s || 0) * 100 + \"%, \"\n + (this.l || 0) * 100 + \"%\"\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","export default function autoType(object) {\n for (var key in object) {\n var value = object[key].trim(), number, m;\n if (!value) value = null;\n else if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"NaN\") value = NaN;\n else if (!isNaN(number = +value)) value = number;\n else if (m = value.match(/^([-+]\\d{2})?\\d{4}(-\\d{2}(-\\d{2})?)?(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?(Z|[-+]\\d{2}:\\d{2})?)?$/)) {\n if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\n value = new Date(value);\n }\n else continue;\n object[key] = value;\n }\n return object;\n}\n\n// https://github.com/d3/d3-dsv/issues/45\nconst fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","import * as d3 from \"d3\";\n\nexport const csvParse = ({ contents, requiredCols }) => {\n const data = d3.csvParse(contents, d3.autoType);\n requiredCols.forEach((col) => {\n if (!(col in data[0])) {\n throw Error(`Column \"${col}\" not found in CSV file.`);\n }\n });\n return data;\n};\n\nexport const parseCsv = (contents, requiredCols = []) => {\n const data = d3.csvParse(contents);\n const T = data.columns.length - requiredCols.length;\n let isValid = true;\n for (let t = 0; t < T; t++) {\n requiredCols.push(t + 1);\n }\n requiredCols.forEach((col) => {\n if (!(col in data[0])) {\n console.log(`Column \"${col}\" not found in CSV file.`);\n isValid = false;\n }\n });\n if (!isValid) return [undefined, undefined];\n return [data, T];\n};\n\nexport const extractNumericColumns = (obj, prefix) => {\n const result = [];\n for (let i = 1; `${prefix} ${i}` in obj; i++) {\n result.push(obj[`${prefix} ${i}`]);\n }\n return result;\n};\n\nexport const csvFormat = (data) => {\n return d3.csvFormat(data);\n};\n\nexport const generateFile = (filename, contents) => {\n var link = document.createElement(\"a\");\n link.setAttribute(\"href\", URL.createObjectURL(new Blob([contents])));\n link.setAttribute(\"download\", filename);\n link.style.visibility = \"hidden\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n","import Section from \"./Section\";\nimport Card from \"./Card\";\nimport Form from \"./Form\";\nimport TextInputRow from \"./TextInputRow\";\nimport FileInputRow from \"./FileInputRow\";\nimport DictInputRow from \"./DictInputRow\";\nimport { csvParse, extractNumericColumns, generateFile } from \"./csv\";\nimport { csvFormat } from \"d3\";\n\nconst ProductBlock = (props) => {\n const onChange = (field, val) => {\n const newProduct = { ...props.value };\n newProduct[field] = val;\n props.onChange(newProduct);\n };\n\n const onInitialAmountsFile = (contents) => {\n const data = csvParse({\n contents: contents,\n requiredCols: [\"latitude (deg)\", \"longitude (deg)\", \"name\"],\n });\n const result = {};\n data.forEach((el) => {\n result[el[\"name\"]] = {\n \"latitude (deg)\": el[\"latitude (deg)\"],\n \"longitude (deg)\": el[\"longitude (deg)\"],\n \"amount (tonne)\": extractNumericColumns(el, \"amount\"),\n };\n });\n onChange(\"initial amounts\", result);\n };\n\n const onInitialAmountsClear = () => {\n onChange(\"initial amounts\", {});\n };\n\n const onInitialAmountsTemplate = () => {\n generateFile(\n \"Initial amounts - Template.csv\",\n csvFormat([\n {\n name: \"Washakie County\",\n \"latitude (deg)\": \"43.8356\",\n \"longitude (deg)\": \"-107.6602\",\n \"amount 1\": \"21902\",\n \"amount 2\": \"6160\",\n \"amount 3\": \"2721\",\n \"amount 4\": \"12917\",\n \"amount 5\": \"18048\",\n },\n {\n name: \"Platte County\",\n \"latitude (deg)\": \"42.1314\",\n \"longitude (deg)\": \"-104.9676\",\n \"amount 1\": \"16723\",\n \"amount 2\": \"8709\",\n \"amount 3\": \"22584\",\n \"amount 4\": \"12278\",\n \"amount 5\": \"7196\",\n },\n {\n name: \"Park County\",\n \"latitude (deg)\": \"44.4063\",\n \"longitude (deg)\": \"-109.4153\",\n \"amount 1\": \"14731\",\n \"amount 2\": \"11729\",\n \"amount 3\": \"15562\",\n \"amount 4\": \"7703\",\n \"amount 5\": \"23349\",\n },\n ])\n );\n };\n\n const onInitialAmountsDownload = () => {\n const results = [];\n for (const [locationName, locationDict] of Object.entries(\n props.value[\"initial amounts\"]\n )) {\n const row = {\n name: locationName,\n \"latitude (deg)\": locationDict[\"latitude (deg)\"],\n \"longitude (deg)\": locationDict[\"longitude (deg)\"],\n };\n locationDict[\"amount (tonne)\"].forEach((el, idx) => {\n row[`amount ${idx + 1}`] = el;\n });\n results.push(row);\n }\n generateFile(`Initial amounts - ${props.name}.csv`, csvFormat(results));\n };\n\n let description = \"Not initially available\";\n let notInitiallyAvailable = true;\n const nCenters = Object.keys(props.value[\"initial amounts\"]).length;\n if (nCenters > 0) {\n description = `${nCenters} collection centers`;\n notInitiallyAvailable = false;\n }\n\n return (\n <>\n \n \n \n \n >\n );\n};\n\nexport default ProductBlock;\n","import Section from \"./Section\";\nimport Card from \"./Card\";\nimport Form from \"./Form\";\nimport TextInputRow from \"./TextInputRow\";\nimport FileInputRow from \"./FileInputRow\";\nimport DictInputRow from \"./DictInputRow\";\nimport { csvFormat, csvParse, generateFile } from \"./csv\";\n\nconst PlantBlock = (props) => {\n const onChange = (val, field1, field2, field3) => {\n const newPlant = { ...props.value };\n if (field3 !== undefined) {\n newPlant[field1][field2][field3] = val;\n } else if (field2 !== undefined) {\n newPlant[field1][field2] = val;\n } else {\n newPlant[field1] = val;\n }\n props.onChange(newPlant);\n };\n\n const onCandidateLocationsTemplate = () => {\n generateFile(\n \"Candidate locations - Template.csv\",\n csvFormat([\n {\n name: \"Washakie County\",\n \"latitude (deg)\": \"43.8356\",\n \"longitude (deg)\": \"-107.6602\",\n \"area cost factor\": \"0.88\",\n },\n {\n name: \"Platte County\",\n \"latitude (deg)\": \"42.1314\",\n \"longitude (deg)\": \"-104.9676\",\n \"area cost factor\": \"1.29\",\n },\n {\n name: \"Park County\",\n \"latitude (deg)\": \"44.4063\",\n \"longitude (deg)\": \"-109.4153\",\n \"area cost factor\": \"0.99\",\n },\n {\n name: \"Goshen County\",\n \"latitude (deg)\": \"42.0853\",\n \"longitude (deg)\": \"-104.3534\",\n \"area cost factor\": \"1\",\n },\n ])\n );\n };\n\n const onCandidateLocationsFile = (contents) => {\n const data = csvParse({\n contents: contents,\n requiredCols: [\n \"name\",\n \"latitude (deg)\",\n \"longitude (deg)\",\n \"area cost factor\",\n ],\n });\n const result = {};\n data.forEach((el) => {\n result[el[\"name\"]] = {\n \"latitude (deg)\": el[\"latitude (deg)\"],\n \"longitude (deg)\": el[\"longitude (deg)\"],\n \"area cost factor\": el[\"area cost factor\"],\n };\n });\n onChange(result, \"locations\");\n };\n\n const onCandidateLocationsDownload = () => {\n const result = [];\n for (const [locationName, locationDict] of Object.entries(\n props.value[\"locations\"]\n )) {\n result.push({\n name: locationName,\n \"latitude (deg)\": locationDict[\"latitude (deg)\"],\n \"longitude (deg)\": locationDict[\"longitude (deg)\"],\n \"area cost factor\": locationDict[\"area cost factor\"],\n });\n }\n generateFile(`Candidate locations - ${props.name}.csv`, csvFormat(result));\n };\n\n const onCandidateLocationsClear = () => {\n onChange({}, \"locations\");\n };\n\n let description = \"No locations set\";\n const nCenters = Object.keys(props.value[\"locations\"]).length;\n if (nCenters > 0) description = `${nCenters} locations`;\n\n const shouldDisableMaxCap =\n props.value[\"minimum capacity (tonne)\"] ===\n props.value[\"maximum capacity (tonne)\"];\n\n return (\n <>\n \n \n \n \n >\n );\n};\n\nexport default PlantBlock;\n","// extracted by mini-css-extract-plugin\nexport default {\"HeaderBox\":\"Header_HeaderBox__1tBDX\",\"HeaderContent\":\"Header_HeaderContent__Ac8nl\"};","import styles from \"./Header.module.css\";\n\nconst Header = (props) => {\n return (\n \n
\n
RELOG
\n
{props.title}
\n
\n {props.children}\n
\n
\n
\n );\n};\n\nexport default Header;\n","// extracted by mini-css-extract-plugin\nexport default {\"Footer\":\"Footer_Footer__YUTTj\"};","import styles from \"./Footer.module.css\";\n\nconst Footer = () => {\n return (\n \n
RELOG: Reverse Logistics Optimization
\n
\n Copyright © 2020—2022, UChicago Argonne, LLC. All Rights\n Reserved.\n
\n
\n );\n};\n\nexport default Footer;\n","export const defaultProduct = {\n \"initial amounts\": {},\n \"disposal cost ($/tonne)\": \"0\",\n \"disposal limit (tonne)\": \"0\",\n \"disposal limit (%)\": \"\",\n \"transportation cost ($/km/tonne)\": \"0\",\n \"transportation energy (J/km/tonne)\": \"0\",\n \"transportation emissions (tonne/km/tonne)\": {},\n x: 0,\n y: 0,\n};\n\nexport const defaultPlantLocation = {\n \"area cost factor\": 1.0,\n \"latitude (deg)\": 0,\n \"longitude (deg)\": 0,\n};\n\nexport const defaultPlant = {\n locations: {},\n \"outputs (tonne/tonne)\": {},\n \"disposal cost ($/tonne)\": {},\n \"disposal limit (tonne)\": {},\n \"emissions (tonne/tonne)\": {},\n storage: {\n \"cost ($/tonne)\": 0,\n \"limit (tonne)\": 0,\n },\n \"maximum capacity (tonne)\": 0,\n \"minimum capacity (tonne)\": 0,\n \"opening cost (max capacity) ($)\": 0,\n \"opening cost (min capacity) ($)\": 0,\n \"fixed operating cost (max capacity) ($)\": 0,\n \"fixed operating cost (min capacity) ($)\": 0,\n \"variable operating cost ($/tonne)\": 0,\n \"energy (GJ/tonne)\": 0,\n x: 0,\n y: 0,\n};\n\nexport const defaultData = {\n parameters: {\n \"time horizon (years)\": \"1\",\n \"building period (years)\": \"[1]\",\n \"inflation rate (%)\": \"0\",\n },\n products: {},\n plants: {},\n};\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(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 _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const isNumeric = (val) => {\n return String(val).length > 0 && !isNaN(val);\n};\n\nconst keysToList = (obj) => {\n const result = [];\n for (const key of Object.keys(obj)) {\n result.push(key);\n }\n return result;\n};\n\nexport const exportValue = (original, T, R = 1) => {\n if (isNumeric(original)) {\n if (T) {\n let v = parseFloat(original);\n const result = [];\n for (let i = 0; i < T; i++) {\n result.push(v);\n v *= R;\n }\n return result;\n } else {\n return parseFloat(original);\n }\n }\n\n try {\n const parsed = JSON.parse(original);\n return parsed;\n } catch {\n // ignore\n }\n return original;\n};\n\nconst exportValueDict = (original, T) => {\n const result = {};\n for (const [key, val] of Object.entries(original)) {\n if (key.length === 0) continue;\n result[key] = exportValue(val, T);\n }\n if (Object.keys(result).length > 0) {\n return result;\n } else {\n return null;\n }\n};\n\nconst computeTotalInitialAmount = (prod) => {\n let total = null;\n for (const locDict of Object.values(prod[\"initial amounts\"])) {\n const locAmount = locDict[\"amount (tonne)\"];\n if (!total) total = [...locAmount];\n else {\n for (let i = 0; i < locAmount.length; i++) {\n total[i] += locAmount[i];\n }\n }\n }\n return total;\n};\n\nexport const importList = (args, R = 1) => {\n if (args === undefined) return \"\";\n if (Array.isArray(args) && args.length > 0) {\n let isConstant = true;\n for (let i = 1; i < args.length; i++) {\n if (Math.abs(args[i - 1] - args[i] / R) > 1e-3) {\n isConstant = false;\n break;\n }\n }\n if (isConstant) {\n return String(args[0]);\n } else {\n return JSON.stringify(args);\n }\n } else {\n return args;\n }\n};\n\nexport const importDict = (args) => {\n if (!args) return {};\n const result = {};\n for (const [key, val] of Object.entries(args)) {\n result[key] = importList(val);\n }\n return result;\n};\n\nconst computeAbsDisposal = (prod) => {\n const disposalPerc = prod[\"disposal limit (%)\"];\n const total = computeTotalInitialAmount(prod);\n const disposalAbs = [];\n for (let i = 0; i < total.length; i++) {\n disposalAbs[i] = (total[i] * disposalPerc) / 100;\n }\n return disposalAbs;\n};\n\nconst computeInflationAndTimeHorizon = (obj, keys) => {\n for (let i = 0; i < keys.length; i++) {\n const list = obj[keys[i]];\n if (\n Array.isArray(list) &&\n list.length > 1 &&\n isNumeric(list[0]) &&\n isNumeric(list[1]) &&\n Math.abs(list[0]) > 0\n ) {\n return [list[1] / list[0], list.length];\n }\n }\n return [1, 1];\n};\n\nexport const exportProduct = (original, parameters) => {\n const result = {};\n\n // Read time horizon\n let T = parameters[\"time horizon (years)\"];\n if (isNumeric(T)) T = parseInt(T);\n else T = 1;\n\n // Read inflation\n let R = parameters[\"inflation rate (%)\"];\n if (isNumeric(R)) R = parseFloat(R) / 100 + 1;\n else R = 1;\n\n // Copy constant time series\n result[\"initial amounts\"] = original[\"initial amounts\"];\n [\"disposal limit (tonne)\", \"transportation energy (J/km/tonne)\"].forEach(\n (key) => {\n const v = exportValue(original[key], T);\n if (v.length > 0) result[key] = v;\n }\n );\n\n // Copy cost time series (with inflation)\n [\"disposal cost ($/tonne)\", \"transportation cost ($/km/tonne)\"].forEach(\n (key) => {\n const v = exportValue(original[key], T, R);\n if (v.length > 0) result[key] = v;\n }\n );\n\n // Copy dictionaries\n [\"transportation emissions (tonne/km/tonne)\"].forEach((key) => {\n const v = exportValueDict(original[key], T);\n if (v) result[key] = v;\n });\n\n // Transform percentage disposal limits into absolute\n if (isNumeric(original[\"disposal limit (%)\"])) {\n result[\"disposal limit (tonne)\"] = computeAbsDisposal(original);\n }\n return result;\n};\n\nexport const exportPlant = (original, parameters) => {\n const result = {};\n\n // Read time horizon\n let T = parameters[\"time horizon (years)\"];\n if (isNumeric(T)) T = parseInt(T);\n else T = 1;\n\n // Read inflation\n let R = parameters[\"inflation rate (%)\"];\n if (isNumeric(R)) R = parseFloat(R) / 100 + 1;\n else R = 1;\n\n // Copy scalar values\n [\"input\"].forEach((key) => {\n result[key] = original[key];\n });\n\n // Copy time series values\n [\"energy (GJ/tonne)\"].forEach((key) => {\n result[key] = exportValue(original[key], T);\n if (result[key] === undefined) {\n delete result[key];\n }\n });\n\n // Copy scalar dicts\n [\"outputs (tonne/tonne)\"].forEach((key) => {\n const v = exportValueDict(original[key]);\n if (v) result[key] = v;\n });\n\n // Copy time series dicts\n [\"emissions (tonne/tonne)\"].forEach((key) => {\n const v = exportValueDict(original[key], T);\n if (v) result[key] = v;\n });\n\n const minCap = original[\"minimum capacity (tonne)\"];\n const maxCap = original[\"maximum capacity (tonne)\"];\n\n result.locations = {};\n for (const [locName, origDict] of Object.entries(original[\"locations\"])) {\n const resDict = (result.locations[locName] = {});\n const capDict = (resDict[\"capacities (tonne)\"] = {});\n\n const acf = origDict[\"area cost factor\"];\n\n const exportValueAcf = (obj) => {\n const v = exportValue(obj, T, R);\n if (Array.isArray(v)) {\n return v.map((v) => v * acf);\n }\n return \"\";\n };\n\n // Copy scalar values\n [\"latitude (deg)\", \"longitude (deg)\"].forEach((key) => {\n resDict[key] = origDict[key];\n });\n\n // Copy minimum capacity dict\n capDict[minCap] = {};\n for (const [resKeyName, origKeyName] of Object.entries({\n \"opening cost ($)\": \"opening cost (min capacity) ($)\",\n \"fixed operating cost ($)\": \"fixed operating cost (min capacity) ($)\",\n \"variable operating cost ($/tonne)\": \"variable operating cost ($/tonne)\",\n })) {\n capDict[minCap][resKeyName] = exportValueAcf(original[origKeyName]);\n }\n\n if (maxCap !== minCap) {\n // Copy maximum capacity dict\n capDict[maxCap] = {};\n for (const [resKeyName, origKeyName] of Object.entries({\n \"opening cost ($)\": \"opening cost (max capacity) ($)\",\n \"fixed operating cost ($)\": \"fixed operating cost (max capacity) ($)\",\n \"variable operating cost ($/tonne)\":\n \"variable operating cost ($/tonne)\",\n })) {\n capDict[maxCap][resKeyName] = exportValueAcf(original[origKeyName]);\n }\n }\n\n // Copy disposal\n resDict.disposal = {};\n for (const [dispName, dispCost] of Object.entries(\n original[\"disposal cost ($/tonne)\"]\n )) {\n if (dispName.length === 0) continue;\n const v = exportValueAcf(dispCost, T);\n if (v) {\n resDict.disposal[dispName] = { \"cost ($/tonne)\": v };\n const limit = original[\"disposal limit (tonne)\"][dispName];\n if (isNumeric(limit)) {\n resDict.disposal[dispName][\"limit (tonne)\"] = exportValue(limit, T);\n }\n }\n }\n\n // Copy storage\n resDict.storage = {\n \"cost ($/tonne)\": exportValueAcf(original[\"storage\"][\"cost ($/tonne)\"]),\n };\n const storLimit = original[\"storage\"][\"limit (tonne)\"];\n if (isNumeric(storLimit)) {\n resDict.storage[\"limit (tonne)\"] = exportValue(storLimit);\n }\n }\n\n return result;\n};\n\nexport const exportData = (original) => {\n const result = {\n parameters: {},\n products: {},\n plants: {},\n };\n\n // Export parameters\n [\"time horizon (years)\", \"building period (years)\"].forEach((key) => {\n result.parameters[key] = exportValue(original.parameters[key]);\n });\n\n // Read time horizon\n let T = result.parameters[\"time horizon (years)\"];\n if (!isNumeric(T)) T = 1;\n\n // Export products\n for (const [prodName, prodDict] of Object.entries(original.products)) {\n result.products[prodName] = exportProduct(prodDict, original.parameters);\n }\n\n // Export plants\n for (const [plantName, plantDict] of Object.entries(original.plants)) {\n result.plants[plantName] = exportPlant(plantDict, original.parameters);\n }\n return result;\n};\n\nconst compressDisposalLimits = (original, result) => {\n if (!(\"disposal limit (tonne)\" in original)) {\n return;\n }\n const total = computeTotalInitialAmount(original);\n if (!total) return;\n const limit = original[\"disposal limit (tonne)\"];\n let perc = Math.round((limit[0] / total[0]) * 1e6) / 1e6;\n for (let i = 1; i < limit.length; i++) {\n if (Math.abs(limit[i] / total[i] - perc) > 1e-5) {\n return;\n }\n }\n result[\"disposal limit (tonne)\"] = \"\";\n result[\"disposal limit (%)\"] = String(perc * 100);\n};\n\nexport const importProduct = (original) => {\n const prod = {};\n const parameters = {};\n\n prod[\"initial amounts\"] = { ...original[\"initial amounts\"] };\n\n // Initialize null values\n [\"x\", \"y\"].forEach((key) => {\n prod[key] = null;\n });\n\n // Initialize empty values\n [\"disposal limit (%)\"].forEach((key) => {\n prod[key] = \"\";\n });\n\n // Import constant lists\n [\"transportation energy (J/km/tonne)\", \"disposal limit (tonne)\"].forEach(\n (key) => {\n prod[key] = importList(original[key]);\n }\n );\n\n // Compute inflation and time horizon\n const [R, T] = computeInflationAndTimeHorizon(original, [\n \"transportation cost ($/km/tonne)\",\n \"disposal cost ($/tonne)\",\n ]);\n parameters[\"inflation rate (%)\"] = String((R - 1) * 100);\n parameters[\"time horizon (years)\"] = String(T);\n\n // Import cost lists\n [\"transportation cost ($/km/tonne)\", \"disposal cost ($/tonne)\"].forEach(\n (key) => {\n prod[key] = importList(original[key], R);\n }\n );\n\n // Import dicts\n [\"transportation emissions (tonne/km/tonne)\"].forEach((key) => {\n prod[key] = importDict(original[key]);\n });\n\n // Attempt to convert absolute disposal limits to relative\n compressDisposalLimits(original, prod);\n\n return [prod, parameters];\n};\n\nexport const importPlant = (original) => {\n const plant = {};\n const parameters = {};\n\n plant[\"storage\"] = {};\n plant[\"storage\"][\"cost ($/tonne)\"] = 0;\n plant[\"storage\"][\"limit (tonne)\"] = 0;\n plant[\"disposal cost ($/tonne)\"] = 0;\n plant[\"disposal limit (tonne)\"] = 0;\n\n // Initialize null values\n [\"x\", \"y\"].forEach((key) => {\n plant[key] = null;\n });\n\n // Import scalar values\n [\"input\"].forEach((key) => {\n plant[key] = original[key];\n });\n\n // Import timeseries values\n [\"energy (GJ/tonne)\"].forEach((key) => {\n plant[key] = importList(original[key]);\n if (plant[key] === \"\") {\n delete plant[key];\n }\n });\n\n // Import dicts\n [\"outputs (tonne/tonne)\", \"emissions (tonne/tonne)\"].forEach((key) => {\n plant[key] = importDict(original[key]);\n });\n\n let costsInitialized = false;\n let R = null;\n\n // Read locations\n const resLocDict = (plant.locations = {});\n for (const [locName, origLocDict] of Object.entries(original[\"locations\"])) {\n resLocDict[locName] = {};\n\n // Import latitude and longitude\n [\"latitude (deg)\", \"longitude (deg)\"].forEach((key) => {\n resLocDict[locName][key] = origLocDict[key];\n });\n\n const capacities = keysToList(origLocDict[\"capacities (tonne)\"]);\n const last = capacities.length - 1;\n const minCap = capacities[0];\n const maxCap = capacities[last];\n const minCapDict = origLocDict[\"capacities (tonne)\"][minCap];\n const maxCapDict = origLocDict[\"capacities (tonne)\"][maxCap];\n\n // Import min/max capacity\n if (\"minimum capacity (tonne)\" in plant) {\n if (\n plant[\"minimum capacity (tonne)\"] !== minCap ||\n plant[\"maximum capacity (tonne)\"] !== maxCap\n ) {\n throw \"Data loss\";\n }\n } else {\n plant[\"minimum capacity (tonne)\"] = minCap;\n plant[\"maximum capacity (tonne)\"] = maxCap;\n }\n\n // Compute area cost factor\n let acf = 1;\n if (costsInitialized) {\n acf = plant[\"opening cost (min capacity) ($)\"];\n if (Array.isArray(acf)) acf = acf[0];\n acf = minCapDict[\"opening cost ($)\"][0] / acf;\n }\n resLocDict[locName][\"area cost factor\"] = acf;\n\n const [R, T] = computeInflationAndTimeHorizon(maxCapDict, [\n \"opening cost ($)\",\n \"fixed operating cost ($)\",\n \"variable operating cost ($/tonne)\",\n ]);\n parameters[\"inflation rate (%)\"] = String((R - 1) * 100);\n parameters[\"time horizon (years)\"] = String(T);\n\n // Read adjusted costs\n const importListAcf = (obj) =>\n importList(\n obj.map((v) => v / acf),\n R\n );\n const openCostMax = importListAcf(maxCapDict[\"opening cost ($)\"]);\n const openCostMin = importListAcf(minCapDict[\"opening cost ($)\"]);\n const fixCostMax = importListAcf(maxCapDict[\"fixed operating cost ($)\"]);\n const fixCostMin = importListAcf(minCapDict[\"fixed operating cost ($)\"]);\n const storCost = importListAcf(origLocDict.storage[\"cost ($/tonne)\"]);\n const storLimit = String(origLocDict.storage[\"limit (tonne)\"]);\n const varCost = importListAcf(\n minCapDict[\"variable operating cost ($/tonne)\"]\n );\n\n const dispCost = {};\n const dispLimit = {};\n for (const prodName of Object.keys(original[\"outputs (tonne/tonne)\"])) {\n dispCost[prodName] = \"\";\n dispLimit[prodName] = \"\";\n\n if (prodName in origLocDict[\"disposal\"]) {\n const prodDict = origLocDict[\"disposal\"][prodName];\n dispCost[prodName] = importListAcf(prodDict[\"cost ($/tonne)\"]);\n if (\"limit (tonne)\" in prodDict)\n dispLimit[prodName] = importList(prodDict[\"limit (tonne)\"]);\n }\n }\n\n const check = (left, right) => {\n let valid = true;\n if (isNumeric(left) && isNumeric(right)) {\n valid = Math.abs(left - right) < 1.0;\n } else {\n valid = left === right;\n }\n if (!valid)\n console.warn(`Data loss detected: ${locName}, ${left} != ${right}`);\n };\n\n if (costsInitialized) {\n // Verify that location costs match the previously initialized ones\n check(plant[\"opening cost (max capacity) ($)\"], openCostMax);\n check(plant[\"opening cost (min capacity) ($)\"], openCostMin);\n check(plant[\"fixed operating cost (max capacity) ($)\"], fixCostMax);\n check(plant[\"fixed operating cost (min capacity) ($)\"], fixCostMin);\n check(plant[\"variable operating cost ($/tonne)\"], varCost);\n check(plant[\"storage\"][\"cost ($/tonne)\"], storCost);\n check(plant[\"storage\"][\"limit (tonne)\"], storLimit);\n check(String(plant[\"disposal cost ($/tonne)\"]), String(dispCost));\n check(String(plant[\"disposal limit (tonne)\"]), String(dispLimit));\n } else {\n // Initialize plant costs\n costsInitialized = true;\n plant[\"opening cost (max capacity) ($)\"] = openCostMax;\n plant[\"opening cost (min capacity) ($)\"] = openCostMin;\n plant[\"fixed operating cost (max capacity) ($)\"] = fixCostMax;\n plant[\"fixed operating cost (min capacity) ($)\"] = fixCostMin;\n plant[\"variable operating cost ($/tonne)\"] = varCost;\n plant[\"storage\"] = {};\n plant[\"storage\"][\"cost ($/tonne)\"] = storCost;\n plant[\"storage\"][\"limit (tonne)\"] = storLimit;\n plant[\"disposal cost ($/tonne)\"] = dispCost;\n plant[\"disposal limit (tonne)\"] = dispLimit;\n parameters[\"inflation rate (%)\"] = String((R - 1) * 100);\n }\n }\n\n return [plant, parameters];\n};\n\nexport const importData = (original) => {\n [\"parameters\", \"plants\", \"products\"].forEach((key) => {\n if (!(key in original)) {\n throw \"File not recognized.\";\n }\n });\n\n const result = {};\n result.parameters = importDict(original.parameters);\n [\"building period (years)\"].forEach((k) => {\n result.parameters[k] = JSON.stringify(original.parameters[k]);\n });\n result.parameters[\"inflation rate (%)\"] = \"0\";\n\n // Import products\n result.products = {};\n for (const [prodName, origProdDict] of Object.entries(original.products)) {\n const [recoveredProd, recoveredParams] = importProduct(origProdDict);\n result.products[prodName] = recoveredProd;\n result.parameters = { ...result.parameters, ...recoveredParams };\n }\n\n // Import plants\n result.plants = {};\n for (const [plantName, origPlantDict] of Object.entries(original.plants)) {\n const [recoveredPlant, recoveredParams] = importPlant(origPlantDict);\n result.plants[plantName] = recoveredPlant;\n result.parameters = { ...result.parameters, ...recoveredParams };\n }\n\n return result;\n};\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { openDB, deleteDB, wrap, unwrap } from \"idb\";\n\nimport \"./index.css\";\nimport PipelineBlock from \"./PipelineBlock\";\nimport ParametersBlock from \"./ParametersBlock\";\nimport ProductBlock from \"./ProductBlock\";\nimport PlantBlock from \"./PlantBlock\";\nimport Button from \"./Button\";\nimport Header from \"./Header\";\nimport Footer from \"./Footer\";\nimport { defaultData, defaultPlant, defaultProduct } from \"./defaults\";\nimport { randomPosition } from \"./PipelineBlock\";\nimport { exportData, importData } from \"./export\";\nimport { generateFile } from \"./csv\";\n\nconst setDefaults = (actualDict, defaultDict) => {\n for (const [key, defaultValue] of Object.entries(defaultDict)) {\n if (!(key in actualDict)) {\n if (typeof defaultValue === \"object\") {\n actualDict[key] = { ...defaultValue };\n } else {\n actualDict[key] = defaultValue;\n }\n }\n }\n};\n\nconst cleanDict = (dict, defaultDict) => {\n for (const key of Object.keys(dict)) {\n if (!(key in defaultDict)) {\n delete dict[key];\n }\n }\n};\n\nconst fixLists = (dict, blacklist, stringify) => {\n for (const [key, val] of Object.entries(dict)) {\n if (blacklist.includes(key)) continue;\n if (Array.isArray(val)) {\n // Replace constant lists by a single number\n let isConstant = true;\n for (let i = 1; i < val.length; i++) {\n if (val[i - 1] !== val[i]) {\n isConstant = false;\n break;\n }\n }\n if (isConstant) dict[key] = val[0];\n\n // Convert lists to JSON strings\n if (stringify) dict[key] = JSON.stringify(dict[key]);\n }\n if (typeof val === \"object\") {\n fixLists(val, blacklist, stringify);\n }\n }\n};\n\nconst openRelogDB = async () => {\n const dbPromise = await openDB(\"RELOG\", 1, {\n upgrade(db) {\n db.createObjectStore(\"casebuilder\");\n },\n });\n return dbPromise;\n};\n\nconst InputPage = () => {\n const fileElem = useRef();\n let [data, setData] = useState(defaultData);\n\n const save = async (data) => {\n const db = await openRelogDB();\n await db.put(\"casebuilder\", data, \"data\");\n };\n\n useEffect(async () => {\n const db = await openRelogDB();\n const data = await db.get(\"casebuilder\", \"data\");\n if (data) setData(data);\n }, []);\n\n const promptName = (prevData) => {\n const name = prompt(\"Name\");\n if (!name || name.length === 0) return;\n if (name in prevData.products || name in prevData.plants) return;\n return name;\n };\n\n const onAddPlant = () => {\n setData((prevData) => {\n const name = promptName(prevData);\n if (name === undefined) return prevData;\n const newData = { ...prevData };\n const [x, y] = randomPosition();\n newData.plants[name] = {\n ...defaultPlant,\n x: x,\n y: y,\n };\n save(newData);\n return newData;\n });\n };\n\n const onAddProduct = () => {\n setData((prevData) => {\n const name = promptName(prevData);\n if (name === undefined) return prevData;\n const newData = { ...prevData };\n const [x, y] = randomPosition();\n console.log(x, y);\n newData.products[name] = {\n ...defaultProduct,\n x: x,\n y: y,\n };\n save(newData);\n return newData;\n });\n };\n\n const onRenamePlant = (prevName, newName) => {\n setData((prevData) => {\n const newData = { ...prevData };\n newData.plants[newName] = newData.plants[prevName];\n delete newData.plants[prevName];\n save(newData);\n return newData;\n });\n };\n\n const onRenameProduct = (prevName, newName) => {\n setData((prevData) => {\n const newData = { ...prevData };\n newData.products[newName] = newData.products[prevName];\n delete newData.products[prevName];\n for (const [, plant] of Object.entries(newData.plants)) {\n if (plant.input === prevName) {\n plant.input = newName;\n }\n let outputFound = false;\n for (const [outputName] of Object.entries(\n plant[\"outputs (tonne/tonne)\"]\n )) {\n if (outputName === prevName) outputFound = true;\n }\n if (outputFound) {\n plant[\"outputs (tonne/tonne)\"][newName] =\n plant[\"outputs (tonne/tonne)\"][prevName];\n delete plant[\"outputs (tonne/tonne)\"][prevName];\n }\n }\n save(newData);\n return newData;\n });\n };\n\n const onMovePlant = (plantName, x, y) => {\n setData((prevData) => {\n const newData = { ...prevData };\n newData.plants[plantName].x = x;\n newData.plants[plantName].y = y;\n save(newData);\n return newData;\n });\n };\n\n const onMoveProduct = (productName, x, y) => {\n setData((prevData) => {\n const newData = { ...prevData };\n newData.products[productName].x = x;\n newData.products[productName].y = y;\n save(newData);\n return newData;\n });\n };\n\n const onRemovePlant = (plantName) => {\n setData((prevData) => {\n const newData = { ...prevData };\n delete newData.plants[plantName];\n save(newData);\n return newData;\n });\n };\n\n const onRemoveProduct = (productName) => {\n setData((prevData) => {\n const newData = { ...prevData };\n delete newData.products[productName];\n for (const [, plant] of Object.entries(newData.plants)) {\n if (plant.input === productName) {\n delete plant.input;\n }\n let outputFound = false;\n for (const [outputName] of Object.entries(\n plant[\"outputs (tonne/tonne)\"]\n )) {\n if (outputName === productName) outputFound = true;\n }\n if (outputFound) {\n delete plant[\"outputs (tonne/tonne)\"][productName];\n }\n }\n save(newData);\n return newData;\n });\n };\n\n const onSetPlantInput = (plantName, productName) => {\n setData((prevData) => {\n const newData = { ...prevData };\n newData.plants[plantName].input = productName;\n save(newData);\n return newData;\n });\n };\n\n const onAddPlantOutput = (plantName, productName) => {\n setData((prevData) => {\n if (productName in prevData.plants[plantName][\"outputs (tonne/tonne)\"]) {\n return prevData;\n }\n const newData = { ...prevData };\n [\n \"outputs (tonne/tonne)\",\n \"disposal cost ($/tonne)\",\n \"disposal limit (tonne)\",\n ].forEach((key) => {\n newData.plants[plantName][key] = { ...newData.plants[plantName][key] };\n newData.plants[plantName][key][productName] = 0;\n });\n save(newData);\n return newData;\n });\n };\n\n const onSave = () => {\n generateFile(\"case.json\", JSON.stringify(exportData(data), null, 2));\n };\n\n const onClear = () => {\n const newData = JSON.parse(JSON.stringify(defaultData));\n setData(newData);\n save(newData);\n };\n\n const onLoad = (contents) => {\n const newData = importData(JSON.parse(contents));\n setData(newData);\n save(newData);\n };\n\n const onChange = (val, field1, field2) => {\n setData((prevData) => {\n const newData = { ...prevData };\n if (field2 !== undefined) {\n newData[field1][field2] = val;\n } else {\n newData[field1] = val;\n }\n save(newData);\n return newData;\n });\n };\n let productComps = [];\n for (const [prodName, prod] of Object.entries(data.products)) {\n productComps.push(\n onChange(v, \"products\", prodName, v)}\n />\n );\n }\n\n let plantComps = [];\n for (const [plantName, plant] of Object.entries(data.plants)) {\n plantComps.push(\n onChange(v, \"plants\", plantName)}\n />\n );\n }\n\n const onFileSelected = () => {\n const file = fileElem.current.files[0];\n if (file) {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n onLoad(reader.result);\n });\n reader.readAsText(file);\n }\n fileElem.current.value = \"\";\n };\n\n return (\n <>\n \n \n
\n
onChange(v, \"parameters\")}\n />\n {productComps}\n {plantComps}\n \n \n >\n );\n};\n\nexport default InputPage;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport InputPage from \"./InputPage\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n"],"names":["module","exports","graphlib","require","layout","debug","util","time","notime","version","_","greedyFAS","run","g","fas","graph","acyclicer","e","edge","weight","weightFn","stack","visited","dfs","v","has","forEach","outEdges","w","push","nodes","dfsFAS","label","removeEdge","forwardName","name","reversed","setEdge","uniqueId","undo","edges","addBorderNode","prop","prefix","sg","sgNode","rank","width","height","borderType","prev","curr","addDummyNode","setParent","children","node","length","borderLeft","borderRight","minRank","maxRank","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","toLowerCase","points","reverseY","swapXY","List","sentinel","_next","_prev","this","_sentinel","unlink","entry","filterOutLinks","k","prototype","dequeue","enqueue","toString","strs","JSON","stringify","join","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layer","i","layerV","reduce","u","style","window","nodeCount","state","fasGraph","maxIn","maxOut","out","prevWeight","edgeWeight","Math","max","buckets","range","map","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","concat","doGreedyFAS","flatten","constant","collectPredecessors","undefined","inEdges","uEntry","wEntry","acyclic","normalize","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","position","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","parent","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","t","b","l","last","r","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","Number","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","p","translateGraph","p1","p2","nodeV","nodeW","unshift","intersectRect","assignNodeIntersects","reverse","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","obj","mapValues","newAttrs","lodash","cloneDeep","each","filter","find","forIn","isUndefined","minBy","now","sortBy","values","zipObject","root","nodeSep","depths","top","bottom","child","childNode","childTop","childBottom","thisWeight","nestingEdge","depth","treeDepths","nestingRoot","acc","sumWeights","nodeRankFactor","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","cg","vs","rootPrev","prevChild","movable","inV","result","nodeU","sum","barycenter","relationship","hasNode","createRootNode","setDefaultNodeLabel","twoLayerCrossCount","northLayer","southLayer","southPos","southEntries","pos","firstIndex","treeSize","tree","Array","cc","index","weightSum","layering","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","simpleNodes","orderedVs","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","target","source","mergeEntries","handleOut","pop","doResolveConflicts","resolveConflicts","sort","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","consumeUnsortable","unsortable","parts","partition","sortable","lhs","rhs","vsIndex","bias","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","slice","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","delta","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","iterate","setXsFunc","nextNodesFunc","elem","bind","findSmallestWidthAlignment","xss","NEGATIVE_INFINITY","halfWidth","alignCoordinates","alignTo","alignToVals","alignToMin","alignToMax","vert","horiz","alignment","xsVals","balance","ul","ignore","positionX","adjustedLayering","inner","smallestWidth","rankSep","prevY","maxHeight","positionY","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","start","size","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","initRank","preorder","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","arguments","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","f","flipped","updateRanks","rootLabel","type","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","Error","offset","collection","fn","value","console","log","lib","json","alg","cmpt","cmpts","doDfs","navigation","isArray","isDirected","dijkstra","weightFunc","edgeFunc","transform","PriorityQueue","edgeFn","pq","updateNeighbors","distance","predecessor","decrease","add","removeMin","runDijkstra","String","DEFAULT_WEIGHT_FUNC","tarjan","d","rowK","rowI","j","ik","kj","ij","altDistance","runFloydWarshall","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","CycleException","parents","pri","priority","init","onStack","lowlink","visit","_arr","_keyIndices","keys","key","keyIndices","arr","_decrease","_swap","_heapify","largest","origArrI","origArrJ","GRAPH_NODE","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_parent","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","v_","w_","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","self","isEmpty","setNodes","args","_removeFromParentsChildList","ancestor","predsV","sucsV","union","isLeaf","filterNodes","copy","constructor","findParent","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","arg0","Object","freeze","outV","writeNodes","nodeValue","writeEdges","edgeValue","write","options","clone","read","DataView","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","clear","set","get","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","Promise","Set","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","data","Symbol","Uint8Array","WeakMap","func","thisArg","call","apply","array","iteratee","predicate","resIndex","baseIndexOf","comparator","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","hasOwnProperty","inherited","isArr","isArg","isBuff","isType","skipIndexes","accumulator","initAccum","asciiSize","baseProperty","baseAssignValue","eq","object","objValue","copyObject","keysIn","defineProperty","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isObject","isSet","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","customizer","isDeep","isFlat","isFull","tag","isFunc","stacked","subValue","props","objectCreate","create","baseCreate","proto","baseForOwn","baseEach","createBaseEach","isSymbol","current","computed","fromIndex","fromRight","arrayPush","isFlattenable","baseFlatten","isStrict","baseFor","createBaseFor","castPath","toKey","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseFindIndex","baseIsNaN","strictIndexOf","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","equalArrays","equalByTag","equalObjects","arrayTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isMasked","toSource","reIsHostCtor","funcProto","Function","objectProto","funcToString","reIsNative","RegExp","replace","test","isLength","typedArrayTags","baseMatches","baseMatchesProperty","identity","property","isPrototype","nativeKeys","nativeKeysIn","isProto","isArrayLike","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","assignMergeValue","baseMergeDeep","safeGet","baseMerge","srcIndex","newValue","cloneTypedArray","isArrayLikeObject","isPlainObject","toPlainObject","mergeFunc","isCommon","isTyped","arrayMap","baseGet","baseIteratee","baseMap","baseSortBy","baseUnary","compareMultiple","iteratees","orders","basePickBy","paths","baseSet","nativeCeil","nativeMax","end","step","eachFunc","overRest","setToString","lastIndex","nested","baseSetToString","string","comparer","n","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","includes","seen","outer","seenIndex","assignFunc","valsLength","cache","stringToPath","arrayBuffer","byteLength","freeExports","nodeType","freeModule","Buffer","allocUnsafe","buffer","cloneArrayBuffer","dataView","byteOffset","reFlags","regexp","exec","symbolValueOf","valueOf","symbol","typedArray","valIsDefined","valIsNull","valIsReflexive","valIsSymbol","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","compareAscending","objCriteria","criteria","othCriteria","ordersLength","isNew","getSymbols","getSymbolsIn","coreJsData","baseRest","isIterateeCall","assigner","guard","iterable","findIndexFunc","baseRange","toFinite","noop","arraySome","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","message","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","global","baseGetAllKeys","isKeyable","baseIsNative","getValue","getPrototype","overArg","getPrototypeOf","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","Ctor","ctorString","hasFunc","reHasUnicode","nativeCreate","input","cloneDataView","cloneRegExp","cloneSymbol","spreadableSymbol","isConcatSpreadable","reIsUint","reIsDeepProp","reIsPlainProp","maskSrcKey","uid","IE_PROTO","assocIndexOf","splice","getMapData","memoize","freeProcess","process","nodeUtil","types","binding","arg","otherArgs","freeSelf","shortOut","nativeNow","Date","count","lastCalled","stamp","remaining","pairs","LARGE_ARRAY_SIZE","hasUnicode","unicodeSize","memoizeCapped","rePropName","reEscapeChar","charCodeAt","match","number","quote","subString","reWhitespace","charAt","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","CLONE_DEEP_FLAG","propsIndex","propsLength","baseFilter","createFind","toInteger","castFunction","defaultValue","baseHas","hasPath","baseHasIn","baseIsArguments","stubFalse","baseKeys","baseIsMap","nodeIsMap","objectCtorString","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeysIn","baseExtremum","baseGt","resolver","TypeError","memoized","Cache","createAssigner","baseLt","basePick","flatRest","basePropertyDeep","createRange","arrayReduce","baseReduce","isString","stringSize","baseOrderBy","toNumber","INFINITY","remainder","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isBinary","isArrLike","baseUniq","arrays","idCounter","id","baseValues","baseZipObject","propIsEnumerable","toObject","val","assign","test1","getOwnPropertyNames","test2","fromCharCode","test3","split","letter","err","shouldUseNative","from","symbols","to","s","aa","m","a","c","encodeURIComponent","ba","ca","da","ea","fa","document","createElement","ha","ia","ja","ka","B","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","D","oa","pa","toUpperCase","qa","ma","isNaN","na","la","removeAttribute","setAttribute","setAttributeNS","xlinkHref","ra","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","sa","ta","ua","wa","xa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","for","E","Ma","Ka","iterator","La","Na","trim","Oa","Pa","prepareStackTrace","Reflect","construct","displayName","Qa","render","_render","Ra","$$typeof","_context","_payload","_init","Sa","Ta","nodeName","Va","_valueTracker","getOwnPropertyDescriptor","configurable","enumerable","setValue","stopTracking","Ua","Wa","checked","Xa","activeElement","body","Ya","defaultChecked","_wrapperState","initialChecked","Za","initialValue","controlled","$a","ab","bb","cb","ownerDocument","eb","Children","db","fb","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","hb","ib","jb","textContent","kb","lb","mb","nb","ob","namespaceURI","innerHTML","firstChild","removeChild","appendChild","MSApp","execUnsafeLocalFunction","pb","lastChild","qb","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","rb","sb","tb","indexOf","setProperty","substring","ub","menuitem","area","base","col","embed","hr","img","keygen","link","meta","param","track","wbr","vb","wb","is","xb","srcElement","correspondingUseElement","parentNode","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Ob","Pb","Qb","addEventListener","removeEventListener","Rb","onError","Sb","Tb","Ub","Vb","Wb","Xb","Zb","alternate","return","flags","$b","memoizedState","dehydrated","ac","sibling","bc","dc","ec","fc","gc","hc","ic","jc","kc","lc","mc","nc","oc","pc","qc","rc","blockedOn","domEventName","eventSystemFlags","nativeEvent","targetContainers","sc","delete","pointerId","tc","vc","wc","lanePriority","unstable_runWithPriority","hydrate","containerInfo","xc","yc","shift","zc","Ac","Bc","unstable_scheduleCallback","unstable_NormalPriority","Cc","Dc","Ec","animationend","animationiteration","animationstart","transitionend","Fc","Gc","Hc","animation","transition","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","unstable_now","F","Rc","Uc","pendingLanes","expiredLanes","suspendedLanes","pingedLanes","Vc","entangledLanes","entanglements","Wc","Xc","Yc","Zc","$c","eventTimes","clz32","bd","cd","LN2","dd","unstable_UserBlockingPriority","ed","fd","gd","hd","uc","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","stopPropagation","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","code","location","repeat","locale","which","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","date","datetime","email","month","password","search","tel","text","url","week","me","ne","oe","event","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","Le","nextSibling","Me","contains","compareDocumentPosition","Ne","HTMLIFrameElement","contentWindow","href","Oe","contentEditable","Pe","Qe","Re","Se","Te","Ue","selectionStart","selectionEnd","anchorNode","defaultView","getSelection","anchorOffset","focusNode","focusOffset","Ve","We","Xe","Ye","Ze","Yb","instance","listener","G","$e","af","bf","random","cf","df","capture","passive","Nb","z","q","ef","ff","parentWindow","gf","hf","J","K","Q","L","je","char","ke","jf","kf","lf","mf","autoFocus","nf","__html","of","setTimeout","pf","clearTimeout","qf","rf","sf","previousSibling","tf","vf","wf","xf","yf","zf","Af","Bf","H","I","Cf","M","N","Df","Ef","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Ff","childContextTypes","Gf","Hf","If","getChildContext","Jf","__reactInternalMemoizedMergedChildContext","Kf","Lf","Mf","Nf","Of","Pf","unstable_cancelCallback","Qf","unstable_shouldYield","Rf","unstable_requestPaint","Sf","Tf","unstable_getCurrentPriorityLevel","Uf","unstable_ImmediatePriority","Vf","Wf","Xf","unstable_LowPriority","Yf","unstable_IdlePriority","Zf","$f","ag","bg","dg","O","eg","fg","gg","hg","ig","jg","kg","ReactCurrentBatchConfig","defaultProps","mg","ng","og","pg","qg","rg","_currentValue","childLanes","tg","dependencies","firstContext","lanes","ug","vg","context","observedBits","next","responders","wg","xg","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","yg","zg","eventTime","lane","payload","callback","Ag","Bg","Cg","A","C","Dg","Eg","Fg","Component","refs","Gg","Kg","isMounted","_reactInternals","enqueueSetState","Hg","Ig","Jg","enqueueReplaceState","enqueueForceUpdate","Lg","shouldComponentUpdate","isPureReactComponent","Mg","contextType","updater","Ng","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Og","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","Pg","Qg","ref","_owner","_stringRef","Rg","Sg","lastEffect","nextEffect","firstEffect","Tg","Ug","mode","elementType","Vg","implementation","Wg","Xg","done","Yg","Zg","$g","ah","bh","ch","dh","eh","documentElement","tagName","fh","gh","hh","P","ih","memoizedProps","revealOrder","jh","kh","lh","mh","nh","oh","pendingProps","ph","qh","rh","sh","th","uh","_workInProgressVersionPrimary","vh","ReactCurrentDispatcher","wh","xh","R","S","T","yh","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","baseQueue","queue","Ih","Jh","Kh","lastRenderedReducer","action","eagerReducer","eagerState","lastRenderedState","dispatch","Lh","Mh","_getVersion","_source","mutableReadLanes","Nh","U","useState","getSnapshot","subscribe","useEffect","setSnapshot","Oh","Ph","Qh","Rh","destroy","deps","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","di","readContext","useCallback","useContext","useImperativeHandle","useLayoutEffect","useMemo","useReducer","useRef","useDebugValue","useDeferredValue","useTransition","useMutableSource","useOpaqueIdentifier","unstable_isNewReconciler","uf","ei","ReactCurrentOwner","fi","gi","hi","ii","ji","compare","ki","li","mi","baseLanes","ni","oi","pi","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","qi","getDerivedStateFromError","ri","pendingContext","Bi","Di","Ei","si","retryLane","ti","fallback","unstable_avoidThisFallback","ui","unstable_expectedLoadTime","vi","wi","xi","yi","zi","isBackwards","rendering","renderingStartTime","tail","tailMode","Ai","Fi","Gi","wasMultiple","multiple","onClick","onclick","createElementNS","createTextNode","V","Hi","Ii","W","Ji","Ki","Li","Mi","Ni","error","Oi","Pi","element","Qi","Ri","Si","componentDidCatch","Ti","componentStack","Ui","WeakSet","Vi","Wi","Xi","__reactInternalSnapshotBeforeUpdate","Yi","Zi","$i","focus","aj","display","bj","onCommitFiberUnmount","componentWillUnmount","cj","dj","ej","fj","gj","hj","insertBefore","_reactRootContainer","jj","lj","then","mj","nj","oj","pj","X","Y","qj","rj","sj","tj","uj","vj","Infinity","wj","ck","Z","xj","yj","zj","Aj","Bj","Cj","Dj","Ej","Fj","Gj","Hj","Ij","Jj","Sc","Kj","Lj","Mj","callbackNode","expirationTimes","callbackPriority","Tc","Nj","Oj","Pj","Qj","Rj","Sj","Tj","finishedWork","finishedLanes","Uj","timeoutHandle","Wj","Xj","pingCache","Yj","Zj","va","ak","bk","dk","rangeCount","focusedElem","selectionRange","ek","extend","setStart","removeAllRanges","addRange","setEnd","left","scrollLeft","scrollTop","onCommitFiberRoot","fk","gk","isReactComponent","pendingChildren","jk","mutableSourceEagerHydrationData","kk","lk","mk","nk","ok","qk","hydrationOptions","mutableSources","_internalRoot","rk","tk","hasAttribute","sk","uk","hk","_calculateChangedBits","unstable_observedBits","unmount","querySelectorAll","form","Vj","vk","Events","wk","findFiberByHostInstance","bundleType","rendererPackageName","xk","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","__REACT_DEVTOOLS_GLOBAL_HOOK__","yk","isDisabled","supportsFiber","inject","createPortal","findDOMNode","flushSync","unmountComponentAtNode","unstable_batchedUpdates","unstable_createPortal","unstable_renderSubtreeIntoContainer","checkDCE","Fragment","__self","__source","jsx","jsxs","StrictMode","Profiler","Suspense","setState","forceUpdate","escape","_status","_result","default","IsSomeRendererActing","toArray","only","PureComponent","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","createFactory","createRef","forwardRef","isValidElement","lazy","memo","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","writable","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","_invoke","GenStateSuspendedStart","method","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","invoke","reject","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","info","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iteratorMethod","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","skipTempReset","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","performance","MessageChannel","unstable_forceFrameRate","cancelAnimationFrame","requestAnimationFrame","port2","port1","onmessage","postMessage","sortIndex","startTime","expirationTime","priorityLevel","unstable_Profiling","unstable_continueExecution","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","delay","unstable_wrapCallback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","__esModule","definition","o","nmd","asyncGeneratorStep","gen","_throw","_asyncToGenerator","_defineProperty","ownKeys","enumerableOnly","sym","_objectSpread2","getOwnPropertyDescriptors","defineProperties","_arrayLikeToArray","len","arr2","_unsupportedIterableToArray","minLen","_i","_s","_e","_n","_d","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","receiver","IDBTransaction","objectStoreNames","objectStore","wrapFunction","IDBDatabase","transaction","IDBCursor","advance","continue","continuePrimaryKey","unwrap","storeNames","tx","transformCachableValue","unlisten","DOMException","cacheDonePromiseForTransaction","IDBObjectStore","IDBIndex","some","Proxy","IDBRequest","request","promise","success","catch","promisifyRequest","openDB","blocked","upgrade","blocking","terminated","indexedDB","open","openPromise","oldVersion","newVersion","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","storeName","store","all","allowArrayLike","it","normalCompletion","didErr","_e2","oldTraps","selection_iterator","_objectWithoutProperties","excluded","sourceKeys","objectWithoutPropertiesLoose","sourceSymbolKeys","names","formatProdErrorMessage","$$observable","observable","randomString","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","_ref2","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","getState","isSubscribed","replaceReducer","nextReducer","_ref","outerSubscribe","observer","observeState","unsubscribe","bindActionCreator","actionCreator","bindActionCreators","actionCreators","boundActionCreators","reactIs_production_min$1","reactIsModule","require$$0","order2","checkPropTypes","typeSpecs","componentName","getStack","resetWarningCache","emptyFunction","emptyFunctionWithReset","propTypesModule","shim","propName","propFullName","secret","getShim","isRequired","ReactPropTypes","bigint","bool","any","arrayOf","instanceOf","objectOf","oneOf","oneOfType","shape","exact","PropTypes","require$$2","ReactReduxContext","React","batch","getBatch","nullListeners","notify","createSubscription","parentSub","handleChangeWrapper","subscription","onStateChange","trySubscribe","addNestedSub","first","createListenerCollection","notifyNestedSubs","Boolean","tryUnsubscribe","getListeners","useIsomorphicLayoutEffect","contextValue","previousState","reactIs","TYPE_STATICS","ForwardRef","propTypes","Memo","useReduxContext","createStoreHook","useDefaultReduxContext","reactIs_production_min","useStore","createDispatchHook","useDefaultStore","useDispatch","refEquality","createSelectorHook","selector","equalityFn","_useReduxContext","selectedState","contextSub","forceRender","latestSubscriptionCallbackError","latestSelector","latestStoreState","latestSelectedState","storeState","newSelectedState","checkForUpdates","newStoreState","_newSelectedState","useSelectorWithStoreAndSubscription","newBatch","useSelector","arrayLikeToArray","_toConsumableArray","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","_slicedToArray","arrayWithHoles","iterableToArrayLimit","nonIterableRest","Dispatch","parseTypenames","typenames","on","typename","that","xhtml","svg","xlink","xml","xmlns","namespaces","space","local","creatorInherit","uri","creatorFixed","fullname","namespace","none","querySelector","empty","matches","childMatcher","childFirst","firstElementChild","update","EnterNode","datum","bindIndex","group","enter","exit","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","keyValues","arraylike","NaN","attrRemove","attrRemoveNS","removeAttributeNS","attrConstant","attrConstantNS","attrFunction","attrFunctionNS","styleRemove","removeProperty","styleConstant","styleFunction","styleValue","getPropertyValue","getComputedStyle","propertyRemove","propertyConstant","propertyFunction","classArray","classList","ClassList","_node","_names","getAttribute","classedAdd","list","classedRemove","remove","classedTrue","classedFalse","classedFunction","textRemove","textConstant","textFunction","htmlRemove","htmlConstant","htmlFunction","raise","lower","constantNull","selection_cloneShallow","cloneNode","selection_cloneDeep","onRemove","__on","onAdd","contextListener","dispatchEvent","params","CustomEvent","createEvent","initEvent","dispatchConstant","dispatchFunction","groups","_groups","Selection","_parents","selection","sourceEvent","ownerSVGElement","createSVGPoint","matrixTransform","getScreenCTM","inverse","getBoundingClientRect","clientLeft","clientTop","select","subgroups","subnode","subgroup","selectAll","arrayAll","selectorAll","selectChild","childFind","selectChildren","childrenFilter","matcher","enterGroup","updateGroup","exitGroup","previous","i0","i1","_enter","_exit","sparse","onenter","onupdate","onexit","append","groups0","groups1","m0","m1","merges","group0","group1","compareNode","sortgroups","sortgroup","attr","getAttributeNS","classed","html","creator","insert","before","deep","nonpassivecapture","stopImmediatePropagation","noevent","__noselect","MozUserSelect","yesdrag","noclick","factory","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","format","rgbn","Rgb","rgba","hsla","rgbConvert","rgb_formatHex","hex","rgb_formatRgb","round","Hsl","hslConvert","hsl2rgb","m2","channels","displayable","formatHsl","pow","gamma","nogamma","exponential","linear","rgbGamma","colorRgb","reA","reB","am","bm","bs","one","zero","svgNode","degrees","PI","translateX","translateY","rotate","skewX","scaleX","scaleY","sqrt","atan2","atan","interpolateTransform","parse","pxComma","pxParen","degParen","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","decompose","interpolateTransformSvg","baseVal","consolidate","matrix","cosh","exp","taskHead","taskTail","zoomRho","rho","rho2","rho4","p0","ux0","uy0","w0","ux1","uy1","w1","d2","d1","b0","b1","r0","r1","coshr0","tanh","sinh","duration","SQRT2","_1","_2","frame","timeout","interval","clockLast","clockNow","clockSkew","clock","setFrame","clearNow","Timer","_call","_time","timer","restart","wake","timerFlush","t0","t2","t1","sleep","nap","poke","clearInterval","setInterval","elapsed","emptyOn","emptyTween","timing","schedules","__transition","tween","schedule","tick","ease","active","tweenRemove","tween0","tween1","tweenFunction","tweenValue","_id","interpolateNumber","interpolateRgb","interpolateString","interpolate","value1","string00","interpolate0","string1","string0","string10","attrInterpolate","attrInterpolateNS","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","every","styleInterpolate","styleTween","textInterpolate","textTween","Transition","_name","newId","selection_prototype","inherit","id0","id1","styleNull","listener0","styleMaybeRemove","removeFunction","easeVarying","cancel","interrupt","defaultTiming","ZoomEvent","Transform","applyX","applyY","invert","invertX","invertY","rescaleX","domain","rescaleY","nopropagation","defaultFilter","defaultExtent","SVGElement","viewBox","clientWidth","clientHeight","defaultTransform","__zoom","defaultWheelDelta","defaultTouchable","navigator","maxTouchPoints","defaultConstrain","extent","translateExtent","dx0","dx1","dy0","dy1","touchstarting","touchfirst","touchending","constrain","touchable","scaleExtent","interpolateZoom","touchDelay","clickDistance2","tapDistance","wheeled","mousedowned","dblclicked","touchstarted","touchmoved","touchended","centroid","gesture","clean","__zooming","Gesture","taps","pointer","wheel","mouse","wheelidled","mousemoved","mouseupped","x0","y0","dragDisable","moved","dragEnable","started","identifier","touch0","touch1","l0","l1","dp","dl","hypot","scaleBy","scaleTo","translateBy","translateTo","emit","clickDistance","toVal","mix","str","shims","num","getPrefix_1","getPrefix","browserPrefixToKey","prefixes","_window$document","_window$document$docu","shouldCapitalize","kebabToTitleCase","_default","_typeof","domFns","matchesSelector","el","baseNode","handler","inputOptions","_objectSpread","computedStyle","_shims","int","borderTopWidth","borderBottomWidth","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","paddingLeft","paddingRight","evt","offsetParent","offsetParentRect","controlPos","positionOffset","translation","getTranslation","_getPrefix","findInArray","doc","styleEl","getElementById","getElementsByTagName","addClassName","removeClassName","nodeInterop","_getRequireWildcardCache","newObj","hasPropertyDescriptor","desc","_interopRequireWildcard","require$$1","cacheBabelInterop","cacheNodeInterop","matchesSelectorFunc","unitSuffix","defaultX","defaultY","className","positionFns","draggable","bounds","right","cloneBounds","boundNode","ownerWindow","HTMLElement","boundNodeEl","nodeStyle","boundNodeStyle","offsetLeft","marginLeft","offsetTop","marginTop","_domFns","innerWidth","outerWidth","marginRight","innerHeight","outerHeight","marginBottom","isNum","grid","pendingX","pendingY","axis","touchIdentifier","draggableCore","touchObj","getTouch","offsetXYFromParent","isStart","lastX","lastY","coreData","log_1","DraggableCore_1","_propTypes","_interopRequireDefault","_reactDom","require$$3","_positionFns","require$$4","require$$5","_log","require$$6","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_classCallCheck","Constructor","_defineProperties","descriptor","_setPrototypeOf","_createSuper","Derived","hasNativeReflectConstruct","sham","_isNativeReflectConstruct","Super","_getPrototypeOf","NewTarget","_possibleConstructorReturn","_assertThisInitialized","ReferenceError","eventsFor","move","dragEventFor","DraggableCore","_React$Component","subClass","superClass","_inherits","protoProps","staticProps","_super","_this","_len","_key","dragging","onMouseDown","allowAnyClick","thisNode","Node","matchesSelectorAndParentsTo","getTouchIdentifier","getControlPosition","coreEvent","createCoreData","onStart","mounted","enableUserSelectHack","addUserSelectStyles","addEvent","handleDrag","handleDragStop","_snapToGrid2","snapToGrid","onDrag","MouseEvent","initMouseEvent","onStop","removeUserSelectStyles","removeEvent","handleDragStart","onTouchStart","_this$props$nodeRef$c","_this$props","_this$props$nodeRef","nodeRef","onMouseUp","onTouchEnd","dontSetMe","_DraggableCore","_clsx2","require$$7","require$$8","_excluded","_extends","_objectWithoutPropertiesLoose","Draggable","createDraggableData","dragged","uiData","newState","slackX","slackY","_getBoundPosition2","getBoundPosition","newStateX","newStateY","_this$props$position","defaultPosition","prevPropsPosition","isElementSVG","warn","_clsx","_this$props2","defaultClassName","defaultClassNameDragging","defaultClassNameDragged","draggableCoreProps","svgTransform","validPosition","transformOpts","canDragX","canDragY","createSVGTransform","createCSSTransform","onDragStart","onDragStop","cjsModule","fastDeepEqual","equal","styleInject","css","insertAt","head","styleSheet","cssText","_path","SvgPlus","SvgMinus","SvgFitview","SvgLock","SvgUnlock","styles","title","kind","tooltip","nextX","nextY","randomPosition","elements","mapNameToType","hasNullPositions","products","productName","product","sourcePosition","targetPosition","plants","plantName","plant","animated","stroke","selectable","onLayout","layoutedElements","dagreGraph","dagre","isNode","nodeWidth","nodeHeight","getLayoutedElements","onMovePlant","onMoveProduct","ReactFlow","onNodeDoubleClick","ev","oldName","newName","prompt","onRenamePlant","onRenameProduct","onNodeDragStop","onConnect","sourceType","targetType","onSetPlantInput","onAddPlantOutput","onElementsRemove","onRemovePlant","onRemoveProduct","deleteKeyCode","maxZoom","minZoom","preventScrolling","showInteractive","textAlign","onAddProduct","onAddPlant","VALIDATION_REGEX","intList","float","floatList","validate","TextInputRow","unit","form_styles","isValid","placeholder","onChange","onChangeField","field","fileElem","click","onDownload","disableDownload","onClear","disableClear","onTemplate","accept","file","files","reader","FileReader","onFile","readAsText","dict","disableKeys","onChangeKey","prevKey","newKey","newDict","renameKey","keyPlaceholder","valuePlaceholder","onChangeValue","basis","v0","v1","v2","v3","t3","rgbSpline","spline","colors","number1","number2","EOL","EOF","objectConverter","inferColumns","rows","columnSet","row","column","pad","formatDate","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","getUTCFullYear","getUTCMonth","getUTCDate","csv","delimiter","reFormat","DELIMITER","parseRows","eof","eol","token","preformatBody","formatValue","formatRow","customConverter","formatBody","formatRows","dsv","csvParse","csvFormat","autoType","fixtz","getHours","contents","requiredCols","d3","extractNumericColumns","generateFile","filename","URL","createObjectURL","Blob","visibility","newProduct","description","notInitiallyAvailable","nCenters","locationName","locationDict","idx","field1","field2","field3","newPlant","shouldDisableMaxCap","defaultProduct","defaultPlant","locations","storage","defaultData","parameters","isNumeric","exportValue","original","parseFloat","parsed","exportValueDict","computeTotalInitialAmount","prod","total","locAmount","importList","isConstant","importDict","computeInflationAndTimeHorizon","exportProduct","disposalPerc","disposalAbs","computeAbsDisposal","exportPlant","minCap","maxCap","locName","origDict","resDict","capDict","acf","exportValueAcf","resKeyName","origKeyName","disposal","dispName","dispCost","limit","storLimit","importProduct","perc","compressDisposalLimits","importPlant","costsInitialized","resLocDict","origLocDict","capacities","keysToList","minCapDict","maxCapDict","importListAcf","openCostMax","openCostMin","fixCostMax","fixCostMin","storCost","varCost","dispLimit","prodName","prodDict","check","openRelogDB","createObjectStore","dbPromise","setData","save","put","promptName","prevData","onLoad","newData","origProdDict","recoveredProd","recoveredParams","origPlantDict","recoveredPlant","importData","productComps","plantComps","plantDict","exportData","prevName","outputFound","ReactDOM"],"sourceRoot":""}
\ No newline at end of file