{"version":3,"sources":["jsdelivr-header.js","/node_modules/path2d-polyfill/dist/index.esm.js","/node_modules/extend/index.js","/npm/picasso.js@1.0.0/src/about.js","/npm/picasso.js@1.0.0/src/core/utils/event-type.js","/npm/picasso.js@1.0.0/src/core/utils/is-number.js","/npm/picasso.js@1.0.0/src/core/geometry/util.js","/node_modules/d3-path/src/path.js","/node_modules/d3-shape/src/constant.js","/node_modules/d3-shape/src/math.js","/node_modules/d3-shape/src/arc.js","/node_modules/d3-shape/src/curve/linear.js","/node_modules/d3-shape/src/point.js","/node_modules/d3-shape/src/area.js","/node_modules/d3-shape/src/line.js","/node_modules/d3-shape/src/descending.js","/node_modules/d3-shape/src/identity.js","/node_modules/d3-shape/src/array.js","/node_modules/d3-shape/src/curve/basis.js","/node_modules/d3-shape/src/curve/cardinal.js","/node_modules/d3-shape/src/curve/catmullRom.js","/node_modules/d3-shape/src/curve/monotone.js","/node_modules/d3-shape/src/curve/natural.js","/node_modules/d3-shape/src/curve/step.js","/node_modules/d3-shape/src/offset/none.js","/node_modules/d3-shape/src/order/none.js","/node_modules/d3-shape/src/stack.js","/node_modules/d3-shape/src/order/appearance.js","/node_modules/d3-shape/src/order/ascending.js","/npm/picasso.js@1.0.0/src/core/utils/registry.js","/node_modules/d3-format/src/formatDecimal.js","/node_modules/d3-format/src/exponent.js","/node_modules/d3-format/src/formatSpecifier.js","/node_modules/d3-format/src/formatPrefixAuto.js","/node_modules/d3-format/src/formatRounded.js","/node_modules/d3-format/src/formatTypes.js","/node_modules/d3-format/src/identity.js","/node_modules/d3-format/src/locale.js","/node_modules/d3-format/src/defaultLocale.js","/node_modules/d3-format/src/formatGroup.js","/node_modules/d3-format/src/formatNumerals.js","/node_modules/d3-format/src/formatTrim.js","/node_modules/d3-time/src/interval.js","/node_modules/d3-time/src/duration.js","/node_modules/d3-time/src/day.js","/node_modules/d3-time/src/week.js","/node_modules/d3-time/src/year.js","/node_modules/d3-time/src/utcDay.js","/node_modules/d3-time/src/utcWeek.js","/node_modules/d3-time/src/utcYear.js","/node_modules/d3-time-format/src/locale.js","/npm/picasso.js@1.0.0/src/core/formatter/index.js","/npm/picasso.js@1.0.0/src/core/formatter/d3/numberFormat.js","/npm/picasso.js@1.0.0/src/core/formatter/d3/timeFormat.js","/npm/picasso.js@1.0.0/src/core/data/field.js","/npm/picasso.js@1.0.0/src/core/data/stack.js","/node_modules/d3-shape/src/offset/diverging.js","/node_modules/d3-shape/src/offset/silhouette.js","/node_modules/d3-shape/src/offset/expand.js","/node_modules/d3-shape/src/offset/wiggle.js","/node_modules/d3-shape/src/order/insideOut.js","/node_modules/d3-shape/src/order/reverse.js","/npm/picasso.js@1.0.0/src/core/data/extractor.js","/npm/picasso.js@1.0.0/src/core/chart/formatter/index.js","/node_modules/d3-array/src/ascending.js","/node_modules/d3-array/src/bisect.js","/node_modules/d3-array/src/bisector.js","/node_modules/d3-array/src/ticks.js","/node_modules/d3-scale/src/init.js","/node_modules/d3-collection/src/map.js","/node_modules/d3-collection/src/set.js","/node_modules/d3-scale/src/array.js","/node_modules/d3-scale/src/ordinal.js","/node_modules/d3-scale/src/band.js","/node_modules/d3-array/src/range.js","/node_modules/d3-color/src/define.js","/node_modules/d3-color/src/color.js","/node_modules/d3-interpolate/src/constant.js","/node_modules/d3-interpolate/src/color.js","/node_modules/d3-interpolate/src/rgb.js","/node_modules/d3-interpolate/src/numberArray.js","/node_modules/d3-interpolate/src/array.js","/node_modules/d3-interpolate/src/date.js","/node_modules/d3-interpolate/src/number.js","/node_modules/d3-interpolate/src/object.js","/node_modules/d3-interpolate/src/string.js","/node_modules/d3-interpolate/src/value.js","/node_modules/d3-interpolate/src/round.js","/node_modules/d3-scale/src/number.js","/node_modules/d3-scale/src/continuous.js","/node_modules/d3-scale/src/constant.js","/node_modules/d3-scale/src/tickFormat.js","/node_modules/d3-format/src/precisionPrefix.js","/node_modules/d3-format/src/precisionRound.js","/node_modules/d3-format/src/precisionFixed.js","/node_modules/d3-scale/src/linear.js","/node_modules/d3-scale/src/threshold.js","/npm/picasso.js@1.0.0/src/core/scales/ticks/tick-generators.js","/npm/picasso.js@1.0.0/src/core/scales/settings-resolver.js","/npm/picasso.js@1.0.0/src/core/scales/linear.js","/npm/picasso.js@1.0.0/src/core/scales/band.js","/npm/picasso.js@1.0.0/src/core/scales/h-band.js","/npm/picasso.js@1.0.0/src/core/utils/min-max.js","/npm/picasso.js@1.0.0/src/core/scales/color/sequential.js","/npm/picasso.js@1.0.0/src/core/scales/color/threshold.js","/npm/picasso.js@1.0.0/src/core/scales/ordinal.js","/npm/picasso.js@1.0.0/src/core/scales/color/categorical.js","/npm/picasso.js@1.0.0/src/core/chart/scales/index.js","/node_modules/node-event-emitter/index.js","/npm/picasso.js@1.0.0/src/core/utils/event-emitter.js","/npm/picasso.js@1.0.0/src/core/scroll-api/index.js","/npm/picasso.js@1.0.0/src/core/chart/scroll-api/index.js","/npm/picasso.js@1.0.0/src/core/brush/range-collection.js","/npm/picasso.js@1.0.0/src/core/brush/value-collection.js","/npm/picasso.js@1.0.0/src/core/brush/brush.js","/node_modules/d3-ease/src/cubic.js","/npm/picasso.js@1.0.0/src/core/brush/index.js","/node_modules/d3-ease/src/elastic.js","/node_modules/d3-ease/src/math.js","/npm/picasso.js@1.0.0/src/core/component/tween.js","/npm/picasso.js@1.0.0/src/core/chart-components/property-resolver/index.js","/npm/picasso.js@1.0.0/src/core/scales/index.js","/npm/picasso.js@1.0.0/src/core/component/settings-resolver.js","/npm/picasso.js@1.0.0/src/core/component/brushing.js","/npm/picasso.js@1.0.0/src/core/scene-graph/attributes.js","/npm/picasso.js@1.0.0/src/core/utils/points-to-path.js","/npm/picasso.js@1.0.0/src/core/symbols/cross.js","/npm/picasso.js@1.0.0/src/core/math/angles.js","/npm/picasso.js@1.0.0/src/core/math/vector.js","/npm/picasso.js@1.0.0/src/core/symbols/triangle.js","/npm/picasso.js@1.0.0/src/core/symbols/line.js","/npm/picasso.js@1.0.0/src/core/symbols/index.js","/npm/picasso.js@1.0.0/src/core/symbols/circle.js","/npm/picasso.js@1.0.0/src/core/symbols/diamond.js","/npm/picasso.js@1.0.0/src/core/symbols/saltire.js","/npm/picasso.js@1.0.0/src/core/symbols/square.js","/npm/picasso.js@1.0.0/src/core/symbols/star.js","/npm/picasso.js@1.0.0/src/core/symbols/n-polygon.js","/npm/picasso.js@1.0.0/src/core/symbols/bar.js","/npm/picasso.js@1.0.0/src/core/layout/dock/config.js","/npm/picasso.js@1.0.0/src/core/component/component-factory.js","/npm/picasso.js@1.0.0/src/core/math/intersection.js","/npm/picasso.js@1.0.0/src/core/math/narrow-phase-collision.js","/npm/picasso.js@1.0.0/src/core/style/resolver.js","/npm/picasso.js@1.0.0/src/core/theme/index.js","/npm/picasso.js@1.0.0/src/core/layout/dock/settings-resolver.js","/npm/picasso.js@1.0.0/src/core/layout/dock/create-rect.js","/npm/picasso.js@1.0.0/src/core/layout/dock/docker.js","/npm/picasso.js@1.0.0/src/core/chart/component-collection.js","/npm/picasso.js@1.0.0/src/core/chart/index.js","/npm/picasso.js@1.0.0/src/core/mediator/index.js","/npm/picasso.js@1.0.0/src/core/data/data.js","/npm/picasso.js@1.0.0/src/core/data/collections.js","/npm/picasso.js@1.0.0/src/core/renderer/index.js","/npm/picasso.js@1.0.0/src/core/component/index.js","/npm/picasso.js@1.0.0/src/core/data/util.js","/npm/picasso.js@1.0.0/src/core/data/extractor-matrix.js","/npm/picasso.js@1.0.0/src/core/data/dataset.js","/npm/picasso.js@1.0.0/src/core/data/index.js","/npm/picasso.js@1.0.0/src/core/interaction/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/box-math.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/box-shapes-helper.js","/npm/picasso.js@1.0.0/src/web/interactions/native/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/box.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/box-resolver.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/box-shapes.js","/npm/picasso.js@1.0.0/src/core/chart-components/point/point.js","/npm/picasso.js@1.0.0/src/core/chart-components/pie/pie.js","/node_modules/d3-shape/src/pie.js","/npm/picasso.js@1.0.0/src/core/transposer/crispifier.js","/npm/picasso.js@1.0.0/src/core/transposer/transposer.js","/npm/picasso.js@1.0.0/src/core/chart-components/grid/line.js","/npm/picasso.js@1.0.0/src/core/chart-components/ref-line/oob.js","/npm/picasso.js@1.0.0/src/core/chart-components/ref-line/lines-and-labels.js","/npm/picasso.js@1.0.0/src/core/chart-components/ref-line/refline.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-line-node.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-label-node.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-tick-node.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-label-size.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/get-continuous-label-rect.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-node-builder.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-default-settings.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/axis-size-calculator.js","/npm/picasso.js@1.0.0/src/core/chart-components/container/container.js","/npm/picasso.js@1.0.0/src/core/chart-components/text/text.js","/npm/picasso.js@1.0.0/src/core/chart-components/scrollbar/index.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/brush-range-node-builder.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/brush-range-const.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/brush-range-interaction.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/brush-range.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/brush-area-dir.js","/npm/picasso.js@1.0.0/src/core/chart-components/range/range.js","/npm/picasso.js@1.0.0/src/core/chart-components/brush-lasso/brush-lasso.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/strategies/bars-overlapping-filter.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/strategies/bars.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/strategies/slices.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/string-tokenizer.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/text-const.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/font-size-to-height.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/word-break.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/line-break-resolver.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/text-ellipsis.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/baseline-heuristic.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/text-metrics.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/strategies/rows.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/strategies/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/labels.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/legend-resolver.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/item-renderer.js","/npm/picasso.js@1.0.0/src/core/utils/class-string.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/navigation-renderer.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/title-renderer.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/legend-layout.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/legend-cat.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-seq/node-builder.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-seq/legend-seq.js","/npm/picasso.js@1.0.0/src/core/chart-components/line/line.js","/npm/picasso.js@1.0.0/src/web/components/brush-area/brush-area.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/render.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/timespan-dispatcher.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/placement.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/instance-handler.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/tooltip.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/extractor.js","/npm/picasso.js@1.0.0/src/core/chart-components/debug/debug-collider.js","/npm/picasso.js@1.0.0/src/core/math/arc-to-center.js","/npm/picasso.js@1.0.0/src/core/math/cubic-bezier-curve-interpolation.js","/npm/picasso.js@1.0.0/src/core/math/curve-flattness.js","/npm/picasso.js@1.0.0/src/core/math/quad-bezier-curve-interpolation.js","/npm/picasso.js@1.0.0/src/core/scene-graph/parse-path-d.js","/npm/picasso.js@1.0.0/src/core/chart-components/debug/debug-path-to-points.js","/npm/picasso.js@1.0.0/src/api/components.js","/npm/picasso.js@1.0.0/src/core/chart-components/box/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/point/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/pie/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/grid/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/ref-line/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/axis/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/container/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/text/index.js","/npm/picasso.js@1.0.0/src/web/components/brush-range/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/range/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/brush-lasso/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/labels/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-cat/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/legend-seq/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/line/index.js","/npm/picasso.js@1.0.0/src/web/components/brush-area/index.js","/npm/picasso.js@1.0.0/src/web/components/tooltip/index.js","/npm/picasso.js@1.0.0/src/core/chart-components/debug/index.js","/npm/picasso.js@1.0.0/src/core/scene-graph/node.js","/npm/picasso.js@1.0.0/src/core/geometry/rect.js","/npm/picasso.js@1.0.0/src/core/geometry/circle.js","/npm/picasso.js@1.0.0/src/core/geometry/line.js","/npm/picasso.js@1.0.0/src/core/geometry/polygon.js","/npm/picasso.js@1.0.0/src/core/geometry/geopolygon.js","/npm/picasso.js@1.0.0/src/core/geometry/polyline.js","/npm/picasso.js@1.0.0/src/core/geometry/index.js","/npm/picasso.js@1.0.0/src/core/geometry/geometry-collection.js","/npm/picasso.js@1.0.0/src/core/math/matrix.js","/npm/picasso.js@1.0.0/src/core/scene-graph/transform-resolver.js","/npm/picasso.js@1.0.0/src/core/scene-graph/node-selector.js","/npm/picasso.js@1.0.0/src/core/scene-graph/scene-node.js","/npm/picasso.js@1.0.0/src/core/scene-graph/collision.js","/npm/picasso.js@1.0.0/src/core/scene-graph/collision-resolver.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/display-object.js","/npm/picasso.js@1.0.0/src/core/scene-graph/node-container.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/container.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/stage.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/gradient-item.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/pattern-item.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/rect.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/circle.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/line.js","/npm/picasso.js@1.0.0/src/core/scene-graph/polyline-to-polygon-collider.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/path.js","/npm/picasso.js@1.0.0/src/core/utils/flatten-array.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/text.js","/npm/picasso.js@1.0.0/src/core/scene-graph/display-objects/index.js","/npm/picasso.js@1.0.0/src/core/scene-graph/scene.js","/npm/picasso.js@1.0.0/src/core/scene-graph/context.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/canvas-gradient.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/canvas-pattern.js","/npm/picasso.js@1.0.0/src/web/renderer/renderer-box.js","/npm/picasso.js@1.0.0/src/web/renderer/index.js","/npm/picasso.js@1.0.0/src/web/text-manipulation/inject-textbounds.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/canvas-renderer.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/shapes/rect.js","/npm/picasso.js@1.0.0/src/core/utils/rtl-util.js","/npm/picasso.js@1.0.0/src/web/renderer/node-tree.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/index.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/shapes/circle.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/shapes/line.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/shapes/path.js","/npm/picasso.js@1.0.0/src/web/renderer/canvas-renderer/shapes/text.js","/npm/picasso.js@1.0.0/src/web/renderer/svg-renderer/svg-nodes.js","/npm/picasso.js@1.0.0/src/web/renderer/svg-renderer/svg-tree.js","/npm/picasso.js@1.0.0/src/core/utils/crypto.js","/npm/picasso.js@1.0.0/src/web/renderer/svg-renderer/svg-renderer.js","/npm/picasso.js@1.0.0/src/web/renderer/svg-renderer/svg-pattern.js","/npm/picasso.js@1.0.0/src/web/renderer/svg-renderer/svg-gradient.js","/node_modules/preact/dist/preact.module.js","/npm/picasso.js@1.0.0/src/web/renderer/dom-renderer/dom-renderer.js","/npm/picasso.js@1.0.0/src/api/renderers.js","/npm/picasso.js@1.0.0/src/web/renderer/dom-renderer/index.js","/npm/picasso.js@1.0.0/src/core/utils/logger.js","/npm/picasso.js@1.0.0/src/index.js","/npm/picasso.js@1.0.0/src/core/theme/light/index.js","/npm/picasso.js@1.0.0/src/api/scales.js"],"names":[],"mappings":"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","file":"/npm/picasso.js@1.0.0/dist/picasso.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/picasso.js@1.0.0/dist/picasso.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var ARG_LENGTH = {\n  a: 7,\n  c: 6,\n  h: 1,\n  l: 2,\n  m: 2,\n  q: 4,\n  s: 4,\n  t: 2,\n  v: 1,\n  z: 0\n};\nvar SEGMENT_PATTERN = /([astvzqmhlc])([^astvzqmhlc]*)/gi;\nvar NUMBER = /-?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)?/gi;\n\nfunction parseValues(args) {\n  var numbers = args.match(NUMBER);\n  return numbers ? numbers.map(Number) : [];\n}\n/**\n * parse an svg path data string. Generates an Array\n * of commands where each command is an Array of the\n * form `[command, arg1, arg2, ...]`\n *\n * https://www.w3.org/TR/SVG/paths.html#PathDataGeneralInformation\n * @ignore\n *\n * @param {string} path\n * @returns {array}\n */\n\n\nfunction parse(path) {\n  var data = [];\n  var p = String(path).trim(); // A path data segment (if there is one) must begin with a \"moveto\" command\n\n  if (p[0] !== 'M' && p[0] !== 'm') {\n    return data;\n  }\n\n  p.replace(SEGMENT_PATTERN, function (_, command, args) {\n    var type = command.toLowerCase();\n    var theArgs = parseValues(args);\n    var theCommand = command; // overloaded moveTo\n\n    if (type === 'm' && theArgs.length > 2) {\n      data.push([theCommand].concat(theArgs.splice(0, 2)));\n      type = 'l';\n      theCommand = theCommand === 'm' ? 'l' : 'L';\n    } // Ignore invalid commands\n\n\n    if (theArgs.length < ARG_LENGTH[type]) {\n      return '';\n    }\n\n    data.push([theCommand].concat(theArgs.splice(0, ARG_LENGTH[type]))); // The command letter can be eliminated on subsequent commands if the\n    // same command is used multiple times in a row (e.g., you can drop the\n    // second \"L\" in \"M 100 200 L 200 100 L -100 -200\" and use\n    // \"M 100 200 L 200 100 -100 -200\" instead).\n\n    while (theArgs.length >= ARG_LENGTH[type] && theArgs.length && ARG_LENGTH[type]) {\n      data.push([theCommand].concat(theArgs.splice(0, ARG_LENGTH[type])));\n    }\n\n    return '';\n  });\n  return data;\n}\n\nvar parsePath = parse;\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _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}\n\n/**\n * Work around for https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8438884/\n * @ignore\n */\n\nfunction supportsSvgPathArgument(window) {\n  var canvas = window.document.createElement('canvas');\n  var g = canvas.getContext('2d');\n  var p = new window.Path2D('M0 0 L1 1');\n  g.strokeStyle = 'red';\n  g.lineWidth = 1;\n  g.stroke(p);\n  var imgData = g.getImageData(0, 0, 1, 1);\n  return imgData.data[0] === 255; // Check if pixel is red\n}\n\nfunction rotatePoint(point, angle) {\n  var nx = point.x * Math.cos(angle) - point.y * Math.sin(angle);\n  var ny = point.y * Math.cos(angle) + point.x * Math.sin(angle);\n  point.x = nx;\n  point.y = ny;\n}\n\nfunction translatePoint(point, dx, dy) {\n  point.x += dx;\n  point.y += dy;\n}\n\nfunction scalePoint(point, s) {\n  point.x *= s;\n  point.y *= s;\n}\n\nfunction polyFillPath2D(window) {\n  if (typeof window === 'undefined' || !window.CanvasRenderingContext2D) {\n    return;\n  }\n\n  if (window.Path2D && supportsSvgPathArgument(window)) {\n    return;\n  }\n  /**\n   * Crates a Path2D polyfill object\n   * @constructor\n   * @ignore\n   * @param {String} path\n   */\n\n\n  var Path2D = /*#__PURE__*/function () {\n    function Path2D(path) {\n      _classCallCheck(this, Path2D);\n\n      this.segments = [];\n\n      if (path && path instanceof Path2D) {\n        var _this$segments;\n\n        (_this$segments = this.segments).push.apply(_this$segments, _toConsumableArray(path.segments));\n      } else if (path) {\n        this.segments = parsePath(path);\n      }\n    }\n\n    _createClass(Path2D, [{\n      key: \"addPath\",\n      value: function addPath(path) {\n        if (path && path instanceof Path2D) {\n          var _this$segments2;\n\n          (_this$segments2 = this.segments).push.apply(_this$segments2, _toConsumableArray(path.segments));\n        }\n      }\n    }, {\n      key: \"moveTo\",\n      value: function moveTo(x, y) {\n        this.segments.push(['M', x, y]);\n      }\n    }, {\n      key: \"lineTo\",\n      value: function lineTo(x, y) {\n        this.segments.push(['L', x, y]);\n      }\n    }, {\n      key: \"arc\",\n      value: function arc(x, y, r, start, end, ccw) {\n        this.segments.push(['AC', x, y, r, start, end, !!ccw]);\n      }\n    }, {\n      key: \"arcTo\",\n      value: function arcTo(x1, y1, x2, y2, r) {\n        this.segments.push(['AT', x1, y1, x2, y2, r]);\n      }\n    }, {\n      key: \"ellipse\",\n      value: function ellipse(x, y, rx, ry, angle, start, end, ccw) {\n        this.segments.push(['E', x, y, rx, ry, angle, start, end, !!ccw]);\n      }\n    }, {\n      key: \"closePath\",\n      value: function closePath() {\n        this.segments.push(['Z']);\n      }\n    }, {\n      key: \"bezierCurveTo\",\n      value: function bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n        this.segments.push(['C', cp1x, cp1y, cp2x, cp2y, x, y]);\n      }\n    }, {\n      key: \"quadraticCurveTo\",\n      value: function quadraticCurveTo(cpx, cpy, x, y) {\n        this.segments.push(['Q', cpx, cpy, x, y]);\n      }\n    }, {\n      key: \"rect\",\n      value: function rect(x, y, width, height) {\n        this.segments.push(['R', x, y, width, height]);\n      }\n    }]);\n\n    return Path2D;\n  }();\n\n  function buildPath(canvas, segments) {\n    var endAngle;\n    var startAngle;\n    var largeArcFlag;\n    var sweepFlag;\n    var endPoint;\n    var midPoint;\n    var angle;\n    var lambda;\n    var t1;\n    var t2;\n    var x;\n    var x1;\n    var y;\n    var y1;\n    var r;\n    var rx;\n    var ry;\n    var w;\n    var h;\n    var pathType;\n    var centerPoint;\n    var cpx;\n    var cpy;\n    var qcpx;\n    var qcpy;\n    var ccw;\n    var startPoint = {\n      x: 0,\n      y: 0\n    };\n    var currentPoint = {\n      x: 0,\n      y: 0\n    };\n    canvas.beginPath();\n\n    for (var i = 0; i < segments.length; ++i) {\n      var s = segments[i];\n      pathType = s[0]; // Reset control point if command is not cubic\n\n      if (pathType !== 'S' && pathType !== 's' && pathType !== 'C' && pathType !== 'c') {\n        cpx = null;\n        cpy = null;\n      }\n\n      if (pathType !== 'T' && pathType !== 't' && pathType !== 'Q' && pathType !== 'q') {\n        qcpx = null;\n        qcpy = null;\n      }\n\n      switch (pathType) {\n        case 'm':\n        case 'M':\n          if (pathType === 'm') {\n            x += s[1];\n            y += s[2];\n          } else {\n            x = s[1];\n            y = s[2];\n          }\n\n          if (pathType === 'M' || !startPoint) {\n            startPoint = {\n              x: x,\n              y: y\n            };\n          }\n\n          canvas.moveTo(x, y);\n          break;\n\n        case 'l':\n          x += s[1];\n          y += s[2];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'L':\n          x = s[1];\n          y = s[2];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'H':\n          x = s[1];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'h':\n          x += s[1];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'V':\n          y = s[1];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'v':\n          y += s[1];\n          canvas.lineTo(x, y);\n          break;\n\n        case 'a':\n        case 'A':\n          if (pathType === 'a') {\n            x += s[6];\n            y += s[7];\n          } else {\n            x = s[6];\n            y = s[7];\n          }\n\n          rx = s[1]; // rx\n\n          ry = s[2]; // ry\n\n          angle = s[3] * Math.PI / 180;\n          largeArcFlag = !!s[4];\n          sweepFlag = !!s[5];\n          endPoint = {\n            x: x,\n            y: y\n          }; // https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\n          midPoint = {\n            x: (currentPoint.x - endPoint.x) / 2,\n            y: (currentPoint.y - endPoint.y) / 2\n          };\n          rotatePoint(midPoint, -angle); // radius correction\n\n          lambda = midPoint.x * midPoint.x / (rx * rx) + midPoint.y * midPoint.y / (ry * ry);\n\n          if (lambda > 1) {\n            lambda = Math.sqrt(lambda);\n            rx *= lambda;\n            ry *= lambda;\n          }\n\n          centerPoint = {\n            x: rx * midPoint.y / ry,\n            y: -(ry * midPoint.x) / rx\n          };\n          t1 = rx * rx * ry * ry;\n          t2 = rx * rx * midPoint.y * midPoint.y + ry * ry * midPoint.x * midPoint.x;\n\n          if (sweepFlag !== largeArcFlag) {\n            scalePoint(centerPoint, Math.sqrt((t1 - t2) / t2) || 0);\n          } else {\n            scalePoint(centerPoint, -Math.sqrt((t1 - t2) / t2) || 0);\n          }\n\n          startAngle = Math.atan2((midPoint.y - centerPoint.y) / ry, (midPoint.x - centerPoint.x) / rx);\n          endAngle = Math.atan2(-(midPoint.y + centerPoint.y) / ry, -(midPoint.x + centerPoint.x) / rx);\n          rotatePoint(centerPoint, angle);\n          translatePoint(centerPoint, (endPoint.x + currentPoint.x) / 2, (endPoint.y + currentPoint.y) / 2);\n          canvas.save();\n          canvas.translate(centerPoint.x, centerPoint.y);\n          canvas.rotate(angle);\n          canvas.scale(rx, ry);\n          canvas.arc(0, 0, 1, startAngle, endAngle, !sweepFlag);\n          canvas.restore();\n          break;\n\n        case 'C':\n          cpx = s[3]; // Last control point\n\n          cpy = s[4];\n          x = s[5];\n          y = s[6];\n          canvas.bezierCurveTo(s[1], s[2], cpx, cpy, x, y);\n          break;\n\n        case 'c':\n          canvas.bezierCurveTo(s[1] + x, s[2] + y, s[3] + x, s[4] + y, s[5] + x, s[6] + y);\n          cpx = s[3] + x; // Last control point\n\n          cpy = s[4] + y;\n          x += s[5];\n          y += s[6];\n          break;\n\n        case 'S':\n          if (cpx === null || cpx === null) {\n            cpx = x;\n            cpy = y;\n          }\n\n          canvas.bezierCurveTo(2 * x - cpx, 2 * y - cpy, s[1], s[2], s[3], s[4]);\n          cpx = s[1]; // last control point\n\n          cpy = s[2];\n          x = s[3];\n          y = s[4];\n          break;\n\n        case 's':\n          if (cpx === null || cpx === null) {\n            cpx = x;\n            cpy = y;\n          }\n\n          canvas.bezierCurveTo(2 * x - cpx, 2 * y - cpy, s[1] + x, s[2] + y, s[3] + x, s[4] + y);\n          cpx = s[1] + x; // last control point\n\n          cpy = s[2] + y;\n          x += s[3];\n          y += s[4];\n          break;\n\n        case 'Q':\n          qcpx = s[1]; // last control point\n\n          qcpy = s[2];\n          x = s[3];\n          y = s[4];\n          canvas.quadraticCurveTo(qcpx, qcpy, x, y);\n          break;\n\n        case 'q':\n          qcpx = s[1] + x; // last control point\n\n          qcpy = s[2] + y;\n          x += s[3];\n          y += s[4];\n          canvas.quadraticCurveTo(qcpx, qcpy, x, y);\n          break;\n\n        case 'T':\n          if (qcpx === null || qcpx === null) {\n            qcpx = x;\n            qcpy = y;\n          }\n\n          qcpx = 2 * x - qcpx; // last control point\n\n          qcpy = 2 * y - qcpy;\n          x = s[1];\n          y = s[2];\n          canvas.quadraticCurveTo(qcpx, qcpy, x, y);\n          break;\n\n        case 't':\n          if (qcpx === null || qcpx === null) {\n            qcpx = x;\n            qcpy = y;\n          }\n\n          qcpx = 2 * x - qcpx; // last control point\n\n          qcpy = 2 * y - qcpy;\n          x += s[1];\n          y += s[2];\n          canvas.quadraticCurveTo(qcpx, qcpy, x, y);\n          break;\n\n        case 'z':\n        case 'Z':\n          x = startPoint.x;\n          y = startPoint.y;\n          startPoint = undefined;\n          canvas.closePath();\n          break;\n\n        case 'AC':\n          // arc\n          x = s[1];\n          y = s[2];\n          r = s[3];\n          startAngle = s[4];\n          endAngle = s[5];\n          ccw = s[6];\n          canvas.arc(x, y, r, startAngle, endAngle, ccw);\n          break;\n\n        case 'AT':\n          // arcTo\n          x1 = s[1];\n          y1 = s[2];\n          x = s[3];\n          y = s[4];\n          r = s[5];\n          canvas.arcTo(x1, y1, x, y, r);\n          break;\n\n        case 'E':\n          // ellipse\n          x = s[1];\n          y = s[2];\n          rx = s[3];\n          ry = s[4];\n          angle = s[5];\n          startAngle = s[6];\n          endAngle = s[7];\n          ccw = s[8];\n          canvas.save();\n          canvas.translate(x, y);\n          canvas.rotate(angle);\n          canvas.scale(rx, ry);\n          canvas.arc(0, 0, 1, startAngle, endAngle, ccw);\n          canvas.restore();\n          break;\n\n        case 'R':\n          // rect\n          x = s[1];\n          y = s[2];\n          w = s[3];\n          h = s[4];\n          startPoint = {\n            x: x,\n            y: y\n          };\n          canvas.rect(x, y, w, h);\n          break;\n\n      }\n\n      currentPoint.x = x;\n      currentPoint.y = y;\n    }\n  }\n\n  var cFill = window.CanvasRenderingContext2D.prototype.fill;\n  var cStroke = window.CanvasRenderingContext2D.prototype.stroke;\n\n  window.CanvasRenderingContext2D.prototype.fill = function fill() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var fillRule = 'nonzero';\n\n    if (args.length === 0 || args.length === 1 && typeof args[0] === 'string') {\n      cFill.apply(this, args);\n      return;\n    }\n\n    if (arguments.length === 2) {\n      fillRule = args[1];\n    }\n\n    var path = args[0];\n    buildPath(this, path.segments);\n    cFill.call(this, fillRule);\n  };\n\n  window.CanvasRenderingContext2D.prototype.stroke = function stroke(path) {\n    if (!path) {\n      cStroke.call(this);\n      return;\n    }\n\n    buildPath(this, path.segments);\n    cStroke.call(this);\n  };\n\n  var cIsPointInPath = window.CanvasRenderingContext2D.prototype.isPointInPath;\n\n  window.CanvasRenderingContext2D.prototype.isPointInPath = function isPointInPath() {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    // let fillRule = 'nonzero';\n    if (args[0].constructor.name === 'Path2D') {\n      // first argument is a Path2D object\n      var x = args[1];\n      var y = args[2];\n      var fillRule = args[3] || 'nonzero';\n      var path = args[0];\n      buildPath(this, path.segments);\n      return cIsPointInPath.apply(this, [x, y, fillRule]);\n    } else {\n      return cIsPointInPath.apply(this, args);\n    }\n  };\n\n  window.Path2D = Path2D;\n}\n\nvar path2dPolyfill = polyFillPath2D;\n\nif (typeof window !== 'undefined') {\n  path2dPolyfill(window);\n}\n\nvar src = {\n  path2dPolyfill: path2dPolyfill,\n  parsePath: parsePath\n};\n\nexport default src;\n//# sourceMappingURL=index.esm.js.map\n","'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n","export default { version: '1.0.0' };\n","/* global navigator */\n\nexport function detectPointerSupport(e) {\n  if ('onpointerdown' in e && 'onpointerup' in e) {\n    return true;\n  }\n  return false;\n}\n\nexport function detectTouchSupport(e) {\n  if (('ontouchstart' in e && 'ontouchend' in e) || navigator.maxTouchPoints > 1) {\n    return true;\n  }\n  return false;\n}\n\nexport function isTouchEvent(e) {\n  return !!e.changedTouches;\n}\n\nexport function isValidTapEvent(e, eventInfo) {\n  const isTouch = isTouchEvent(e);\n  const ee = isTouch ? e.changedTouches[0] : e;\n  const dt = Date.now() - eventInfo.time;\n  const dx = isNaN(eventInfo.x) ? 0 : Math.abs(ee.clientX - eventInfo.x);\n  const dy = isNaN(eventInfo.y) ? 0 : Math.abs(ee.clientY - eventInfo.y);\n\n  return (e.button === 0 || isTouch) && !eventInfo.multiTouch && dx <= 12 && dy <= 12 && dt <= 300;\n}\n","export function isNumber(v) {\n  return typeof v === 'number' && !isNaN(v);\n}\n\nexport function notNumber(value) {\n  return typeof value !== 'number' || isNaN(value);\n}\n","import { isNumber } from '../utils/is-number';\n\nexport function getMinMax(points) {\n  const num = points.length;\n  let xMin = NaN;\n  let xMax = NaN;\n  let yMin = NaN;\n  let yMax = NaN;\n\n  for (let i = 0; i < num; i++) {\n    xMin = isNaN(xMin) ? points[i].x : Math.min(xMin, points[i].x);\n    xMax = isNaN(xMax) ? points[i].x : Math.max(xMax, points[i].x);\n    yMin = isNaN(yMin) ? points[i].y : Math.min(yMin, points[i].y);\n    yMax = isNaN(yMax) ? points[i].y : Math.max(yMax, points[i].y);\n  }\n  return [xMin, yMin, xMax, yMax];\n}\n\n/**\n * @ignore\n * @param {oject} line\n * @returns {Point[]} Array of points\n */\nexport function lineToPoints(line) {\n  const x1 = line.x1 || 0;\n  const y1 = line.y1 || 0;\n  const x2 = line.x2 || 0;\n  const y2 = line.y2 || 0;\n  return [\n    { x: x1, y: y1 },\n    { x: x2, y: y2 },\n  ];\n}\n\n/**\n * @ignore\n * @param {oject} rect\n * @returns {Point[]} Array of points\n */\nexport function rectToPoints(rect) {\n  return [\n    { x: rect.x, y: rect.y },\n    { x: rect.x + rect.width, y: rect.y },\n    { x: rect.x + rect.width, y: rect.y + rect.height },\n    { x: rect.x, y: rect.y + rect.height },\n  ];\n}\n\nexport function pointsToRect(points) {\n  const [xMin, yMin, xMax, yMax] = getMinMax(points);\n\n  return {\n    x: xMin,\n    y: yMin,\n    width: xMax - xMin,\n    height: yMax - yMin,\n  };\n}\n\nexport function pointsToCircle(points, r) {\n  return {\n    cx: points[0].x,\n    cy: points[0].y,\n    r,\n  };\n}\n\nexport function pointsToLine(points) {\n  return {\n    x1: points[0].x,\n    y1: points[0].y,\n    x2: points[1].x,\n    y2: points[1].y,\n  };\n}\n\nexport function pointToArray(p) {\n  return [p.x, p.y];\n}\n\nexport function arrayToPoint(ary) {\n  return { x: ary[0], y: ary[1] };\n}\n\n/**\n * @ignore\n * @param {oject}\n * @returns {string} Type of geometry\n */\nexport function getShapeType(shape) {\n  const {\n    x,\n    y, // Point\n    width,\n    height, // Rect\n    x1,\n    x2,\n    y1,\n    y2, // Line\n    cx,\n    cy,\n    r, // Circle\n    vertices, // Polygon or GeoPolygon\n  } = shape || {};\n\n  if (isNumber(cx) && isNumber(cy) && isNumber(r)) {\n    return 'circle';\n  }\n  if (isNumber(x1) && isNumber(x2) && isNumber(y1) && isNumber(y2)) {\n    return 'line';\n  }\n  if (isNumber(x) && isNumber(y) && isNumber(width) && isNumber(height)) {\n    return 'rect';\n  }\n  if (isNumber(x) && isNumber(y)) {\n    return 'point';\n  }\n  if (Array.isArray(vertices)) {\n    return vertices.every((item) => Array.isArray(item)) ? 'geopolygon' : 'polygon';\n  }\n  return null;\n}\n\nexport function expandRect(size, rect) {\n  return {\n    x: rect.x - size,\n    y: rect.y - size,\n    width: rect.width + size,\n    height: rect.height + size,\n  };\n}\n","var pi = Math.PI,\n    tau = 2 * pi,\n    epsilon = 1e-6,\n    tauEpsilon = tau - epsilon;\n\nfunction Path() {\n  this._x0 = this._y0 = // start of current subpath\n  this._x1 = this._y1 = null; // end of current subpath\n  this._ = \"\";\n}\n\nfunction path() {\n  return new Path;\n}\n\nPath.prototype = path.prototype = {\n  constructor: Path,\n  moveTo: function(x, y) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n  },\n  closePath: function() {\n    if (this._x1 !== null) {\n      this._x1 = this._x0, this._y1 = this._y0;\n      this._ += \"Z\";\n    }\n  },\n  lineTo: function(x, y) {\n    this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  quadraticCurveTo: function(x1, y1, x, y) {\n    this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n    this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  arcTo: function(x1, y1, x2, y2, r) {\n    x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n    var x0 = this._x1,\n        y0 = this._y1,\n        x21 = x2 - x1,\n        y21 = y2 - y1,\n        x01 = x0 - x1,\n        y01 = y0 - y1,\n        l01_2 = x01 * x01 + y01 * y01;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(\"negative radius: \" + r);\n\n    // Is this path empty? Move to (x1,y1).\n    if (this._x1 === null) {\n      this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n    }\n\n    // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n    else if (!(l01_2 > epsilon));\n\n    // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n    // Equivalently, is (x1,y1) coincident with (x2,y2)?\n    // Or, is the radius zero? Line to (x1,y1).\n    else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n      this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n    }\n\n    // Otherwise, draw an arc!\n    else {\n      var x20 = x2 - x0,\n          y20 = y2 - y0,\n          l21_2 = x21 * x21 + y21 * y21,\n          l20_2 = x20 * x20 + y20 * y20,\n          l21 = Math.sqrt(l21_2),\n          l01 = Math.sqrt(l01_2),\n          l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n          t01 = l / l01,\n          t21 = l / l21;\n\n      // If the start tangent is not coincident with (x0,y0), line to.\n      if (Math.abs(t01 - 1) > epsilon) {\n        this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n      }\n\n      this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n    }\n  },\n  arc: function(x, y, r, a0, a1, ccw) {\n    x = +x, y = +y, r = +r, ccw = !!ccw;\n    var dx = r * Math.cos(a0),\n        dy = r * Math.sin(a0),\n        x0 = x + dx,\n        y0 = y + dy,\n        cw = 1 ^ ccw,\n        da = ccw ? a0 - a1 : a1 - a0;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(\"negative radius: \" + r);\n\n    // Is this path empty? Move to (x0,y0).\n    if (this._x1 === null) {\n      this._ += \"M\" + x0 + \",\" + y0;\n    }\n\n    // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n    else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n      this._ += \"L\" + x0 + \",\" + y0;\n    }\n\n    // Is this arc empty? We’re done.\n    if (!r) return;\n\n    // Does the angle go the wrong way? Flip the direction.\n    if (da < 0) da = da % tau + tau;\n\n    // Is this a complete circle? Draw two arcs to complete the circle.\n    if (da > tauEpsilon) {\n      this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n    }\n\n    // Is this arc non-empty? Draw an arc!\n    else if (da > epsilon) {\n      this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n    }\n  },\n  rect: function(x, y, w, h) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n  },\n  toString: function() {\n    return this._;\n  }\n};\n\nexport default path;\n","export default function(x) {\n  return function constant() {\n    return x;\n  };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n  return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\n\nfunction arcInnerRadius(d) {\n  return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n  return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n  return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n  return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n  return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n  var x10 = x1 - x0, y10 = y1 - y0,\n      x32 = x3 - x2, y32 = y3 - y2,\n      t = y32 * x10 - x32 * y10;\n  if (t * t < epsilon) return;\n  t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n  return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n  var x01 = x0 - x1,\n      y01 = y0 - y1,\n      lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n      ox = lo * y01,\n      oy = -lo * x01,\n      x11 = x0 + ox,\n      y11 = y0 + oy,\n      x10 = x1 + ox,\n      y10 = y1 + oy,\n      x00 = (x11 + x10) / 2,\n      y00 = (y11 + y10) / 2,\n      dx = x10 - x11,\n      dy = y10 - y11,\n      d2 = dx * dx + dy * dy,\n      r = r1 - rc,\n      D = x11 * y10 - x10 * y11,\n      d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n      cx0 = (D * dy - dx * d) / d2,\n      cy0 = (-D * dx - dy * d) / d2,\n      cx1 = (D * dy + dx * d) / d2,\n      cy1 = (-D * dx + dy * d) / d2,\n      dx0 = cx0 - x00,\n      dy0 = cy0 - y00,\n      dx1 = cx1 - x00,\n      dy1 = cy1 - y00;\n\n  // Pick the closer of the two intersection points.\n  // TODO Is there a faster way to determine which intersection to use?\n  if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n  return {\n    cx: cx0,\n    cy: cy0,\n    x01: -ox,\n    y01: -oy,\n    x11: cx0 * (r1 / r - 1),\n    y11: cy0 * (r1 / r - 1)\n  };\n}\n\nexport default function() {\n  var innerRadius = arcInnerRadius,\n      outerRadius = arcOuterRadius,\n      cornerRadius = constant(0),\n      padRadius = null,\n      startAngle = arcStartAngle,\n      endAngle = arcEndAngle,\n      padAngle = arcPadAngle,\n      context = null;\n\n  function arc() {\n    var buffer,\n        r,\n        r0 = +innerRadius.apply(this, arguments),\n        r1 = +outerRadius.apply(this, arguments),\n        a0 = startAngle.apply(this, arguments) - halfPi,\n        a1 = endAngle.apply(this, arguments) - halfPi,\n        da = abs(a1 - a0),\n        cw = a1 > a0;\n\n    if (!context) context = buffer = path();\n\n    // Ensure that the outer radius is always larger than the inner radius.\n    if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n    // Is it a point?\n    if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n    // Or is it a circle or annulus?\n    else if (da > tau - epsilon) {\n      context.moveTo(r1 * cos(a0), r1 * sin(a0));\n      context.arc(0, 0, r1, a0, a1, !cw);\n      if (r0 > epsilon) {\n        context.moveTo(r0 * cos(a1), r0 * sin(a1));\n        context.arc(0, 0, r0, a1, a0, cw);\n      }\n    }\n\n    // Or is it a circular or annular sector?\n    else {\n      var a01 = a0,\n          a11 = a1,\n          a00 = a0,\n          a10 = a1,\n          da0 = da,\n          da1 = da,\n          ap = padAngle.apply(this, arguments) / 2,\n          rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n          rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n          rc0 = rc,\n          rc1 = rc,\n          t0,\n          t1;\n\n      // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n      if (rp > epsilon) {\n        var p0 = asin(rp / r0 * sin(ap)),\n            p1 = asin(rp / r1 * sin(ap));\n        if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n        else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n        if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n        else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n      }\n\n      var x01 = r1 * cos(a01),\n          y01 = r1 * sin(a01),\n          x10 = r0 * cos(a10),\n          y10 = r0 * sin(a10);\n\n      // Apply rounded corners?\n      if (rc > epsilon) {\n        var x11 = r1 * cos(a11),\n            y11 = r1 * sin(a11),\n            x00 = r0 * cos(a00),\n            y00 = r0 * sin(a00),\n            oc;\n\n        // Restrict the corner radius according to the sector angle.\n        if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n          var ax = x01 - oc[0],\n              ay = y01 - oc[1],\n              bx = x11 - oc[0],\n              by = y11 - oc[1],\n              kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n              lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n          rc0 = min(rc, (r0 - lc) / (kc - 1));\n          rc1 = min(rc, (r1 - lc) / (kc + 1));\n        }\n      }\n\n      // Is the sector collapsed to a line?\n      if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n      // Does the sector’s outer ring have rounded corners?\n      else if (rc1 > epsilon) {\n        t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n        t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n        context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n        // Have the corners merged?\n        if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n        // Otherwise, draw the two corners and the ring.\n        else {\n          context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n          context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n          context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n        }\n      }\n\n      // Or is the outer ring just a circular arc?\n      else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n      // Is there no inner ring, and it’s a circular sector?\n      // Or perhaps it’s an annular sector collapsed due to padding?\n      if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n      // Does the sector’s inner ring (or point) have rounded corners?\n      else if (rc0 > epsilon) {\n        t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n        t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n        context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n        // Have the corners merged?\n        if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n        // Otherwise, draw the two corners and the ring.\n        else {\n          context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n          context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n          context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n        }\n      }\n\n      // Or is the inner ring just a circular arc?\n      else context.arc(0, 0, r0, a10, a00, cw);\n    }\n\n    context.closePath();\n\n    if (buffer) return context = null, buffer + \"\" || null;\n  }\n\n  arc.centroid = function() {\n    var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n        a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n    return [cos(a) * r, sin(a) * r];\n  };\n\n  arc.innerRadius = function(_) {\n    return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n  };\n\n  arc.outerRadius = function(_) {\n    return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n  };\n\n  arc.cornerRadius = function(_) {\n    return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n  };\n\n  arc.padRadius = function(_) {\n    return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n  };\n\n  arc.startAngle = function(_) {\n    return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n  };\n\n  arc.endAngle = function(_) {\n    return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n  };\n\n  arc.padAngle = function(_) {\n    return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n  };\n\n  arc.context = function(_) {\n    return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n  };\n\n  return arc;\n}\n","function Linear(context) {\n  this._context = context;\n}\n\nLinear.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; // proceed\n      default: this._context.lineTo(x, y); break;\n    }\n  }\n};\n\nexport default function(context) {\n  return new Linear(context);\n}\n","export function x(p) {\n  return p[0];\n}\n\nexport function y(p) {\n  return p[1];\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function() {\n  var x0 = pointX,\n      x1 = null,\n      y0 = constant(0),\n      y1 = pointY,\n      defined = constant(true),\n      context = null,\n      curve = curveLinear,\n      output = null;\n\n  function area(data) {\n    var i,\n        j,\n        k,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer,\n        x0z = new Array(n),\n        y0z = new Array(n);\n\n    if (context == null) output = curve(buffer = path());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) {\n          j = i;\n          output.areaStart();\n          output.lineStart();\n        } else {\n          output.lineEnd();\n          output.lineStart();\n          for (k = i - 1; k >= j; --k) {\n            output.point(x0z[k], y0z[k]);\n          }\n          output.lineEnd();\n          output.areaEnd();\n        }\n      }\n      if (defined0) {\n        x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n        output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n      }\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  function arealine() {\n    return line().defined(defined).curve(curve).context(context);\n  }\n\n  area.x = function(_) {\n    return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n  };\n\n  area.x0 = function(_) {\n    return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n  };\n\n  area.x1 = function(_) {\n    return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n  };\n\n  area.y = function(_) {\n    return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n  };\n\n  area.y0 = function(_) {\n    return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n  };\n\n  area.y1 = function(_) {\n    return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n  };\n\n  area.lineX0 =\n  area.lineY0 = function() {\n    return arealine().x(x0).y(y0);\n  };\n\n  area.lineY1 = function() {\n    return arealine().x(x0).y(y1);\n  };\n\n  area.lineX1 = function() {\n    return arealine().x(x1).y(y0);\n  };\n\n  area.defined = function(_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n  };\n\n  area.curve = function(_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n  };\n\n  area.context = function(_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n  };\n\n  return area;\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function() {\n  var x = pointX,\n      y = pointY,\n      defined = constant(true),\n      context = null,\n      curve = curveLinear,\n      output = null;\n\n  function line(data) {\n    var i,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer;\n\n    if (context == null) output = curve(buffer = path());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) output.lineStart();\n        else output.lineEnd();\n      }\n      if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  line.x = function(_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n  };\n\n  line.y = function(_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n  };\n\n  line.defined = function(_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n  };\n\n  line.curve = function(_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n  };\n\n  line.context = function(_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n  };\n\n  return line;\n}\n","export default function(a, b) {\n  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n","export default function(d) {\n  return d;\n}\n","export var slice = Array.prototype.slice;\n","export function point(that, x, y) {\n  that._context.bezierCurveTo(\n    (2 * that._x0 + that._x1) / 3,\n    (2 * that._y0 + that._y1) / 3,\n    (that._x0 + 2 * that._x1) / 3,\n    (that._y0 + 2 * that._y1) / 3,\n    (that._x0 + 4 * that._x1 + x) / 6,\n    (that._y0 + 4 * that._y1 + y) / 6\n  );\n}\n\nexport function Basis(context) {\n  this._context = context;\n}\n\nBasis.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x0 = this._x1 =\n    this._y0 = this._y1 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function() {\n    switch (this._point) {\n      case 3: point(this, this._x1, this._y1); // proceed\n      case 2: this._context.lineTo(this._x1, this._y1); break;\n    }\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; break;\n      case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n      default: point(this, x, y); break;\n    }\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n  }\n};\n\nexport default function(context) {\n  return new Basis(context);\n}\n","export function point(that, x, y) {\n  that._context.bezierCurveTo(\n    that._x1 + that._k * (that._x2 - that._x0),\n    that._y1 + that._k * (that._y2 - that._y0),\n    that._x2 + that._k * (that._x1 - x),\n    that._y2 + that._k * (that._y1 - y),\n    that._x2,\n    that._y2\n  );\n}\n\nexport function Cardinal(context, tension) {\n  this._context = context;\n  this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x0 = this._x1 = this._x2 =\n    this._y0 = this._y1 = this._y2 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function() {\n    switch (this._point) {\n      case 2: this._context.lineTo(this._x2, this._y2); break;\n      case 3: point(this, this._x1, this._y1); break;\n    }\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n      case 2: this._point = 3; // proceed\n      default: point(this, x, y); break;\n    }\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nexport default (function custom(tension) {\n\n  function cardinal(context) {\n    return new Cardinal(context, tension);\n  }\n\n  cardinal.tension = function(tension) {\n    return custom(+tension);\n  };\n\n  return cardinal;\n})(0);\n","import {epsilon} from \"../math.js\";\nimport {Cardinal} from \"./cardinal.js\";\n\nexport function point(that, x, y) {\n  var x1 = that._x1,\n      y1 = that._y1,\n      x2 = that._x2,\n      y2 = that._y2;\n\n  if (that._l01_a > epsilon) {\n    var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n        n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n    x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n    y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n  }\n\n  if (that._l23_a > epsilon) {\n    var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n        m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n    x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n    y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n  }\n\n  that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n  this._context = context;\n  this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x0 = this._x1 = this._x2 =\n    this._y0 = this._y1 = this._y2 = NaN;\n    this._l01_a = this._l12_a = this._l23_a =\n    this._l01_2a = this._l12_2a = this._l23_2a =\n    this._point = 0;\n  },\n  lineEnd: function() {\n    switch (this._point) {\n      case 2: this._context.lineTo(this._x2, this._y2); break;\n      case 3: this.point(this._x2, this._y2); break;\n    }\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n\n    if (this._point) {\n      var x23 = this._x2 - x,\n          y23 = this._y2 - y;\n      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n    }\n\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; break;\n      case 2: this._point = 3; // proceed\n      default: point(this, x, y); break;\n    }\n\n    this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nexport default (function custom(alpha) {\n\n  function catmullRom(context) {\n    return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n  }\n\n  catmullRom.alpha = function(alpha) {\n    return custom(+alpha);\n  };\n\n  return catmullRom;\n})(0.5);\n","function sign(x) {\n  return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n  var h0 = that._x1 - that._x0,\n      h1 = x2 - that._x1,\n      s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n      s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n      p = (s0 * h1 + s1 * h0) / (h0 + h1);\n  return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n  var h = that._x1 - that._x0;\n  return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n  var x0 = that._x0,\n      y0 = that._y0,\n      x1 = that._x1,\n      y1 = that._y1,\n      dx = (x1 - x0) / 3;\n  that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n  this._context = context;\n}\n\nMonotoneX.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x0 = this._x1 =\n    this._y0 = this._y1 =\n    this._t0 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function() {\n    switch (this._point) {\n      case 2: this._context.lineTo(this._x1, this._y1); break;\n      case 3: point(this, this._t0, slope2(this, this._t0)); break;\n    }\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    var t1 = NaN;\n\n    x = +x, y = +y;\n    if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; break;\n      case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n      default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n    }\n\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n    this._t0 = t1;\n  }\n}\n\nfunction MonotoneY(context) {\n  this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n  MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n  this._context = context;\n}\n\nReflectContext.prototype = {\n  moveTo: function(x, y) { this._context.moveTo(y, x); },\n  closePath: function() { this._context.closePath(); },\n  lineTo: function(x, y) { this._context.lineTo(y, x); },\n  bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n  return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n  return new MonotoneY(context);\n}\n","function Natural(context) {\n  this._context = context;\n}\n\nNatural.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x = [];\n    this._y = [];\n  },\n  lineEnd: function() {\n    var x = this._x,\n        y = this._y,\n        n = x.length;\n\n    if (n) {\n      this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n      if (n === 2) {\n        this._context.lineTo(x[1], y[1]);\n      } else {\n        var px = controlPoints(x),\n            py = controlPoints(y);\n        for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n          this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n        }\n      }\n    }\n\n    if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n    this._x = this._y = null;\n  },\n  point: function(x, y) {\n    this._x.push(+x);\n    this._y.push(+y);\n  }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n  var i,\n      n = x.length - 1,\n      m,\n      a = new Array(n),\n      b = new Array(n),\n      r = new Array(n);\n  a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n  for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n  a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n  for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n  a[n - 1] = r[n - 1] / b[n - 1];\n  for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n  b[n - 1] = (x[n] + a[n - 1]) / 2;\n  for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n  return [a, b];\n}\n\nexport default function(context) {\n  return new Natural(context);\n}\n","function Step(context, t) {\n  this._context = context;\n  this._t = t;\n}\n\nStep.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._x = this._y = NaN;\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; // proceed\n      default: {\n        if (this._t <= 0) {\n          this._context.lineTo(this._x, y);\n          this._context.lineTo(x, y);\n        } else {\n          var x1 = this._x * (1 - this._t) + x * this._t;\n          this._context.lineTo(x1, this._y);\n          this._context.lineTo(x1, y);\n        }\n        break;\n      }\n    }\n    this._x = x, this._y = y;\n  }\n};\n\nexport default function(context) {\n  return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n  return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n  return new Step(context, 1);\n}\n","export default function(series, order) {\n  if (!((n = series.length) > 1)) return;\n  for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n    s0 = s1, s1 = series[order[i]];\n    for (j = 0; j < m; ++j) {\n      s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n    }\n  }\n}\n","export default function(series) {\n  var n = series.length, o = new Array(n);\n  while (--n >= 0) o[n] = n;\n  return o;\n}\n","import {slice} from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\n\nfunction stackValue(d, key) {\n  return d[key];\n}\n\nexport default function() {\n  var keys = constant([]),\n      order = orderNone,\n      offset = offsetNone,\n      value = stackValue;\n\n  function stack(data) {\n    var kz = keys.apply(this, arguments),\n        i,\n        m = data.length,\n        n = kz.length,\n        sz = new Array(n),\n        oz;\n\n    for (i = 0; i < n; ++i) {\n      for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n        si[j] = sij = [0, +value(data[j], ki, j, data)];\n        sij.data = data[j];\n      }\n      si.key = ki;\n    }\n\n    for (i = 0, oz = order(sz); i < n; ++i) {\n      sz[oz[i]].index = i;\n    }\n\n    offset(sz, oz);\n    return sz;\n  }\n\n  stack.keys = function(_) {\n    return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : keys;\n  };\n\n  stack.value = function(_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n  };\n\n  stack.order = function(_) {\n    return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(slice.call(_)), stack) : order;\n  };\n\n  stack.offset = function(_) {\n    return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n  };\n\n  return stack;\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n  var peaks = series.map(peak);\n  return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; });\n}\n\nfunction peak(series) {\n  var i = -1, j = 0, n = series.length, vi, vj = -Infinity;\n  while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\n  return j;\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n  var sums = series.map(sum);\n  return none(series).sort(function(a, b) { return sums[a] - sums[b]; });\n}\n\nexport function sum(series) {\n  var s = 0, i = -1, n = series.length, v;\n  while (++i < n) if (v = +series[i][1]) s += v;\n  return s;\n}\n","export default function registryFactory(parentRegistry, registerName = 'unspecified', logger) {\n  let defaultValue;\n  const reg = {};\n  const parent = parentRegistry || {\n    get: () => undefined,\n    has: () => false,\n    default: () => undefined,\n  };\n\n  defaultValue = parent.default();\n\n  /**\n   * @private\n   * @param {string} key\n   * @param {any} value\n   * @throws {TypeError} Key must be a non-empty string\n   * @returns {boolean} False if the given key already exists, true otherwise\n   * @example\n   * var r = registry();\n   * r.add( \"marker\", function(args) {\n   *   return new markers[args.type](args);\n   * });\n   *\n   */\n  function add(key, value) {\n    if (!key || typeof key !== 'string') {\n      throw new TypeError('Invalid argument: key must be a non-empty string');\n    }\n    if (key in reg) {\n      return false;\n    }\n    reg[key] = value;\n    return true;\n  }\n\n  function get(key) {\n    return reg[key] || parent.get(key);\n  }\n\n  function has(key) {\n    return !!reg[key] || parent.has(key);\n  }\n\n  function remove(key) {\n    const d = reg[key];\n    delete reg[key];\n    return d;\n  }\n\n  function getKeys() {\n    return Object.keys(reg);\n  }\n\n  function getValues() {\n    return Object.keys(reg).map((key) => reg[key]);\n  }\n\n  function deflt(d) {\n    if (typeof d !== 'undefined') {\n      defaultValue = d;\n    }\n    return defaultValue;\n  }\n\n  /**\n   * Register a `value` with the given `key`. If `value` is omitted, returns the `value` of `key`.\n   * @alias registry\n   * @param {string} key Name of the type to register\n   * @param {any} [value] Value to store in the registry.\n   * @returns {any} Registered value\n   */\n  function registry(key, value) {\n    if (typeof value !== 'undefined') {\n      return add(key, value);\n    }\n    const ret = get(key);\n    if (logger && typeof ret === 'undefined') {\n      logger.warn(`${key} does not exist in ${registerName} registry`);\n    }\n    return ret || get(defaultValue);\n  }\n\n  registry.add = add;\n  registry.get = get;\n  registry.has = has;\n  registry.remove = remove;\n  registry.getKeys = getKeys;\n  registry.getValues = getValues;\n  registry.default = deflt;\n  registry.register = add; // deprecated\n\n  return registry;\n}\n","export default function(x) {\n  return Math.abs(x = Math.round(x)) >= 1e21\n      ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n      : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n  var i, coefficient = x.slice(0, i);\n\n  // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n  return [\n    coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n    +x.slice(i + 1)\n  ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n  return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n  return this.fill\n      + this.align\n      + this.sign\n      + this.symbol\n      + (this.zero ? \"0\" : \"\")\n      + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n      + (this.comma ? \",\" : \"\")\n      + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n      + (this.trim ? \"~\" : \"\")\n      + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n  var d = formatDecimalParts(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient\n      : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n      : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n      : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n  var d = formatDecimalParts(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n      : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n      : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n  \"%\": function(x, p) { return (x * 100).toFixed(p); },\n  \"b\": function(x) { return Math.round(x).toString(2); },\n  \"c\": function(x) { return x + \"\"; },\n  \"d\": formatDecimal,\n  \"e\": function(x, p) { return x.toExponential(p); },\n  \"f\": function(x, p) { return x.toFixed(p); },\n  \"g\": function(x, p) { return x.toPrecision(p); },\n  \"o\": function(x) { return Math.round(x).toString(8); },\n  \"p\": function(x, p) { return formatRounded(x * 100, p); },\n  \"r\": formatRounded,\n  \"s\": formatPrefixAuto,\n  \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n  \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n  return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = formatSpecifier(specifier);\n\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type;\n\n    // The \"n\" type is an alias for \",g\".\n    if (type === \"n\") comma = true, type = \"g\";\n\n    // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n    // If zero fill is specified, padding goes after sign and before digits.\n    if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n    // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n    // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n    var formatType = formatTypes[type],\n        maybeSuffix = /[defgprs%]/.test(type);\n\n    // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n    precision = precision === undefined ? 6\n        : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n        : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i, n, c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value;\n\n        // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n        var valueNegative = value < 0 || 1 / value < 0;\n\n        // Perform the initial formatting.\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n        // Trim insignificant zeros.\n        if (trim) value = formatTrim(value);\n\n        // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n        if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n        // Compute the prefix and suffix.\n        valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n        valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n        // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      }\n\n      // If the fill character is not \"0\", grouping is applied before padding.\n      if (comma && !zero) value = group(value, Infinity);\n\n      // Compute the padding.\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n      // If the fill character is \"0\", grouping is applied after padding.\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n      // Reconstruct the final output based on the desired alignment.\n      switch (align) {\n        case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n        case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n        case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n        default: value = padding + valuePrefix + value + valueSuffix; break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function() {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function(value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  format = locale.format;\n  formatPrefix = locale.formatPrefix;\n  return locale;\n}\n","export default function(grouping, thousands) {\n  return function(value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n","export default function(numerals) {\n  return function(value) {\n    return value.replace(/[0-9]/g, function(i) {\n      return numerals[+i];\n    });\n  };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\": i0 = i1 = i; break;\n      case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n      default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n    }\n  }\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","var t0 = new Date,\n    t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n  function interval(date) {\n    return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n  }\n\n  interval.floor = function(date) {\n    return floori(date = new Date(+date)), date;\n  };\n\n  interval.ceil = function(date) {\n    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n  };\n\n  interval.round = function(date) {\n    var d0 = interval(date),\n        d1 = interval.ceil(date);\n    return date - d0 < d1 - date ? d0 : d1;\n  };\n\n  interval.offset = function(date, step) {\n    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n  };\n\n  interval.range = function(start, stop, step) {\n    var range = [], previous;\n    start = interval.ceil(start);\n    step = step == null ? 1 : Math.floor(step);\n    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n    while (previous < start && start < stop);\n    return range;\n  };\n\n  interval.filter = function(test) {\n    return newInterval(function(date) {\n      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n    }, function(date, step) {\n      if (date >= date) {\n        if (step < 0) while (++step <= 0) {\n          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n        } else while (--step >= 0) {\n          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n        }\n      }\n    });\n  };\n\n  if (count) {\n    interval.count = function(start, end) {\n      t0.setTime(+start), t1.setTime(+end);\n      floori(t0), floori(t1);\n      return Math.floor(count(t0, t1));\n    };\n\n    interval.every = function(step) {\n      step = Math.floor(step);\n      return !isFinite(step) || !(step > 0) ? null\n          : !(step > 1) ? interval\n          : interval.filter(field\n              ? function(d) { return field(d) % step === 0; }\n              : function(d) { return interval.count(0, d) % step === 0; });\n    };\n  }\n\n  return interval;\n}\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nvar day = interval(function(date) {\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setDate(date.getDate() + step);\n}, function(start, end) {\n  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n  return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction weekday(i) {\n  return interval(function(date) {\n    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setDate(date.getDate() + step * 7);\n  }, function(start, end) {\n    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n  });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval.js\";\n\nvar year = interval(function(date) {\n  date.setMonth(0, 1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n  return end.getFullYear() - start.getFullYear();\n}, function(date) {\n  return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setFullYear(date.getFullYear() + step * k);\n  });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval.js\";\nimport {durationDay} from \"./duration.js\";\n\nvar utcDay = interval(function(date) {\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n  return (end - start) / durationDay;\n}, function(date) {\n  return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval.js\";\nimport {durationWeek} from \"./duration.js\";\n\nfunction utcWeekday(i) {\n  return interval(function(date) {\n    date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCDate(date.getUTCDate() + step * 7);\n  }, function(start, end) {\n    return (end - start) / durationWeek;\n  });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval.js\";\n\nvar utcYear = interval(function(date) {\n  date.setUTCMonth(0, 1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n  return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n  return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step * k);\n  });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n  timeDay,\n  timeSunday,\n  timeMonday,\n  timeThursday,\n  timeYear,\n  utcDay,\n  utcSunday,\n  utcMonday,\n  utcThursday,\n  utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n    date.setFullYear(d.y);\n    return date;\n  }\n  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n  return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n  var locale_dateTime = locale.dateTime,\n      locale_date = locale.date,\n      locale_time = locale.time,\n      locale_periods = locale.periods,\n      locale_weekdays = locale.days,\n      locale_shortWeekdays = locale.shortDays,\n      locale_months = locale.months,\n      locale_shortMonths = locale.shortMonths;\n\n  var periodRe = formatRe(locale_periods),\n      periodLookup = formatLookup(locale_periods),\n      weekdayRe = formatRe(locale_weekdays),\n      weekdayLookup = formatLookup(locale_weekdays),\n      shortWeekdayRe = formatRe(locale_shortWeekdays),\n      shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n      monthRe = formatRe(locale_months),\n      monthLookup = formatLookup(locale_months),\n      shortMonthRe = formatRe(locale_shortMonths),\n      shortMonthLookup = formatLookup(locale_shortMonths);\n\n  var formats = {\n    \"a\": formatShortWeekday,\n    \"A\": formatWeekday,\n    \"b\": formatShortMonth,\n    \"B\": formatMonth,\n    \"c\": null,\n    \"d\": formatDayOfMonth,\n    \"e\": formatDayOfMonth,\n    \"f\": formatMicroseconds,\n    \"g\": formatYearISO,\n    \"G\": formatFullYearISO,\n    \"H\": formatHour24,\n    \"I\": formatHour12,\n    \"j\": formatDayOfYear,\n    \"L\": formatMilliseconds,\n    \"m\": formatMonthNumber,\n    \"M\": formatMinutes,\n    \"p\": formatPeriod,\n    \"q\": formatQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatSeconds,\n    \"u\": formatWeekdayNumberMonday,\n    \"U\": formatWeekNumberSunday,\n    \"V\": formatWeekNumberISO,\n    \"w\": formatWeekdayNumberSunday,\n    \"W\": formatWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatYear,\n    \"Y\": formatFullYear,\n    \"Z\": formatZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var utcFormats = {\n    \"a\": formatUTCShortWeekday,\n    \"A\": formatUTCWeekday,\n    \"b\": formatUTCShortMonth,\n    \"B\": formatUTCMonth,\n    \"c\": null,\n    \"d\": formatUTCDayOfMonth,\n    \"e\": formatUTCDayOfMonth,\n    \"f\": formatUTCMicroseconds,\n    \"g\": formatUTCYearISO,\n    \"G\": formatUTCFullYearISO,\n    \"H\": formatUTCHour24,\n    \"I\": formatUTCHour12,\n    \"j\": formatUTCDayOfYear,\n    \"L\": formatUTCMilliseconds,\n    \"m\": formatUTCMonthNumber,\n    \"M\": formatUTCMinutes,\n    \"p\": formatUTCPeriod,\n    \"q\": formatUTCQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatUTCSeconds,\n    \"u\": formatUTCWeekdayNumberMonday,\n    \"U\": formatUTCWeekNumberSunday,\n    \"V\": formatUTCWeekNumberISO,\n    \"w\": formatUTCWeekdayNumberSunday,\n    \"W\": formatUTCWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatUTCYear,\n    \"Y\": formatUTCFullYear,\n    \"Z\": formatUTCZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var parses = {\n    \"a\": parseShortWeekday,\n    \"A\": parseWeekday,\n    \"b\": parseShortMonth,\n    \"B\": parseMonth,\n    \"c\": parseLocaleDateTime,\n    \"d\": parseDayOfMonth,\n    \"e\": parseDayOfMonth,\n    \"f\": parseMicroseconds,\n    \"g\": parseYear,\n    \"G\": parseFullYear,\n    \"H\": parseHour24,\n    \"I\": parseHour24,\n    \"j\": parseDayOfYear,\n    \"L\": parseMilliseconds,\n    \"m\": parseMonthNumber,\n    \"M\": parseMinutes,\n    \"p\": parsePeriod,\n    \"q\": parseQuarter,\n    \"Q\": parseUnixTimestamp,\n    \"s\": parseUnixTimestampSeconds,\n    \"S\": parseSeconds,\n    \"u\": parseWeekdayNumberMonday,\n    \"U\": parseWeekNumberSunday,\n    \"V\": parseWeekNumberISO,\n    \"w\": parseWeekdayNumberSunday,\n    \"W\": parseWeekNumberMonday,\n    \"x\": parseLocaleDate,\n    \"X\": parseLocaleTime,\n    \"y\": parseYear,\n    \"Y\": parseFullYear,\n    \"Z\": parseZone,\n    \"%\": parseLiteralPercent\n  };\n\n  // These recursive directive definitions must be deferred.\n  formats.x = newFormat(locale_date, formats);\n  formats.X = newFormat(locale_time, formats);\n  formats.c = newFormat(locale_dateTime, formats);\n  utcFormats.x = newFormat(locale_date, utcFormats);\n  utcFormats.X = newFormat(locale_time, utcFormats);\n  utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n  function newFormat(specifier, formats) {\n    return function(date) {\n      var string = [],\n          i = -1,\n          j = 0,\n          n = specifier.length,\n          c,\n          pad,\n          format;\n\n      if (!(date instanceof Date)) date = new Date(+date);\n\n      while (++i < n) {\n        if (specifier.charCodeAt(i) === 37) {\n          string.push(specifier.slice(j, i));\n          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n          else pad = c === \"e\" ? \" \" : \"0\";\n          if (format = formats[c]) c = format(date, pad);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n\n      string.push(specifier.slice(j, i));\n      return string.join(\"\");\n    };\n  }\n\n  function newParse(specifier, Z) {\n    return function(string) {\n      var d = newDate(1900, undefined, 1),\n          i = parseSpecifier(d, specifier, string += \"\", 0),\n          week, day;\n      if (i != string.length) return null;\n\n      // If a UNIX timestamp is specified, return it.\n      if (\"Q\" in d) return new Date(d.Q);\n      if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n      // If this is utcParse, never use the local timezone.\n      if (Z && !(\"Z\" in d)) d.Z = 0;\n\n      // The am-pm flag is 0 for AM, and 1 for PM.\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n      // If the month was not specified, inherit from the quarter.\n      if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n      // Convert day-of-week and week-of-year to day-of-year.\n      if (\"V\" in d) {\n        if (d.V < 1 || d.V > 53) return null;\n        if (!(\"w\" in d)) d.w = 1;\n        if (\"Z\" in d) {\n          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n          week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n          week = utcDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getUTCFullYear();\n          d.m = week.getUTCMonth();\n          d.d = week.getUTCDate() + (d.w + 6) % 7;\n        } else {\n          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n          week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n          week = timeDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getFullYear();\n          d.m = week.getMonth();\n          d.d = week.getDate() + (d.w + 6) % 7;\n        }\n      } else if (\"W\" in d || \"U\" in d) {\n        if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n        day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n        d.m = 0;\n        d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n      }\n\n      // If a time zone is specified, all fields are interpreted as UTC and then\n      // offset according to the specified time zone.\n      if (\"Z\" in d) {\n        d.H += d.Z / 100 | 0;\n        d.M += d.Z % 100;\n        return utcDate(d);\n      }\n\n      // Otherwise, all fields are in local time.\n      return localDate(d);\n    };\n  }\n\n  function parseSpecifier(d, specifier, string, j) {\n    var i = 0,\n        n = specifier.length,\n        m = string.length,\n        c,\n        parse;\n\n    while (i < n) {\n      if (j >= m) return -1;\n      c = specifier.charCodeAt(i++);\n      if (c === 37) {\n        c = specifier.charAt(i++);\n        parse = parses[c in pads ? specifier.charAt(i++) : c];\n        if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n\n    return j;\n  }\n\n  function parsePeriod(d, string, i) {\n    var n = periodRe.exec(string.slice(i));\n    return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortWeekday(d, string, i) {\n    var n = shortWeekdayRe.exec(string.slice(i));\n    return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseWeekday(d, string, i) {\n    var n = weekdayRe.exec(string.slice(i));\n    return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortMonth(d, string, i) {\n    var n = shortMonthRe.exec(string.slice(i));\n    return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseMonth(d, string, i) {\n    var n = monthRe.exec(string.slice(i));\n    return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseLocaleDateTime(d, string, i) {\n    return parseSpecifier(d, locale_dateTime, string, i);\n  }\n\n  function parseLocaleDate(d, string, i) {\n    return parseSpecifier(d, locale_date, string, i);\n  }\n\n  function parseLocaleTime(d, string, i) {\n    return parseSpecifier(d, locale_time, string, i);\n  }\n\n  function formatShortWeekday(d) {\n    return locale_shortWeekdays[d.getDay()];\n  }\n\n  function formatWeekday(d) {\n    return locale_weekdays[d.getDay()];\n  }\n\n  function formatShortMonth(d) {\n    return locale_shortMonths[d.getMonth()];\n  }\n\n  function formatMonth(d) {\n    return locale_months[d.getMonth()];\n  }\n\n  function formatPeriod(d) {\n    return locale_periods[+(d.getHours() >= 12)];\n  }\n\n  function formatQuarter(d) {\n    return 1 + ~~(d.getMonth() / 3);\n  }\n\n  function formatUTCShortWeekday(d) {\n    return locale_shortWeekdays[d.getUTCDay()];\n  }\n\n  function formatUTCWeekday(d) {\n    return locale_weekdays[d.getUTCDay()];\n  }\n\n  function formatUTCShortMonth(d) {\n    return locale_shortMonths[d.getUTCMonth()];\n  }\n\n  function formatUTCMonth(d) {\n    return locale_months[d.getUTCMonth()];\n  }\n\n  function formatUTCPeriod(d) {\n    return locale_periods[+(d.getUTCHours() >= 12)];\n  }\n\n  function formatUTCQuarter(d) {\n    return 1 + ~~(d.getUTCMonth() / 3);\n  }\n\n  return {\n    format: function(specifier) {\n      var f = newFormat(specifier += \"\", formats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    parse: function(specifier) {\n      var p = newParse(specifier += \"\", false);\n      p.toString = function() { return specifier; };\n      return p;\n    },\n    utcFormat: function(specifier) {\n      var f = newFormat(specifier += \"\", utcFormats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    utcParse: function(specifier) {\n      var p = newParse(specifier += \"\", true);\n      p.toString = function() { return specifier; };\n      return p;\n    }\n  };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n    numberRe = /^\\s*\\d+/, // note: ignores next directive\n    percentRe = /^%/,\n    requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n  var sign = value < 0 ? \"-\" : \"\",\n      string = (sign ? -value : value) + \"\",\n      length = string.length;\n  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n  return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n  return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n  var map = {}, i = -1, n = names.length;\n  while (++i < n) map[names[i].toLowerCase()] = i;\n  return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 4));\n  return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n  var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 6));\n  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n  var n = percentRe.exec(string.slice(i, i + 1));\n  return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n  return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n  return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n  return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n  return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n  return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n  return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n  return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n  return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n  return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n  var day = d.getDay();\n  return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n  return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n  var day = d.getDay();\n  return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n  d = dISO(d);\n  return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n  return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n  return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n  d = dISO(d);\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n  var day = d.getDay();\n  d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n  var z = d.getTimezoneOffset();\n  return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n      + pad(z / 60 | 0, \"0\", 2)\n      + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n  return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n  return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n  return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n  return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n  return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n  return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n  return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n  return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n  return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n  var dow = d.getUTCDay();\n  return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n  return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n  var day = d.getUTCDay();\n  return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n  d = UTCdISO(d);\n  return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n  return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n  return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n  d = UTCdISO(d);\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n  var day = d.getUTCDay();\n  d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n  return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n  return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n  return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n  return Math.floor(+d / 1000);\n}\n","import registry from '../utils/registry';\n\nimport { numberFormat as d3NumberFormatter, timeFormat as d3TimeFormatter } from './d3';\n\n/**\n * @typedef {function} formatter\n * @returns {any} Returns a formatted value\n */\n\n/**\n * @typedef {object} FormatterDefinition\n * @property {string} [formatter] Name of the formatter\n * @property {string} [type] Type of formatter\n * @property {string} [format] Format string\n * @property {DataExtraction|DataFieldExtraction} [data] The data to create formatter from\n */\n\nconst formatterRegistry = registry();\n\nformatterRegistry('d3-number', d3NumberFormatter);\nformatterRegistry('d3-time', d3TimeFormatter);\n\nexport { formatterRegistry as default };\n","import { formatLocale } from 'd3-format';\n\nexport default function formatter(pattern, thousand, decimal) {\n  let locale, d3format;\n\n  /**\n   * Format a value according to the specified pattern created at construct\n   * @private\n   *\n   * @param  {Number} value   The number to be formatted\n   * @return {String}         [description]\n   */\n  function format(value) {\n    return d3format(value);\n  }\n\n  /**\n   * Set the locale for the formatter\n   *\n   * @param  {Object} args   Locale object for formatting\n   * @return {Undefined}      Returns nothing\n   */\n  format.locale = function localeFn(settings) {\n    locale = formatLocale(settings);\n    d3format = locale.format(pattern);\n\n    return this;\n  };\n\n  /**\n   * Resets the formatter using format.locale\n   * @ignore\n   */\n  function reset() {\n    format.locale({\n      decimal: decimal || '.',\n      thousands: thousand || ',',\n      grouping: [3],\n      currency: ['$', ''],\n    });\n  }\n  reset();\n\n  /**\n   * Format a value according to a specific pattern\n   * that is not the one specified in the constructor\n   *\n   * @param  {String} p   Pattern\n   * @param  {Number} v   Value\n   * @param  {String} t   Thousand\n   * @param  {String} d   Decimal\n   * @return {String}     Formatted value\n   */\n  format.format = function formatFn(p, v, t, d) {\n    if (t || d) {\n      thousand = t;\n      decimal = d;\n      reset();\n    }\n    return locale.format(p)(v);\n  };\n\n  /**\n   * Change the pattern on existing formatter\n   *\n   * @param  {String} p     Pattern (optional)\n   * @return {String}       Returns the pattern\n   */\n  format.pattern = function patternFn(p) {\n    if (p) {\n      pattern = p;\n      d3format = locale.format(p);\n    }\n    return pattern;\n  };\n\n  return format;\n}\n","import { timeFormatLocale } from 'd3-time-format';\n\nexport default function formatter(pattern) {\n  // eslint-disable-line import/prefer-default-export\n  let locale = timeFormatLocale({\n    dateTime: '%x, %X',\n    date: '%-m/%-d/%Y',\n    time: '%-I:%M:%S %p',\n    periods: ['AM', 'PM'],\n    days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n    shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n    months: [\n      'January',\n      'February',\n      'March',\n      'April',\n      'May',\n      'June',\n      'July',\n      'August',\n      'September',\n      'October',\n      'November',\n      'December',\n    ],\n    shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  });\n\n  let d3format = locale.format(pattern);\n\n  /**\n   * Format a value according to the specified pattern created at construct\n   *\n   * @param  {Date} value   The number to be formatted\n   * @return {String}         [description]\n   * @private\n   */\n  function format(value) {\n    return d3format(value);\n  }\n\n  /**\n   * Format a value according to a specific pattern\n   * that is not the one specified in the constructor\n   *\n   * @param  {String} p   Pattern\n   * @param  {Date} v   Value\n   * @return {String}     Formatted value\n   */\n  format.format = function formatFn(p, v) {\n    return locale.format(p)(v);\n  };\n\n  /**\n   * Set the locale for the formatter\n   *\n   * @param  {Object} args   Locale object for formatting\n   * @return {Undefined}      Returns nothing\n   */\n  format.locale = function localeFn(...args) {\n    locale = timeFormatLocale(...args);\n    d3format = locale.format(pattern);\n\n    return this;\n  };\n\n  /**\n   * Parse a string to a date according to a pattern\n   *\n   * @param  {String} p   Pattern\n   * @param  {String} v   Value\n   * @return {Date}     Date\n   */\n  format.parse = function parse(p, v) {\n    return locale.parse(p)(v);\n  };\n\n  /**\n   * Returns a parser that parses strings to date according to the pattern\n   *\n   * @param  {String} p   Pattern\n   * @return {Function}   Parser\n   */\n  format.parsePattern = function parsePattern(p) {\n    return locale.parse(p);\n  };\n\n  return format;\n}\n","/* eslint no-return-assign: 0 */\nimport formatterFn from '../formatter';\n\n// TODO - decide whether usage of .call() is appropriate when invoking accessors, if yes then arrow functions are not allowed!\n\nconst getFormatter = (data) => {\n  if (typeof data.formatter === 'function') {\n    return data.formatter();\n  }\n  const f = data.formatter || {};\n  return formatterFn(f.type || 'd3-number')(f.format || '');\n};\n\nconst accessors = {\n  id: (data) => `${data.source}/${data.key || data.title}`,\n  key: (data) => String(data.key || data.title),\n  tags: (data) => data.tags,\n  min: (data) => data.min,\n  max: (data) => data.max,\n  type: (data) => data.type,\n  title: (data) => String(data.title),\n  values: (data) => data.values,\n  value: (v) => v,\n  label: (v) => v,\n  formatter: (data) => getFormatter(data),\n};\n\n/**\n * Create a new field with default settings\n * @ignore\n * @return {Field} Data field\n */\nexport default function field(\n  data,\n  {\n    id = accessors.id,\n    key = accessors.key,\n    min = accessors.min,\n    max = accessors.max,\n    type = accessors.type,\n    tags = accessors.tags,\n    title = accessors.title,\n    values = accessors.values,\n    value = accessors.value,\n    label = accessors.label,\n    formatter = accessors.formatter,\n  } = {}\n) {\n  /**\n   * @alias Field\n   */\n  const f = {\n    /**\n     * Returns this field's id\n     * @returns {string}\n     */\n    id: () => id(data),\n\n    /**\n     * Returns this field's key\n     * @returns {string}\n     */\n    key: () => key(data),\n\n    /**\n     * Returns the input data\n     * @returns {any}\n     */\n    raw: () => data,\n    /**\n     * Returns the tags.\n     * @return {Array<string>}\n     */\n    tags: () => tags(data),\n\n    /**\n     * Returns this field's type: 'dimension' or 'measure'.\n     * @return {string}\n     */\n    type: () => type(data),\n\n    /**\n     * Returns the min value of this field.\n     * @return {number}\n     */\n    min: () => min(data),\n\n    /**\n     * Returns the max value of this field.\n     * @return {number}\n     */\n    max: () => max(data),\n\n    /**\n     * Returns this field's title.\n     * @return {string}\n     */\n    title: () => title(data),\n\n    /**\n     * Returns the values of this field.\n     * @return {Array<DatumExtract>}\n     */\n    items: () => values(data),\n\n    /**\n     * Returns a formatter adapted to the content of this field.\n     */\n    formatter: () => formatter(data),\n\n    value,\n    label,\n  };\n\n  return f;\n}\n","import {\n  stack,\n  stackOrderAscending,\n  stackOrderInsideOut,\n  stackOrderNone,\n  stackOrderReverse,\n  stackOffsetDiverging,\n  stackOffsetNone,\n  stackOffsetSilhouette,\n  stackOffsetExpand,\n  stackOffsetWiggle,\n} from 'd3-shape';\nimport fieldFn from './field';\n\nconst OFFSETS = {\n  diverging: stackOffsetDiverging,\n  none: stackOffsetNone,\n  silhouette: stackOffsetSilhouette,\n  expand: stackOffsetExpand,\n  wiggle: stackOffsetWiggle,\n};\n\nconst ORDERS = {\n  ascending: stackOrderAscending,\n  insideout: stackOrderInsideOut,\n  none: stackOrderNone,\n  reverse: stackOrderReverse,\n};\n\nfunction stacked(data, config, ds) {\n  const stackIds = {};\n  const stackFn = config.stackKey;\n  const valueFn = config.value;\n  const startProp = config.startProp || 'start';\n  const endProp = config.endProp || 'end';\n  const offset = config.offset || 'none';\n  const order = config.order || 'none';\n  const valueRef = config.valueRef || '';\n\n  let maxStackCount = 0;\n\n  let valueFields = {};\n\n  for (let i = 0; i < data.items.length; i++) {\n    let p = data.items[i];\n    let sourceField = valueRef ? p[valueRef] : null;\n    if (sourceField && sourceField.source) {\n      let ff = `${sourceField.source.key || ''}/${sourceField.source.field}`;\n      if (!valueFields[ff]) {\n        valueFields[ff] = sourceField.source;\n      }\n    }\n    let sid = stackFn(p);\n    stackIds[sid] = stackIds[sid] || { items: [] };\n    stackIds[sid].items.push(p);\n\n    maxStackCount = Math.max(maxStackCount, stackIds[sid].items.length);\n  }\n\n  const keys = Array.apply(null, { length: maxStackCount }).map(Number.call, Number); // eslint-disable-line\n  const matrix = Object.keys(stackIds).map((sid) => stackIds[sid].items);\n\n  const d3Stack = stack()\n    .keys(keys)\n    .value((s, key) => (s[key] ? valueFn(s[key]) : 0))\n    .order(ORDERS[order])\n    .offset(OFFSETS[offset]);\n\n  let series = d3Stack(matrix);\n  let values = [];\n\n  for (let i = 0; i < series.length; i++) {\n    let serie = series[i];\n    for (let s = 0; s < serie.length; s++) {\n      let range = serie[s];\n      let item = serie[s].data[serie.key];\n      if (!item) {\n        continue;\n      }\n      item[startProp] = { value: range[0] };\n      item[endProp] = { value: range[1] };\n      values.push(range[0], range[1]);\n    }\n  }\n\n  let stackedFields = Object.keys(valueFields)\n    .map((f) => {\n      let dSource = ds(valueFields[f].key);\n      return dSource ? dSource.field(valueFields[f].field) : null;\n    })\n    .filter((f) => !!f);\n\n  const field = fieldFn({\n    title: stackedFields.map((f) => f.title()).join(', '),\n    min: Math.min(...values),\n    max: Math.max(...values),\n    type: 'measure',\n    formatter: stackedFields[0] ? stackedFields[0].formatter : undefined,\n  });\n  data.fields.push(field);\n}\n\nexport { stacked as default };\n","export default function(series, order) {\n  if (!((n = series.length) > 0)) return;\n  for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n    for (yp = yn = 0, i = 0; i < n; ++i) {\n      if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {\n        d[0] = yp, d[1] = yp += dy;\n      } else if (dy < 0) {\n        d[1] = yn, d[0] = yn += dy;\n      } else {\n        d[0] = yp;\n      }\n    }\n  }\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n  if (!((n = series.length) > 0)) return;\n  for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n    for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n    s0[j][1] += s0[j][0] = -y / 2;\n  }\n  none(series, order);\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n  if (!((n = series.length) > 0)) return;\n  for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n    for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n    if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n  }\n  none(series, order);\n}\n","import none from \"./none.js\";\n\nexport default function(series, order) {\n  if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n  for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n    for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n      var si = series[order[i]],\n          sij0 = si[j][1] || 0,\n          sij1 = si[j - 1][1] || 0,\n          s3 = (sij0 - sij1) / 2;\n      for (var k = 0; k < i; ++k) {\n        var sk = series[order[k]],\n            skj0 = sk[j][1] || 0,\n            skj1 = sk[j - 1][1] || 0;\n        s3 += skj0 - skj1;\n      }\n      s1 += sij0, s2 += s3 * sij0;\n    }\n    s0[j - 1][1] += s0[j - 1][0] = y;\n    if (s1) y -= s2 / s1;\n  }\n  s0[j - 1][1] += s0[j - 1][0] = y;\n  none(series, order);\n}\n","import appearance from \"./appearance.js\";\nimport {sum} from \"./ascending.js\";\n\nexport default function(series) {\n  var n = series.length,\n      i,\n      j,\n      sums = series.map(sum),\n      order = appearance(series),\n      top = 0,\n      bottom = 0,\n      tops = [],\n      bottoms = [];\n\n  for (i = 0; i < n; ++i) {\n    j = order[i];\n    if (top < bottom) {\n      top += sums[j];\n      tops.push(j);\n    } else {\n      bottom += sums[j];\n      bottoms.push(j);\n    }\n  }\n\n  return bottoms.reverse().concat(tops);\n}\n","import none from \"./none.js\";\n\nexport default function(series) {\n  return none(series).reverse();\n}\n","import stack from './stack';\n\nexport default function extract(dataConfig, data = {}, opts = {}) {\n  let extracted = {\n    // items: [],\n    // fields: [],\n    // source: null,\n    // value: null,\n    // label: null,\n    // children: null,\n    // root: null,\n    // graph: null\n  };\n\n  const logger = opts.logger;\n\n  if (Array.isArray(dataConfig)) {\n    // if data is an array, assume it's manual data input -> normalize\n    extracted.items = dataConfig.map((v) => ({ value: v, label: String(v) }));\n  } else if (dataConfig) {\n    if ('collection' in dataConfig) {\n      extracted = { ...data.collection(dataConfig.collection) };\n    } else {\n      const source = data.dataset ? data.dataset(dataConfig.source) : null;\n      let valueFn = dataConfig.value || ((d) => d);\n      let labelFn = dataConfig.label || ((d) => d);\n      if (dataConfig.groupBy || dataConfig.mapTo) {\n        // DEPRECATION\n        logger.warn('Deprecated \"data\" configuration', dataConfig);\n        extracted.items = [];\n      } else if (dataConfig.hierarchy) {\n        extracted.root = source.hierarchy ? source.hierarchy(dataConfig.hierarchy) : null;\n        extracted.fields = source.fields();\n      } else if (dataConfig.items) {\n        extracted.items = dataConfig.items.map((v) => ({ value: valueFn(v), label: String(labelFn(v)) }));\n      } else if (dataConfig.extract) {\n        const extractionsConfigs = Array.isArray(dataConfig.extract) ? dataConfig.extract : [dataConfig.extract];\n        extracted.items = [];\n        const sourceFields = [];\n        extractionsConfigs.forEach((cfg) => {\n          const s = cfg.source ? data.dataset(cfg.source) : source;\n          if (!s) {\n            return;\n          }\n          extracted.items.push(...s.extract(cfg));\n          if (typeof cfg.field !== 'undefined') {\n            sourceFields.push(s.field(cfg.field));\n          }\n        });\n        if (sourceFields.length) {\n          extracted.fields = sourceFields;\n        }\n        if (dataConfig.amend && Array.isArray(dataConfig.amend)) {\n          extracted.items.push(...dataConfig.amend);\n        }\n      } else if (typeof dataConfig.field !== 'undefined' && source) {\n        const f = source.field(dataConfig.field);\n        if (f) {\n          if (!extracted.fields) {\n            extracted.fields = [];\n          }\n          extracted.fields.push(f);\n          if (!('value' in dataConfig)) {\n            valueFn = f.value || ((v) => v);\n            labelFn = f.label || ((v) => v);\n            extracted.value = valueFn;\n          }\n          extracted.items = f\n            .items()\n            .map((v) => ({ value: valueFn(v), label: String(labelFn(v)), source: { field: dataConfig.field } }));\n          // TODO - add source: { key: dataConfig.source, field: dataConfig.field, data: v }\n        }\n      } else if (dataConfig.fields) {\n        dataConfig.fields.forEach((obj) => {\n          const s = typeof obj === 'object' && obj.source ? data.dataset(obj.source) : source;\n          if (!s) {\n            return;\n          }\n          let f;\n          if (typeof obj === 'object' && typeof obj.field !== 'undefined') {\n            f = s.field(obj.field);\n          } else {\n            f = s.field(obj);\n          }\n          if (f) {\n            if (!extracted.fields) {\n              extracted.fields = [];\n            }\n            extracted.fields.push(f);\n          }\n        });\n      }\n\n      if (extracted.items && dataConfig.map) {\n        extracted.items = extracted.items.map(dataConfig.map);\n      }\n    }\n\n    if (dataConfig && dataConfig.stack) {\n      stack(extracted, dataConfig.stack, data.dataset);\n    }\n  }\n  if (dataConfig && !Array.isArray(dataConfig) && typeof dataConfig.filter === 'function' && extracted.items) {\n    extracted.items = extracted.items.filter(dataConfig.filter);\n  }\n  if (dataConfig && !Array.isArray(dataConfig) && typeof dataConfig.sort === 'function' && extracted.items) {\n    extracted.items = extracted.items.sort(dataConfig.sort);\n  }\n  return extracted;\n}\n","import extractData from '../../data/extractor';\n\nexport function create(options, data, deps, extractor = extractData) {\n  if (options.data) {\n    const d = extractor(options.data, data, deps);\n    if (d && d.fields && d.fields[0]) {\n      // TODO Have some magic to handle and merge formatters from multiple sources\n      return d.fields[0].formatter();\n    }\n  }\n\n  let formatterType;\n  if (options.formatter) {\n    formatterType = `${options.formatter}-${options.type || 'number'}`;\n  } else {\n    formatterType = options.type || 'd3-number';\n  }\n\n  if (deps.formatter.has(formatterType)) {\n    const f = deps.formatter.get(formatterType)(options.format || '');\n    return f;\n  }\n\n  throw new Error(`Formatter of type '${formatterType}' was not found`);\n}\n\nexport function collection(formattersConfig, data, deps, fn = create) {\n  const formatters = {};\n  return {\n    get(def) {\n      let key;\n      if (typeof def === 'string' && formattersConfig[def]) {\n        key = def;\n      } else if (typeof def === 'object' && 'formatter' in def && formattersConfig[def.formatter]) {\n        key = def.formatter;\n      } else if (typeof def === 'object' && 'type' in def && formattersConfig[def.type]) {\n        key = def.type;\n      }\n\n      if (key) {\n        formatters[key] = formatters[key] || fn(formattersConfig[key], data, deps);\n        return formatters[key];\n      }\n\n      return fn(def || {}, data, deps);\n    },\n    all() {\n      Object.keys(formattersConfig).forEach(this.get);\n      return formatters;\n    },\n  };\n}\n","export default function(a, b) {\n  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n  if (compare.length === 1) compare = ascendingComparator(compare);\n  return {\n    left: function(a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) < 0) lo = mid + 1;\n        else hi = mid;\n      }\n      return lo;\n    },\n    right: function(a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) > 0) hi = mid;\n        else lo = mid + 1;\n      }\n      return lo;\n    }\n  };\n}\n\nfunction ascendingComparator(f) {\n  return function(d, x) {\n    return ascending(f(d), x);\n  };\n}\n","var e10 = Math.sqrt(50),\n    e5 = Math.sqrt(10),\n    e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n  var reverse,\n      i = -1,\n      n,\n      ticks,\n      step;\n\n  stop = +stop, start = +start, count = +count;\n  if (start === stop && count > 0) return [start];\n  if (reverse = stop < start) n = start, start = stop, stop = n;\n  if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n  if (step > 0) {\n    start = Math.ceil(start / step);\n    stop = Math.floor(stop / step);\n    ticks = new Array(n = Math.ceil(stop - start + 1));\n    while (++i < n) ticks[i] = (start + i) * step;\n  } else {\n    start = Math.floor(start * step);\n    stop = Math.ceil(stop * step);\n    ticks = new Array(n = Math.ceil(start - stop + 1));\n    while (++i < n) ticks[i] = (start - i) / step;\n  }\n\n  if (reverse) ticks.reverse();\n\n  return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n  var step = (stop - start) / Math.max(0, count),\n      power = Math.floor(Math.log(step) / Math.LN10),\n      error = step / Math.pow(10, power);\n  return power >= 0\n      ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n      : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n  var step0 = Math.abs(stop - start) / Math.max(0, count),\n      step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n      error = step0 / step1;\n  if (error >= e10) step1 *= 10;\n  else if (error >= e5) step1 *= 5;\n  else if (error >= e2) step1 *= 2;\n  return stop < start ? -step1 : step1;\n}\n","export function initRange(domain, range) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.range(domain); break;\n    default: this.range(range).domain(domain); break;\n  }\n  return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.interpolator(domain); break;\n    default: this.interpolator(interpolator).domain(domain); break;\n  }\n  return this;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n  constructor: Map,\n  has: function(key) {\n    return (prefix + key) in this;\n  },\n  get: function(key) {\n    return this[prefix + key];\n  },\n  set: function(key, value) {\n    this[prefix + key] = value;\n    return this;\n  },\n  remove: function(key) {\n    var property = prefix + key;\n    return property in this && delete this[property];\n  },\n  clear: function() {\n    for (var property in this) if (property[0] === prefix) delete this[property];\n  },\n  keys: function() {\n    var keys = [];\n    for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n    return keys;\n  },\n  values: function() {\n    var values = [];\n    for (var property in this) if (property[0] === prefix) values.push(this[property]);\n    return values;\n  },\n  entries: function() {\n    var entries = [];\n    for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n    return entries;\n  },\n  size: function() {\n    var size = 0;\n    for (var property in this) if (property[0] === prefix) ++size;\n    return size;\n  },\n  empty: function() {\n    for (var property in this) if (property[0] === prefix) return false;\n    return true;\n  },\n  each: function(f) {\n    for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n  }\n};\n\nfunction map(object, f) {\n  var map = new Map;\n\n  // Copy constructor.\n  if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n  // Index array by numeric index or specified key function.\n  else if (Array.isArray(object)) {\n    var i = -1,\n        n = object.length,\n        o;\n\n    if (f == null) while (++i < n) map.set(i, object[i]);\n    else while (++i < n) map.set(f(o = object[i], i, object), o);\n  }\n\n  // Convert object to map.\n  else if (object) for (var key in object) map.set(key, object[key]);\n\n  return map;\n}\n\nexport default map;\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n  constructor: Set,\n  has: proto.has,\n  add: function(value) {\n    value += \"\";\n    this[prefix + value] = value;\n    return this;\n  },\n  remove: proto.remove,\n  clear: proto.clear,\n  values: proto.keys,\n  size: proto.size,\n  empty: proto.empty,\n  each: proto.each\n};\n\nfunction set(object, f) {\n  var set = new Set;\n\n  // Copy constructor.\n  if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n  // Otherwise, assume it’s an array.\n  else if (object) {\n    var i = -1, n = object.length;\n    if (f == null) while (++i < n) set.add(object[i]);\n    else while (++i < n) set.add(f(object[i], i, object));\n  }\n\n  return set;\n}\n\nexport default set;\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","import {map} from \"d3-collection\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport var implicit = {name: \"implicit\"};\n\nexport default function ordinal() {\n  var index = map(),\n      domain = [],\n      range = [],\n      unknown = implicit;\n\n  function scale(d) {\n    var key = d + \"\", i = index.get(key);\n    if (!i) {\n      if (unknown !== implicit) return unknown;\n      index.set(key, i = domain.push(d));\n    }\n    return range[(i - 1) % range.length];\n  }\n\n  scale.domain = function(_) {\n    if (!arguments.length) return domain.slice();\n    domain = [], index = map();\n    var i = -1, n = _.length, d, key;\n    while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\n    return scale;\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), scale) : range.slice();\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function() {\n    return ordinal(domain, range).unknown(unknown);\n  };\n\n  initRange.apply(scale, arguments);\n\n  return scale;\n}\n","import {range as sequence} from \"d3-array\";\nimport {initRange} from \"./init\";\nimport ordinal from \"./ordinal\";\n\nexport default function band() {\n  var scale = ordinal().unknown(undefined),\n      domain = scale.domain,\n      ordinalRange = scale.range,\n      range = [0, 1],\n      step,\n      bandwidth,\n      round = false,\n      paddingInner = 0,\n      paddingOuter = 0,\n      align = 0.5;\n\n  delete scale.unknown;\n\n  function rescale() {\n    var n = domain().length,\n        reverse = range[1] < range[0],\n        start = range[reverse - 0],\n        stop = range[1 - reverse];\n    step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n    if (round) step = Math.floor(step);\n    start += (stop - start - step * (n - paddingInner)) * align;\n    bandwidth = step * (1 - paddingInner);\n    if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n    var values = sequence(n).map(function(i) { return start + step * i; });\n    return ordinalRange(reverse ? values.reverse() : values);\n  }\n\n  scale.domain = function(_) {\n    return arguments.length ? (domain(_), rescale()) : domain();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\n  };\n\n  scale.rangeRound = function(_) {\n    return range = [+_[0], +_[1]], round = true, rescale();\n  };\n\n  scale.bandwidth = function() {\n    return bandwidth;\n  };\n\n  scale.step = function() {\n    return step;\n  };\n\n  scale.round = function(_) {\n    return arguments.length ? (round = !!_, rescale()) : round;\n  };\n\n  scale.padding = function(_) {\n    return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n  };\n\n  scale.paddingInner = function(_) {\n    return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n  };\n\n  scale.paddingOuter = function(_) {\n    return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n  };\n\n  scale.align = function(_) {\n    return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n  };\n\n  scale.copy = function() {\n    return band(domain(), range)\n        .round(round)\n        .paddingInner(paddingInner)\n        .paddingOuter(paddingOuter)\n        .align(align);\n  };\n\n  return initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n  var copy = scale.copy;\n\n  scale.padding = scale.paddingOuter;\n  delete scale.paddingInner;\n  delete scale.paddingOuter;\n\n  scale.copy = function() {\n    return pointish(copy());\n  };\n\n  return scale;\n}\n\nexport function point() {\n  return pointish(band.apply(null, arguments).paddingInner(1));\n}\n","export default function(start, stop, step) {\n  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n  var i = -1,\n      n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n      range = new Array(n);\n\n  while (++i < n) {\n    range[i] = start + i * step;\n  }\n\n  return range;\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 default function(x) {\n  return function() {\n    return x;\n  };\n}\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","export default function(a, b) {\n  if (!b) b = [];\n  var n = a ? Math.min(b.length, a.length) : 0,\n      c = b.slice(),\n      i;\n  return function(t) {\n    for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n    return c;\n  };\n}\n\nexport function isNumberArray(x) {\n  return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n  var nb = b ? b.length : 0,\n      na = a ? Math.min(nb, a.length) : 0,\n      x = new Array(na),\n      c = new Array(nb),\n      i;\n\n  for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n  for (; i < nb; ++i) c[i] = b[i];\n\n  return function(t) {\n    for (i = 0; i < na; ++i) c[i] = x[i](t);\n    return c;\n  };\n}\n","export default function(a, b) {\n  var d = new Date;\n  return a = +a, b = +b, function(t) {\n    return d.setTime(a * (1 - t) + b * t), d;\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","import value from \"./value.js\";\n\nexport default function(a, b) {\n  var i = {},\n      c = {},\n      k;\n\n  if (a === null || typeof a !== \"object\") a = {};\n  if (b === null || typeof b !== \"object\") b = {};\n\n  for (k in b) {\n    if (k in a) {\n      i[k] = value(a[k], b[k]);\n    } else {\n      c[k] = b[k];\n    }\n  }\n\n  return function(t) {\n    for (k in i) c[k] = i[k](t);\n    return c;\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 rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  var t = typeof b, c;\n  return b == null || t === \"boolean\" ? constant(b)\n      : (t === \"number\" ? number\n      : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n      : b instanceof color ? rgb\n      : b instanceof Date ? date\n      : isNumberArray(b) ? numberArray\n      : Array.isArray(b) ? genericArray\n      : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n      : number)(a, b);\n}\n","export default function(a, b) {\n  return a = +a, b = +b, function(t) {\n    return Math.round(a * (1 - t) + b * t);\n  };\n}\n","export default function(x) {\n  return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n  return x;\n}\n\nfunction normalize(a, b) {\n  return (b -= (a = +a))\n      ? function(x) { return (x - a) / b; }\n      : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(domain) {\n  var a = domain[0], b = domain[domain.length - 1], t;\n  if (a > b) t = a, a = b, b = t;\n  return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n  var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n  else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n  return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n  var j = Math.min(domain.length, range.length) - 1,\n      d = new Array(j),\n      r = new Array(j),\n      i = -1;\n\n  // Reverse descending domains.\n  if (domain[j] < domain[0]) {\n    domain = domain.slice().reverse();\n    range = range.slice().reverse();\n  }\n\n  while (++i < j) {\n    d[i] = normalize(domain[i], domain[i + 1]);\n    r[i] = interpolate(range[i], range[i + 1]);\n  }\n\n  return function(x) {\n    var i = bisect(domain, x, 1, j) - 1;\n    return r[i](d[i](x));\n  };\n}\n\nexport function copy(source, target) {\n  return target\n      .domain(source.domain())\n      .range(source.range())\n      .interpolate(source.interpolate())\n      .clamp(source.clamp())\n      .unknown(source.unknown());\n}\n\nexport function transformer() {\n  var domain = unit,\n      range = unit,\n      interpolate = interpolateValue,\n      transform,\n      untransform,\n      unknown,\n      clamp = identity,\n      piecewise,\n      output,\n      input;\n\n  function rescale() {\n    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n    output = input = null;\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n  }\n\n  scale.invert = function(y) {\n    return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n  };\n\n  scale.domain = function(_) {\n    return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n  };\n\n  scale.rangeRound = function(_) {\n    return range = slice.call(_), interpolate = interpolateRound, rescale();\n  };\n\n  scale.clamp = function(_) {\n    return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;\n  };\n\n  scale.interpolate = function(_) {\n    return arguments.length ? (interpolate = _, rescale()) : interpolate;\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function(t, u) {\n    transform = t, untransform = u;\n    return rescale();\n  };\n}\n\nexport default function continuous(transform, untransform) {\n  return transformer()(transform, untransform);\n}\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(start, stop, count, specifier) {\n  var step = tickStep(start, stop, count),\n      precision;\n  specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n  switch (specifier.type) {\n    case \"s\": {\n      var value = Math.max(Math.abs(start), Math.abs(stop));\n      if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n      return formatPrefix(specifier, value);\n    }\n    case \"\":\n    case \"e\":\n    case \"g\":\n    case \"p\":\n    case \"r\": {\n      if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n      break;\n    }\n    case \"f\":\n    case \"%\": {\n      if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n      break;\n    }\n  }\n  return format(specifier);\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n  return Math.max(0, -exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n  var domain = scale.domain;\n\n  scale.ticks = function(count) {\n    var d = domain();\n    return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n  };\n\n  scale.tickFormat = function(count, specifier) {\n    var d = domain();\n    return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n  };\n\n  scale.nice = function(count) {\n    if (count == null) count = 10;\n\n    var d = domain(),\n        i0 = 0,\n        i1 = d.length - 1,\n        start = d[i0],\n        stop = d[i1],\n        step;\n\n    if (stop < start) {\n      step = start, start = stop, stop = step;\n      step = i0, i0 = i1, i1 = step;\n    }\n\n    step = tickIncrement(start, stop, count);\n\n    if (step > 0) {\n      start = Math.floor(start / step) * step;\n      stop = Math.ceil(stop / step) * step;\n      step = tickIncrement(start, stop, count);\n    } else if (step < 0) {\n      start = Math.ceil(start * step) / step;\n      stop = Math.floor(stop * step) / step;\n      step = tickIncrement(start, stop, count);\n    }\n\n    if (step > 0) {\n      d[i0] = Math.floor(start / step) * step;\n      d[i1] = Math.ceil(stop / step) * step;\n      domain(d);\n    } else if (step < 0) {\n      d[i0] = Math.ceil(start * step) / step;\n      d[i1] = Math.floor(stop * step) / step;\n      domain(d);\n    }\n\n    return scale;\n  };\n\n  return scale;\n}\n\nexport default function linear() {\n  var scale = continuous(identity, identity);\n\n  scale.copy = function() {\n    return copy(scale, linear());\n  };\n\n  initRange.apply(scale, arguments);\n\n  return linearish(scale);\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport default function threshold() {\n  var domain = [0.5],\n      range = [0, 1],\n      unknown,\n      n = 1;\n\n  function scale(x) {\n    return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n  }\n\n  scale.domain = function(_) {\n    return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n  };\n\n  scale.invertExtent = function(y) {\n    var i = range.indexOf(y);\n    return [domain[i - 1], domain[i]];\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function() {\n    return threshold()\n        .domain(domain)\n        .range(range)\n        .unknown(unknown);\n  };\n\n  return initRange.apply(scale, arguments);\n}\n","import { notNumber } from '../../utils/is-number';\n\nfunction applyFormat(formatter) {\n  return typeof formatter === 'undefined' ? (t) => t : (t) => formatter(t);\n}\n\nfunction clamp(val) {\n  return Math.max(0, Math.min(1, val));\n}\n\nfunction isObject(obj) {\n  return typeof obj === 'object';\n}\n\nfunction minorTicksGenerator(count, start, end) {\n  const r = Math.abs(start - end);\n  const interval = r / (count + 1);\n  const ticks = [];\n  for (let i = 1; i <= count; i++) {\n    const v = i * interval;\n    ticks.push(start < end ? start + v : start - v);\n  }\n  return ticks;\n}\n\nfunction appendMinorTicks(majorTicks, minorCount, scale) {\n  if (majorTicks.length === 1) {\n    return majorTicks;\n  }\n\n  const ticks = majorTicks.concat([]);\n\n  for (let i = 0; i < majorTicks.length; i++) {\n    let start = majorTicks[i];\n    let end = majorTicks[i + 1];\n\n    if (i === 0 && start !== scale.start()) {\n      // Before and after first major tick\n      ticks.push(...minorTicksGenerator(minorCount, start, end));\n      start -= end - start;\n      end = majorTicks[i];\n      ticks.push(...minorTicksGenerator(minorCount, start, end));\n    } else if (i === majorTicks.length - 1 && end !== scale.end()) {\n      // After last major tick\n      end = start + (start - majorTicks[i - 1]);\n      ticks.push(...minorTicksGenerator(minorCount, start, end));\n    } else {\n      ticks.push(...minorTicksGenerator(minorCount, start, end));\n    }\n  }\n\n  return ticks.filter((t) => t >= scale.min() && t <= scale.max());\n}\n\n/**\n * Generate ticks based on a distance, for each 100th unit, one additional tick may be added\n * @private\n * @param  {Number} distance       Distance between each tick\n * @param  {Number} scale         The scale instance\n * @param  {Number} [minorCount=0]     Number of tick added between each distance\n * @param  {Number} [unitDivider=100]   Number to divide distance with\n * @return {Array}               Array of ticks\n */\nexport function looseDistanceBasedGenerator({\n  distance,\n  scale,\n  minorCount = 0,\n  unitDivider = 100,\n  formatter = undefined,\n}) {\n  const step = !notNumber(unitDivider) && !notNumber(distance) ? Math.max(distance / unitDivider, 2) : 2;\n  const count = Math.min(1000, Math.round(step)); // safe guard against huge numbers\n  let majorTicks = scale.ticks(count);\n  if (majorTicks.length <= 1) {\n    majorTicks = scale.ticks(count + 1);\n  }\n\n  const ticks = minorCount > 0 ? appendMinorTicks(majorTicks, minorCount, scale) : majorTicks;\n  ticks.sort((a, b) => a - b);\n\n  const ticksFormatted = ticks.map(applyFormat(formatter));\n\n  return ticks.map((tick, i) => {\n    const position = scale(tick);\n    return {\n      position,\n      start: position,\n      end: position,\n      label: ticksFormatted[i],\n      value: tick,\n      isMinor: majorTicks.indexOf(tick) === -1,\n    };\n  });\n}\n\n/**\n * Generate ticks based on a distance, for each 100th unit, one additional tick may be added.\n * Will attempt to round the bounds of domain to even values and generate ticks hitting the domain bounds.\n * @private\n * @param  {Number} distance       Distance between each tick\n * @param  {Number} scale         The scale instance\n * @param  {Number} [minorCount=0]     Number of tick added between each distance\n * @param  {Number} [unitDivider=100]   Number to divide distance with\n * @return {Array}               Array of ticks\n */\nexport function tightDistanceBasedGenerator({\n  distance,\n  scale,\n  minorCount = 0,\n  unitDivider = 100,\n  formatter = undefined,\n}) {\n  const step = !notNumber(unitDivider) && !notNumber(distance) ? Math.max(distance / unitDivider, 2) : 2;\n  const count = Math.min(1000, Math.round(step)); // safe guard against huge numbers\n  const n = count > 10 ? 10 : count;\n  scale.nice(n);\n\n  const majorTicks = scale.ticks(count);\n  const ticks = minorCount > 0 ? appendMinorTicks(majorTicks, minorCount, scale) : majorTicks;\n  ticks.sort((a, b) => a - b);\n\n  const ticksFormatted = ticks.map(applyFormat(formatter));\n\n  return ticks.map((tick, i) => {\n    const position = scale(tick);\n    return {\n      position,\n      start: position,\n      end: position,\n      label: ticksFormatted[i],\n      value: tick,\n      isMinor: majorTicks.indexOf(tick) === -1,\n    };\n  });\n}\n\nfunction ticksByCount({ count, minorCount, scale, formatter }) {\n  return scale.ticks((count - 1) * minorCount + count).map((tick, i) => {\n    const position = scale(tick);\n    return {\n      position,\n      start: position,\n      end: position,\n      label: formatter(tick),\n      isMinor: i % (minorCount + 1) !== 0,\n      value: tick,\n    };\n  });\n}\n\nfunction ticksByValue({ values, scale, formatter = (v) => v }) {\n  return values\n    .sort((a, b) => (isObject(a) ? a.value : a) - (isObject(b) ? b.value : b))\n    .filter((v, i, ary) => {\n      const val = isObject(v) ? v.value : v;\n      return val <= scale.max() && val >= scale.min() && ary.indexOf(v) === i;\n    })\n    .map((v) => {\n      const isObj = isObject(v);\n      const value = isObj ? v.value : v;\n      const position = scale(value);\n      return {\n        position,\n        value,\n        label: isObj && typeof v.label !== 'undefined' ? v.label : formatter(value),\n        isMinor: isObj ? !!v.isMinor : false,\n        start: isObj && !isNaN(v.start) ? clamp(scale(v.start)) : position, // TODOHandle end < start?\n        end: isObj && !isNaN(v.end) ? clamp(scale(v.end)) : position, // TODO Handle start > end?\n      };\n    });\n}\n\nfunction forceTicksAtBounds(ticks, scale, formatter) {\n  const ticksP = ticks.map((t) => t.position);\n  const range = scale.range();\n\n  if (ticksP.indexOf(range[0]) === -1) {\n    ticks.splice(0, 0, {\n      position: range[0],\n      start: range[0],\n      end: range[0],\n      label: formatter(scale.start()),\n      isMinor: false,\n      value: scale.start(),\n    });\n  } else if (ticks[0] && ticks[0].isMinor) {\n    ticks[0].isMinor = false; // Convert to major tick\n  }\n\n  const lastTick = ticks[ticks.length - 1];\n  if (ticksP.indexOf(range[1]) === -1) {\n    ticks.push({\n      position: range[1],\n      start: range[1],\n      end: range[1],\n      label: formatter(scale.end()),\n      isMinor: false,\n      value: scale.end(),\n    });\n  } else if (lastTick && lastTick.isMinor) {\n    lastTick.isMinor = false; // Convert to major tick\n  }\n}\n\nexport function generateContinuousTicks({ settings, scale, distance, formatter = (val) => val }) {\n  let ticks;\n  const minorCount =\n    settings.minorTicks && !notNumber(settings.minorTicks.count) ? Math.min(100, settings.minorTicks.count) : 0;\n\n  if (Array.isArray(settings.ticks.values)) {\n    const values = settings.ticks.values.filter((v) => (typeof v === 'object' ? !notNumber(v.value) : !notNumber(v)));\n    ticks = ticksByValue({ values, scale: scale.copy(), formatter });\n  } else if (!notNumber(settings.ticks.count)) {\n    const count = Math.min(1000, settings.ticks.count);\n    ticks = ticksByCount({\n      count,\n      minorCount,\n      scale: scale.copy(),\n      formatter,\n    });\n  } else {\n    const tickGen = settings.ticks.tight ? tightDistanceBasedGenerator : looseDistanceBasedGenerator;\n    ticks = tickGen({\n      distance,\n      minorCount,\n      unitDivider: settings.ticks.distance,\n      scale,\n      formatter,\n    });\n\n    if (settings.ticks.forceBounds) {\n      forceTicksAtBounds(ticks, scale, formatter);\n    }\n  }\n\n  return ticks;\n}\n\nexport function generateDiscreteTicks({ scale }) {\n  const domain = scale.domain();\n  const values = domain;\n  const dataItems = scale.data().items;\n  const labels = scale.labels ? scale.labels() : values;\n  const bandwidth = scale.bandwidth();\n\n  return values.map((d, i) => {\n    const start = scale(d);\n    return {\n      position: start + bandwidth / 2,\n      label: `${labels[i]}`,\n      data: dataItems ? dataItems[i] : undefined,\n      start,\n      end: start + bandwidth,\n    };\n  });\n}\n","export default function resolveSettings(settings = {}, defaultSettings = {}, context = {}) {\n  const stngs = {};\n\n  Object.keys(defaultSettings).forEach((key) => {\n    const type = typeof settings[key];\n\n    if (type === 'function') {\n      stngs[key] = settings[key](context);\n    } else if (type === 'undefined') {\n      stngs[key] = defaultSettings[key];\n    } else {\n      stngs[key] = settings[key];\n    }\n  });\n\n  return stngs;\n}\n","import { scaleLinear as d3ScaleLinear } from 'd3-scale';\nimport extend from 'extend';\n\nimport { notNumber } from '../utils/is-number';\nimport { generateContinuousTicks } from './ticks/tick-generators';\nimport resolveSettings from './settings-resolver';\n\nexport const DEFAULT_SETTINGS = {\n  min: NaN,\n  max: NaN,\n  expand: NaN,\n  include: [],\n  invert: false,\n};\n\nexport const DEFAULT_TICKS_SETTINGS = {\n  tight: false,\n  forceBounds: false,\n  values: undefined,\n  count: NaN,\n  distance: 100,\n};\n\nexport const DEFAULT_MINORTICKS_SETTINGS = {\n  count: NaN,\n};\n\n/**\n * @typedef {object} ScaleLinear\n * @property {string} [type='linear']\n * @property {number} [expand] - Expand the output range\n * @property {boolean} [invert=false] - Invert the output range\n * @property {number[]} [include] - Include specified numbers in the output range\n * @property {object} [ticks]\n * @property {boolean} [ticks.tight = false]\n * @property {boolean} [ticks.forceBounds = false]\n * @property {number} [ticks.distance = 100]  - Approximate distance between each tick\n * @property {number[]|object[]} [ticks.values] - If set, ticks are no longer generated but instead equal to this set\n * @property {number} [ticks.count]\n * @property {object} [minorTicks]\n * @property {number} [minorTicks.count = 3]\n * @property {number} [min] - Set an explicit minimum value\n * @property {number} [max] - Set an explicit maximum value\n */\n\nfunction getMinMax(settings, fields) {\n  const min = +settings.min;\n  const max = +settings.max;\n  let fieldMin = 0;\n  let fieldMax = 1;\n  if (fields && fields[0]) {\n    const minValues = fields.map((m) => m.min()).filter((v) => !isNaN(v));\n    const maxValues = fields.map((m) => m.max()).filter((v) => !isNaN(v));\n    fieldMin = minValues.length ? Math.min(...minValues) : Number.NaN;\n    fieldMax = maxValues.length ? Math.max(...maxValues) : Number.NaN;\n\n    if (isNaN(fieldMin) || isNaN(fieldMax)) {\n      fieldMin = -1;\n      fieldMax = 1;\n    } else if (fieldMin === fieldMax && fieldMin === 0) {\n      fieldMin = -1;\n      fieldMax = 1;\n    } else if (fieldMin === fieldMax && fieldMin) {\n      fieldMin -= Math.abs(fieldMin * 0.1);\n      fieldMax += Math.abs(fieldMax * 0.1);\n    } else if (!isNaN(settings.expand)) {\n      const range = fieldMax - fieldMin;\n      fieldMin -= range * settings.expand;\n      fieldMax += range * settings.expand;\n    }\n\n    if (Array.isArray(settings.include)) {\n      const i = settings.include.filter((n) => !isNaN(n));\n      fieldMin = Math.min(...i, fieldMin);\n      fieldMax = Math.max(...i, fieldMax);\n    }\n  }\n\n  return {\n    mini: !isNaN(min) ? min : fieldMin,\n    maxi: !isNaN(max) ? max : fieldMax,\n  };\n}\n\nfunction initNormScale(normScale, scale) {\n  if (normScale.instance) {\n    return;\n  }\n  normScale.instance = scale.copy();\n  normScale.instance.domain([scale.start(), scale.end()]);\n  normScale.instance.clamp(true);\n  normScale.instance.range(normScale.invert ? [1, 0] : [0, 1]);\n}\n/**\n * @alias scaleLinear\n * @private\n * @param { object } settings\n * @param { field[] } [fields]\n * @return { linear }\n */\n\nexport default function scaleLinear(settings = {}, data = {}, resources = {}) {\n  const d3Scale = d3ScaleLinear();\n  const normScale = { instance: null, invert: false };\n  const ctx = { data, resources };\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, ctx);\n  stgns.ticks = resolveSettings(settings.ticks, DEFAULT_TICKS_SETTINGS, ctx);\n  stgns.minorTicks = resolveSettings(settings.minorTicks, DEFAULT_MINORTICKS_SETTINGS, ctx);\n  let tickCache;\n\n  /**\n   * @alias linear\n   * @private\n   * @param { Object } value\n   * @return { number }\n   */\n  function fn(v) {\n    if (notNumber(v)) {\n      return NaN;\n    }\n    return d3Scale(v);\n  }\n\n  fn.data = () => data;\n\n  /**\n   * {@link https://github.com/d3/d3-scale#continuous_invert }\n   * @param { number } value The inverted value\n   * @return { number } The inverted scaled value\n   */\n  fn.invert = function invert(value) {\n    return d3Scale.invert(value);\n  };\n\n  /**\n   * {@link https://github.com/d3/d3-scale#continuous_rangeRound }\n   * @param { number[] } values Range values\n   * @return { linear } The instance this method was called on\n   */\n  fn.rangeRound = function rangeRound(values) {\n    d3Scale.rangeRound(values);\n    return fn;\n  };\n\n  /**\n   * {@link https://github.com/d3/d3-scale#continuous_clamp }\n   * @param { boolean } [ value=true ] TRUE if clamping should be enabled\n   * @return { linear } The instance this method was called on\n   */\n  fn.clamp = function clamp(value = true) {\n    d3Scale.clamp(value);\n    return fn;\n  };\n\n  /**\n   * Get cached ticks (if any)\n   * @return { number | undefined }\n   */\n  fn.cachedTicks = function fnCachedTicks() {\n    return tickCache;\n  };\n\n  /**\n   * Clear the tick cache\n   * @return {number | undefined}\n   */\n  fn.clearTicksCache = function fnClearTicks() {\n    tickCache = undefined;\n    return this;\n  };\n\n  /**\n   * {@link https://github.com/d3/d3-scale#continuous_ticks }\n   * @param { Object } input Number of ticks to generate or an object passed to tick generator\n   * @return { number[] | Object } Array of ticks or any type the custom tick generator returns\n   */\n  fn.ticks = function ticks(input) {\n    if (input !== null && typeof input === 'object') {\n      input.settings = input.settings || {};\n      // TODO Discontinue support for custom ticks settings as argument\n      input.settings = extend(true, {}, stgns, input.settings);\n      input.scale = fn;\n      tickCache = generateContinuousTicks(input);\n      return tickCache;\n    }\n\n    tickCache = d3Scale.ticks(input);\n    return tickCache;\n  };\n\n  /**\n   * {@link https://github.com/d3/d3-scale#continuous_nice }\n   * @param { number } count\n   * @return { linear } The instance this method was called on\n   */\n  fn.nice = function nice(count) {\n    d3Scale.nice(count);\n\n    return fn;\n  };\n\n  // TODO Support this?\n  fn.tickFormat = function tickFormat(count, format) {\n    return d3Scale.tickFormat(count, format);\n  };\n\n  // TODO Support this?\n  fn.interpolate = function interpolate(func) {\n    d3Scale.interpolate(func);\n    return fn;\n  };\n\n  /**\n   * @param { number[] } [values] Set or Get domain values\n   * @return { linear | Number[] } The instance this method was called on if a parameter is provided, otherwise the current domain is returned\n   */\n  fn.domain = function domain(values) {\n    if (arguments.length) {\n      d3Scale.domain(values);\n      if (normScale.instance) {\n        normScale.instance.domain([fn.start(), fn.end()]);\n      }\n      return fn;\n    }\n    return d3Scale.domain();\n  };\n\n  /**\n   * @param { number[] } [values] Set or Get range values\n   * @return { linear | number[] } The instance this method was called on if a parameter is provided, otherwise the current range is returned\n   */\n  fn.range = function range(values) {\n    if (arguments.length) {\n      d3Scale.range(values);\n\n      return fn;\n    }\n    return d3Scale.range();\n  };\n\n  /**\n   * Get the first value of the domain\n   * @return { number }\n   */\n  fn.start = function start() {\n    return fn.domain()[0];\n  };\n\n  /**\n   * Get the last value of the domain\n   * @return { number }\n   */\n  fn.end = function end() {\n    return fn.domain()[this.domain().length - 1];\n  };\n\n  /**\n   * Get the minimum value of the domain\n   * @return { number }\n   */\n  fn.min = function min() {\n    return Math.min(this.start(), this.end());\n  };\n\n  /**\n   * Get the maximum value of the domain\n   * @return { number }\n   */\n  fn.max = function max() {\n    return Math.max(this.start(), this.end());\n  };\n\n  /**\n   * Divides the domain and range into uniform segments, based on start and end value\n   * @param  { number } segments The number of segments\n   * @return { function } The instance this method was called on\n   * @example\n   * let s = linear();\n   * s.domain([0, 10]);\n   * s.range([0, 1]);\n   * s.classify( 2 );\n   * s.domain(); // [10, 5, 5, 0]\n   * s.range(); // [0.75, 0.75, 0.25, 0.25]\n   */\n  fn.classify = function classify(segments) {\n    let valueRange = (fn.start() - fn.end()) / segments,\n      domain = [fn.end()],\n      range = [],\n      samplePos = valueRange / 2;\n\n    for (let i = 0; i < segments; i++) {\n      let lastVal = domain[domain.length - 1] || 0,\n        calIntervalPos = lastVal + valueRange,\n        calSamplePos = lastVal + samplePos,\n        sampleColValue = fn(calSamplePos);\n\n      domain.push(...[calIntervalPos, calIntervalPos]);\n      range.push(...[sampleColValue, sampleColValue]);\n    }\n    domain.pop();\n    fn.domain(domain);\n    fn.range(range);\n\n    return fn;\n  };\n\n  fn.copy = function copy() {\n    const cop = scaleLinear(settings, data, resources);\n    cop.domain(fn.domain());\n    cop.range(fn.range());\n    cop.clamp(d3Scale.clamp());\n    return cop;\n  };\n\n  /**\n   * @param {number} d - A domain value\n   * @return {number} A normalized range output given in range 0-1\n   * @example\n   * const scale = scaleLinear().domain([0, 10]).range([0, 10000]);\n   * scale.norm(5); // Returns 0.5\n   * scale(5); // Returns 5000\n   *\n   * scale.domain([0, 2, 10]);\n   * scale.norm(5); // Returns 0.5\n   */\n  fn.norm = function norm(d) {\n    initNormScale(normScale, fn);\n\n    return normScale.instance(d);\n  };\n\n  /**\n   * @param {number} d - A normalized value in range 0-1\n   * @return {number} A corresponding domain value\n   * @example\n   * const scale = scaleLinear().domain([0, 10]).range([0, 10000]);\n   * scale.normInvert(0.5); // Returns 5\n   * scale.invert(5000); // Returns 5\n   */\n  fn.normInvert = function norm(t) {\n    initNormScale(normScale, fn);\n\n    return normScale.instance.invert(t);\n  };\n\n  const { mini, maxi } = getMinMax(stgns, data ? data.fields : []);\n\n  fn.domain([mini, maxi]);\n  fn.range(stgns.invert ? [1, 0] : [0, 1]);\n  normScale.invert = stgns.invert;\n\n  return fn;\n}\n","import extend from 'extend';\nimport { scaleBand as d3ScaleBand } from 'd3-scale';\nimport { generateDiscreteTicks } from './ticks/tick-generators';\nimport resolveSettings from './settings-resolver';\n\nexport const DEFAULT_SETTINGS = {\n  padding: 0,\n  paddingInner: NaN,\n  paddingOuter: NaN,\n  align: 0.5,\n  invert: false,\n  maxPxStep: NaN,\n  range: [0, 1],\n};\n\n/**\n * @typedef {object} ScaleBand\n * @property {string} [type='band']\n * @property {number} [padding=0] - Sets both inner and outer padding to the same value\n * @property {number} [paddingInner=0] - Inner padding\n * @property {number} [paddingOuter=0] - Outer padding\n * @property {number} [align=0.5] -  Control how the outer padding should be distributed, where 0.5 would distribute the padding equally on both sides\n * @property {boolean} [invert=false] - Invert the output range\n * @property {number} [maxPxStep] - Explicitly limit the bandwidth to a pixel value\n * @property {function} [label] - Callback label function, applied on each datum\n * @property {function} [value] - Callback value function, applied on each datum\n * @property {array<number>|function} [range=[0, 1]] - Set range explicitly (ignored when maxPxStep takes effect)\n */\n\n/**\n * @alias scaleBand\n * @memberof picasso\n * @private\n * @param { Object } settings\n * @param { fields[] } [fields]\n * @param { dataset } [dataset]\n * @return { band }\n */\n\nexport default function scaleBand(settings = {}, data = {}, resources = {}) {\n  const ctx = { data, resources };\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, ctx);\n  const items = data.items || [];\n  const domainToDataMapping = {};\n  const values = [];\n  const labels = [];\n\n  // I would like to define this outside of scaleBand but it cause the documentation to be in the wrong order\n  function augmentScaleBand(band, fsettings) {\n    band.data = () => data;\n\n    band.datum = (domainValue) => items[domainToDataMapping[domainValue]];\n\n    /**\n     * Get the first value of the domain\n     * @return { number }\n     */\n    band.start = function start() {\n      return band.domain()[0];\n    };\n\n    /**\n     * Get the last value of the domain\n     * @return { number }\n     */\n    band.end = function end() {\n      return band.domain()[band.domain().length - 1];\n    };\n\n    band.labels = () => labels;\n\n    /**\n     * Generate discrete ticks\n     * @return {Object[]} Array of ticks\n     */\n    band.ticks = function ticks(input = {}) {\n      input.scale = band;\n      return generateDiscreteTicks(input, fsettings.trackBy || 'label');\n    };\n  }\n  /**\n   * An augmented {@link https://github.com/d3/d3-scale#_band|d3 band scale}\n   * @alias band\n   * @private\n   * @kind function\n   * @param { Object } value\n   * @return { number }\n   */\n  const band = d3ScaleBand();\n  augmentScaleBand(band, settings);\n\n  /**\n   * if required creates a new scale with a restricted range\n   * so that step size is at most maxPxStep\n   * otherwise it returns itself\n   * @param { number } size\n   * @return { band }\n   */\n  band.pxScale = function pxScale(size) {\n    const max = stgns.maxPxStep;\n    if (isNaN(max)) {\n      return band;\n    }\n    const n = band.domain().length;\n    const sizeRelativeToStep = Math.max(1, n - band.paddingInner() + 2 * band.paddingOuter());\n\n    if (sizeRelativeToStep * max >= size) {\n      return band;\n    }\n\n    const newBand = band.copy();\n    newBand.type = band.type;\n    augmentScaleBand(newBand, settings);\n    const t = (sizeRelativeToStep * max) / size;\n    const offset = (1 - t) * band.align();\n    newBand.range(stgns.invert ? [t + offset, offset] : [offset, t + offset]);\n\n    return newBand;\n  };\n\n  const valueFn = typeof settings.value === 'function' ? settings.value : (d) => d.datum.value;\n  const labelFn = typeof settings.label === 'function' ? settings.label : (d) => d.datum.label;\n\n  for (let i = 0; i < items.length; i++) {\n    const arg = extend({ datum: items[i] }, ctx);\n    const v = valueFn(arg, i);\n    if (values.indexOf(v) === -1) {\n      values.push(v);\n      labels.push(labelFn(arg, i));\n      domainToDataMapping[v] = i;\n    }\n  }\n\n  band.domain(values);\n  band.range(stgns.invert ? stgns.range.slice().reverse() : stgns.range);\n  band.padding(isNaN(stgns.padding) ? 0 : stgns.padding);\n  if (!isNaN(stgns.paddingInner)) {\n    band.paddingInner(stgns.paddingInner);\n  }\n  if (!isNaN(stgns.paddingOuter)) {\n    band.paddingOuter(stgns.paddingOuter);\n  }\n  band.align(isNaN(stgns.align) ? 0.5 : stgns.align);\n\n  return band;\n}\n","import extend from 'extend';\nimport bandScale, { DEFAULT_SETTINGS } from './band';\nimport resolveSettings from './settings-resolver';\n\nconst DEFAULT_TICKS_SETTINGS = {\n  depth: 0,\n};\n\nfunction keyGen(node, valueFn, ctx) {\n  return node\n    .ancestors()\n    .map((a) => valueFn(extend({ datum: a.data }, ctx)))\n    .reverse()\n    .slice(1) // Delete root node\n    .toString();\n}\n\nfunction flattenTree(rootNode, settings, ctx) {\n  const ticksDepth = settings.ticks.depth;\n  const valueFn = settings.value;\n  const labelFn = settings.label;\n  const values = [];\n  const labels = [];\n  const items = {};\n  const ticks = [];\n  let expando = 0;\n  if (!rootNode) {\n    return {\n      values,\n      labels,\n      items,\n      ticks,\n    };\n  }\n\n  rootNode.eachAfter((node) => {\n    if (node.depth > 0) {\n      const key = keyGen(node, valueFn, ctx);\n      const leaves = node.leaves() || [node]; // If leaf node returns itself\n      const value = valueFn(extend({ datum: node.data }, ctx));\n      const label = labelFn(extend({ datum: node.data }, ctx));\n      const isBranch = Array.isArray(node.children);\n\n      const item = {\n        key,\n        count: leaves.length,\n        value,\n        label,\n        leftEdge: keyGen(leaves[0], valueFn, ctx),\n        rightEdge: keyGen(leaves[Math.max(leaves.length - 1, 0)], valueFn, ctx),\n        node,\n        // isTick: ticksDepth === null ? !isBranch : node.depth === ticksDepth\n      };\n\n      if (isBranch) {\n        values.push(`SPACER_${expando}_SPACER`);\n        expando++;\n      } else {\n        values.push(key);\n        labels.push(label);\n      }\n\n      if ((ticksDepth <= 0 && !isBranch) || node.depth === ticksDepth) {\n        ticks.push(item);\n      }\n\n      items[key] = item;\n    }\n  });\n\n  const spill = rootNode.height - 1;\n  if (spill > 0) {\n    values.splice(-spill);\n  }\n\n  return {\n    values,\n    labels,\n    items,\n    ticks,\n  };\n}\n\n/**\n * @typedef {object} scale-hBand.settings\n * @private\n * @property {number} [padding=0] - Exposes {@link https://github.com/d3/d3-scale#band_padding}\n * @property {boolean} [paddingOuter=0] - Exposes {@link https://github.com/d3/d3-scale#band_paddingOuter}\n * @property {number[]} [paddingInner=0] - Exposes {@link https://github.com/d3/d3-scale#band_paddingInner}\n * @property {object} [align=0.5] - Exposes {@link https://github.com/d3/d3-scale#band_align}\n * @property {boolean} [invert=false] - Invert the output range\n */\n\n/**\n * Hierarchical band scale, that is an augmented band scale, that takes hierarchical data as input\n * @alias scaleHierarchicalBand\n * @private\n * @param { Object } settings\n * @param { fields[] } [fields]\n * @param { dataset } [dataset] - With a root property that is an instance of D3.js Hierarchy\n * @return { h-band }\n */\n\nexport default function scaleHierarchicalBand(settings = {}, data = {}, resources = {}) {\n  const ctx = { data, resources };\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, ctx);\n  stgns.ticks = resolveSettings(settings.ticks, DEFAULT_TICKS_SETTINGS, ctx);\n  stgns.value = typeof settings.value === 'function' ? settings.value : (d) => d.datum.value;\n  stgns.label = typeof settings.label === 'function' ? settings.label : (d) => d.datum.value;\n\n  let bandInstance = bandScale(stgns);\n\n  const { values, labels, items, ticks } = flattenTree(data.root, stgns, ctx);\n\n  /**\n   * @alias h-band\n   * @private\n   * @kind function\n   * @param { Object[] } value - Array where each value is a reference to a node, going from depth 1 to n.\n   * @return { number }\n   */\n  const hBand = function fn(val) {\n    const strVal = String(val);\n    const item = items[strVal];\n    if (item) {\n      return bandInstance(stgns.invert ? item.rightEdge : item.leftEdge);\n    }\n\n    return bandInstance(strVal);\n  };\n\n  extend(true, hBand, bandInstance);\n\n  /**\n   * Wrapped {@link https://github.com/d3/d3-scale#band_bandwidth}\n   * @param { Object[] } [val] - Array where each value is a reference to a node, going from depth 1 to n. If omitted, bandwidth for the leaf nodes is return.\n   * @return { number }\n   */\n\n  hBand.bandwidth = function bandwidth(val) {\n    const item = items[String(val)];\n    const bw = bandInstance.bandwidth();\n    if (item && !item.isLeaf) {\n      const left = hBand(item.leftEdge);\n      const right = hBand(item.rightEdge);\n      return Math.abs(left - right) + bw;\n    }\n    return bw;\n  };\n\n  /**\n   * Wrapped {@link https://github.com/d3/d3-scale#band_step}\n   * @param { Object[] } [val] - Array where each value is a reference to a node, going from depth 1 to n. If omitted, step size for the leaf nodes is return.\n   * @return { number }\n   */\n  hBand.step = function step(val) {\n    const item = items[String(val)];\n    const leafCount = item ? item.count : 1;\n    let stepSize = bandInstance.step();\n    stepSize *= leafCount;\n    return stepSize;\n  };\n\n  /**\n   * @return { dataset }\n   */\n  hBand.data = () => data;\n\n  /**\n   * Return datum for a given node\n   * @param { Object[] } val - Array where each value is a reference to a node, going from depth 1 to n.\n   * @return { Object } The datum\n   */\n  hBand.datum = (val) => {\n    const item = items[String(val)];\n    if (item) {\n      return item.node.data;\n    }\n    return null;\n  };\n\n  hBand.copy = () => scaleHierarchicalBand(settings, data, resources);\n\n  /**\n   * @return { Object[] } Labels for each leaf node\n   */\n  hBand.labels = () => labels;\n\n  /**\n   * Generate discrete ticks\n   * @return { Object[] } Ticks for each leaf node\n   */\n  hBand.ticks = () => {\n    // eslint-disable-line arrow-body-style\n    return ticks.map((item) => {\n      const start = hBand(item.key);\n      const bandwidth = hBand.bandwidth(item.key);\n      return {\n        position: start + bandwidth / 2,\n        label: item.label,\n        data: item.node.data,\n        start,\n        end: start + bandwidth,\n      };\n    });\n  };\n\n  const orgPxScale = bandInstance.pxScale;\n  hBand.pxScale = function pxScale(size) {\n    bandInstance = orgPxScale(size);\n    return hBand;\n  };\n\n  hBand.domain(values);\n\n  return hBand;\n}\n","import { isNumber as numericFilter } from './is-number';\n\nconst minAccessor = (v) => v.min();\nconst maxAccessor = (v) => v.max();\n\n/**\n * Calculate the min/max value based on various inputs.\n *\n * Provided min/max setting takes presedence over all other inputs. If not provided, the respective values are calculated\n * from the given arr input, where each item in the array is expected to have a min/max accessor.\n *\n * @private\n * @param {object} [settings]\n * @param {number} [settings.min] The minimum value. Defaults to 0 if not provided.\n * @param {number} [settings.max] The maximum value. Defaults to 1 if not provided.\n * @param {object} [arr]\n * @returns { object[] } An array containing the min and max values.\n *\n * @example\n * minmax(); // [0, 1]\n *\n * minmax({}, [\n * { min: () => 13, max: () => 15 },\n * { min: () => NaN, max: () => 17 },\n * ]); // [13, 17]\n *\n * minmax({ min: -5, max: 4 }, [\n * { min: () => -20, max: () => 15 },\n * ]); // [-5, 4]\n */\nexport default function minmax(settings, arr) {\n  // const definedMin = settings && typeof settings.min !== 'undefined';\n  // const definedMax = settings && typeof settings.max !== 'undefined';\n  const definedMin = settings && !isNaN(settings.min);\n  const definedMax = settings && !isNaN(settings.max);\n\n  let min = definedMin ? +settings.min : 0;\n  let max = definedMax ? +settings.max : 1;\n\n  if (arr && arr.length) {\n    if (!definedMin) {\n      const arrMin = arr.map(minAccessor).filter(numericFilter);\n      min = arrMin.length ? Math.min(...arrMin) : min;\n    }\n\n    if (!definedMax) {\n      const arrMax = arr.map(maxAccessor).filter(numericFilter);\n      max = arrMax.length ? Math.max(...arrMax) : max;\n    }\n  }\n\n  return [min, max];\n}\n","import { interpolateRgb } from 'd3-interpolate';\nimport extend from 'extend';\nimport minmax from '../../utils/min-max';\nimport linear from '../linear';\nimport resolveSettings from '../settings-resolver';\n\nconst DEFAULT_SETTINGS = {\n  domain: [],\n  range: [],\n  invert: false,\n  min: NaN,\n  max: NaN,\n};\n\nfunction generateDomain(range, min, max) {\n  const len = range.length;\n  if (len === 2) {\n    return [min, max];\n  }\n  const domain = [];\n  const part = (max - min) / (len - 1);\n\n  domain.push(min);\n  for (let i = 1; i < len - 1; i++) {\n    domain.push(min + part * i);\n  }\n  domain.push(max);\n\n  return domain;\n}\n\n/**\n * @typedef {object} ScaleSequentialColor\n * @property {string} [type='sequential-color']\n * @property {string[]} [range] - CSS color values of the output range\n * @property {boolean} [invert=false] - Invert range\n * @property {number} [min] - Set an explicit minimum value\n * @property {number} [max] - Set an explicit maximum value\n */\n\n/**\n * @alias scaleSequentialColor\n * @private\n * @param { Object } [settings] Settings for this scale. If both range and domain are specified, they have to fulfill range.length === domain.length, otherwise they will be overriden.\n * @param { number[] } [settings.domain] Numeric values indicating stop limits between start and end values.\n * @param { color[] } [settings.range] CSS color values indicating stop colors between start and end values.\n * @param { field[] } [fields] Fields to dynamically calculate the domain extent.\n * @return { sequentialColor }\n *\n * @example\n * picasso.scaleSequentialColor({\n *  range: ['red', '#fc6', 'green'],\n *  domain: [-40, 0, 100]\n * });\n */\n\nexport default function scaleSequentialColor(settings = {}, data = {}, resources = {}) {\n  const s = linear(settings, data, resources).clamp(true).interpolate(interpolateRgb);\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, { data, resources });\n  const isDomain = Array.isArray(stgns.domain) && stgns.domain.length;\n  const isRange = Array.isArray(stgns.range) && stgns.range.length;\n\n  /**\n   * @alias sequentialColor\n   * @private\n   * @kind function\n   * @param { Object } v Object containing a 'value' property\n   * @return { string } The blended color\n   */\n  const fn = s;\n\n  extend(true, fn, s);\n  const [min, max] = minmax(stgns, data ? data.fields : []);\n  const num = isDomain ? stgns.domain.length : -1;\n  const DEFAULT_COLORS = resources.theme ? resources.theme.palette('sequential', num > 0 ? num : 2) : [];\n\n  const range = isRange ? stgns.range : DEFAULT_COLORS;\n  fn.range(stgns.invert ? range.slice().reverse() : range.slice());\n  fn.domain(isDomain ? stgns.domain : generateDomain(fn.range(), min, max));\n\n  return fn;\n}\n","import { scaleThreshold, scaleLinear } from 'd3-scale';\nimport { notNumber } from '../../utils/is-number';\nimport minmax from '../../utils/min-max';\nimport sequential from './sequential';\nimport resolveSettings from '../settings-resolver';\n\n// const DEFAULT_COLORS = ['rgb(180,221,212)', 'rgb(34, 83, 90)'];\n\nconst DEFAULT_SETTINGS = {\n  domain: [],\n  range: [],\n  invert: false,\n  min: NaN,\n  max: NaN,\n  nice: false,\n};\n\nfunction generateDomain(range, min, max) {\n  const len = range.length;\n  if (len === 2) {\n    return [min + (max - min) / 2];\n  }\n  const domain = [];\n  const part = (max - min) / len;\n\n  for (let i = 1; i < len; i++) {\n    domain.push(min + part * i);\n  }\n  return domain;\n}\n\nfunction getBreaks(domain) {\n  const ret = [];\n  for (let i = 0; i < domain.length - 1; i++) {\n    ret.push((domain[i] + domain[i + 1]) / 2);\n  }\n  return ret;\n}\n\nfunction generateRange(domain, colors, min, max) {\n  min = domain[0];\n  max = domain && domain.length >= 2 ? domain[domain.length - 1] : max;\n  const seq = sequential().domain([min, max]).range(colors);\n  const values = [min, ...getBreaks(domain), max];\n  return values.map((v) => seq(v));\n}\n\nfunction generateNiceDomain(range, min, max) {\n  const numPoints = range.length === 2 ? 10 : Math.max(1, range.length);\n  const lin = scaleLinear().domain([min, max]).nice(numPoints);\n  const domain = lin.ticks(numPoints);\n\n  if (!range || !range.length) {\n    return domain;\n  }\n\n  // remove values from endpoints\n  const num = Math.max(0, range.length - 1);\n  while (domain.length > num) {\n    if (domain[0] - min <= max - domain[domain.length - 1]) {\n      domain.shift();\n    } else {\n      domain.pop();\n    }\n  }\n\n  return domain;\n}\n\n/**\n * @typedef {object} ScaleThresholdColor\n * @property {string} [type='threshold-color']\n * @property {number[]} [domain] Values defining the thresholds\n * @property {string[]} [range] - CSS color values of the output range\n * @property {boolean} [invert=false] - Invert range\n * @property {number} [min] - Set an explicit minimum value\n * @property {number} [max] - Set an explicit maximum value\n * @property {boolean} [nice=false] If set to true, will generate 'nice' domain values. Ignored if domain is set.\n */\n\n/**\n * @alias scaleThresholdColor\n * @private\n * @param { object } [settings] Settings for this scale. If both domain and range are specified, they have to fulfill domain.length === range.length + 1,  otherwise they will be overriden.\n * @param { number[] } [settings.domain] Values defining the thresholds.\n * @param { color[] } [settings.range] CSS color values of the output range.\n * @param { boolean } [settings.nice=false] If set to true, will generate 'nice' domain values. Ignored if domain is set.\n * @param { number } [settings.min] Minimum value to generate domain extent from. Ignored if domain is set.\n * @param { number } [settings.max] Maximum value to generate domain extend from. Ignored if domain is set.\n * @param { field[] } [fields] Fields to dynamically calculate the domain extent from. Ignored if min/max are set.\n * @return { thresholdColor }\n *\n * @example\n * let t = threshold({\n *   range: ['black', 'white'],\n *   domain: [25,50,75],\n *   max: 100,\n *   min: 0\n * });\n * t.domain(); // [25,50,75]\n * t.range(); // Generates from colors and domain: ['rgb(0,0,0)','rgb(85,85,85)','rgb(170,170,170)','rgb(255,255,255)']\n */\n\nexport default function scaleThresholdColor(settings = {}, data = {}, resources = {}) {\n  const d3Scale = scaleThreshold();\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, { data, resources });\n  const isDomain = Array.isArray(stgns.domain) && stgns.domain.length;\n  const isRange = Array.isArray(stgns.range) && stgns.range.length;\n\n  /**\n   * @alias thresholdColor\n   * @private\n   * @param { object } v Object literal containing a 'value' property.\n   * @return { string } A CSS color from the scale's range.\n   */\n  function fn(v) {\n    if (notNumber(v)) {\n      return NaN;\n    }\n    return d3Scale(v);\n  }\n\n  Object.keys(d3Scale).forEach((key) => (fn[key] = d3Scale[key]));\n\n  const fields = data.fields;\n\n  const [min, max] = minmax(stgns, fields);\n  const num = isDomain ? stgns.domain.length : -1;\n  const DEFAULT_COLORS = resources.theme ? resources.theme.palette('sequential', num > 0 ? num : 2) : [];\n\n  let range = isRange ? stgns.range : DEFAULT_COLORS;\n  let domain = [];\n\n  if (isDomain) {\n    domain = stgns.domain;\n  } else if (stgns.nice) {\n    domain = generateNiceDomain(range, min, max);\n  } else {\n    domain = [min + (max - min) / 2];\n  }\n\n  if (range.length > domain.length + 1) {\n    // Generate limits from range\n    domain = generateDomain(range, min, max);\n  } else if (range.length < domain.length + 1) {\n    // Generate additional colors\n    range = generateRange(domain, range, min, max);\n  }\n\n  fn.data = () => data;\n\n  fn.range(stgns.invert ? range.slice().reverse() : range);\n  fn.domain(domain);\n\n  return fn;\n}\n","import { scaleOrdinal } from 'd3-scale';\nimport extend from 'extend';\nimport resolveSettings from './settings-resolver';\n\nconst DEFAULT_SETTINGS = {\n  domain: [],\n  range: [],\n};\n\n/**\n * @alias scaleOrdinal\n * @private\n * @param { Object } settings\n * @param { field[] } [fields]\n * @param { dataset } data\n * @return { ordinal }\n */\nexport default function ordinal(settings = {}, data = {}, resources = {}) {\n  /**\n   * An augmented {@link https://github.com/d3/d3-scale#_ordinal|d3 ordinal scale}\n   * @private\n   * @alias ordinal\n   * @param { Object }\n   * @return { number }\n   */\n  const fn = scaleOrdinal();\n\n  const ctx = { data, resources };\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, ctx);\n\n  const valueFn = typeof settings.value === 'function' ? settings.value : (d) => d.datum.value;\n  const labelFn = typeof settings.label === 'function' ? settings.label : (d) => d.datum.label;\n  const items = data.items || [];\n  const domainToDataMapping = {};\n  const values = [];\n  const labels = [];\n\n  for (let i = 0; i < items.length; i++) {\n    const arg = extend({ datum: items[i] }, ctx);\n    const v = valueFn(arg, i);\n    if (values.indexOf(v) === -1) {\n      values.push(v);\n      labels.push(labelFn(arg, i));\n      domainToDataMapping[v] = i;\n    }\n  }\n\n  fn.data = () => data;\n\n  fn.labels = () => labels;\n\n  fn.label = (domainValue) => labels[values.indexOf(domainValue)];\n\n  fn.datum = (domainValue) => items[domainToDataMapping[domainValue]];\n\n  fn.range(stgns.range);\n\n  if (Array.isArray(stgns.domain) && stgns.domain.length) {\n    fn.domain(stgns.domain);\n  } else {\n    fn.domain(values);\n  }\n  return fn;\n}\n","import ordinal from '../ordinal';\nimport resolveSettings from '../settings-resolver';\n\nconst DEFAULT_SETTINGS = {\n  domain: [],\n  range: [],\n  unknown: undefined,\n};\n\nconst DEFAULT_EXPLICIT_SETTINGS = {\n  domain: [],\n  range: [],\n  override: false,\n};\n\n/**\n * @typedef {object} ScaleCategoricalColor\n * @property {string} [type='categorical-color']\n * @property {string[]} [range=false] - CSS color values of the output range\n * @property {string} [unknown] - Value to return when input value is unknown\n * @property {object} [explicit] - Explicitly bind values to an output\n * @property {object[]} [explicit.domain[]] - Values to bind\n * @property {string[]} [explicit.range[]] - Output range\n */\n\n/**\n * An ordinal scale with the output range set to default colors, as defined by *scaleCategorical.range*\n * @alias scaleCategorical\n * @private\n * @param { Object } settings\n * @param { field[] } [fields]\n * @param { dataset } [dataset]\n * @return { ordinal }\n */\nexport default function scaleCategorical(settings = {}, data = {}, resources = {}) {\n  const s = ordinal(settings, data, resources);\n  const theme = resources.theme;\n  const stgns = resolveSettings(settings, DEFAULT_SETTINGS, { data, resources });\n  stgns.explicit = resolveSettings(settings.explicit, DEFAULT_EXPLICIT_SETTINGS, { data, resources });\n\n  let range;\n  if (!Array.isArray(stgns.range) || stgns.range.length === 0) {\n    range = theme ? theme.palette('categorical', s.domain().length).slice() : [];\n  } else {\n    range = stgns.range.slice();\n  }\n\n  if (stgns.unknown) {\n    s.unknown(stgns.unknown);\n  } else if (theme && theme.palette('unknown')) {\n    let un = theme.palette('unknown');\n    s.unknown(un[0]);\n  }\n\n  if (Array.isArray(stgns.explicit.domain) && stgns.explicit.domain.length) {\n    const domain = s.domain().slice();\n    const explicitDomain = stgns.explicit.domain;\n    const explicitRange = Array.isArray(stgns.explicit.range) ? stgns.explicit.range : [];\n\n    // duplicate range values to cover entire domain\n    const numCopies = Math.floor(domain.length / range.length);\n    for (let i = 1; i < numCopies + 1; i *= 2) {\n      range = range.concat(range);\n    }\n\n    if (stgns.explicit.override) {\n      for (let i = 0; i < explicitDomain.length; i++) {\n        const index = domain.indexOf(explicitDomain[i]);\n        if (index > -1) {\n          range[index] = explicitRange[i];\n        }\n      }\n    } else {\n      // inject explicit colors\n      const order = explicitDomain.map((d, i) => [domain.indexOf(d), d, explicitRange[i]]).sort((a, b) => a[0] - b[0]);\n      order.forEach((v) => {\n        const idx = domain.indexOf(v[1]);\n        if (idx !== -1) {\n          range.splice(idx, 0, v[2]);\n        }\n      });\n    }\n\n    // cutoff excess range values\n    range.length = domain.length;\n  }\n\n  s.range(range);\n  return s;\n}\n","import registry from '../../utils/registry';\nimport linear from '../../scales/linear';\nimport band from '../../scales/band';\nimport hBand from '../../scales/h-band';\nimport sequential from '../../scales/color/sequential';\nimport threshold from '../../scales/color/threshold';\nimport categorical from '../../scales/color/categorical';\nimport extractData from '../../data/extractor';\n\n/**\n * Definition for creating a scale. Additional properties, specific for a type of scale, can be added as key/value pairs\n * @typedef {object} ScaleDefinition\n * @property {string} [type] Type of scale\n * @property {DataExtraction|DataFieldExtraction} [data] Data configuration\n */\n\n/**\n * Scale instance\n * @typedef {object} Scale\n * @interface\n * @property {string} type Type of scale\n */\n\nconst scaleRegistry = registry();\n\nscaleRegistry('linear', linear);\nscaleRegistry('band', band);\nscaleRegistry('h-band', hBand);\nscaleRegistry('sequential-color', sequential);\nscaleRegistry('threshold-color', threshold);\nscaleRegistry('categorical-color', categorical);\n\nexport { scaleRegistry as default };\n\nfunction getTypeFromMeta(fields) {\n  const types = fields.map((field) => (field.type() === 'dimension' ? 'band' : 'linear'));\n  return types.indexOf('linear') !== -1 ? 'linear' : 'band';\n}\n\nfunction deduceScaleTypeFromData(data) {\n  if (data.root) {\n    return 'h-band';\n  }\n\n  if (data.fields && data.fields[0]) {\n    return getTypeFromMeta(data.fields);\n  }\n  return 'linear';\n}\n\nexport function create(options, d, deps) {\n  let dataSourceConfig = options.data;\n  if (options.source) {\n    // DEPRECATION\n    deps.logger.warn('Deprecated: Scale data source configuration');\n    dataSourceConfig = {\n      extract: [],\n    };\n    (Array.isArray(options.source) ? options.source : [options.source]).forEach((source) => {\n      dataSourceConfig.extract.push({\n        field: source,\n      });\n    });\n  }\n\n  const data = extractData(dataSourceConfig, d, deps);\n  let type = options.type || deduceScaleTypeFromData(data);\n  let s;\n\n  if (type === 'color') {\n    if (data.fields && data.fields[0] && data.fields[0].type() === 'dimension') {\n      type = 'categorical-color';\n    } else {\n      type = 'sequential-color';\n    }\n  }\n\n  if (deps.scale.has(type)) {\n    s = deps.scale.get(type);\n    s = s(options, data, { theme: deps.theme, logger: deps.logger });\n    s.type = type;\n  }\n  return s;\n}\n\nexport function collection(scalesConfig, data, deps, fn = create) {\n  const scales = {};\n\n  return {\n    get(def) {\n      let key;\n      if (typeof def === 'string' && scalesConfig[def]) {\n        key = def;\n      } else if (typeof def === 'object' && 'scale' in def && scalesConfig[def.scale]) {\n        key = def.scale;\n      }\n\n      if (key) {\n        scales[key] = scales[key] || fn(scalesConfig[key], data, deps);\n        return scales[key];\n      }\n\n      return fn(def, data, deps);\n    },\n    all() {\n      Object.keys(scalesConfig).forEach(this.get);\n      return scales;\n    },\n  };\n}\n","/**\n * Utility functions\n */\n\nvar util = {};\n\nutil.isObject = function isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nutil.isNumber = function isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nutil.isUndefined = function isUndefined(arg) {\n  return arg === void 0;\n}\n\nutil.isFunction = function isFunction(arg){\n  return typeof arg === 'function';\n}\n\n\n/**\n * EventEmitter class\n */\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!util.isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error' && !this._events.error) {\n    er = arguments[1];\n    if (er instanceof Error) {\n      throw er; // Unhandled 'error' event\n    } else {\n      throw Error('Uncaught, unspecified \"error\" event.');\n    }\n    return false;\n  }\n\n  handler = this._events[type];\n\n  if (util.isUndefined(handler))\n    return false;\n\n  if (util.isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (util.isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!util.isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              util.isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (util.isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (util.isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!util.isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n\n      if (util.isFunction(console.error)) {\n        console.error('(node) warning: possible EventEmitter memory ' +\n                      'leak detected. %d listeners added. ' +\n                      'Use emitter.setMaxListeners() to increase limit.',\n                      this._events[type].length);\n      }\n      if (util.isFunction(console.trace))\n        console.trace();\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!util.isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!util.isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (util.isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (util.isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (util.isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (Array.isArray(listeners)) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (util.isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (util.isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n","import EventEmitter from 'node-event-emitter';\n\nexport default {\n  /**\n   * Function used to add event handling to objects passed in.\n   * @private\n   * @param {Object} obj Object instance that will get event handling.\n   */\n  mixin(obj) {\n    Object.keys(EventEmitter.prototype).forEach((key) => {\n      obj[key] = EventEmitter.prototype[key];\n    });\n    EventEmitter.init(obj);\n    return obj;\n  },\n};\n","import EventEmitter from '../utils/event-emitter';\n\nexport default function scrollApi() {\n  let min = 0;\n  let max = 0;\n  let start = 0;\n  let viewSize = 0;\n  start = start || min;\n\n  /**\n   * The scroll api\n   * @private\n   * @alias scroll\n   */\n  const s = {\n    /**\n     * Move the current scroll\n     * @param {number} value\n     * @emits update\n     */\n    move(value) {\n      this.moveTo(start + value);\n    },\n\n    /**\n     * Change the current scroll to a specific value\n     * @param {number} value\n     * @emits update\n     */\n    moveTo(value) {\n      const newStart = Math.max(min, Math.min(max - viewSize, value));\n      if (start !== newStart) {\n        start = newStart;\n        s.emit('update');\n      }\n    },\n\n    /**\n     * Update scroll settings\n     * @param {number} [settings.min]\n     * @param {number} [settings.max]\n     * @param {number} [settings.viewSize]\n     * @emits update\n     */\n    update(settings) {\n      let triggerUpdate = false;\n      ({ min = min, max = max } = settings);\n      if (settings.viewSize !== undefined && settings.viewSize !== viewSize) {\n        viewSize = settings.viewSize;\n        triggerUpdate = true;\n      }\n\n      // update scroll to be within the new bounds\n      const newStart = Math.max(min, Math.min(max - viewSize, start));\n      if (start !== newStart) {\n        start = newStart;\n        triggerUpdate = true;\n      }\n\n      if (triggerUpdate) {\n        s.emit('update');\n      }\n    },\n\n    /**\n     * Get the current scroll state\n     * @return {object} with min, max, start & viewSize\n     */\n    getState() {\n      return {\n        min,\n        max,\n        start,\n        viewSize,\n      };\n    },\n  };\n\n  EventEmitter.mixin(s);\n\n  return s;\n}\n","import scrollApi from '../../scroll-api';\n\nexport function createOrUpdate(options, oldApi) {\n  const min = options.min || 0;\n  const max = options.max || 0;\n  const viewSize = options.viewSize || 0;\n\n  const s = oldApi || scrollApi();\n  s.update({ min, max, viewSize });\n\n  return s;\n}\n\nexport default function builder(obj, oldScrollApis) {\n  const scrollApis = {};\n  for (const n in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, n)) {\n      scrollApis[n] = createOrUpdate(obj[n], oldScrollApis ? oldScrollApis[n] : null);\n    }\n  }\n  return scrollApis;\n}\n\nexport function getOrCreateScrollApi(v, scrollApis) {\n  if (!scrollApis[v]) {\n    scrollApis[v] = scrollApi();\n  }\n  return scrollApis[v];\n}\n","function lessThanOrEqual(value, limit) {\n  return value <= limit;\n}\n\nfunction lessThan(value, limit) {\n  return value < limit;\n}\n\nfunction index(boundaries, point, after) {\n  let i = 0;\n  while (i < boundaries.length && point > boundaries[i]) {\n    ++i;\n  }\n  if (boundaries[i] === point && after) {\n    ++i;\n  }\n  return i;\n}\n\nfunction contains(boundaries, point, minCondition, maxCondition) {\n  const len = boundaries.length;\n\n  for (let i = 1; i < len; i += 2) {\n    if (minCondition(boundaries[i - 1], point) && maxCondition(point, boundaries[i])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport default function rangeCollection(config = {}) {\n  let maxCondition;\n  let minCondition;\n  let boundaries = [];\n\n  function fn() {}\n\n  fn.configure = (c = {}) => {\n    const { includeMax = true, includeMin = true } = c;\n    maxCondition = includeMax ? lessThanOrEqual : lessThan;\n    minCondition = includeMin ? lessThanOrEqual : lessThan;\n  };\n\n  fn.add = ({ min, max }) => {\n    const i0 = index(boundaries, min);\n    const i1 = index(boundaries, max, true);\n\n    const args = [i0, i1 - i0];\n    if (i0 % 2 === 0) {\n      args.push(min);\n    }\n    if (i1 % 2 === 0) {\n      args.push(max);\n    }\n\n    const before = boundaries.join(',');\n    boundaries.splice(...args);\n    const after = boundaries.join(',');\n    return before !== after;\n  };\n\n  fn.remove = ({ min, max }) => {\n    const i0 = index(boundaries, min);\n    const i1 = index(boundaries, max, true);\n\n    const args = [i0, i1 - i0];\n    if (i0 % 2 === 1) {\n      args.push(min);\n    }\n    if (i1 % 2 === 1) {\n      args.push(max);\n    }\n    const before = boundaries.join(',');\n    boundaries.splice(...args);\n    const after = boundaries.join(',');\n    return before !== after;\n  };\n\n  fn.set = (range) => {\n    const before = boundaries.join(',');\n    boundaries = [];\n    if (Array.isArray(range)) {\n      range.forEach(fn.add);\n    } else {\n      fn.add(range);\n    }\n    const after = boundaries.join(',');\n    return before !== after;\n  };\n\n  fn.clear = () => {\n    const before = boundaries.length > 0;\n    boundaries = [];\n    return before;\n  };\n\n  fn.containsValue = (value) => contains(boundaries, value, minCondition, maxCondition);\n\n  fn.containsRange = ({ min, max }) => {\n    const i0 = index(boundaries, min, true);\n    const i1 = index(boundaries, max);\n\n    return i0 === i1 && i1 % 2 === 1;\n  };\n\n  fn.toggle = (range) => {\n    if (fn.containsRange(range)) {\n      return fn.remove(range);\n    }\n    return fn.add(range);\n  };\n\n  fn.ranges = () => {\n    const collection = [];\n    for (let i = 1; i < boundaries.length; i += 2) {\n      collection.push({\n        min: boundaries[i - 1],\n        max: boundaries[i],\n      });\n    }\n    return collection;\n  };\n\n  fn.configure(config);\n\n  return fn;\n}\n","export default function valueCollection() {\n  let values = [];\n  function vc() {}\n\n  vc.add = (value) => {\n    if (values.indexOf(value) === -1) {\n      values.push(value);\n      return true;\n    }\n    return false;\n  };\n\n  vc.remove = (value) => {\n    const idx = values.indexOf(value);\n    if (idx !== -1) {\n      values.splice(idx, 1);\n      return true;\n    }\n    return false;\n  };\n\n  vc.contains = (value) => values.indexOf(value) !== -1;\n\n  vc.values = () => values.slice();\n\n  vc.clear = () => (values = []);\n\n  vc.toString = () => values.join(';');\n\n  return vc;\n}\n","import extend from 'extend';\n\nimport EventEmitter from '../utils/event-emitter';\n\nimport rangeCollection from './range-collection';\nimport valueCollection from './value-collection';\n\n/**\n * @typedef {object} BrushConfig\n * @property {Array<BrushConfig~Ranges>} [ranges] - Range configurations\n */\n\n/**\n * @typedef {object}\n * @alias BrushConfig~Ranges\n */\nconst DEFAULT_RANGE_CONFIG = {\n  /**\n   * An identifier that represents the data source of the value\n   * @type {string=}\n   */\n  key: undefined,\n  /**\n   * Whether or not the minimum value of a range should be included when determining if a value is brushed.\n   * @type {boolean=} */\n  includeMin: true,\n  /**\n   * Whether or not the maximum value of a range should be included when determining if a value is brushed.\n   * @type {boolean=} */\n  includeMax: true,\n};\n\nfunction add({ items, collection, vc }) {\n  const changedMap = {};\n  const changed = [];\n  let key;\n  let values;\n\n  for (let i = 0, num = items.length; i < num; i++) {\n    key = items[i].key;\n    if (!collection[key]) {\n      collection[key] = vc();\n    }\n    values = items[i].values || [items[i].value];\n    for (let vi = 0; vi < values.length; vi++) {\n      if (collection[key].add(values[vi])) {\n        changedMap[key] = changedMap[key] || [];\n        changedMap[key].push(values[vi]);\n      }\n    }\n  }\n\n  const keys = Object.keys(changedMap);\n  for (let i = 0, num = keys.length; i < num; i++) {\n    key = keys[i];\n    changed.push({ id: key, values: changedMap[key] });\n  }\n\n  return changed;\n}\n\nfunction remove({ items, collection }) {\n  const changedMap = {};\n  const changed = [];\n  let key;\n  let values;\n\n  for (let i = 0, num = items.length; i < num; i++) {\n    key = items[i].key;\n    if (!collection[key]) {\n      continue;\n    }\n    values = items[i].values || [items[i].value];\n    for (let vi = 0; vi < values.length; vi++) {\n      if (collection[key].remove(values[vi])) {\n        changedMap[key] = changedMap[key] || [];\n        changedMap[key].push(values[vi]);\n      }\n    }\n  }\n\n  const keys = Object.keys(changedMap);\n  for (let i = 0, num = keys.length; i < num; i++) {\n    key = keys[i];\n    changed.push({ id: key, values: changedMap[key] });\n  }\n\n  return changed;\n}\n\nfunction collectUnique(items) {\n  const filteredSet = {};\n  let key;\n  let values;\n\n  for (let i = 0, num = items.length; i < num; i++) {\n    key = items[i].key;\n    values = items[i].values || [items[i].value];\n    if (!filteredSet[key]) {\n      filteredSet[key] = [];\n    }\n    for (let vi = 0; vi < values.length; vi++) {\n      const idx = filteredSet[key].indexOf(values[vi]);\n      if (idx === -1) {\n        filteredSet[key].push(values[vi]);\n      }\n    }\n  }\n\n  return filteredSet;\n}\n\nfunction createValueCollection({ key, collection, obj, fn, value }) {\n  if (!collection[key]) {\n    collection[key] = fn();\n  }\n  obj[key] = obj[key] || [];\n  obj[key].push(value);\n  collection[key].add(value);\n}\n\nexport function toggle({ items, values, vc }) {\n  const addedMap = {};\n  const removedMap = {};\n  const added = [];\n  const removed = [];\n  const filteredSet = collectUnique(items);\n  let key;\n  let value;\n  let fs;\n\n  const setKeys = Object.keys(filteredSet);\n  for (let i = 0, num = setKeys.length; i < num; i++) {\n    key = setKeys[i];\n    fs = filteredSet[key];\n\n    for (let k = 0, len = fs.length; k < len; k++) {\n      value = fs[k];\n      if (!values[key] || !values[key].contains(value)) {\n        createValueCollection({\n          key,\n          value,\n          collection: values,\n          obj: addedMap,\n          fn: vc,\n        });\n      } else if (values[key] && values[key].contains(value)) {\n        removedMap[key] = removedMap[key] || [];\n        removedMap[key].push(value);\n        values[key].remove(value);\n      }\n    }\n  }\n\n  const addedKeys = Object.keys(addedMap);\n  for (let i = 0, num = addedKeys.length; i < num; i++) {\n    key = addedKeys[i];\n    added.push({ id: key, values: addedMap[key] });\n  }\n\n  const removedKeys = Object.keys(removedMap);\n  for (let i = 0, num = removedKeys.length; i < num; i++) {\n    key = removedKeys[i];\n    removed.push({ id: key, values: removedMap[key] });\n  }\n\n  return [added, removed];\n}\n\nfunction diff(old, current) {\n  const changed = [];\n  const keys = Object.keys(old);\n  let key;\n  let changedValues;\n  const filterFn = (v) => current[key].indexOf(v) === -1;\n\n  for (let i = 0, num = keys.length; i < num; i++) {\n    key = keys[i];\n    if (!current[key]) {\n      changed.push({ id: key, values: old[key] });\n    } else {\n      changedValues = old[key].filter(filterFn);\n      if (changedValues.length) {\n        changed.push({ id: key, values: changedValues });\n      }\n    }\n  }\n\n  return changed;\n}\n\nexport function set({ items, vCollection, vc }) {\n  const addedMap = {};\n  const filteredSet = collectUnique(items);\n  let added = [];\n  let removed = [];\n  let key;\n\n  const oldMap = {};\n  const vcKeys = Object.keys(vCollection);\n  for (let i = 0, num = vcKeys.length; i < num; i++) {\n    key = vcKeys[i];\n    oldMap[key] = vCollection[key].values().slice();\n    delete vCollection[key];\n  }\n\n  const createValueCollectionFn = (value) => {\n    if (!vCollection[key] || !vCollection[key].contains(value)) {\n      createValueCollection({\n        key,\n        value,\n        collection: vCollection,\n        obj: addedMap,\n        fn: vc,\n      });\n    }\n  };\n\n  const fsKeys = Object.keys(filteredSet);\n  for (let i = 0, num = fsKeys.length; i < num; i++) {\n    key = fsKeys[i];\n    filteredSet[key].forEach(createValueCollectionFn);\n  }\n\n  removed = diff(oldMap, addedMap);\n  added = diff(addedMap, oldMap);\n\n  return [added, removed];\n}\n\nfunction applyAliases(items, aliases) {\n  if (!Object.keys(aliases).length) {\n    return items;\n  }\n  const len = items.length;\n  const its = Array(len);\n  for (let i = 0; i < len; i++) {\n    its[i] = items[i].key in aliases ? extend({}, items[i], { key: aliases[items[i].key] }) : items[i];\n  }\n  return its;\n}\n\nfunction intercept(handlers, items, aliases) {\n  const its = applyAliases(items, aliases);\n  return handlers && handlers.length ? handlers.reduce((value, interceptor) => interceptor(value), its) : its;\n}\n\nfunction toCamelCase(s) {\n  return s.replace(/(-[a-z])/g, ($1) => $1.toUpperCase().replace('-', ''));\n}\n\nfunction toSnakeCase(s) {\n  return s.replace(/([A-Z])/g, ($1) => `-${$1.toLowerCase()}`);\n}\n\nfunction updateRange(items, action, { ranges, interceptors, rc, aliases, rangeConfig }) {\n  const inter = `${action}Ranges`;\n  const its = intercept(interceptors[inter], items, aliases);\n  let changed = false;\n  its.forEach((item) => {\n    const key = item.key;\n    if (!ranges[key]) {\n      ranges[key] = rc(rangeConfig.sources[key] || rangeConfig.default);\n    }\n    if (action === 'set') {\n      changed = ranges[key][action](item.ranges || item.range) || changed;\n    } else {\n      const rangeValues = item.ranges || [item.range];\n      for (let i = 0; i < rangeValues.length; i++) {\n        changed = ranges[key][action](rangeValues[i]) || changed;\n      }\n    }\n  });\n\n  return changed;\n}\n\nexport default function brush({ vc = valueCollection, rc = rangeCollection } = {}) {\n  let activated = false;\n  let ranges = {};\n  let values = {};\n  let aliases = {};\n  let rangeConfig = {\n    sources: {},\n    default: extend({}, DEFAULT_RANGE_CONFIG),\n  };\n  const interceptors = {\n    addValues: [],\n    removeValues: [],\n    toggleValues: [],\n    setValues: [],\n    addRanges: [],\n    setRanges: [],\n    removeRanges: [],\n    toggleRanges: [],\n  };\n\n  const getState = () => {\n    const state = {\n      values: {},\n      ranges: {},\n    };\n    Object.keys(values).forEach((key) => {\n      state.values[key] = values[key].values();\n    });\n    Object.keys(ranges).forEach((key) => {\n      state.ranges[key] = ranges[key].ranges();\n    });\n    return state;\n  };\n\n  const links = {\n    ls: [],\n    clear() {\n      this.ls.forEach((b) => b.clear());\n    },\n    start() {\n      this.ls.forEach((b) => b.start());\n    },\n    end() {\n      this.ls.forEach((b) => b.end());\n    },\n    update() {\n      const s = getState();\n      this.ls.forEach((b) => b._state(s));\n    },\n    updateValues() {\n      const s = getState();\n      this.ls.forEach((b) =>\n        b._state({\n          values: s.values,\n        })\n      );\n    },\n    updateRanges() {\n      const s = getState();\n      this.ls.forEach((b) =>\n        b._state({\n          ranges: s.ranges,\n        })\n      );\n    },\n  };\n\n  /**\n   * A brush context\n   * @alias Brush\n   * @interface\n   */\n  const fn = {};\n\n  /**\n   * Triggered when this brush is activated\n   * @event Brush#start\n   * @type {string}\n   */\n\n  /**\n   * Triggered when this brush is updated\n   * @event Brush#update\n   * @type {string}\n   * @param {Array<object>} added - The added items\n   * @param {Array<object>} removed - The removed items\n   */\n\n  /**\n   * Triggered when this brush is deactivated\n   * @event Brush#end\n   * @type {string}\n   */\n\n  /**\n   * Configure the brush instance.\n   *\n   * @param {BrushConfig} config\n   * @example\n   * brushInstance.configure({\n   *   ranges: [\n   *     { key: 'some key', includeMax: false },\n   *     { includeMax: true, includeMin: true },\n   *   ]\n   * })\n   */\n  fn.configure = (config = {}) => {\n    if (Array.isArray(config.ranges) && config.ranges.length) {\n      rangeConfig = {\n        sources: {},\n        default: extend({}, DEFAULT_RANGE_CONFIG),\n      };\n\n      config.ranges.forEach((cfg) => {\n        const c = {};\n        Object.keys(DEFAULT_RANGE_CONFIG)\n          .filter((attr) => attr !== 'key')\n          .forEach((attr) => {\n            c[attr] = typeof cfg[attr] !== 'undefined' ? cfg[attr] : DEFAULT_RANGE_CONFIG[attr];\n          });\n\n        if (typeof cfg.key !== 'undefined') {\n          rangeConfig.sources[cfg.key] = c;\n        } else {\n          rangeConfig.default = c;\n        }\n      });\n\n      Object.keys(ranges).forEach((key) => ranges[key].configure(rangeConfig.sources[key] || rangeConfig.default));\n\n      // TODO only emit update if config has changed\n      fn.emit('update', [], []);\n    }\n  };\n\n  /**\n   * Link this brush to another brush instance.\n   *\n   * When linked, the `target` will receive updates whenever this brush changes.\n   * @param {Brush} target - The brush instance to link to\n   */\n  fn.link = (target) => {\n    if (fn === target) {\n      throw new Error(\"Can't link to self\");\n    }\n    links.ls.push(target);\n    target._state(getState());\n  };\n\n  fn._state = (s) => {\n    if (!s) {\n      return getState();\n    }\n    if (s.values) {\n      const arr = [];\n      Object.keys(s.values).forEach((key) => {\n        if (!values[key] || s.values[key].join(';') !== values[key].toString()) {\n          arr.push({\n            key,\n            values: s.values[key],\n          });\n        }\n      });\n      Object.keys(values).forEach((key) => {\n        if (!s.values[key]) {\n          arr.push({\n            key,\n            values: [],\n          });\n        }\n      });\n      if (arr.length) {\n        fn.setValues(arr);\n      }\n    }\n    if (s.ranges) {\n      const arr = [];\n      Object.keys(s.ranges).forEach((key) => {\n        if (!ranges[key] || s.ranges[key].join(';') !== ranges[key].toString()) {\n          arr.push({\n            key,\n            ranges: s.ranges[key],\n          });\n        }\n      });\n      Object.keys(ranges).forEach((key) => {\n        if (!s.ranges[key]) {\n          arr.push({\n            key,\n            ranges: [],\n          });\n        }\n      });\n      if (arr.length) {\n        fn.setRanges(arr);\n      }\n    }\n    return undefined;\n  };\n\n  /**\n   * Starts this brush context\n   *\n   * Starts this brush context and emits a 'start' event if it is not already started.\n   * @param {...any} args - arguments to be passed to 'start' listeners\n   * @emits Brush#start\n   */\n  fn.start = (...args) => {\n    if (!activated) {\n      activated = true;\n      fn.emit('start', ...args);\n      links.start();\n    }\n  };\n\n  /**\n   * Ends this brush context\n   *\n   * Ends this brush context and emits an 'end' event if it is not already ended.\n   * @param {...any} args - arguments to be passed to 'end' listeners\n   * @emits Brush#end\n   */\n  fn.end = (...args) => {\n    if (!activated) {\n      return;\n    }\n    activated = false;\n    ranges = {};\n    values = {};\n    fn.emit('end', ...args);\n    links.end();\n  };\n\n  /**\n   * Checks if this brush is activated\n   *\n   * Returns true if started, false otherwise\n   * @return {boolean}\n   */\n  fn.isActive = () => activated;\n\n  /**\n   * Clears this brush context\n   */\n  fn.clear = () => {\n    const removed = fn\n      .brushes()\n      .filter((b) => b.type === 'value' && b.brush.values().length)\n      .map((b) => ({ id: b.id, values: b.brush.values() }));\n    const hasChanged = Object.keys(ranges).length > 0 || removed.length;\n    ranges = {};\n    values = {};\n    if (hasChanged) {\n      fn.emit('update', [], removed); // TODO - do not emit update if state hasn't changed\n      links.clear();\n    }\n  };\n\n  /**\n   * Returns all brushes within this context\n   * @return {object}\n   */\n  fn.brushes = () => {\n    let result = [];\n    result = result.concat(\n      Object.keys(ranges).map((key) => ({\n        type: 'range',\n        id: key,\n        brush: ranges[key],\n      }))\n    );\n\n    result = result.concat(\n      Object.keys(values).map((key) => ({\n        type: 'value',\n        id: key,\n        brush: values[key],\n      }))\n    );\n\n    return result;\n  };\n\n  /**\n   * Adds a primitive value to this brush context\n   *\n   * If this brush context is not started, a 'start' event is emitted.\n   * If the state of the brush changes, ie. if the added value does not already exist, an 'update' event is emitted.\n   *\n   * @param {string} key  An identifier that represents the data source of the value\n   * @param {string|number} value The value to add\n   * @emits Brush#start\n   * @emits Brush#update\n   * @example\n   * brush.addValue('countries', 'Sweden');\n   * brush.addValue('/qHyperCube/qDimensionInfo/0', 3);\n   */\n  fn.addValue = (key, value) => {\n    fn.addValues([{ key, value }]);\n  };\n\n  /**\n   * @param {object[]} items Items to add\n   */\n  fn.addValues = (items) => {\n    const its = intercept(interceptors.addValues, items, aliases);\n    const added = add({\n      vc,\n      collection: values,\n      items: its,\n    });\n\n    fn.emit('add-values', its);\n\n    if (added.length) {\n      if (!activated) {\n        activated = true;\n        fn.emit('start');\n      }\n      fn.emit('update', added, []);\n      links.updateValues();\n    }\n  };\n\n  /**\n   * @param {object[]} items Items to set\n   */\n  fn.setValues = (items) => {\n    const its = intercept(interceptors.setValues, items, aliases);\n    const changed = set({\n      items: its,\n      vCollection: values,\n      vc,\n    });\n\n    fn.emit('set-values', its);\n\n    if (changed[0].length > 0 || changed[1].length > 0) {\n      if (!activated) {\n        activated = true;\n        fn.emit('start');\n      }\n      fn.emit('update', changed[0], changed[1]);\n      links.updateValues();\n    }\n  };\n\n  /**\n   * Removes a primitive values from this brush context\n   *\n   * If the state of the brush changes, ie. if the removed value does exist, an 'update' event is emitted.\n   *\n   * @param  {string} key  An identifier that represents the data source of the value\n   * @param  {string|number} value The value to remove\n   * @example\n   * brush.removeValue('countries', 'Sweden');\n   */\n  fn.removeValue = (key, value) => {\n    fn.removeValues([{ key, value }]);\n  };\n\n  /**\n   * @param {object[]} items Items to remove\n   */\n  fn.removeValues = (items) => {\n    const its = intercept(interceptors.removeValues, items, aliases);\n    const removed = remove({\n      collection: values,\n      items: its,\n    });\n\n    fn.emit('remove-values', its);\n\n    if (removed.length) {\n      fn.emit('update', [], removed);\n      links.updateValues();\n      // TODO - emit 'end' event if there are no remaining active brushes\n    }\n  };\n\n  /**\n   * Add and remove values in a single operation\n   * almost the same as calling addValues and removeValues but only triggers one 'update' event\n   *\n   * If the state of the brush changes, an 'update' event is emitted.\n   *\n   * @param {object[]} addItems Items to add\n   * @param {object[]} removeItems Items to remove\n   */\n  fn.addAndRemoveValues = (addItems, removeItems) => {\n    const addIts = intercept(interceptors.addValues, addItems, aliases);\n    const removeIts = intercept(interceptors.removeValues, removeItems, aliases);\n    const added = add({\n      vc,\n      collection: values,\n      items: addIts,\n    });\n    const removed = remove({\n      collection: values,\n      items: removeIts,\n    });\n\n    fn.emit('add-values', addIts);\n    fn.emit('remove-values', removeIts);\n\n    if (added.length || removed.length) {\n      if (!activated) {\n        activated = true;\n        fn.emit('start');\n      }\n      fn.emit('update', added, removed);\n      links.updateValues();\n    }\n  };\n\n  /**\n   * Toggles a primitive value in this brush context\n   *\n   * If the given value exists in this brush context, it will be removed. If it does not exist it will be added.\n   *\n   * @param  {string} key  An identifier that represents the data source of the value\n   * @param  {string|number} value The value to toggle\n   * @example\n   * brush.toggleValue('countries', 'Sweden');\n   */\n  fn.toggleValue = (key, value) => {\n    fn.toggleValues([{ key, value }]);\n  };\n\n  /**\n   * @param {object[]} items Items to toggle\n   */\n  fn.toggleValues = (items) => {\n    const its = intercept(interceptors.toggleValues, items, aliases);\n    const toggled = toggle({\n      items: its,\n      values,\n      vc,\n    });\n\n    fn.emit('toggle-values', its);\n\n    if (toggled[0].length > 0 || toggled[1].length > 0) {\n      if (!activated) {\n        activated = true;\n        fn.emit('start');\n      }\n      fn.emit('update', toggled[0], toggled[1]);\n      links.updateValues();\n    }\n  };\n\n  /**\n   * Checks if a certain value exists in this brush context\n   *\n   * Returns true if the values exists for the provided key, returns false otherwise.\n   *\n   * @param  {string} key  An identifier that represents the data source of the value\n   * @param  {string|number} value The value to check for\n   * @return {boolean}\n   * @example\n   * brush.addValue('countries', 'Sweden');\n   * brush.containsValue('countries', 'Sweden'); // true\n   * brush.toggleValue('countries', 'Sweden'); // remove 'Sweden'\n   * brush.containsValue('countries', 'Sweden'); // false\n   */\n  fn.containsValue = (key, value) => {\n    let k = aliases[key] || key;\n    if (!values[k]) {\n      return false;\n    }\n    return values[k].contains(value);\n  };\n\n  /**\n   * Adds a numeric range to this brush context\n   *\n   * @param {string} key - An identifier that represents the data source of the range\n   * @param {object} range - The range to add to this brush\n   * @param {number} range.min - Min value of the range\n   * @param {number} range.max - Max value of the range\n   * @example\n   * brush.addRange('Sales', { min: 20, max: 50 });\n   */\n  fn.addRange = (key, range) => {\n    fn.addRanges([{ key, range }]);\n  };\n\n  /**\n   * @see {brush.addRange}\n   * @param {object[]} items - Items containing the ranges to remove\n   * @param {string} items[].key\n   * @param {object} items[].range\n   */\n  fn.addRanges = (items) => {\n    const changed = updateRange(items, 'add', {\n      ranges,\n      rc,\n      interceptors,\n      aliases,\n      rangeConfig,\n    });\n\n    if (!changed) {\n      return;\n    }\n\n    if (!activated) {\n      activated = true;\n      fn.emit('start');\n    }\n    fn.emit('update', [], []);\n    links.updateRanges();\n  };\n\n  /**\n   * Removes a numeric range from this brush context\n   *\n   * @param {string} key - An identifier that represents the data source of the range\n   * @param {object} range - The range to remove from this brush\n   * @param {number} range.min - Min value of the range\n   * @param {number} range.max - Max value of the range\n   */\n  fn.removeRange = (key, range) => {\n    fn.removeRanges([{ key, range }]);\n  };\n\n  /**\n   * @see {brush.removeRange}\n   * @param {object[]} items - Items containing the ranges to remove\n   */\n  fn.removeRanges = (items) => {\n    const changed = updateRange(items, 'remove', {\n      ranges,\n      rc,\n      interceptors,\n      aliases,\n      rangeConfig,\n    });\n\n    if (!changed) {\n      return;\n    }\n\n    if (!activated) {\n      activated = true;\n      fn.emit('start');\n    }\n    fn.emit('update', [], []);\n    links.updateRanges();\n  };\n\n  /**\n   * Sets a numeric range to this brush context\n   *\n   * Overwrites any active ranges identified by `key`\n   *\n   * @param {string} key - An identifier that represents the data source of the range\n   * @param {object} range - The range to set on this brush\n   * @param {number} range.min - Min value of the range\n   * @param {number} range.max - Max value of the range\n   */\n  fn.setRange = (key, range) => {\n    fn.setRanges([{ key, range }]);\n  };\n\n  /**\n   * @see {brush.setRange}\n   * @param {object[]} items - Items containing the ranges to set\n   */\n  fn.setRanges = (items) => {\n    const changed = updateRange(items, 'set', {\n      ranges,\n      rc,\n      interceptors,\n      aliases,\n      rangeConfig,\n    });\n\n    if (!changed) {\n      return;\n    }\n\n    if (!activated) {\n      activated = true;\n      fn.emit('start');\n    }\n    fn.emit('update', [], []);\n    links.updateRanges();\n  };\n\n  /**\n   * Toggles a numeric range in this brush context\n   *\n   * Removes the range if it's already contained within the given identifier,\n   * otherwise the given range is added to the brush.\n   *\n   * @param {string} key - An identifier that represents the data source of the range\n   * @param {object} range - The range to toggle in this brush\n   * @param {number} range.min - Min value of the range\n   * @param {number} range.max - Max value of the range\n   */\n  fn.toggleRange = (key, range) => {\n    fn.toggleRanges([{ key, range }]);\n  };\n\n  /**\n   * @see {brush.toggleRange}\n   * @param {object[]} items - Items containing the ranges to toggle\n   */\n  fn.toggleRanges = (items) => {\n    const changed = updateRange(items, 'toggle', {\n      ranges,\n      rc,\n      interceptors,\n      aliases,\n      rangeConfig,\n    });\n\n    if (!changed) {\n      return;\n    }\n\n    if (!activated) {\n      activated = true;\n      fn.emit('start');\n    }\n    fn.emit('update', [], []);\n    links.updateRanges();\n  };\n\n  /**\n   * Checks if a value is contained within a range in this brush context\n   *\n   * Returns true if the values exists for the provided key, returns false otherwise.\n   *\n   * @param  {string} key - An identifier that represents the data source of the value\n   * @param  {number} value - The value to check for\n   * @return {boolean}\n   * @example\n   * brush.addRange('Sales', { min: 10, max: 50 });\n   * brush.containsRangeValue('Sales', 30); // true\n   * brush.containsRangeValue('Sales', 5); // false\n   */\n  fn.containsRangeValue = (key, value) => {\n    let k = aliases[key] || key;\n    if (!ranges[k]) {\n      return false;\n    }\n    return ranges[k].containsValue(value);\n  };\n\n  /**\n   * Checks if a range segment is contained within this brush context\n   *\n   * Returns true if the range segment exists for the provided key, returns false otherwise.\n   *\n   * @param {string} key - An identifier that represents the data source of the value\n   * @param {object} range - The range to check for\n   * @param {number} range.min - Min value of the range\n   * @param {number} range.max - Max value of the range\n   * @return {boolean}\n   * @example\n   * brush.addRange('Sales', { min: 10, max: 50 });\n   * brush.containsRange('Sales', { min: 15, max: 20 }); // true - the range segment is fully contained within [10, 50]\n   * brush.containsRange('Sales', { min: 5, max: 20 }); // false - part of the range segment is outside [10, 50]\n   * brush.containsRange('Sales', { min: 30, max: 80 }); // false - part of the range segment is outside [10, 50]\n   */\n  fn.containsRange = (key, range) => {\n    let k = aliases[key] || key;\n    if (!ranges[k]) {\n      return false;\n    }\n    return ranges[k].containsRange(range);\n  };\n\n  fn.containsMappedData = (d, props, mode) => {\n    let status = [];\n    const keys = Object.keys(d);\n    let key;\n    let item;\n    let source;\n    let value;\n\n    for (let i = 0, num = keys.length; i < num; i++) {\n      key = keys[i];\n      if (key === 'value') {\n        item = d;\n        status[i] = { key: '', i, bool: false };\n      } else if (key === 'source') {\n        continue;\n      } else {\n        item = d[key];\n        status[i] = { key, i, bool: false };\n      }\n      source = item.source && item.source.field;\n      if (typeof source === 'undefined') {\n        continue;\n      }\n      if (typeof item.source.key !== 'undefined') {\n        source = `${item.source.key}/${source}`;\n      }\n\n      if (source in aliases) {\n        source = aliases[source];\n      }\n\n      value = item.value;\n      if (ranges[source]) {\n        status[i].bool = Array.isArray(value)\n          ? ranges[source].containsRange({ min: value[0], max: value[1] })\n          : ranges[source].containsValue(value);\n      } else if (values[source] && values[source].contains(value)) {\n        status[i].bool = true;\n      }\n    }\n\n    if (props) {\n      status = status.filter((b) => props.indexOf(b.key) !== -1);\n      if (mode === 'and') {\n        return !!status.length && !status.some((s) => s.bool === false);\n      }\n      if (mode === 'xor') {\n        return !!status.length && status.some((s) => s.bool) && status.some((s) => s.bool === false);\n      }\n      // !mode || mode === 'or'\n      return status.some((s) => s.bool);\n    }\n    return status.some((s) => s.bool);\n  };\n\n  /**\n   * Adds an event interceptor\n   *\n   * @param {string} name Name of the event to intercept\n   * @param {function} ic Handler to call before event is triggered\n   * @example\n   * brush.intercept('add-values', items => {\n   *  console.log('about to add the following items', items);\n   *  return items;\n   * });\n   */\n  fn.intercept = (name, ic) => {\n    const s = toCamelCase(name);\n    if (!interceptors[s]) {\n      return;\n    }\n    interceptors[s].push(ic);\n  };\n\n  /**\n   * Removes an interceptor\n   *\n   * @param {string} name Name of the event to intercept\n   * @param {function} ic Handler to remove\n   */\n  fn.removeInterceptor = (name, ic) => {\n    const s = toCamelCase(name);\n    if (!interceptors[s]) {\n      return;\n    }\n    const idx = interceptors[s].indexOf(ic);\n    if (idx !== -1) {\n      interceptors[s].splice(idx, 1);\n    }\n  };\n\n  /**\n   * Removes all interceptors\n   *\n   * @param {string} [name] Name of the event to remove interceptors for. If not provided, removes all interceptors.\n   */\n  fn.removeAllInterceptors = (name) => {\n    const toRemove = [];\n    if (name) {\n      const s = toCamelCase(name);\n      if (interceptors[s] && interceptors[s].length) {\n        toRemove.push({ name, handlers: interceptors[s] });\n      }\n    } else {\n      Object.keys(interceptors).forEach((n) => {\n        if (interceptors[n].length) {\n          toRemove.push({ name: toSnakeCase(n), handlers: interceptors[n] });\n        }\n      });\n    }\n\n    toRemove.forEach((ic) => {\n      const interceptorHandlers = ic.handlers.slice();\n      interceptorHandlers.forEach((handler) => fn.removeInterceptor(ic.name, handler));\n    });\n  };\n\n  /**\n   * Adds an alias to the given key\n   *\n   * @param {string} key - Value to be replaced\n   * @param {string} alias - Value to replace key with\n   * @example\n   * brush.addKeyAlias('BadFieldName', 'Region');\n   * brush.addValue('BadFieldName', 'Sweden'); // 'BadFieldName' will be stored as 'Region'\n   * brush.containsValue('Region', 'Sweden'); // true\n   * brush.containsValue('BadFieldName', 'Sweden'); // true\n   */\n  fn.addKeyAlias = (key, alias) => {\n    aliases[key] = alias;\n  };\n\n  /**\n   * Removes an alias\n   *\n   * This will only remove the key to alias mapping for new manipulations of the brush,\n   * no changes will be made to the current state of this brush.\n   *\n   * @param {string} key - Value to remove as alias\n   * @example\n   * brush.removeKeyAlias('BadFieldName');\n   */\n  fn.removeKeyAlias = (key) => {\n    delete aliases[key];\n  };\n\n  EventEmitter.mixin(fn);\n\n  return fn;\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 brush from './brush';\nimport registry from '../utils/registry';\n\nconst reg = registry();\n\nexport function register(type, b) {\n  if (b) {\n    reg.add(type, b);\n  }\n  return reg.get(type);\n}\n\nexport default brush;\n","import {tpmt} from \"./math.js\";\n\nvar tau = 2 * Math.PI,\n    amplitude = 1,\n    period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticIn(t) {\n    return a * tpmt(-(--t)) * Math.sin((s - t) / p);\n  }\n\n  elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n  elasticIn.period = function(p) { return custom(a, p); };\n\n  return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticOut(t) {\n    return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);\n  }\n\n  elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n  elasticOut.period = function(p) { return custom(a, p); };\n\n  return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticInOut(t) {\n    return ((t = t * 2 - 1) < 0\n        ? a * tpmt(-t) * Math.sin((s - t) / p)\n        : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;\n  }\n\n  elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n  elasticInOut.period = function(p) { return custom(a, p); };\n\n  return elasticInOut;\n})(amplitude, period);\n","// tpmt is two power minus ten times t scaled to [0,1]\nexport function tpmt(x) {\n  return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n","import extend from 'extend';\nimport { interpolateObject } from 'd3-interpolate';\nimport { easeCubic, easeElasticOut } from 'd3-ease';\n\n/* globals window */\n\nfunction nodeId(node, i) {\n  if (node.data) {\n    return node.data.value;\n  }\n  if (node.type === 'text') {\n    return node.text;\n  }\n  return i;\n}\n\nfunction tween({ old, current }, { renderer }, config) {\n  let ticker;\n  // let staticNodes = [];\n  let toBeUpdated = [];\n  let entered = { nodes: [], ips: [] };\n  let exited = { nodes: [], ips: [] };\n  let updated = { nodes: [], ips: [] };\n  let stages = [];\n  const trackBy = config.trackBy || nodeId;\n\n  const tweener = {\n    start() {\n      let ids = {};\n      old.forEach((node, i) => {\n        let id = trackBy(node, i);\n        ids[id] = node;\n      });\n      current.forEach((node, i) => {\n        let id = trackBy(node, i);\n        if (ids[id]) {\n          updated.ips.push(interpolateObject(ids[id], node));\n          updated.nodes.push(node);\n          toBeUpdated.push(ids[id]);\n          ids[id] = false;\n        } else {\n          entered.nodes.push(node);\n          entered.ips.push(\n            interpolateObject(\n              {\n                r: 0.001,\n                opacity: 0,\n              },\n              node\n            )\n          );\n        }\n      });\n      Object.keys(ids).forEach((key) => {\n        if (ids[key]) {\n          exited.nodes.push(ids[key]);\n          exited.ips.push(interpolateObject(ids[key], extend({}, ids[key], { r: 0.0001, opacity: 0 })));\n        }\n      });\n      if (exited.ips.length) {\n        stages.push({\n          easing: easeCubic,\n          duration: 200,\n          tweens: exited.ips,\n          nodes: [...toBeUpdated],\n        });\n      }\n      if (updated.ips.length) {\n        stages.push({\n          easing: easeCubic,\n          duration: 400,\n          tweens: updated.ips,\n          nodes: [],\n        });\n      }\n      if (entered.ips.length) {\n        stages.push({\n          easing: easeElasticOut,\n          duration: 1200,\n          tweens: entered.ips,\n          nodes: [...updated.nodes],\n        });\n      }\n      // console.log(stages);\n      if (stages.length) {\n        stages[0].started = Date.now();\n        if (typeof window !== 'undefined') {\n          ticker = window.requestAnimationFrame(tweener.tick);\n        }\n      }\n    },\n    tick() {\n      let currentStage = stages[0];\n      if (!currentStage) {\n        tweener.stop();\n      }\n      if (!currentStage.started) {\n        currentStage.started = Date.now();\n      }\n      let t = (Date.now() - currentStage.started) / currentStage.duration;\n      let currentNodes = [];\n      let tweenedNodes = currentStage.tweens.map((ip) => ip(currentStage.easing(Math.min(1, t))));\n      currentNodes.push(...tweenedNodes);\n      currentNodes.push(...currentStage.nodes);\n      // currentNodes.push(...staticNodes);\n      // stages.slice(1).forEach(stage => currentNodes.push(...stage.nodes));\n      renderer.render(currentNodes);\n      if (t >= 1) {\n        // staticNodes.push(...currentStage.nodes);\n        stages.shift();\n        if (!stages.length) {\n          tweener.stop();\n        }\n      }\n      if (ticker) {\n        ticker = window.requestAnimationFrame(tweener.tick);\n      }\n    },\n    stop() {\n      if (ticker) {\n        window.cancelAnimationFrame(ticker);\n        ticker = false;\n      }\n    },\n  };\n\n  return tweener;\n}\n\nexport { tween as default };\n","import extend from 'extend';\n\nconst GLOBAL_DEFAULTS = {\n  fontFamily: 'Arial',\n  fontSize: '13px',\n  color: '#595959',\n  backgroundColor: '#ffffff',\n  stroke: '#000000',\n  strokeWidth: 0,\n  $fill: '#333333',\n};\n\nconst REF_RX = /^\\$/;\n\nfunction isPrimitive(x) {\n  const type = typeof x;\n  return type !== 'object' && type !== 'function' && type !== 'undefined';\n}\n\n/**\n * Callback function\n * @callback datumAccessor\n * @param {DatumExtract} d datum\n * @example\n * (d) => Math.min(0, d.value);\n */\n\n/**\n * @typedef {object} DatumConfig\n * @property {string} [scale] - Name of a scale\n * @property {datumAccessor} [fn]\n * @property {string} [ref] - A reference to a DatumExtract property\n * @example\n * // Implicitly resolve the datum by passing a referenced data through the scale\n * {\n *  scale: '<name-of-scale>',\n *  ref: '<data-property>'\n * }\n *\n * // or explicitly resolve the datum using callback function\n * {\n *  fn: (d) => Math.min(0, d.datum.x.value);\n * }\n */\n\n/**\n * Custom type that is either a string, DatumConfig or a datumAccessor\n * @typedef {string|DatumConfig|datumAccessor} DatumString\n */\n\n/**\n * Custom type that is either a number, DatumConfig or a datumAccessor\n * @typedef {number|DatumConfig|datumAccessor} DatumNumber\n */\n\n/**\n * Custom type that is either a boolean, DatumConfig or a datumAccessor\n * @typedef {boolean|DatumConfig|datumAccessor} DatumBoolean\n */\n\n/**\n * Normalizes property settings\n *\n * @ignore\n * @export\n * @param {any} settings\n * @param {any} defaults\n * @param {any} chart\n * @returns {any}\n */\nexport function normalizeSettings(settings, defaults, chart) {\n  const composition = extend({}, settings);\n  const defs = extend({}, defaults);\n  Object.keys(composition).forEach((key) => {\n    defs[key] = {};\n    const v = composition[key];\n    const vType = typeof v;\n    if (typeof v === 'function') {\n      defs[key].fn = v;\n    } else if (isPrimitive(v)) {\n      let defaultValue = defaults[key];\n      if (typeof defaultValue === 'string' && REF_RX.test(defaultValue)) {\n        defaultValue = GLOBAL_DEFAULTS[defaultValue];\n      }\n      const defaultType = typeof defaultValue;\n      if (defaultType === 'undefined') {\n        // if property has no default, assign provided value\n        defs[key] = v;\n      } else {\n        // assign provided value if it's of same type as default, otherwise use default\n        defs[key] = defaultType === vType ? v : defaultValue;\n      }\n    } else if (v && typeof v === 'object') {\n      if (typeof v.fn === 'function') {\n        defs[key].fn = v.fn;\n      }\n      if (typeof v.scale !== 'undefined') {\n        defs[key].scale = chart.scale(v.scale);\n      }\n      if (typeof v.ref === 'string') {\n        defs[key].ref = v.ref;\n      }\n    }\n  });\n\n  Object.keys(defaults).forEach((key) => {\n    if (key in composition) {\n      // don't process same props again\n      return;\n    }\n    const v = defaults[key];\n    const defaultType = typeof v;\n    if (defaultType === 'string' && REF_RX.test(v)) {\n      defs[key] = GLOBAL_DEFAULTS[v];\n    } else {\n      defs[key] = v;\n    }\n  });\n\n  return defs;\n}\n\nexport function resolveForItem(context, normalized, idx) {\n  const ret = {};\n  const keys = Object.keys(normalized);\n  const len = keys.length;\n  const fallbackData = context.datum;\n  const datum = context.datum;\n  for (let i = 0; i < len; i++) {\n    const key = keys[i];\n    const normalizedProp = normalized[key];\n    const exists = typeof datum === 'object' && typeof normalizedProp !== 'undefined';\n    const hasExplicitDataProp = exists && typeof normalizedProp.ref === 'string';\n    const hasImplicitDataProp = exists && key in datum;\n    const propData = hasExplicitDataProp ? datum[normalizedProp.ref] : hasImplicitDataProp ? datum[key] : fallbackData; // eslint-disable-line\n    if (isPrimitive(normalizedProp)) {\n      ret[key] = normalizedProp;\n    } else if (exists && normalizedProp.fn) {\n      // callback function\n      if (normalizedProp.scale) {\n        context.scale = normalizedProp.scale;\n      }\n      ret[key] = normalizedProp.fn.call(null, context, idx);\n    } else if (exists && normalizedProp.scale && propData) {\n      ret[key] = normalizedProp.scale(propData.value);\n      if (normalizedProp.scale.bandwidth) {\n        ret[key] += normalizedProp.scale.bandwidth() / 2;\n      }\n    } else if (hasExplicitDataProp && propData) {\n      ret[key] = propData.value;\n    } else if (normalizedProp.fn) {\n      ret[key] = normalizedProp.fn.call(null, context, idx);\n    } else {\n      ret[key] = normalizedProp;\n    }\n  }\n  return ret;\n}\n","export function updateScaleSize(object, path, size) {\n  const o = object[path];\n  if (o && o.scale && o.scale.pxScale) {\n    o.scale = o.scale.pxScale(size);\n  } else if (o && o.pxScale) {\n    object[path] = o.pxScale(size);\n  }\n}\n\nexport function scaleWithSize(scale, size) {\n  return scale.pxScale ? scale.pxScale(size) : scale;\n}\n","import { normalizeSettings, resolveForItem } from '../chart-components/property-resolver';\nimport { updateScaleSize } from '../scales';\n\nconst externals = {\n  normalizeSettings,\n  resolveForItem,\n  updateScaleSize,\n};\n\nexport default function (resources, deps = externals) {\n  let cache = {};\n\n  function resolve({ data, settings, defaults = {}, scaled }) {\n    const norm = (cache.norm = deps.normalizeSettings(settings, defaults, resources.chart));\n\n    const res = {\n      scale: resources.chart.scale,\n      formatter: resources.chart.formatter,\n    };\n\n    if (scaled) {\n      Object.keys(scaled).forEach((key) => {\n        if (norm[key]) {\n          deps.updateScaleSize(norm, key, scaled[key]);\n        }\n      });\n    }\n\n    const resolved = [];\n    if (data && Array.isArray(data.items)) {\n      let context;\n      for (let i = 0, len = data.items.length; i < len; i++) {\n        context = {\n          datum: data.items[i],\n          data,\n          resources: res,\n        };\n        let obj = deps.resolveForItem(context, cache.norm, i);\n        obj.data = data.items[i];\n        resolved.push(obj);\n      }\n    } else {\n      const context = {\n        data,\n        resources: res,\n      };\n      let obj = deps.resolveForItem(context, cache.norm, -1);\n      return {\n        settings: cache.norm,\n        item: obj,\n      };\n    }\n    return {\n      settings: cache.norm,\n      items: resolved,\n    };\n  }\n\n  return {\n    resolve,\n  };\n}\n","import extend from 'extend';\nimport { isTouchEvent } from '../utils/event-type';\n\n/**\n * Flatten the array of nodes by removing any containers as they do not support styling, thus unable to brush them.\n * @param {array} nodes\n * @ignore\n */\nexport function reduceToLeafNodes(nodes = []) {\n  return nodes.reduce((ary, node) => {\n    if (Array.isArray(node.children)) {\n      ary.push(...reduceToLeafNodes(node.children));\n      return ary;\n    }\n    ary.push(node);\n    return ary;\n  }, []);\n}\n\nexport function styler(obj, { context, data, style, filter, mode }) {\n  const brusher = obj.chart.brush(context);\n  const dataProps = data;\n  const active = style.active || {};\n  const inactive = style.inactive || {};\n  const styleProps = [];\n  Object.keys(active).forEach((key) => {\n    styleProps.push(key);\n  });\n\n  Object.keys(inactive).forEach((key) => {\n    if (styleProps.indexOf(key) === -1) {\n      styleProps.push(key);\n    }\n  });\n\n  const activeNodes = [];\n  let globalActivation = false; // track when we need to loop through all nodes, not just the active ones\n\n  const getNodes = () => {\n    let nodes = reduceToLeafNodes(obj.nodes);\n    if (typeof filter === 'function') {\n      nodes = nodes.filter(filter);\n    }\n    return nodes;\n  };\n\n  const update = () => {\n    // TODO - render nodes only once, i.e. don't render for each brush, update nodes for all brushes and then render\n    const nodes = getNodes();\n    const len = nodes.length;\n    let nodeData;\n    let globalChanged = false;\n    const evaluatedDataProps = typeof dataProps === 'function' ? dataProps({ brush: brusher }) : dataProps;\n\n    for (let i = 0; i < len; i++) {\n      // TODO - update only added and removed nodes\n      nodeData = nodes[i].data;\n      if (!nodeData) {\n        continue;\n      }\n\n      if (!nodes[i].__style) {\n        nodes[i].__style = {};\n        styleProps.forEach((s) => {\n          nodes[i].__style[s] = nodes[i][s]; // store original value\n        });\n      }\n\n      const isActive = brusher.containsMappedData(nodeData, evaluatedDataProps, mode);\n      const activeIdx = activeNodes.indexOf(nodes[i]);\n      let changed = false;\n      if (isActive && activeIdx === -1) {\n        // activated\n        activeNodes.push(nodes[i]);\n        changed = true;\n      } else if (!isActive && activeIdx !== -1) {\n        // was active\n        activeNodes.splice(activeIdx, 1);\n        changed = true;\n      }\n      if (changed || globalActivation) {\n        const original = extend({}, nodes[i], nodes[i].__style);\n        styleProps.forEach((s) => {\n          if (isActive && s in active) {\n            nodes[i][s] = typeof active[s] === 'function' ? active[s].call(null, original) : active[s];\n          } else if (!isActive && s in inactive) {\n            nodes[i][s] = typeof inactive[s] === 'function' ? inactive[s].call(null, original) : inactive[s];\n          } else {\n            nodes[i][s] = nodes[i].__style[s];\n          }\n        });\n        globalChanged = true;\n      }\n    }\n    globalActivation = false;\n    return globalChanged;\n  };\n\n  const onStart = (opts = { suppressRender: false }) => {\n    const { suppressRender } = opts;\n    const nodes = getNodes();\n    const len = nodes.length;\n    for (let i = 0; i < len; i++) {\n      if (!nodes[i].data) {\n        continue;\n      }\n\n      nodes[i].__style = nodes[i].__style || {};\n      styleProps.forEach((s) => {\n        nodes[i].__style[s] = nodes[i][s]; // store original value\n        if (s in inactive) {\n          nodes[i][s] = typeof inactive[s] === 'function' ? inactive[s].call(null, nodes[i]) : inactive[s];\n        }\n      });\n    }\n    globalActivation = true;\n    activeNodes.length = 0;\n    if (!suppressRender) {\n      obj.renderer.render(obj.nodes);\n    }\n  };\n\n  const onEnd = (opts = { suppressRender: false }) => {\n    const { suppressRender } = opts;\n    const nodes = getNodes();\n    const len = nodes.length;\n\n    for (let i = 0; i < len; i++) {\n      if (nodes[i].__style) {\n        Object.keys(nodes[i].__style).forEach((s) => {\n          nodes[i][s] = nodes[i].__style[s];\n        });\n        nodes[i].__style = undefined;\n      }\n    }\n    activeNodes.length = 0;\n    if (!suppressRender) {\n      obj.renderer.render(obj.nodes);\n    }\n  };\n  const onUpdate = () => {\n    const changed = update();\n    if (changed) {\n      obj.renderer.render(obj.nodes);\n    }\n  };\n\n  const externalUpdate = () => {\n    activeNodes.length = 0;\n    globalActivation = true;\n    update();\n  };\n\n  brusher.on('start', onStart);\n  brusher.on('end', onEnd);\n  brusher.on('update', onUpdate);\n\n  function cleanUp() {\n    brusher.removeListener('start', onStart);\n    brusher.removeListener('end', onEnd);\n    brusher.removeListener('update', onUpdate);\n  }\n\n  return {\n    isActive() {\n      return brusher.isActive();\n    },\n    update: externalUpdate,\n    cleanUp,\n  };\n}\n\nexport function brushDataPoints({ dataPoints, action, chart, trigger }) {\n  if (!trigger) {\n    return;\n  }\n\n  const dataProps = trigger.data || [''];\n\n  let rangeBrush = {\n    items: [],\n    actionFn: 'toggleRanges',\n  };\n  let valueBrush = {\n    items: [],\n    actionFn: 'toggleValues',\n  };\n\n  if (['add', 'remove', 'set', 'toggle'].indexOf(action) !== -1) {\n    rangeBrush.actionFn = `${action}Ranges`;\n    valueBrush.actionFn = `${action}Values`;\n  }\n\n  for (let i = 0; i < dataPoints.length; i++) {\n    const dataPoint = dataPoints[i];\n    if (!dataPoint) {\n      continue;\n    }\n    dataProps.forEach((p) => {\n      let d = dataPoint && !p ? dataPoint : dataPoint[p];\n      if (d) {\n        let it = { key: d.source.field };\n        if (typeof d.source.key !== 'undefined') {\n          it.key = `${d.source.key}/${d.source.field}`;\n        }\n        if (Array.isArray(d.value)) {\n          it.range = { min: d.value[0], max: d.value[1] };\n          rangeBrush.items.push(it);\n        } else {\n          it.value = d.value;\n          valueBrush.items.push(it);\n        }\n      }\n    });\n  }\n\n  trigger.contexts.forEach((c) => {\n    if (rangeBrush.items.length) {\n      chart.brush(c)[rangeBrush.actionFn](rangeBrush.items);\n    } else {\n      chart.brush(c)[valueBrush.actionFn](valueBrush.items); // call action even if there are items to potentially clear what is currently in the brush\n    }\n  });\n}\n\nexport function brushFromSceneNodes({ nodes, action, chart, trigger }) {\n  const dataPoints = [];\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    let nodeData = node.data;\n    if (nodeData !== null) {\n      dataPoints.push(nodeData);\n    }\n  }\n\n  brushDataPoints({\n    dataPoints,\n    action,\n    chart,\n    trigger,\n  });\n}\n\nexport function resolveEvent({ collisions, t, config, action }) {\n  let brushCollisions = [];\n  let resolved = false;\n\n  if (collisions.length > 0) {\n    brushCollisions = collisions;\n    resolved = true;\n\n    if (t.propagation === 'stop') {\n      brushCollisions = [collisions[collisions.length - 1]];\n    }\n  }\n\n  const nodes = brushCollisions.map((c) => c.node);\n  brushFromSceneNodes({\n    nodes,\n    action,\n    chart: config.chart,\n    data: config.data,\n    trigger: t,\n  });\n\n  return resolved;\n}\n\nfunction touchSingleContactPoint(e, rect) {\n  if (e.changedTouches.length !== 1) {\n    return null;\n  }\n\n  return {\n    x: e.changedTouches[0].clientX - rect.left,\n    y: e.changedTouches[0].clientY - rect.top,\n  };\n}\n\nfunction singleContactPoint(e, rect) {\n  return {\n    x: e.clientX - rect.left,\n    y: e.clientY - rect.top,\n  };\n}\n\nfunction resolveCollisions(e, t, renderer) {\n  const rect = renderer.element().getBoundingClientRect();\n  let p = isTouchEvent(e) ? touchSingleContactPoint(e, rect) : singleContactPoint(e, rect);\n\n  if (p === null || p.x < 0 || p.y < 0 || p.x > rect.width || p.y > rect.height) {\n    // TODO include radius in this check?\n    return [];\n  }\n\n  if (t.touchRadius > 0 && isTouchEvent(e)) {\n    p = {\n      cx: p.x,\n      cy: p.y,\n      r: t.touchRadius, // TODO Use touch event radius/width value (Need to handle dpi scaling as well)\n    };\n  } else if (t.mouseRadius > 0 && !isTouchEvent(e)) {\n    p = {\n      cx: p.x,\n      cy: p.y,\n      r: t.mouseRadius,\n    };\n  }\n\n  return renderer.itemsAt(p);\n}\n\nfunction resolveAction(action, e, def) {\n  if (action) {\n    if (typeof action === 'function') {\n      return action(e);\n    }\n    return action;\n  }\n  return def;\n}\n\nexport function resolveTapEvent({ e, t, config }) {\n  const collisions = resolveCollisions(e, t, config.renderer);\n\n  return resolveEvent({\n    collisions,\n    t,\n    config,\n    action: resolveAction(t.action, e, 'toggle'),\n  });\n}\n\nexport function resolveOverEvent({ e, t, config }) {\n  const collisions = resolveCollisions(e, t, config.renderer);\n\n  return resolveEvent({\n    collisions,\n    t,\n    config,\n    action: resolveAction(t.action, e, 'set'),\n  });\n}\n","/**\n * A list of supported attributes in lower camelCase notation mapped to corresponding kebab-case notation.\n * The kebab-case notations are a sub-set of SVG attributes (https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute).\n * @ignore\n * @private\n */\nconst mappedAttributes = {\n  fill: 'fill',\n  stroke: 'stroke',\n  opacity: 'opacity',\n  strokeWidth: 'stroke-width',\n  strokeLinejoin: 'stroke-linejoin',\n  fontFamily: 'font-family',\n  fontSize: 'font-size',\n  baseline: 'dominant-baseline', // Special case where we have defined our own attribute name\n  dominantBaseline: 'dominant-baseline',\n  anchor: 'text-anchor', // Special case where we have defined our own attribute name\n  textAnchor: 'text-anchor',\n  maxWidth: 'maxWidth',\n  transform: 'transform',\n  strokeDasharray: 'stroke-dasharray',\n  id: 'id',\n};\n\n/**\n * Takes a target object and assign each supported attribute from a source object to that target.\n * Each supported attributes is converted to a mapped kebab-case notation.\n * @ignore\n * @private\n * @param {object} target - Target object on which to assign mapped attribute values\n * @param {object} source - Source object\n */\nfunction assignMappedAttribute(target, source) {\n  Object.keys(mappedAttributes).forEach((key) => {\n    const sourceValue = source[key];\n    if (typeof sourceValue !== 'undefined') {\n      const mappedKey = mappedAttributes[key];\n      target[mappedKey] = sourceValue;\n    }\n  });\n}\n\nexport { mappedAttributes, assignMappedAttribute };\n","export default function pointsToPath(points, close = true) {\n  let d = '';\n\n  for (let i = 0; i < points.length; i++) {\n    const p = points[i];\n    if (i === 0) {\n      d += `M${p.x} ${p.y}`;\n    } else {\n      d += `L${p.x} ${p.y}`;\n    }\n\n    d += ' ';\n  }\n\n  if (close) {\n    d += 'Z';\n  }\n\n  return d;\n}\n","import pointsToPath from '../utils/points-to-path';\n\nexport function generateCrossPoints(x, y, size, barWidth) {\n  const r = size / 2;\n  const innerLeft = x - barWidth / 2;\n  const innerTop = y - barWidth / 2;\n  const left = x - r;\n  const top = y - r;\n\n  return [\n    { x: innerLeft, y: innerTop }, // Top\n    { x: innerLeft, y: top },\n    { x: innerLeft + barWidth, y: top },\n    { x: innerLeft + barWidth, y: innerTop }, // Right\n    { x: left + size, y: innerTop },\n    { x: left + size, y: innerTop + barWidth },\n    { x: innerLeft + barWidth, y: innerTop + barWidth }, // Bottom\n    { x: innerLeft + barWidth, y: top + size },\n    { x: innerLeft, y: top + size },\n    { x: innerLeft, y: innerTop + barWidth }, // Left\n    { x: left, y: innerTop + barWidth },\n    { x: left, y: innerTop },\n  ];\n}\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolCross\n * @property {number} [width] - Width of the diagonals\n */\nfunction cross(options) {\n  const x = options.x;\n  const y = options.y;\n  const r = options.size / 2;\n  const width = isNaN(options.width) ? r / 2 : options.width;\n  const barWidth = Math.min(width, r);\n\n  const points = generateCrossPoints(x, y, options.size, barWidth);\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { cross as default };\n","/**\n * Get x1, y1, x2, y2 point from angle\n * Source: {@link https://codepen.io/NV/pen/jcnmK}\n * @private\n *\n * @param  {number} angle Radians\n * @return {object}       Point with x1, y2, x2, y2.\n */\nexport function angleToPoints(angle) {\n  let segment = Math.floor((angle / Math.PI) * 2) + 2;\n  let diagonal = (0.5 * segment + 0.25) * Math.PI;\n  let op = Math.cos(Math.abs(diagonal - angle)) * Math.sqrt(2);\n  let x = op * Math.cos(angle);\n  let y = op * Math.sin(angle);\n\n  return {\n    x1: x < 0 ? 1 : 0,\n    y1: y < 0 ? 1 : 0,\n    x2: x >= 0 ? x : x + 1,\n    y2: y >= 0 ? y : y + 1,\n  };\n}\n\n/**\n * Turns degrees into radians\n * @private\n *\n * @param  {number} degrees Degrees\n * @return {number}         Radians\n */\nexport function toRadians(d) {\n  return (-d / 180) * Math.PI;\n}\n\n/**\n * Turns radians into degrees\n * @private\n *\n * @param  {number} degrees Degrees\n * @return {number}         Radians\n */\nexport function toDegrees(r) {\n  return r * (180 / Math.PI);\n}\n\n/**\n * Get x1, y1, x2, y2 point from degree\n * @private\n *\n * @param  {number} d Degree\n * @return {object}   Point with x1, y2, x2, y2.\n */\nexport function degreesToPoints(d) {\n  return angleToPoints(toRadians(d));\n}\n","export function add(v1, v2) {\n  return {\n    x: v1.x + v2.x,\n    y: v1.y + v2.y,\n  };\n}\n\nexport function sub(v1, v2) {\n  return {\n    x: v1.x - v2.x,\n    y: v1.y - v2.y,\n  };\n}\n\nexport function scalarMultiply(v, s) {\n  return {\n    x: v.x * s,\n    y: v.y * s,\n  };\n}\n\nexport function sqrMagnitude(v) {\n  return Math.pow(v.x, 2) + Math.pow(v.y, 2);\n}\n\nexport function magnitude(v) {\n  return Math.sqrt(sqrMagnitude(v));\n}\n\nexport function distanceX(v1, v2) {\n  return v1.x - v2.x;\n}\n\nexport function distanceY(v1, v2) {\n  return v1.y - v2.y;\n}\n\nexport function sqrDistance(v1, v2) {\n  return Math.pow(distanceX(v1, v2), 2) + Math.pow(distanceY(v1, v2), 2);\n}\n\nexport function distance(v1, v2) {\n  return Math.sqrt(sqrDistance(v1, v2));\n}\n\nexport function determinant(v1, v2) {\n  return v1.x * v2.y - v2.x * v1.y;\n}\n\nexport function dot(v1, v2) {\n  return v1.x * v2.x + v1.y * v2.y;\n}\n\nexport function projectOnto(v1, v2) {\n  const m = dot(v1, v2) / dot(v2, v2) || 1;\n  return {\n    x: v2.x * m,\n    y: v2.y * m,\n  };\n}\n\nexport function rotate(v, radians, origin = { x: 0, y: 0 }) {\n  const cos = Math.cos(radians);\n  const sin = Math.sin(radians);\n\n  const t1 = sub(v, origin);\n\n  const t2 = {\n    x: cos * t1.x - sin * t1.y,\n    y: sin * t1.x + cos * t1.y,\n  };\n\n  return add(t2, origin);\n}\n\nexport function unit(v) {\n  const m = magnitude(v);\n  return { x: v.x / m, y: v.y / m };\n}\n\nexport function cross(u, v, a) {\n  return (v.x - u.x) * (a.y - u.y) - (v.y - u.y) * (v.x - u.x);\n}\n","import pointsToPath from '../utils/points-to-path';\nimport { rotate } from '../math/vector';\nimport { toRadians } from '../math/angles';\n\nconst DIRECTION_TO_ANGLE = {\n  up: 0,\n  down: 180,\n  left: 90,\n  right: -90,\n};\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolTriangle\n * @property {string} [direction='up'] - Direction of the triangle ('up'|'down'|'left'|'right')\n */\nfunction triangle(options) {\n  const size = options.size;\n  const p = { x: options.x, y: options.y };\n  const directionAngle = DIRECTION_TO_ANGLE[options.direction] || 0;\n  const halfSize = size / 2;\n  const left = options.x - halfSize;\n  const top = options.y - halfSize;\n  let points = [\n    { x: left, y: top + size },\n    { x: left + halfSize, y: top },\n    { x: left + size, y: top + size },\n    { x: left, y: top + size },\n  ];\n\n  const radians = toRadians(directionAngle);\n  points = points.map((pp) => rotate(pp, radians, p));\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { triangle as default };\n","function createRectCollider({ x, y, size }) {\n  const r = size / 2;\n  return {\n    type: 'rect',\n    x: x - r,\n    y: y - r,\n    width: size,\n    height: size,\n  };\n}\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolLine\n * @property {string} [direction='horizontal'] - Direction of line ('horizontal'|'vertical').\n */\nfunction line(options) {\n  const isVertical = options.direction === 'vertical';\n  const r = options.size / 2;\n  const x = options.x;\n  const y = options.y;\n\n  return {\n    type: 'line',\n    stroke: 'black',\n    strokeWidth: 1,\n    x1: x - (isVertical ? 0 : r),\n    y1: y - (isVertical ? r : 0),\n    x2: x + (isVertical ? 0 : r),\n    y2: y + (isVertical ? r : 0),\n    collider: createRectCollider(options), // TODO Use visual collider?\n  };\n}\n\nexport { line as default };\n","import { mappedAttributes } from '../scene-graph/attributes';\nimport circle from './circle';\nimport diamond from './diamond';\nimport saltire from './saltire';\nimport square from './square';\nimport triangle from './triangle';\nimport line from './line';\nimport star from './star';\nimport nPolygon from './n-polygon';\nimport cross from './cross';\nimport bar from './bar';\nimport registry from '../utils/registry';\n\nconst parentReg = registry();\n\nparentReg.add('circle', circle);\nparentReg.add('diamond', diamond);\nparentReg.add('saltire', saltire);\nparentReg.add('square', square);\nparentReg.add('triangle', triangle);\nparentReg.add('line', line);\nparentReg.add('star', star);\nparentReg.add('n-polygon', nPolygon);\nparentReg.add('cross', cross);\nparentReg.add('bar', bar);\n\nfunction applyOpts(obj, opts = {}) {\n  Object.keys(opts).forEach((key) => {\n    if (typeof mappedAttributes[key] !== 'undefined' && key !== 'transform') {\n      obj[key] = opts[key];\n    }\n  });\n}\n\n/**\n * Factory function for symbols.\n * Options object is passed to symbols function.\n * @private\n * @param {SymbolBar|SymbolCircle|SymbolCross|SymbolDiamond|SymbolLine|SymbolPolygon|SymbolSaltire|SymbolSquare|SymbolStar|SymbolTriangle} options - Options definition may contain any of the supported display-object attributes\n * @returns {object} A node definition\n */\nconst create = (reg = parentReg) => (options = {}) => {\n  // TODO handle reserverd properties x, y, size, data, etc..\n  const fn = reg.get(options.type);\n  if (fn) {\n    const s = fn(options);\n    applyOpts(s, options);\n\n    if (typeof options.data !== 'undefined') {\n      s.data = options.data;\n    }\n\n    return s;\n  }\n  return fn;\n};\n\nexport { create as default, parentReg as symbolRegistry };\n\n/**\n * Mandatory symbol config\n * @private\n * @typedef {object} Symbol\n * @property {object} options - Options definition may contain any of the supported display-object attributes\n * @property {string} options.type - Type of symbol\n * @property {number} options.x - x-coordinate\n * @property {number} options.y - y-coordinate\n * @property {number} options.size\n * @property {object} [options.data]\n */\n","/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolCircle\n */\nfunction circle(options) {\n  return {\n    type: 'circle',\n    fill: 'black',\n    cx: options.x,\n    cy: options.y,\n    r: options.size / 2,\n  };\n}\n\nexport { circle as default };\n","import pointsToPath from '../utils/points-to-path';\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolDiamond\n */\nfunction diamond(options) {\n  const size = options.size;\n  const left = options.x - size / 2;\n  const top = options.y - size / 2;\n  const points = [\n    { x: left, y: top + size / 2 },\n    { x: left + size / 2, y: top },\n    { x: left + size, y: top + size / 2 },\n    { x: left + size / 2, y: top + size },\n    { x: left, y: top + size / 2 },\n  ];\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { diamond as default };\n","import { generateCrossPoints } from './cross';\nimport { toRadians } from '../math/angles';\nimport { rotate } from '../math/vector';\nimport pointsToPath from '../utils/points-to-path';\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolSaltire\n * @property {number} [width] - Width of the diagonals\n */\nfunction saltire(options) {\n  const radians = toRadians(45);\n  const r = options.size / 2;\n  const width = isNaN(options.width) ? r / 2 : options.width;\n  const barWidth = Math.min(width, r);\n  let adjustedSize = options.size;\n\n  // Adjust for the barwidth and rotation angle, so that the visual part is always inside the symbol area\n  const h = Math.sin(Math.asin(-radians)) * (barWidth / 2);\n  const c = r / Math.sin(-radians);\n  adjustedSize += (c - r) * 2;\n  adjustedSize -= h * 2;\n\n  const centroid = { x: options.x, y: options.y };\n  const points = generateCrossPoints(options.x, options.y, adjustedSize, barWidth).map((p) =>\n    rotate(p, radians, centroid)\n  );\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { saltire as default };\n","/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolSquare\n */\nfunction square(options) {\n  const size = options.size;\n\n  return {\n    type: 'rect',\n    fill: 'black',\n    x: options.x - size / 2,\n    y: options.y - size / 2,\n    width: size,\n    height: size,\n  };\n}\n\nexport { square as default };\n","import pointsToPath from '../utils/points-to-path';\nimport { toRadians } from '../math/angles';\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolStar\n * @property {number} [points=5] - Number of points on the star\n * @property {number} [startAngle=90] - Start drawing angle\n * @property {number} [innerRadius=size/2] - Size of the star core. My not exceed size of symbol.\n */\nfunction star(options) {\n  const size = options.size;\n  const points = [];\n  const outerRadius = size / 2;\n  const drawPoints = options.points || 5;\n  const innerRadius = Math.min(options.innerRadius || size / 2, size) / 2;\n  const startAngle = isNaN(options.startAngle) ? 90 : options.startAngle;\n  const angle = 360 / drawPoints;\n\n  for (let i = 1; i <= drawPoints; i++) {\n    const pAngle = angle * i + startAngle;\n    const radians = toRadians(pAngle);\n    const innerRadians = toRadians(pAngle + angle / 2);\n    const y = Math.sin(radians);\n    const x = Math.cos(radians);\n    const iy = Math.sin(innerRadians);\n    const ix = Math.cos(innerRadians);\n\n    points.push({\n      x: options.x + x * outerRadius,\n      y: options.y + y * outerRadius,\n    });\n\n    points.push({\n      x: options.x + ix * innerRadius,\n      y: options.y + iy * innerRadius,\n    });\n  }\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { star as default };\n","import pointsToPath from '../utils/points-to-path';\nimport { toRadians } from '../math/angles';\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolPolygon\n * @property {object} [sides=6] - Number of sides on the regular polygon\n * @property {object} [startAngle=0] - Start drawing angle\n */\nfunction nPolygon(options) {\n  const points = [];\n  const radius = options.size / 2;\n  const drawPoints = Math.max(isNaN(options.sides) ? 6 : options.sides, 3);\n  const angle = 360 / drawPoints;\n  const startAngle = isNaN(options.startAngle) ? 0 : options.startAngle;\n\n  for (let i = 1; i <= drawPoints; i++) {\n    const radians = toRadians(angle * i + startAngle);\n    const y = Math.sin(radians);\n    const x = Math.cos(radians);\n    points.push({\n      x: options.x + x * radius,\n      y: options.y + y * radius,\n    });\n  }\n\n  return {\n    type: 'path',\n    fill: 'black',\n    d: pointsToPath(points),\n  };\n}\n\nexport { nPolygon as default };\n","import { rotate } from '../math/vector';\nimport { pointsToRect } from '../geometry/util';\nimport { toRadians } from '../math/angles';\n\n/**\n * @private\n * @extends Symbol\n * @typedef {object} SymbolBar\n * @property {string} [direction='horizontal'] - Direction of bar ('horizontal'|'vertical').\n */\nfunction bar(options) {\n  const p = { x: options.x, y: options.y };\n  const isVertical = options.direction === 'vertical';\n  const r = options.size / 2;\n  const width = r / 2;\n  const halfWidth = width / 2;\n\n  let points = [\n    { x: p.x - r, y: p.y + halfWidth },\n    { x: p.x - r, y: p.y - halfWidth },\n    { x: p.x + r, y: p.y - halfWidth },\n    { x: p.x + r, y: p.y + halfWidth },\n  ];\n\n  if (isVertical) {\n    const radians = toRadians(90);\n    points = points.map((pp) => rotate(pp, radians, p));\n  }\n\n  const rect = pointsToRect(points);\n  rect.type = 'rect';\n  rect.fill = 'black';\n\n  return rect;\n}\n\nexport { bar as default };\n","/**\n * Initilize a new dock configuration\n * @private\n * @param {object} [settings] - Settings object\n * @returns {object} A dock configuration instance\n * @example\n * let instance = create({\n *  dock: 'left',\n *  displayOrder: 2,\n *  prioOrder: 1,\n *  preferredSize: 33,\n *  minimumLayoutMode: 'L',\n *  show: true\n * });\n */\nfunction create(settings = {}, callbackContext = {}) {\n  let {\n    dock = 'center',\n    displayOrder = 0,\n    prioOrder = 0,\n    preferredSize = 0,\n    minimumLayoutMode,\n    show = true,\n  } = settings;\n\n  // avoid empty string dock\n  dock = dock || 'center';\n\n  /**\n   * @private\n   * @alias dockConfig\n   * @interface\n   */\n  const dockConfig = {\n    /**\n     * Returns the preferred size of a component.\n     * The return value of the function can either be a number representing the required size in the dock direction\n     * or an object with a `size` and `edgeBleed` property.\n     * @param {object} [inner]\n     * @param {object} [outer]\n     * @returns {number|object} Returns the computed preferred size\n     * @example\n     * dockConfig.computePreferredSize(() => 150); // Require a size of 150 in the dock direction\n     *\n     * dockConfig.computePreferredSize(() => ({\n     *  size: 150,\n     *  edgeBleed: {\n     *    left: 50,\n     *    right: 50\n     *  }\n     * })); // Require a size of 150 in the dock direction and a bleed size of 50 to the left and right dock direction\n     */\n    computePreferredSize({ inner, outer, children }) {\n      if (typeof preferredSize === 'function') {\n        return preferredSize({ inner, outer, children, dock: this.dock() }, callbackContext);\n      }\n      return preferredSize;\n    },\n\n    /**\n     * Set the dock direction, supported values are left | right | top | bottom. Any other value will be interpreted as center dock.\n     * @param {string} [val=''] - Dock direction\n     * @returns {this} The current context\n     * @example\n     * dockConfig.dock('left');\n     */\n    dock(val) {\n      if (typeof val !== 'undefined') {\n        dock = val;\n        return this;\n      }\n      return typeof dock === 'function' ? dock(callbackContext) : dock;\n    },\n\n    /**\n     * The `displayOrder` property is used by the layout engine to lay out components.\n     * Components are interpreted in the ascending order of the `displayOrder` value. The layout engine apply the value in two ways,\n     * the first is the order in which components are rendererd. The second is the area components are laid out in\n     * when they have a direction, i.e. docked to either top, bottom, left or right.\n     *\n     * If docked at the same area, the component with a higher `displayOrder` will be rendered\n     * on top of the component with a lower `displayOrder`. It can be seen as defining a z-index.\n     * A lower `displayOrder` also means that a component will be laid out first in a given direction,\n     * i.e. laid out closer to the central area (non-directional area) then a component with a higher `displayOrder`.\n     * It can in this case be seen as the x-index or y-index.\n     * @param {number} [val=0] - The display order\n     * @returns {this|number} The current context or display order\n     * @example\n     * dockConfig.displayOrder(99);\n     */\n    displayOrder(val) {\n      if (typeof val !== 'undefined') {\n        displayOrder = val;\n        return this;\n      }\n      return typeof displayOrder === 'function' ? displayOrder(callbackContext) : displayOrder;\n    },\n\n    /**\n     * The `prioOrder` property is used to define the order in which components are added to the layout engine,\n     * this is done before any components are laid out. When there is not enough space to add any more components\n     * to a given area, all components not all ready added, are then discarded. The `prioOrder` is interpreted\n     * in the ascending order. Such that a lower value is added to the layout engine first.\n     * @param {number} [val=0] - The prio order\n     * @returns {this|number} The current context or prio order\n     * @example\n     * dockConfig.prioOrder(-1);\n     */\n    prioOrder(val) {\n      if (typeof val !== 'undefined') {\n        prioOrder = val;\n        return this;\n      }\n      return typeof prioOrder === 'function' ? prioOrder(callbackContext) : prioOrder;\n    },\n\n    /**\n     * Ger or set the minimumLayoutMode\n     * @param {string|object} [val] - The minimum layout mode\n     * @returns {string|object|this} If no parameter is passed the current context is returned, else the current layout mode.\n     * @example\n     * dockConfig.minimumLayoutMode('L');\n     * dockConfig.minimumLayoutMode({ width: 'S', height: 'L' });\n     */\n    minimumLayoutMode(val) {\n      if (typeof val !== 'undefined') {\n        minimumLayoutMode = val;\n        return this;\n      }\n      return typeof minimumLayoutMode === 'function' ? minimumLayoutMode(callbackContext) : minimumLayoutMode;\n    },\n\n    /**\n     * Set the component visibility. If false the component is not added to the layout engine.\n     * @param {boolean} [val=true] - Toggle visibility\n     * @returns {this|boolean} The current context or show\n     */\n    show(val) {\n      if (typeof val !== 'undefined') {\n        show = val;\n        return this;\n      }\n      return typeof show === 'function' ? show(callbackContext) : show;\n    },\n  };\n\n  return dockConfig;\n}\n\nexport default create;\n","/* eslint camelcase: 1 */\nimport extend from 'extend';\nimport EventEmitter from '../utils/event-emitter';\nimport extractData from '../data/extractor';\nimport tween from './tween';\nimport settingsResolver from './settings-resolver';\nimport { styler as brushStyler, resolveTapEvent, resolveOverEvent, brushFromSceneNodes } from './brushing';\nimport createSymbolFactory from '../symbols';\nimport createDockConfig from '../layout/dock/config';\n\nconst isReservedProperty = (prop) =>\n  [\n    'on',\n    'preferredSize',\n    'created',\n    'beforeMount',\n    'mounted',\n    'resize',\n    'beforeUpdate',\n    'updated',\n    'beforeRender',\n    'render',\n    'beforeUnmount',\n    'beforeDestroy',\n    'destroyed',\n    'defaultSettings',\n    'data',\n    'settings',\n    'formatter',\n    'scale',\n    'chart',\n    'dockConfig',\n    'mediator',\n    'style',\n    'resolver',\n    'registries',\n    '_DO_NOT_USE_getInfo',\n    'symbol',\n    'isVisible',\n  ].some((name) => name === prop);\n\nfunction prepareContext(ctx, definition, opts) {\n  const { require = [] } = definition;\n  const mediatorSettings = definition.mediator || {};\n  const {\n    settings,\n    formatter,\n    scale,\n    data,\n    renderer,\n    chart,\n    dockConfig,\n    mediator,\n    instance,\n    rect,\n    style,\n    registries,\n    resolver,\n    update,\n    _DO_NOT_USE_getInfo,\n    symbol,\n    isVisible,\n  } = opts;\n\n  ctx.emit = () => {};\n\n  if (isVisible) {\n    ctx.isVisible = isVisible;\n  }\n\n  // TODO add setters and log warnings / errors to console\n  Object.defineProperty(ctx, 'settings', {\n    get: settings,\n  });\n  Object.defineProperty(ctx, 'data', {\n    get: data,\n  });\n  Object.defineProperty(ctx, 'formatter', {\n    get: formatter,\n  });\n  Object.defineProperty(ctx, 'scale', {\n    get: scale,\n  });\n  Object.defineProperty(ctx, 'mediator', {\n    get: mediator,\n  });\n  Object.defineProperty(ctx, 'style', {\n    get: style,\n  });\n  Object.defineProperty(ctx, 'registries', {\n    get: registries,\n  });\n  if (rect) {\n    Object.defineProperty(ctx, 'rect', {\n      get: rect,\n    });\n  }\n\n  // TODO _DO_NOT_USE_getInfo is a temporary solution to expose info from a component\n  // It should replace ASAP with a proper solution.\n  // The only component activaly in need of it is the legend-cat\n  if (_DO_NOT_USE_getInfo) {\n    ctx._DO_NOT_USE_getInfo = _DO_NOT_USE_getInfo;\n  }\n\n  Object.keys(definition).forEach((key) => {\n    if (!isReservedProperty(key)) {\n      // Add non-lifecycle methods to the context\n      if (typeof definition[key] === 'function') {\n        ctx[key] = definition[key].bind(ctx);\n      } else {\n        ctx[key] = definition[key];\n      }\n    }\n  });\n\n  // Add properties to context\n  require.forEach((req) => {\n    if (req === 'renderer') {\n      Object.defineProperty(ctx, 'renderer', {\n        get: renderer,\n      });\n    } else if (req === 'chart') {\n      Object.defineProperty(ctx, 'chart', {\n        get: chart,\n      });\n    } else if (req === 'dockConfig') {\n      Object.defineProperty(ctx, 'dockConfig', {\n        get: dockConfig,\n      });\n    } else if (req === 'instance') {\n      Object.defineProperty(ctx, 'instance', {\n        get: instance,\n      });\n    } else if (req === 'update' && update) {\n      Object.defineProperty(ctx, 'update', {\n        get: update,\n      });\n    } else if (req === 'resolver') {\n      Object.defineProperty(ctx, 'resolver', {\n        get: resolver,\n      });\n    } else if (req === 'symbol') {\n      Object.defineProperty(ctx, 'symbol', {\n        get: symbol,\n      });\n    }\n  });\n\n  Object.keys(mediatorSettings).forEach((eventName) => {\n    ctx.mediator.on(eventName, mediatorSettings[eventName].bind(ctx));\n  });\n}\n\nfunction createDockDefinition(settings, preferredSize, logger) {\n  const getLayoutProperty = (propName) => {\n    if (settings[propName]) {\n      logger.warn(`Deprecation Warning the ${propName} property should be moved into layout: {} property`); // eslint-disable-line no-console\n      return settings[propName];\n    }\n    return settings.layout ? settings.layout[propName] : undefined;\n  };\n\n  const def = {};\n  def.displayOrder = getLayoutProperty('displayOrder');\n  def.dock = getLayoutProperty('dock');\n  def.prioOrder = getLayoutProperty('prioOrder');\n  def.minimumLayoutMode = getLayoutProperty('minimumLayoutMode');\n\n  // move layout properties to layout object\n  settings.layout = settings.layout || {};\n  settings.layout.displayOrder =\n    typeof def.displayOrder !== 'undefined' ? def.displayOrder : settings.layout.displayOrder;\n  settings.layout.prioOrder = typeof def.prioOrder !== 'undefined' ? def.prioOrder : settings.layout.prioOrder;\n  settings.layout.dock = def.dock || settings.layout.dock;\n  settings.layout.minimumLayoutMode = def.minimumLayoutMode || settings.layout.minimumLayoutMode;\n\n  // not directly a dock layout property\n  def.show = settings.show;\n  def.preferredSize = preferredSize;\n  return def;\n}\n\nfunction setUpEmitter(ctx, emitter, settings) {\n  // Object.defineProperty(ctx, 'emitter', )\n  Object.keys(settings.on || {}).forEach((event) => {\n    ctx.eventListeners = ctx.eventListeners || [];\n    const listener = settings.on[event].bind(ctx);\n    ctx.eventListeners.push({ event, listener });\n    emitter.on(event, listener);\n  });\n  ctx.emit = (name, ...event) => emitter.emit(name, ...event);\n}\n\nfunction tearDownEmitter(ctx, emitter) {\n  if (ctx.eventListeners) {\n    ctx.eventListeners.forEach(({ event, listener }) => {\n      emitter.removeListener(event, listener);\n    });\n    ctx.eventListeners.length = 0;\n  }\n  ctx.emit = () => {};\n}\n\n// First render\n// preferredSize -> resize -> beforeRender -> render -> mounted\n\n// Normal update\n// beforeUpdate -> preferredSize -> resize -> beforeRender -> render -> updated\n\n// Update without relayout\n// beforeUpdate -> beforeRender -> render -> updated\n\n// TODO support es6 classes\nfunction componentFactory(definition, context = {}) {\n  const { defaultSettings = {}, _DO_NOT_USE_getInfo = () => ({}) } = definition;\n  const {\n    chart,\n    container,\n    mediator,\n    registries,\n    theme,\n    renderer, // Used by tests\n  } = context;\n  const emitter = EventEmitter.mixin({});\n  let config = context.settings || {};\n  let settings = extend(true, {}, defaultSettings, config);\n  let data = [];\n  let scale;\n  let formatter;\n  let element;\n  let size;\n  let style;\n  let resolver = settingsResolver({\n    chart,\n  });\n  let isVisible = false;\n\n  const brushArgs = {\n    nodes: [],\n    chart,\n    config: settings.brush || {},\n    renderer: null,\n  };\n  const brushTriggers = {\n    tap: [],\n    over: [],\n  };\n  const brushStylers = [];\n  const definitionContext = {};\n  const instanceContext = extend({}, config);\n\n  // Create a callback that calls lifecycle functions in the definition and config (if they exist).\n  function createCallback(method, defaultMethod = () => {}, canBeValue = false) {\n    return function cb(...args) {\n      const inDefinition = typeof definition[method] !== 'undefined';\n      const inConfig = typeof config[method] !== 'undefined';\n\n      let returnValue;\n      if (inDefinition) {\n        if (typeof definition[method] === 'function') {\n          returnValue = definition[method].call(definitionContext, ...args);\n        } else if (canBeValue) {\n          returnValue = definition[method];\n        }\n      }\n\n      if (inConfig) {\n        if (typeof config[method] === 'function') {\n          returnValue = config[method].call(instanceContext, ...args);\n        } else if (canBeValue) {\n          returnValue = config[method];\n        }\n      }\n\n      if (!inDefinition && !inConfig) {\n        returnValue = defaultMethod.call(definitionContext, ...args);\n      }\n\n      return returnValue;\n    };\n  }\n\n  const preferredSize = createCallback('preferredSize', () => 0, true);\n  const resize = createCallback('resize', ({ inner }) => inner);\n  const created = createCallback('created');\n  const beforeMount = createCallback('beforeMount');\n  const mounted = createCallback('mounted');\n  const beforeUnmount = createCallback('beforeUnmount');\n  const beforeUpdate = createCallback('beforeUpdate');\n  const updated = createCallback('updated');\n  const beforeRender = createCallback('beforeRender');\n  const beforeDestroy = createCallback('beforeDestroy');\n  const destroyed = createCallback('destroyed');\n  const render = definition.render; // Do not allow overriding of this function\n\n  const addBrushStylers = () => {\n    if (settings.brush) {\n      (settings.brush.consume || []).forEach((b) => {\n        if (b.context && b.style) {\n          brushStylers.push(brushStyler(brushArgs, b));\n        }\n      });\n    }\n  };\n\n  const addBrushTriggers = () => {\n    if (settings.brush) {\n      (settings.brush.trigger || []).forEach((t) => {\n        if (t.on === 'over') {\n          brushTriggers.over.push(t);\n        } else {\n          brushTriggers.tap.push(t);\n        }\n      });\n    }\n  };\n\n  Object.defineProperty(brushArgs, 'data', {\n    get: () => data,\n  });\n\n  const rendString = settings.renderer || definition.renderer;\n  const rend = rendString ? renderer || registries.renderer(rendString)() : renderer || registries.renderer()();\n  brushArgs.renderer = rend;\n\n  const dockConfigCallbackContext = { resources: chart.logger ? { logger: chart.logger() } : {} };\n  let dockConfig = createDockConfig(\n    createDockDefinition(settings, preferredSize, chart.logger()),\n    dockConfigCallbackContext\n  );\n\n  const appendComponentMeta = (node) => {\n    node.key = settings.key;\n    node.element = rend.element();\n  };\n\n  const fn = () => {};\n\n  fn.dockConfig = () => dockConfig;\n\n  // Set new settings - will trigger mapping of data and creation of scale / formatter.\n  fn.set = (opts = {}) => {\n    if (opts.settings) {\n      config = opts.settings;\n      settings = extend(true, {}, defaultSettings, opts.settings);\n      dockConfig = createDockConfig(\n        createDockDefinition(settings, preferredSize, chart.logger()),\n        dockConfigCallbackContext\n      );\n    }\n\n    if (settings.scale) {\n      scale = chart.scale(settings.scale);\n    }\n\n    if (settings.data) {\n      data = extractData(\n        settings.data,\n        { dataset: chart.dataset, collection: chart.dataCollection },\n        { logger: chart.logger() },\n        chart.dataCollection\n      );\n    } else if (scale) {\n      data = scale.data();\n    } else {\n      data = [];\n    }\n\n    if (typeof settings.formatter === 'string') {\n      formatter = chart.formatter(settings.formatter);\n    } else if (typeof settings.formatter === 'object') {\n      formatter = chart.formatter(settings.formatter);\n    } else if (scale && scale.data().fields) {\n      formatter = scale.data().fields[0].formatter();\n    }\n\n    style = theme.style(settings.style || {});\n  };\n\n  fn.resize = (inner = {}, outer = {}) => {\n    const newSize = resize({\n      inner,\n      outer,\n    });\n    if (newSize) {\n      size = rend.size(newSize);\n    } else {\n      size = rend.size(inner);\n    }\n    instanceContext.rect = extend(\n      true,\n      {\n        computedPhysical: size.computedPhysical,\n        computedOuter: outer.computed || outer,\n        computedInner: inner.computed || inner,\n      },\n      inner\n    );\n    size = extend(\n      true,\n      {\n        computedOuter: outer.computed || outer,\n        computedInner: inner.computed || inner,\n      },\n      size\n    );\n  };\n\n  fn.getRect = () => instanceContext.rect;\n\n  const getRenderArgs = () => {\n    const renderArgs = rend.renderArgs ? rend.renderArgs.slice(0) : [];\n    renderArgs.push({\n      data,\n    });\n    return renderArgs;\n  };\n\n  fn.beforeMount = beforeMount;\n\n  fn.beforeRender = () => {\n    beforeRender({\n      size,\n    });\n  };\n\n  let currentNodes;\n\n  fn.render = () => {\n    const nodes = (brushArgs.nodes = render.call(definitionContext, ...getRenderArgs()));\n    rend.render(nodes);\n    currentNodes = nodes;\n  };\n\n  fn.hide = () => {\n    fn.unmount();\n    rend.size({\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n    });\n    rend.clear();\n  };\n\n  fn.beforeUpdate = () => {\n    beforeUpdate({\n      settings,\n      data,\n    });\n  };\n\n  let currentTween;\n  fn.update = () => {\n    if (currentTween) {\n      currentTween.stop();\n    }\n    const nodes = (brushArgs.nodes = render.call(definitionContext, ...getRenderArgs()));\n\n    // Reset brush stylers and triggers\n    brushStylers.forEach((b) => b.cleanUp());\n    brushStylers.length = 0;\n    brushTriggers.tap = [];\n    brushTriggers.over = [];\n\n    if (settings.brush) {\n      addBrushStylers();\n      addBrushTriggers();\n    }\n\n    brushStylers.forEach((bs) => {\n      if (bs.isActive()) {\n        bs.update();\n      }\n    });\n\n    if (currentNodes && settings.animations && settings.animations.enabled) {\n      currentTween = tween(\n        {\n          old: currentNodes,\n          current: nodes,\n        },\n        { renderer: rend },\n        settings.animations\n      );\n      currentTween.start();\n    } else {\n      rend.render(nodes);\n    }\n    currentNodes = nodes;\n\n    if (rend.setKey && typeof config.key === 'string') {\n      rend.setKey(config.key);\n    }\n  };\n\n  fn.updated = updated;\n\n  fn.destroy = () => {\n    fn.unmount();\n    beforeDestroy(element);\n    rend.destroy();\n    destroyed();\n    element = null;\n  };\n\n  /**\n   * Update active nodes. For now this can be used as a way update and apply brushing on nodes.\n   * Ex: if a component have changed the nodes since its initial render.\n   * @param {Nodes[]} nodes\n   * @deprecated\n   * @ignore\n   */\n  const updateNodes = (nodes) => {\n    brushArgs.nodes = nodes;\n    brushStylers.forEach((bs) => {\n      if (bs.isActive()) {\n        bs.update();\n      }\n    });\n    rend.render(nodes);\n  };\n\n  // Set contexts, note that the definition and instance need different contexts (for example if they have different 'require' props)\n  prepareContext(definitionContext, definition, {\n    settings: () => settings,\n    data: () => data,\n    scale: () => scale,\n    formatter: () => formatter,\n    renderer: () => rend,\n    chart: () => chart,\n    dockConfig: () => dockConfig,\n    mediator: () => mediator,\n    instance: () => instanceContext,\n    rect: () => instanceContext.rect,\n    style: () => style,\n    update: () => updateNodes,\n    registries: () => registries,\n    resolver: () => resolver,\n    symbol: () => createSymbolFactory(registries.symbol),\n  });\n\n  /**\n   * Component instance\n   * @typedef {object} Component\n   * @property {string} type Type of component\n   * @property {string} key Key of the component\n   */\n  prepareContext(instanceContext, config, {\n    settings: () => settings,\n    data: () => data,\n    scale: () => scale,\n    formatter: () => formatter,\n    renderer: () => rend,\n    chart: () => chart,\n    dockConfig: () => dockConfig,\n    mediator: () => mediator,\n    style: () => style,\n    _DO_NOT_USE_getInfo: _DO_NOT_USE_getInfo.bind(definitionContext),\n    isVisible: () => isVisible,\n  });\n\n  fn.getBrushedShapes = function getBrushedShapes(brushCtx, mode, props) {\n    const shapes = [];\n    if (settings.brush && settings.brush.consume) {\n      const brusher = chart.brush(brushCtx);\n      const sceneNodes = rend.findShapes('*');\n      settings.brush.consume\n        .filter((t) => t.context === brushCtx)\n        .forEach((consume) => {\n          for (let i = 0; i < sceneNodes.length; i++) {\n            const node = sceneNodes[i];\n            if (node.data && brusher.containsMappedData(node.data, props || consume.data, mode)) {\n              appendComponentMeta(node);\n              shapes.push(node);\n              sceneNodes.splice(i, 1);\n              i--;\n            }\n          }\n        });\n    }\n    return shapes;\n  };\n\n  fn.findShapes = (selector) => {\n    const shapes = rend.findShapes(selector);\n    for (let i = 0, num = shapes.length; i < num; i++) {\n      appendComponentMeta(shapes[i]);\n    }\n\n    return shapes;\n  };\n\n  fn.shapesAt = (shape, opts = {}) => {\n    const items = rend.itemsAt(shape);\n    let shapes;\n\n    if (opts && opts.propagation === 'stop' && items.length > 0) {\n      shapes = [items.pop().node];\n    } else {\n      shapes = items.map((i) => i.node);\n    }\n\n    for (let i = 0, num = shapes.length; i < num; i++) {\n      appendComponentMeta(shapes[i]);\n    }\n\n    return shapes;\n  };\n\n  fn.brushFromShapes = (shapes, trigger = {}) => {\n    trigger.contexts = Array.isArray(trigger.contexts) ? trigger.contexts : [];\n    const action = trigger.action || 'toggle';\n\n    brushFromSceneNodes({\n      nodes: shapes,\n      action,\n      trigger,\n      chart,\n      data: brushArgs.data,\n    });\n  };\n\n  fn.mount = () => {\n    element = rend.element && rend.element() ? element : rend.appendTo(container);\n    if (rend.setKey && typeof config.key === 'string') {\n      rend.setKey(config.key);\n    }\n\n    if (settings.brush) {\n      addBrushStylers();\n      addBrushTriggers();\n    }\n\n    setUpEmitter(instanceContext, emitter, config);\n    setUpEmitter(definitionContext, emitter, definition);\n\n    isVisible = true;\n  };\n\n  fn.mounted = () => mounted(element);\n\n  fn.unmount = () => {\n    [instanceContext, definitionContext].forEach((ctx) => {\n      tearDownEmitter(ctx, emitter);\n    });\n    brushTriggers.tap = [];\n    brushTriggers.over = [];\n    brushStylers.forEach((bs) => {\n      bs.cleanUp();\n    });\n    brushStylers.length = 0;\n    beforeUnmount();\n\n    isVisible = false;\n  };\n\n  fn.onBrushTap = (e) => {\n    brushTriggers.tap.forEach((t) => {\n      if (resolveTapEvent({ e, t, config: brushArgs }) && t.globalPropagation === 'stop') {\n        chart.toggleBrushing(true);\n      }\n    });\n  };\n\n  fn.onBrushOver = (e) => {\n    brushTriggers.over.forEach((t) => {\n      if (resolveOverEvent({ e, t, config: brushArgs }) && t.globalPropagation === 'stop') {\n        chart.toggleBrushing(true);\n      }\n    });\n  };\n\n  /**\n   * Expose definition on instance\n   * @private\n   * @experimental\n   */\n  fn.def = definitionContext;\n\n  /**\n   * Expose instanceCtx on \"instance\"\n   * @private\n   * @experimental\n   */\n  fn.ctx = instanceContext;\n\n  fn.renderer = () => rend;\n\n  fn.set({ settings: config });\n  created();\n\n  return fn;\n}\n\nexport default componentFactory;\n","import { add, sub, projectOnto, distance } from './vector';\n\nconst EPSILON = 1e-12;\n\nexport function closestPointToLine(start, end, p) {\n  const startToPoint = sub(p, start);\n  const startToEnd = sub(end, start);\n  const pointOnLine = add(projectOnto(startToPoint, startToEnd), start);\n  return pointOnLine;\n}\n\nexport function isPointOnLine(start, end, p) {\n  return distance(start, p) + distance(end, p) - distance(start, end) < EPSILON;\n}\n\nexport function isCollinear(p1, p2, p3, e = EPSILON) {\n  const t = Math.abs(p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y));\n  return t < e;\n}\n\n/**\n * Check if rectangle a is located inside rectangle b or if they are the same rectangle.\n * @param {Rect} a - An rect containing (x,y) coordinates, width and height. The origin is assumed to be top left.\n * @param {Rect} b - An rect containing (x,y) coordinates, width and height. The origin is assumed to be top left.\n * @ignore\n */\nexport function rectContainsRect(a, b) {\n  return a.x >= b.x && a.x + a.width <= b.x + b.width && a.y >= b.y && a.y + a.height <= b.y + b.height;\n}\n","/* eslint no-use-before-define: [\"error\", { \"functions\": false }] */\n\nimport { sqrDistance, distanceX, distanceY } from './vector';\nimport { closestPointToLine, isPointOnLine } from './intersection';\nimport { lineToPoints, rectToPoints, pointsToLine } from '../geometry/util';\n\nfunction lineHasNoLength(line) {\n  return line.x1 === line.x2 && line.y1 === line.y2;\n}\n\nfunction rectHasNoSize(rect) {\n  return rect.width <= 0 || rect.height <= 0;\n}\n\nfunction circleHasNoSize(circle) {\n  return circle.r <= 0;\n}\n\nfunction toFewEdges(polygon) {\n  return polygon.edges.length <= 2;\n}\n\n// Only when the polygon1's bounds is not inside the polygon2's bounds\nfunction testPolygonPolygonSubCase(polygon1, polygon2) {\n  let intersects = false;\n  for (let i = 0, len = polygon2.edges.length; i < len; i++) {\n    intersects = testPolygonLine(polygon1, pointsToLine(polygon2.edges[i]));\n    if (intersects === true) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Only when the geopolygon's bounds is not inside the polygon's bounds\nfunction testGeoPolygonPolygonCase1(geopolygon, polygon) {\n  let intersects = false;\n  for (let i = 0, len = polygon.edges.length; i < len; i++) {\n    intersects = testGeoPolygonLine(geopolygon, pointsToLine(polygon.edges[i]));\n    if (intersects === true) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Only when the geopolygon's bounds is inside the polygon's bounds\nfunction testGeoPolygonPolygonCase2(geopolygon, polygon) {\n  let intersects = false;\n  const { numPolygons, polygons } = geopolygon;\n  for (let n = 0; n < numPolygons; n++) {\n    intersects = testPolygonPolygon(polygon, polygons[n]);\n    if (intersects === true) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Only when the geopolygon1's bounds is not inside the geopolygon2's bounds\nfunction testGeoPolygonGeoPolygonSubCase(geopolygon1, geopolygon2) {\n  let intersects = false;\n  const { numPolygons, polygons } = geopolygon2;\n  for (let n = 0; n < numPolygons; n++) {\n    let polygon = polygons[n];\n    intersects = testGeoPolygonPolygon(geopolygon1, polygon);\n    if (intersects === true) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Test if a Circle contains a point. If so, returns true and false otherwise.\n * Circle muse have a radius greater then 0.\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} point\n * @param {number} point.x - x-coordinate\n * @param {number} point.y - y-coordinate\n * @return {boolean} true if circle contains point\n */\nexport function testCirclePoint(circle, point) {\n  if (circleHasNoSize(circle)) {\n    return false;\n  }\n\n  const center = { x: circle.cx, y: circle.cy };\n  const sqrDist = sqrDistance(center, point);\n\n  if (sqrDist <= Math.pow(circle.r, 2)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Test if a Circle collide with a rectangle. If so, returns true and false otherwise.\n * Circle muse have a radius greater then 0.\n * Rectangle must have a width and height greather then 0.\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @return {boolean} true if circle collide with rectangle\n */\nexport function testCircleRect(circle, rect) {\n  if (rectHasNoSize(rect) || circleHasNoSize(circle)) {\n    return false;\n  }\n  const rX = rect.width / 2;\n  const rY = rect.height / 2;\n  const rcX = rect.x + rX;\n  const rcY = rect.y + rY;\n  const r = circle.r;\n  const cx = circle.cx;\n  const cy = circle.cy;\n  const dX = Math.abs(cx - rcX);\n  const dY = Math.abs(cy - rcY);\n\n  if (dX > rX + r || dY > rY + r) {\n    return false;\n  }\n\n  if (dX <= rX || dY <= rY) {\n    return true;\n  }\n\n  const sqrDist = Math.pow(dX - rX, 2) + Math.pow(dY - rY, 2);\n\n  return sqrDist <= Math.pow(r, 2);\n}\n\n/**\n * Test if a Circle collide with a line segment. If so, returns true and false otherwise.\n * Circle muse have a radius greater then 0.\n * Line must have a length greater then 0.\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @return {boolean} true if circle collide with line\n */\nexport function testCircleLine(circle, line) {\n  if (circleHasNoSize(circle) || lineHasNoLength(line)) {\n    return false;\n  }\n\n  const [p1, p2] = lineToPoints(line);\n  if (testCirclePoint(circle, p1) || testCirclePoint(circle, p2)) {\n    return true;\n  }\n\n  const center = { x: circle.cx, y: circle.cy };\n  const pointOnLine = closestPointToLine(p1, p2, center);\n  const dist = sqrDistance(pointOnLine, center);\n\n  return dist <= Math.pow(circle.r, 2) && isPointOnLine(p1, p2, pointOnLine);\n}\n\n/**\n * Test if a Circle collide with another Circle. If so, returns true and false otherwise.\n * Both circles muse have a radius greater then 0.\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @return {boolean} true if circle collide with circle\n */\nexport function testCircleCircle(circle1, circle2) {\n  if (circleHasNoSize(circle1) || circleHasNoSize(circle2)) {\n    return false;\n  }\n\n  const dx = circle1.cx - circle2.cx;\n  const dy = circle1.cy - circle2.cy;\n  const sqrDist = Math.pow(dx, 2) + Math.pow(dy, 2);\n\n  if (sqrDist <= Math.pow(circle1.r + circle2.r, 2)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Test if a Circle collide with Polygon. If so, returns true and false otherwise.\n * Circle muse have a radius greater then 0.\n * Polygon must contain at least 2 vertices\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} polygon\n * @param {Array} polygon.vertices - Array of vertices\n * @param {object} polygon.vertices.vertex\n * @param {number} polygon.vertices.vertex.x - x-coordinate\n * @param {number} polygon.vertices.vertex.y - y-coordinate\n * @param {Array} polygon.edges - Array of edges\n * @param {Array} polygon.edges.edge - Array of points\n * @param {object} polygon.edges.edge.point\n * @param {number} polygon.edges.edge.point.x - x-coordinate\n * @param {number} polygon.edges.edge.point.y - y-coordinate\n * @return {boolean} true if circle collide with polygon\n */\nexport function testCirclePolygon(circle, polygon) {\n  // TODO handle polygon that is a straight line, current impl will interrept it is a true, if radius is extended onto any of the edges\n  if (toFewEdges(polygon) || circleHasNoSize(circle)) {\n    return false;\n  }\n\n  const center = { x: circle.cx, y: circle.cy };\n  if (testPolygonPoint(polygon, center)) {\n    return true;\n  }\n\n  const num = polygon.edges.length;\n\n  for (let i = 0; i < num; i++) {\n    const edge = pointsToLine(polygon.edges[i]);\n    if (testCircleLine(circle, edge)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Test if a Polygon contains a Point. If so, returns true and false otherwise.\n * Polygon must contain at least 2 vertices\n * @private\n * @param {object} polygon\n * @param {Array} polygon.vertices - Array of vertices\n * @param {object} polygon.vertices.vertex\n * @param {number} polygon.vertices.vertex.x - x-coordinate\n * @param {number} polygon.vertices.vertex.y - y-coordinate\n * @param {Array} polygon.edges - Array of edges\n * @param {Array} polygon.edges.edge - Array of points\n * @param {object} polygon.edges.edge.point\n * @param {number} polygon.edges.edge.point.x - x-coordinate\n * @param {number} polygon.edges.edge.point.y - y-coordinate\n * @param {object} point\n * @param {number} point.x - x-coordinate\n * @param {number} point.y - y-coordinate\n * @return {boolean} true if polygon conatins point\n */\nexport function testPolygonPoint(polygon, point) {\n  // TODO handle polygon that is a straight line, current impl gives a non-deterministic output, that is depending on number of vertices\n  if (toFewEdges(polygon) || !testRectPoint(polygon.boundingRect(), point)) {\n    return false;\n  }\n  const { x, y } = point;\n  const vertices = polygon.vertices;\n  let inside;\n  let l;\n  let j;\n  let i;\n  let tx;\n  for (inside = false, i = -1, l = vertices.length, j = l - 1; ++i < l; j = i) {\n    if (vertices[i].x === x && vertices[i].y === y) {\n      // polygon vertice\n      return true;\n    }\n    if (vertices[i].y === vertices[j].y && vertices[i].y === y && (x - vertices[i].x) * (x - vertices[j].x) <= 0) {\n      // on horizontal edge of polygon\n      return true;\n    }\n    if ((vertices[i].y < y && y <= vertices[j].y) || (vertices[j].y < y && y <= vertices[i].y)) {\n      tx = ((vertices[j].x - vertices[i].x) * (y - vertices[i].y)) / (vertices[j].y - vertices[i].y) + vertices[i].x;\n      if (x === tx) {\n        // on polygon edge\n        return true;\n      }\n      if (x < tx) {\n        inside = !inside;\n      }\n    }\n  }\n  return inside;\n}\n\n/**\n * Test if a Polygon collider with a line. If so, returns true and false otherwise.\n * Polygon must contain at least 3 edges.\n * Line must have length greater then 0.\n * @private\n * @param {object} polygon\n * @param {Array} polygon.vertices - Array of vertices\n * @param {object} polygon.vertices.vertex\n * @param {number} polygon.vertices.vertex.x - x-coordinate\n * @param {number} polygon.vertices.vertex.y - y-coordinate\n * @param {Array} polygon.edges - Array of edges\n * @param {Array} polygon.edges.edge - Array of points\n * @param {object} polygon.edges.edge.point\n * @param {number} polygon.edges.edge.point.x - x-coordinate\n * @param {number} polygon.edges.edge.point.y - y-coordinate\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @return {boolean} true if polygon collider with line\n */\nexport function testPolygonLine(polygon, line) {\n  // TODO handle polygon that is a straight line, current impl gives a non-deterministic output, that is depending on number of vertices\n  if (toFewEdges(polygon)) {\n    return false;\n  }\n\n  for (let i = 0, num = polygon.edges.length; i < num; i++) {\n    const edge = pointsToLine(polygon.edges[i]);\n    if (testLineLine(line, edge)) {\n      return true;\n    }\n  }\n\n  const [p1, p2] = lineToPoints(line);\n\n  return testPolygonPoint(polygon, p1) || testPolygonPoint(polygon, p2);\n}\n\n/**\n * Test if a Polygon collider with a rectangle. If so, returns true and false otherwise.\n * Polygon must contain at least 3 edges.\n * Rectangle must width and height greater then 0.\n * @private\n * @param {object} polygon\n * @param {Array} polygon.vertices - Array of vertices\n * @param {object} polygon.vertices.vertex\n * @param {number} polygon.vertices.vertex.x - x-coordinate\n * @param {number} polygon.vertices.vertex.y - y-coordinate\n * @param {Array} polygon.edges - Array of edges\n * @param {Array} polygon.edges.edge - Array of points\n * @param {object} polygon.edges.edge.point\n * @param {number} polygon.edges.edge.point.x - x-coordinate\n * @param {number} polygon.edges.edge.point.y - y-coordinate\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @return {boolean} true if polygon collider with rect\n */\nexport function testPolygonRect(polygon, rect) {\n  // TODO handle polygon that is a straight line, current impl gives a non-deterministic output, that is depending on number of vertices\n  if (toFewEdges(polygon)) {\n    return false;\n  }\n\n  for (let i = 0, num = polygon.edges.length; i < num; i++) {\n    const edge = pointsToLine(polygon.edges[i]);\n    if (testRectLine(rect, edge)) {\n      return true;\n    }\n  }\n\n  const [p1, p2, p3, p4] = rectToPoints(rect);\n  return (\n    testPolygonPoint(polygon, p1) ||\n    testPolygonPoint(polygon, p2) ||\n    testPolygonPoint(polygon, p3) ||\n    testPolygonPoint(polygon, p4)\n  );\n}\n\n/**\n * Test if a Rectangle collide with another rectangle. If so, returns true and false otherwise.\n * Both rectangles must have a width and height greather then 0.\n * @private\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @return {boolean} true if rectangle collide with rectangle\n */\nexport function testRectRect(rect1, rect2) {\n  if (rectHasNoSize(rect1) || rectHasNoSize(rect2)) {\n    return false;\n  }\n\n  return (\n    rect1.x <= rect2.x + rect2.width &&\n    rect2.x <= rect1.x + rect1.width &&\n    rect1.y <= rect2.y + rect2.height &&\n    rect2.y <= rect1.y + rect1.height\n  );\n}\n\n/**\n * Test if a rectangle contains  another rectangle. If so, returns true and false otherwise.\n * Both rectangles must have a width and height greather then 0.\n * @private\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @return {boolean} true if rectangle collide with rectangle\n */\nexport function testRectContainsRect(rect1, rect2) {\n  if (rectHasNoSize(rect1) || rectHasNoSize(rect2)) {\n    return false;\n  }\n  const points = [\n    { x: rect2.x, y: rect2.y },\n    { x: rect2.x + rect2.width, y: rect2.y },\n    { x: rect2.x + rect2.width, y: rect2.y + rect2.height },\n    { x: rect2.x, y: rect2.y + rect2.height },\n  ];\n  return points.every((p) => testRectPoint(rect1, p));\n}\n\n/**\n * Test if a Rectangle contains a Point. If so, returns true and false otherwise.\n * Rectangle must have a width and height greather then 0.\n * @private\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @param {object} point\n * @param {number} point.x - x-coordinate\n * @param {number} point.y - y-coordinate\n * @return {boolean} true if rectangle contains point\n */\nexport function testRectPoint(rect, point) {\n  if (rectHasNoSize(rect)) {\n    return false;\n  }\n\n  return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;\n}\n\n/**\n * Test if a Rectangle collider with a line. If so, returns true and false otherwise.\n * Rectangle must have a width and height greather then 0.\n * Line must have length greater then 0.\n * @private\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @return {boolean} true if rectangle collide with line\n */\nexport function testRectLine(rect, line) {\n  if (lineHasNoLength(line) || rectHasNoSize(rect)) {\n    return false;\n  }\n\n  const [p1, p2] = lineToPoints(line);\n\n  if (testRectPoint(rect, p1) || testRectPoint(rect, p2)) {\n    return true;\n  }\n\n  const rectEdges = rectToPoints(rect);\n  let num = rectEdges.length;\n  for (let i = 0; i < num; i++) {\n    const edge = pointsToLine([rectEdges[i], rectEdges[i !== 3 ? i + 1 : 0]]);\n    if (testLineLine(edge, line)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Test if a Line collider with another line. If so, returns true and false otherwise.\n * Both lines must have length greater then 0.\n * @private\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @return {boolean} true if line collide with line\n */\nexport function testLineLine(line1, line2) {\n  const [p1, p2] = lineToPoints(line1);\n  const [p3, p4] = lineToPoints(line2);\n  const dx1 = distanceX(p2, p1);\n  const dy1 = distanceY(p2, p1);\n  const dx2 = distanceX(p4, p3);\n  const dy2 = distanceY(p4, p3);\n  const dx3 = distanceX(p1, p3);\n  const dy3 = distanceY(p1, p3);\n  let ub = dy2 * dx1 - dx2 * dy1;\n  const uat = dx2 * dy3 - dy2 * dx3;\n  const ubt = dx1 * dy3 - dy1 * dx3;\n  let t1;\n  let t2;\n\n  if (dx1 === 0 && dy1 === 0) {\n    // Line segment has no length\n    return false;\n  }\n\n  if (dx2 === 0 && dy2 === 0) {\n    // Line segment has no length\n    return false;\n  }\n\n  if (ub === 0) {\n    if (uat === 0 && ubt === 0) {\n      // COINCIDENT;\n      if (dx1 === 0) {\n        if (dy1 === 0) {\n          // p1 = p2\n          return p1.x === p2.x && p1.y === p2.y;\n        }\n        t1 = distanceY(p3, p1) / dy1;\n        t2 = distanceY(p4, p1) / dy1;\n      } else {\n        t1 = (p3.x - p1.x) / dx1;\n        t2 = (p4.x - p1.x) / dx1;\n      }\n      if ((t1 < 0 && t2 < 0) || (t1 > 1 && t2 > 1)) {\n        return false;\n      }\n      return true;\n    }\n    return false; // PARALLEL;\n  }\n  const ua = uat / ub;\n  ub = ubt / ub;\n  if (ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Test if a Line contains a Point. If so, returns true and false otherwise.\n * Line must have length greater then 0.\n * @private\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {object} point\n * @param {number} point.x - x-coordinate\n * @param {number} point.y - y-coordinate\n * @return {boolean} true if line contains point\n */\nexport function testLinePoint(line, point) {\n  if (lineHasNoLength(line)) {\n    return false;\n  }\n\n  const [p1, p2] = lineToPoints(line);\n  return isPointOnLine(p1, p2, point);\n}\n\n/**\n * Test if a polygon intersects another polygon.\n * Supports convex, concave and self-intersecting polygons (filled area).\n * @private\n * @param {object} polygon\n * @param {object} polygon\n * @returns {boolean} True if there is an intersection, false otherwise\n */\nexport function testPolygonPolygon(polygon1, polygon2) {\n  const rect1 = polygon1.boundingRect();\n  const rect2 = polygon2.boundingRect();\n  if (!testRectRect(rect1, rect2)) {\n    return false;\n  }\n  if (testRectContainsRect(rect1, rect2)) {\n    return testPolygonPolygonSubCase(polygon1, polygon2);\n  }\n  return testPolygonPolygonSubCase(polygon2, polygon1);\n}\n\n/**\n * Test if a geopolygon intersects a polygon.\n * @private\n * @param {object} geopolygon\n * @param {object} polygon\n * @returns {boolean} True if there is an intersection, false otherwise\n */\nexport function testGeoPolygonPolygon(geopolygon, polygon) {\n  const rect1 = geopolygon.boundingRect();\n  const rect2 = polygon.boundingRect();\n  if (!testRectRect(rect1, rect2)) {\n    return false;\n  }\n  if (testRectContainsRect(rect2, rect1)) {\n    return testGeoPolygonPolygonCase2(geopolygon, polygon);\n  }\n  return testGeoPolygonPolygonCase1(geopolygon, polygon);\n}\n\n/**\n * Test if a geopolygon intersects another geopolygon.\n * @private\n * @param {object} geopolygon\n * @param {object} geopolygon\n * @returns {boolean} True if there is an intersection, false otherwise\n */\nexport function testGeoPolygonGeoPolygon(geopolygon1, geopolygon2) {\n  const rect1 = geopolygon1.boundingRect();\n  const rect2 = geopolygon2.boundingRect();\n  if (!testRectRect(rect1, rect2)) {\n    return false;\n  }\n  if (testRectContainsRect(rect2, rect1)) {\n    return testGeoPolygonGeoPolygonSubCase(geopolygon2, geopolygon1);\n  }\n  return testGeoPolygonGeoPolygonSubCase(geopolygon1, geopolygon2);\n}\n\n/**\n * Test if a Circle collide with GeoPolygon. If so, returns true and false otherwise.\n * Circle muse have a radius greater then 0.\n * @private\n * @param {object} circle\n * @param {number} circle.cx - center x-coordinate\n * @param {number} circle.cy - center y-coordinate\n * @param {number} circle.r - circle radius\n * @param {object} geopolygon\n * @param {Array} geopolygon.polygons - Array of polygons\n * @return {boolean} true if circle collide with polygon\n */\nexport function testCircleGeoPolygon(circle, geopolygon) {\n  if (circleHasNoSize(circle)) {\n    return false;\n  }\n  const center = { x: circle.cx, y: circle.cy };\n  if (testGeoPolygonPoint(geopolygon, center)) {\n    return true;\n  }\n  const { numPolygons, polygons } = geopolygon;\n  for (let n = 0; n < numPolygons; n++) {\n    const polygon = polygons[n];\n    const num = polygon.edges.length;\n    for (let i = 0; i < num; i++) {\n      const edge = pointsToLine(polygon.edges[i]);\n      if (testCircleLine(circle, edge)) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n/**\n * Test if a GeoPolygon contains a Point. If so, returns true and false otherwise.\n * @private\n * @param {object} geopolygon\n * @param {Array} geopolygon.vertices - Array of of arrays of vertices\n * @param {object} point\n * @param {number} point.x - x-coordinate\n * @param {number} point.y - y-coordinate\n * @return {boolean} true if polygon conatins point\n */\nexport function testGeoPolygonPoint(geopolygon, point) {\n  if (!testRectPoint(geopolygon.boundingRect(), point)) {\n    return false;\n  }\n  const { x, y } = point;\n  const numPolygons = geopolygon.numPolygons;\n  let inside = false;\n  let vertices;\n  let n;\n  let l;\n  let j;\n  let i;\n  let tx;\n  for (n = 0; n < numPolygons; n++) {\n    vertices = geopolygon.vertices[n];\n    for (i = -1, l = vertices.length, j = l - 1; ++i < l; j = i) {\n      if (vertices[i].x === x && vertices[i].y === y) {\n        // polygon vertice\n        return true;\n      }\n      if (vertices[i].y === vertices[j].y && vertices[i].y === y && (x - vertices[i].x) * (x - vertices[j].x) <= 0) {\n        // on horizontal edge of polygon\n        return true;\n      }\n      if ((vertices[i].y < y && y <= vertices[j].y) || (vertices[j].y < y && y <= vertices[i].y)) {\n        tx = ((vertices[j].x - vertices[i].x) * (y - vertices[i].y)) / (vertices[j].y - vertices[i].y) + vertices[i].x;\n        if (x === tx) {\n          // on polygon edge\n          return true;\n        }\n        if (x < tx) {\n          inside = !inside;\n        }\n      }\n    }\n  }\n  return inside;\n}\n\n/**\n * Test if a GeoPolygon collider with a line. If so, returns true and false otherwise.\n * Line must have length greater then 0.\n * @private\n * @param {object} geopolygon\n * @param {Array} geopolygon.polygons - Array of polygons\n * @param {object} line\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @param {number} line.x1 - x-coordinate\n * @param {number} line.y1 - y-coordinate\n * @return {boolean} true if polygon collider with line\n */\nexport function testGeoPolygonLine(geopolygon, line) {\n  const [p1, p2] = lineToPoints(line);\n  if (testGeoPolygonPoint(geopolygon, p1) || testGeoPolygonPoint(geopolygon, p2)) {\n    return true;\n  }\n  const { numPolygons, polygons } = geopolygon;\n  for (let n = 0; n < numPolygons; n++) {\n    const polygon = polygons[n];\n    for (let i = 0, num = polygon.edges.length; i < num; i++) {\n      const edge = pointsToLine(polygon.edges[i]);\n      if (testLineLine(line, edge)) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n/**\n * Test if a GeoPolygon collider with a rectangle. If so, returns true and false otherwise.\n * Rectangle must have width and height greater than 0.\n * @private\n * @param {object} geopolygon\n * @param {Array} geopolygon.polygons - Array of polygons\n * @param {object} rect\n * @param {number} rect.x - x-coordinate\n * @param {number} rect.y - y-coordinate\n * @param {number} rect.width - width\n * @param {number} rect.height - height\n * @return {boolean} true if polygon collider with rect\n */\nexport function testGeoPolygonRect(geopolygon, rect) {\n  const [p1, p2, p3, p4] = rectToPoints(rect);\n  if (\n    testGeoPolygonPoint(geopolygon, p1) ||\n    testGeoPolygonPoint(geopolygon, p2) ||\n    testGeoPolygonPoint(geopolygon, p3) ||\n    testGeoPolygonPoint(geopolygon, p4)\n  ) {\n    return true;\n  }\n  const { numPolygons, polygons } = geopolygon;\n  for (let n = 0; n < numPolygons; n++) {\n    const polygon = polygons[n];\n    for (let i = 0, num = polygon.edges.length; i < num; i++) {\n      const edge = pointsToLine(polygon.edges[i]);\n      if (testRectLine(rect, edge)) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n","import extend from 'extend';\n\nconst VARIABLE_RX = /^\\$/;\nconst EXTEND = '@extend';\n\nfunction throwCyclical(s) {\n  throw new Error(`Cyclical reference for \"${s}\"`);\n}\n\nfunction res(style, references, path) {\n  if (typeof style === 'string') {\n    let value = references[style];\n    if (path.indexOf(style) !== -1) {\n      throwCyclical(style);\n    }\n    if (VARIABLE_RX.test(value)) {\n      path.push(style);\n      return res(value, references, path);\n    }\n    return value;\n  }\n  let computed = style;\n  const refs = extend(true, {}, references, style);\n  const s = {};\n\n  if (style[EXTEND]) {\n    const extendFrom = style[EXTEND];\n    if (path.indexOf(extendFrom) !== -1) {\n      throwCyclical(extendFrom);\n    }\n    let pext = path.slice();\n    pext.push(extendFrom);\n    computed = extend(true, {}, res(refs[extendFrom], references, pext), style);\n  }\n\n  Object.keys(computed).forEach((key) => {\n    let p = path.slice();\n    if (key === EXTEND || VARIABLE_RX.test(key)) {\n      return;\n    }\n    s[key] = computed[key];\n    let value = s[key];\n    if (VARIABLE_RX.test(value) && value in refs) {\n      if (path.indexOf(value) !== -1) {\n        throwCyclical(value);\n      }\n      p.push(value);\n      value = refs[value];\n      if (typeof value === 'object') {\n        s[key] = res(value, refs, p);\n      } else if (VARIABLE_RX.test(value) && value in refs) {\n        s[key] = res(value, refs, p);\n      } else {\n        s[key] = value;\n      }\n    } else if (typeof value === 'object') {\n      s[key] = res(value, refs, p);\n    }\n  });\n  return s;\n}\n\n/**\n * Resolve style references\n * @private\n * @param {style-object} style\n * @param {style-object} references\n * @returns {object} The resolved style\n * @example\n * resolve({\n *   label: '$label--big'\n * }, {\n *   '$size--m': '12px',\n *   '$label--big': {\n *     fontFamily: 'Arial',\n *     fontSize: '$size--m'\n *   }\n * }); // { label: { fontFamily: 'Arial', fontSize: '12px' } }\n */\nfunction resolve(style, references) {\n  return res(style, references, []);\n}\n\nexport { resolve as default };\n","import extend from 'extend';\nimport styleResolver from '../style/resolver';\n\nfunction themeFn(style = {}, palettes = []) {\n  let pals = {};\n  let internalStyle = style;\n  const setPalettes = (p) => {\n    p.forEach((palette) => {\n      const pal = Array.isArray(palette.colors[0]) ? palette.colors : [palette.colors];\n      pals[palette.key] = {\n        colors: pal,\n        sizes: pal.map((colors) => (colors ? colors.length : 0)),\n      };\n    });\n  };\n\n  const getPalette = (key, num) => {\n    const palette = pals[key];\n    if (!palette) {\n      return [];\n    }\n    const sizes = palette.sizes;\n    // find the first color set containing at least 'num' colors\n    for (let i = 0; i < sizes.length; i++) {\n      if (num <= sizes[i]) {\n        return palette.colors[i];\n      }\n    }\n    return palette.colors[sizes.length - 1];\n  };\n\n  /**\n   * Theme API\n   * @private\n   * @experimental\n   */\n  const theme = {\n    /**\n     * Get an array of colors\n     * @param {string} name - Name of the color palette\n     * @param {number} [num] - The minimum number of colors to get from the palette\n     */\n    palette: (name, num) => getPalette(name, num),\n\n    setPalettes,\n\n    /**\n     * Resolve style references\n     * @param {style-object} s - Object containing style\n     */\n    style: (s) => styleResolver(s, internalStyle),\n\n    /**\n     * Set custom style\n     * @param {style-object} s - Object containing style\n     */\n    setStyle: (s) => {\n      internalStyle = extend({}, style, s);\n    },\n  };\n\n  setPalettes(palettes);\n\n  return theme;\n}\n\nexport { themeFn as default };\n","import extend from 'extend';\n\nfunction roundRect(rect) {\n  rect.x = Math.floor(rect.x);\n  rect.y = Math.floor(rect.y);\n  rect.width = Math.floor(rect.width);\n  rect.height = Math.floor(rect.height);\n}\n\nexport function resolveContainerRects(rect, settings) {\n  const containerRect = {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n  const logicalContainerRect = {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n\n  // Check input object for size\n  containerRect.width = rect.width || 0;\n  containerRect.height = rect.height || 0;\n  if (typeof settings.size !== 'undefined') {\n    containerRect.width = isNaN(settings.size.width) ? containerRect.width : settings.size.width;\n    containerRect.height = isNaN(settings.size.height) ? containerRect.height : settings.size.height;\n  }\n\n  if (typeof settings.logicalSize !== 'undefined') {\n    logicalContainerRect.width = isNaN(settings.logicalSize.width) ? containerRect.width : settings.logicalSize.width;\n    logicalContainerRect.height = isNaN(settings.logicalSize.height)\n      ? containerRect.height\n      : settings.logicalSize.height;\n    logicalContainerRect.align = isNaN(settings.logicalSize.align)\n      ? 0.5\n      : Math.min(Math.max(settings.logicalSize.align, 0), 1);\n    logicalContainerRect.preserveAspectRatio = settings.logicalSize.preserveAspectRatio;\n  } else {\n    logicalContainerRect.width = containerRect.width;\n    logicalContainerRect.height = containerRect.height;\n    logicalContainerRect.preserveAspectRatio = false;\n  }\n\n  roundRect(logicalContainerRect);\n  roundRect(containerRect);\n\n  return { logicalContainerRect, containerRect };\n}\n\nexport function resolveSettings(s) {\n  const settings = {\n    center: {\n      minWidthRatio: 0.5,\n      minHeightRatio: 0.5,\n      minWidth: 0,\n      minHeight: 0,\n    },\n  };\n\n  extend(true, settings, s);\n\n  settings.center.minWidthRatio = Math.min(Math.max(settings.center.minWidthRatio, 0), 1); // Only accept value between 0-1\n  settings.center.minHeightRatio = Math.min(Math.max(settings.center.minHeightRatio, 0), 1); // Only accept value between 0-1\n  settings.center.minWidth = Math.max(settings.center.minWidth, 0); // Consider <= 0 to be falsy and fallback to ratio\n  settings.center.minHeight = Math.max(settings.center.minHeight, 0); // Consider <= 0 to be falsy and fallback to ratio\n\n  return settings;\n}\n","export default function createRect(x, y, width, height, margin) {\n  return {\n    x: isNaN(x) ? 0 : x,\n    y: isNaN(x) ? 0 : y,\n    width: isNaN(x) ? 0 : width,\n    height: isNaN(x) ? 0 : height,\n    margin: isNaN(margin) ? 0 : margin,\n  };\n}\n","import extend from 'extend';\nimport { resolveContainerRects, resolveSettings } from './settings-resolver';\nimport { rectToPoints, pointsToRect } from '../../geometry/util';\nimport createRect from './create-rect';\n\nfunction cacheSize(c, reducedRect, layoutRect) {\n  if (typeof c.cachedSize === 'undefined') {\n    const dock = c.config.dock();\n    let size = c.comp.preferredSize({ inner: reducedRect, outer: layoutRect, dock });\n    // backwards compatibility\n    if (!isNaN(size)) {\n      size = { width: size, height: size };\n    } else if (size && !isNaN(size.size)) {\n      size.width = size.size;\n      size.height = size.size;\n    }\n\n    let relevantSize;\n    if (dock === 'top' || dock === 'bottom') {\n      relevantSize = size.height;\n    } else if (dock === 'right' || dock === 'left') {\n      relevantSize = size.width;\n    } else {\n      relevantSize = Math.max(size.width, size.height);\n    }\n    c.cachedSize = Math.ceil(relevantSize);\n    c.edgeBleed = size.edgeBleed || 0;\n  }\n  return c.cachedSize;\n}\n\nfunction validateReduceRect(rect, reducedRect, settings) {\n  // Absolute value for width/height should have predence over relative value\n  const minReduceWidth =\n    Math.min(settings.center.minWidth, rect.width) || Math.max(rect.width * settings.center.minWidthRatio, 1);\n  const minReduceHeight =\n    Math.min(settings.center.minHeight, rect.height) || Math.max(rect.height * settings.center.minHeightRatio, 1);\n  return reducedRect.width >= minReduceWidth && reducedRect.height >= minReduceHeight;\n}\n\nfunction reduceDocRect(reducedRect, c) {\n  switch (c.config.dock()) {\n    case 'top':\n      reducedRect.y += c.cachedSize;\n      reducedRect.height -= c.cachedSize;\n      break;\n    case 'bottom':\n      reducedRect.height -= c.cachedSize;\n      break;\n    case 'left':\n      reducedRect.x += c.cachedSize;\n      reducedRect.width -= c.cachedSize;\n      break;\n    case 'right':\n      reducedRect.width -= c.cachedSize;\n      break;\n    default:\n  }\n}\n\nfunction addEdgeBleed(currentEdgeBleed, c) {\n  const edgeBleed = c.edgeBleed;\n  if (!edgeBleed) {\n    return;\n  }\n  currentEdgeBleed.left = Math.max(currentEdgeBleed.left, edgeBleed.left || 0);\n  currentEdgeBleed.right = Math.max(currentEdgeBleed.right, edgeBleed.right || 0);\n  currentEdgeBleed.top = Math.max(currentEdgeBleed.top, edgeBleed.top || 0);\n  currentEdgeBleed.bottom = Math.max(currentEdgeBleed.bottom, edgeBleed.bottom || 0);\n}\n\nfunction reduceEdgeBleed(layoutRect, reducedRect, edgeBleed) {\n  if (reducedRect.x < edgeBleed.left) {\n    reducedRect.width -= edgeBleed.left - reducedRect.x;\n    reducedRect.x = edgeBleed.left;\n  }\n  const reducedRectRightBoundary = layoutRect.width - (reducedRect.x + reducedRect.width);\n  if (reducedRectRightBoundary < edgeBleed.right) {\n    reducedRect.width -= edgeBleed.right - reducedRectRightBoundary;\n  }\n  if (reducedRect.y < edgeBleed.top) {\n    reducedRect.height -= edgeBleed.top - reducedRect.y;\n    reducedRect.y = edgeBleed.top;\n  }\n  const reducedRectBottomBoundary = layoutRect.height - (reducedRect.y + reducedRect.height);\n  if (reducedRectBottomBoundary < edgeBleed.bottom) {\n    reducedRect.height -= edgeBleed.bottom - reducedRectBottomBoundary;\n  }\n}\n\nfunction reduceSingleLayoutRect(layoutRect, reducedRect, edgeBleed, c, settings) {\n  const newReduceRect = extend({}, reducedRect);\n  const newEdgeBleed = extend({}, edgeBleed);\n  reduceDocRect(newReduceRect, c);\n  addEdgeBleed(newEdgeBleed, c);\n  reduceEdgeBleed(layoutRect, newReduceRect, newEdgeBleed);\n\n  const isValid = validateReduceRect(layoutRect, newReduceRect, settings);\n  if (!isValid) {\n    return false;\n  }\n\n  reduceDocRect(reducedRect, c);\n  addEdgeBleed(edgeBleed, c);\n  return true;\n}\n\n/**\n * Updates the visible and hidden components based on components that are docked to other components.\n * For example, assume a component called myRect:\n * {\n *  key: 'myRect',\n *  type: 'rect',\n *  dock: 'bottom'\n * }\n * and a component called myLine:\n * {\n *  key: 'myLine',\n *  type: 'line',\n *  dock: '@myRect'\n * }\n * if the layout engine decides to hide myRect, then myLine should be hidden as well.\n * @param {Array} visible - Components to be decided if they should be hidden or not.\n * @param {Array} hidden - Components that are already hidden.\n * @returns {Object} containing the new visible components and additional components to be hidden.\n * @ignore\n */\nfunction filterReferencedDocks(visible, hidden) {\n  if (hidden.length === 0) {\n    return;\n  }\n\n  for (let i = 0; i < visible.length; ++i) {\n    let v = visible[i];\n    if (v.referencedDocks.length) {\n      const isAllHidden = v.referencedDocks.every((refDock) => hidden.some((h) => h.key === refDock));\n      if (isAllHidden) {\n        hidden.push(visible.splice(i, 1)[0]);\n      }\n    }\n  }\n}\n\nfunction reduceLayoutRect({ layoutRect, visible, hidden, settings }) {\n  const reducedRect = createRect(layoutRect.x, layoutRect.y, layoutRect.width, layoutRect.height);\n  const edgeBleed = {\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n  };\n\n  const sortedComponents = visible.slice();\n  sortedComponents.sort((a, b) => a.config.prioOrder() - b.config.prioOrder()); // lower prioOrder will have higher prio\n\n  for (let i = 0; i < sortedComponents.length; ++i) {\n    const c = sortedComponents[i];\n    cacheSize(c, reducedRect, layoutRect);\n\n    if (!reduceSingleLayoutRect(layoutRect, reducedRect, edgeBleed, c, settings)) {\n      hidden.push(sortedComponents.splice(i, 1)[0]);\n      --i;\n    }\n  }\n\n  filterReferencedDocks(visible, hidden);\n\n  const filteredUnsortedComps = visible.filter((c) => sortedComponents.indexOf(c) !== -1);\n  visible.length = 0;\n  visible.push(...filteredUnsortedComps);\n  reduceEdgeBleed(layoutRect, reducedRect, edgeBleed);\n  return reducedRect;\n}\n\nfunction computeRect(rect) {\n  return {\n    x: rect.margin.left + rect.x * rect.scaleRatio.x,\n    y: rect.margin.top + rect.y * rect.scaleRatio.y,\n    width: rect.width * rect.scaleRatio.x,\n    height: rect.height * rect.scaleRatio.y,\n  };\n}\n\nfunction appendScaleRatio(rect, outerRect, layoutRect, containerRect) {\n  const scaleRatio = {\n    x: containerRect.width / layoutRect.width,\n    y: containerRect.height / layoutRect.height,\n  };\n  const margin = {\n    left: 0,\n    top: 0,\n  };\n\n  if (layoutRect.preserveAspectRatio) {\n    const xLessThenY = scaleRatio.x < scaleRatio.y;\n    // To preserve the aspect ratio, take the smallest ratio and apply in both directions to \"meet\" the size of the container\n    const minRatio = Math.min(scaleRatio.x, scaleRatio.y);\n    scaleRatio.x = minRatio;\n    scaleRatio.y = minRatio;\n    const area = xLessThenY ? 'height' : 'width';\n    const spread = (containerRect[area] - layoutRect[area] * scaleRatio.x) * layoutRect.align;\n    margin.left = xLessThenY ? 0 : spread;\n    margin.top = xLessThenY ? spread : 0;\n  }\n\n  rect.scaleRatio = scaleRatio;\n  rect.margin = margin;\n  outerRect.scaleRatio = scaleRatio;\n  outerRect.margin = margin;\n  layoutRect.scaleRatio = scaleRatio;\n  layoutRect.margin = margin;\n}\n\nfunction boundingBox(rects) {\n  const points = [].concat(...rects.map(rectToPoints));\n  return pointsToRect(points);\n}\n\nfunction positionComponents({ visible, layoutRect, reducedRect, containerRect, translation }) {\n  const vRect = createRect(reducedRect.x, reducedRect.y, reducedRect.width, reducedRect.height);\n  const hRect = createRect(reducedRect.x, reducedRect.y, reducedRect.width, reducedRect.height);\n\n  const referencedComponents = {};\n  const referenceArray = visible.slice();\n  const elementOrder = referenceArray.slice().sort((a, b) => a.config.displayOrder() - b.config.displayOrder());\n  visible\n    .sort((a, b) => {\n      if (b.referencedDocks.length > 0) {\n        return -1;\n      }\n      if (a.referencedDocks.length > 0) {\n        return 1;\n      }\n      const diff = a.config.displayOrder() - b.config.displayOrder();\n      if (diff === 0) {\n        return referenceArray.indexOf(a) - referenceArray.indexOf(b);\n      }\n      return diff;\n    })\n    .forEach((c) => {\n      let outerRect = {};\n      let rect = {};\n      const d = c.config.dock();\n      switch (d) {\n        case 'top':\n          outerRect.height = rect.height = c.cachedSize;\n          outerRect.width = layoutRect.width;\n          rect.width = vRect.width;\n          outerRect.x = layoutRect.x;\n          rect.x = vRect.x;\n          outerRect.y = rect.y = vRect.y - c.cachedSize;\n\n          vRect.y -= c.cachedSize;\n          vRect.height += c.cachedSize;\n          break;\n        case 'bottom':\n          outerRect.x = layoutRect.x;\n          rect.x = vRect.x;\n          outerRect.y = rect.y = vRect.y + vRect.height;\n          outerRect.width = layoutRect.width;\n          rect.width = vRect.width;\n          outerRect.height = rect.height = c.cachedSize;\n\n          vRect.height += c.cachedSize;\n          break;\n        case 'left':\n          outerRect.x = rect.x = hRect.x - c.cachedSize;\n          outerRect.y = layoutRect.y;\n          rect.y = hRect.y;\n          outerRect.width = rect.width = c.cachedSize;\n          outerRect.height = layoutRect.height;\n          rect.height = hRect.height;\n\n          hRect.x -= c.cachedSize;\n          hRect.width += c.cachedSize;\n          break;\n        case 'right':\n          outerRect.x = rect.x = hRect.x + hRect.width;\n          outerRect.y = layoutRect.y;\n          rect.y = hRect.y;\n          outerRect.width = rect.width = c.cachedSize;\n          outerRect.height = layoutRect.height;\n          rect.height = hRect.height;\n\n          hRect.width += c.cachedSize;\n          break;\n        case 'center':\n          outerRect.x = rect.x = reducedRect.x;\n          outerRect.y = rect.y = reducedRect.y;\n          outerRect.width = rect.width = reducedRect.width;\n          outerRect.height = rect.height = reducedRect.height;\n          break;\n        default:\n          if (c.referencedDocks.length > 0) {\n            const refs = c.referencedDocks.map((ref) => referencedComponents[ref]).filter((ref) => !!ref);\n            if (refs.length > 0) {\n              outerRect = boundingBox(refs.map((ref) => ref.outerRect));\n              rect = boundingBox(refs.map((ref) => ref.r));\n            }\n          }\n          break;\n      }\n      if (c.key) {\n        referencedComponents[c.key] = {\n          // store the size of this component\n          r: rect,\n          outerRect,\n        };\n      }\n      appendScaleRatio(rect, outerRect, layoutRect, containerRect);\n      rect.edgeBleed = c.edgeBleed;\n      rect.computed = computeRect(rect);\n      outerRect.edgeBleed = c.edgeBleed;\n      outerRect.computed = computeRect(outerRect);\n      rect.x += translation.x;\n      rect.y += translation.y;\n      outerRect.x += translation.x;\n      outerRect.y += translation.y;\n      c.comp.resize(rect, outerRect);\n      c.cachedSize = undefined;\n      c.edgeBleed = undefined;\n    });\n  return elementOrder;\n}\n\nfunction checkShowSettings(strategySettings, dockSettings, logicalContainerRect) {\n  const layoutModes = strategySettings.layoutModes || {};\n  const minimumLayoutMode = dockSettings.minimumLayoutMode();\n  let show = dockSettings.show();\n  if (show && typeof minimumLayoutMode === 'object') {\n    show =\n      layoutModes[minimumLayoutMode.width] &&\n      layoutModes[minimumLayoutMode.height] &&\n      logicalContainerRect.width >= layoutModes[minimumLayoutMode.width].width &&\n      logicalContainerRect.height >= layoutModes[minimumLayoutMode.height].height;\n  } else if (show && minimumLayoutMode !== undefined) {\n    show =\n      layoutModes[minimumLayoutMode] &&\n      logicalContainerRect.width >= layoutModes[minimumLayoutMode].width &&\n      logicalContainerRect.height >= layoutModes[minimumLayoutMode].height;\n  }\n  return show;\n}\n\nfunction validateComponent(component) {\n  if (!component.resize || typeof component.resize !== 'function') {\n    throw new Error('Component is missing resize function');\n  }\n  if (!component.dockConfig && !component.preferredSize) {\n    throw new Error('Component is missing preferredSize function');\n  }\n}\n\nfunction filterComponents(components, settings, rect) {\n  const visible = [];\n  const hidden = [];\n  // check show settings\n  for (let i = 0; i < components.length; ++i) {\n    const comp = components[i];\n    validateComponent(comp);\n    // backwards compatibility\n    let config = comp.dockConfig;\n    const key = comp.key;\n    const d = config.dock();\n    const referencedDocks = /@/.test(d) ? d.split(',').map((s) => s.replace(/^\\s*@/, '')) : [];\n    if (checkShowSettings(settings, config, rect)) {\n      visible.push({\n        comp,\n        key,\n        config,\n        referencedDocks,\n      });\n    } else {\n      hidden.push({\n        comp,\n        key,\n        config,\n        referencedDocks,\n      });\n    }\n  }\n  return [visible, hidden];\n}\n\n/**\n * Dock layout settings\n * @typedef {object} DockLayoutSettings\n * @property {object} [logicalSize] - Logical size\n * @property {number} [logicalSize.width] - Width in pixels\n * @property {number} [logicalSize.height] - Height in pixels\n * @property {boolean} [logicalSize.preserveAspectRatio=false] - If true, takes the smallest ratio of width/height between logical and physical size ( physical / logical )\n * @property {number} [logicalSize.align=0.5] - Normalized value between 0-1. Defines how the space around the scaled axis is spread in the container, with 0.5 meaning the spread is equal on both sides. Only applicable if preserveAspectRatio is set to true\n * @property {object} [center] - Define how much space the center dock area requires\n * @property {number} [center.minWidthRatio=0.5] - Value between 0 and 1\n * @property {number} [center.minHeightRatio=0.5] - Value between 0 and 1\n * @property {number} [center.minWidth] - Width in pixels\n * @property {number} [center.minHeight] - Height in pixels\n * @property {object<string, DockLayoutSettings~LayoutMode>} [layoutModes] Dictionary with named sizes\n * @property {object} [size] - Size is equal to that of the container (element) of the chart by default. It's possible to overwrite it by explicitly setting width or height\n * @property {number} [size.width] - Width in pixels\n * @property {number} [size.height] - Height in pixels\n */\n\n/**\n * @typedef {object} DockLayoutSettings~LayoutMode\n * @property {number} width\n * @property {number} height\n */\n\nfunction dockLayout(initialSettings) {\n  let settings = resolveSettings(initialSettings);\n\n  const docker = {};\n\n  docker.layout = function layout(rect, components = []) {\n    if (!rect || isNaN(rect.x) || isNaN(rect.y) || isNaN(rect.width) || isNaN(rect.height)) {\n      throw new Error('Invalid rect');\n    }\n    if (!components.length) {\n      return { visible: [], hidden: [], ordered: [] };\n    }\n\n    const { logicalContainerRect, containerRect } = resolveContainerRects(rect, settings);\n\n    const [visible, hidden] = filterComponents(components, settings, logicalContainerRect);\n\n    const reducedRect = reduceLayoutRect({\n      layoutRect: logicalContainerRect,\n      visible,\n      hidden,\n      settings,\n    });\n\n    const translation = { x: rect.x, y: rect.y };\n\n    const ordered = positionComponents({\n      visible,\n      layoutRect: logicalContainerRect,\n      reducedRect,\n      containerRect,\n      translation,\n    });\n    hidden.forEach((c) => {\n      c.comp.visible = false;\n      // set empty rects on hidden components\n      const r = createRect();\n      c.comp.resize(r, r);\n    });\n    return {\n      visible: visible.map((v) => v.comp),\n      hidden: hidden.map((h) => h.comp),\n      ordered: ordered.map((h) => h.comp),\n    };\n  };\n\n  docker.settings = function settingsFn(s) {\n    settings = resolveSettings(s);\n  };\n\n  return docker;\n}\n\nexport default dockLayout;\n","import createDockLayout from '../layout/dock/docker';\n\nconst findComponentByKeyInList = (list, key) => {\n  for (let i = 0; i < list.length; i++) {\n    const currComp = list[i];\n    if (currComp.hasKey && currComp.key === key) {\n      return list[i];\n    }\n  }\n  return null;\n};\n\nconst wrapChildren = (children) =>\n  children?.map((c) => {\n    const dockConfig = c.instance.dockConfig();\n    return {\n      preferredSize(opts) {\n        return dockConfig.computePreferredSize({ ...opts, children: wrapChildren(c.children) });\n      },\n    };\n  });\nconst hideAll = (rect, components) => ({ visible: [], hidden: components, ordered: [] });\nconst customLayout = (fn) => (rect, components) => {\n  const vcomponents = components.map((c, i) => {\n    const dockConfig = c.instance.dockConfig();\n    return {\n      index: i,\n      key: c.key,\n      dockConfig,\n      resize: c.instance.resize,\n      preferredSize(opts) {\n        return dockConfig.computePreferredSize({ ...opts, children: wrapChildren(c.children) });\n      },\n    };\n  });\n  const mapBack = (c) => components[c.index];\n  const { visible = vcomponents, hidden = [], ordered = visible } = fn(rect, vcomponents) ?? {};\n  return {\n    visible: visible.map(mapBack),\n    hidden: hidden.map(mapBack),\n    ordered: ordered.map(mapBack),\n  };\n};\nconst normalLayout = (layoutSettings) => {\n  const dockLayout = createDockLayout(layoutSettings);\n  return customLayout((rect, vcomponents) => dockLayout.layout(rect, vcomponents));\n};\n\nconst getLayoutFn = (strategy) => {\n  return typeof strategy === 'function' ? customLayout(strategy) : normalLayout(strategy);\n};\n\nfunction collectionFn({ createComponent }) {\n  const instance = {};\n  let allComponents = [];\n  let topComponents = [];\n\n  const createComp = (compSettings) => {\n    const component = createComponent(compSettings);\n    if (component) {\n      allComponents.push(component);\n      if (compSettings.components) {\n        component.children = compSettings.components\n          .map((childSettings) => createComp(childSettings))\n          .filter((c) => !!c);\n      }\n    }\n    return component;\n  };\n  const removeFromAllComponents = (component) => {\n    const index = allComponents.indexOf(component);\n    if (index !== -1) {\n      allComponents.splice(index, 1);\n    }\n  };\n  const removeDeleted = (compList, settingsList) => {\n    for (let i = compList.length - 1; i >= 0; i--) {\n      const currComp = compList[i];\n      // TODO warn when there is no key\n      const currSettings = settingsList.find((c) => currComp.hasKey && currComp.key === c.key);\n      if (!currSettings) {\n        // Component is removed\n        compList.splice(i, 1);\n        removeFromAllComponents(currComp);\n        if (currComp.children) {\n          removeDeleted(currComp.children, []);\n        }\n        currComp.instance.destroy();\n      } else if (currComp.children && currSettings.components) {\n        removeDeleted(currComp.children, currSettings.components);\n      }\n    }\n  };\n  const addAndUpdate = ({ compList, data, excludeFromUpdate, formatters, scales, settingsList }) => {\n    // Let the \"components\" array determine order of components\n    return settingsList\n      .map((comp) => {\n        const component = findComponentByKeyInList(compList, comp.key);\n\n        // Component should not be updated\n        if (excludeFromUpdate.indexOf(comp.key) > -1) {\n          // TODO: decide if to skip children\n          return component;\n        }\n\n        if (!component) {\n          // Component is added\n          return createComp(comp);\n        }\n        // Component is (potentially) updated\n        component.updateWith = {\n          formatters,\n          scales,\n          data,\n          settings: comp,\n        };\n\n        if (comp.components) {\n          component.children = addAndUpdate({\n            compList: component.children || [],\n            data,\n            excludeFromUpdate,\n            formatters,\n            scales,\n            settingsList: comp.components,\n          });\n        }\n\n        return component;\n      })\n      .filter((c) => !!c);\n  };\n  const recLayout = ({ components, hidden, layoutFn, ordered, rect, visible }) => {\n    const { visible: v, hidden: h, ordered: o } = layoutFn(rect, components);\n    visible.push(...v);\n    hidden.push(...h);\n    ordered.push(...o);\n    v.forEach((c) => {\n      if (c.children) {\n        const lFn = getLayoutFn(c.settings?.strategy ?? {});\n        recLayout({ components: c.children, hidden, layoutFn: lFn, ordered, rect: c.instance.getRect(), visible });\n      }\n    });\n    h.forEach((c) => {\n      if (c.children) {\n        recLayout({ components: c.children, hidden, layoutFn: hideAll, ordered, rect: null, visible });\n      }\n    });\n  };\n\n  instance.destroy = () => {\n    allComponents.forEach((comp) => comp.instance.destroy());\n    allComponents = [];\n    topComponents = [];\n  };\n\n  instance.findComponentByKey = (key) => findComponentByKeyInList(allComponents, key);\n\n  instance.forEach = (fn) => {\n    allComponents.forEach(fn);\n  };\n\n  instance.layout = ({ layoutSettings, rect }) => {\n    const visible = [];\n    const hidden = [];\n    const ordered = [];\n    const layoutFn = getLayoutFn(layoutSettings);\n    recLayout({ components: topComponents, hidden, layoutFn, ordered, rect, visible });\n    return { visible, hidden, ordered };\n  };\n\n  instance.set = ({ components }) => {\n    topComponents = components.map((compSettings) => createComp(compSettings)).filter((c) => !!c);\n  };\n\n  instance.update = ({ components, data, excludeFromUpdate, formatters, scales }) => {\n    // remove deleted\n    removeDeleted(topComponents, components);\n\n    // Update and add new\n    topComponents = addAndUpdate({\n      compList: topComponents,\n      data,\n      excludeFromUpdate,\n      formatters,\n      scales,\n      settingsList: components,\n    });\n  };\n\n  return instance;\n}\n\nexport default collectionFn;\n","import extend from 'extend';\n\nimport { detectTouchSupport, isValidTapEvent } from '../utils/event-type';\nimport { getShapeType } from '../geometry/util';\nimport datasources from '../data/data';\nimport dataCollections from '../data/collections';\nimport { collection as formatterCollection } from './formatter';\nimport { collection as scaleCollection } from './scales';\nimport buildScroll, { getOrCreateScrollApi } from './scroll-api';\nimport brush from '../brush';\nimport componentFactory from '../component/component-factory';\nimport mediatorFactory from '../mediator';\nimport { testRectPoint } from '../math/narrow-phase-collision';\nimport themeFn from '../theme';\nimport componentCollectionFn from './component-collection';\n\n/**\n * @callback customLayoutFunction\n * @param {Rect} rect\n * @param {object[]} components\n * @param {string} components[].key\n * @param {object} components[].dockConfig\n * @param {function} components[].resize\n * @param {function} components[].preferredSize\n */\n\n/**\n * Called when the chart has been created\n * @callback created\n * @memberof ChartDefinition\n */\n\n/**\n * Called before the chart has been mounted\n * @callback beforeMount\n * @memberof ChartDefinition\n */\n\n/**\n * Called after the chart has been mounted\n * @callback mounted\n * @memberof ChartDefinition\n * @param {HTMLElement} element The element the chart been mounted to\n */\n\n/**\n * Called before the chart has been rendered\n * @callback beforeRender\n * @memberof ChartDefinition\n */\n\n/**\n * Called before the chart has been updated\n * @callback beforeUpdate\n * @memberof ChartDefinition\n */\n\n/**\n * Called after the chart has been updated\n * @callback updated\n * @memberof ChartDefinition\n */\n\n/**\n * Called before the chart has been destroyed\n * @callback beforeDestroy\n * @memberof ChartDefinition\n */\n\n/**\n * Called after the chart has been destroyed\n * @callback destroyed\n * @memberof ChartDefinition\n */\n\n/**\n * @typedef {object} ChartSettings\n * @property {ComponentSettings[]} [components] Components\n * @property {object.<string, ScaleDefinition>} [scales] Dictionary with scale definitions\n * @property {object.<string, FormatterDefinition>} [formatters] Dictionary with formatter definitions\n * @property {DockLayoutSettings} [strategy] Dock layout strategy\n * @property {InteractionSettings[]} [interactions] Interaction handlers\n * @property {CollectionSettings[]} [collections] Collections\n */\n\n/**\n * Generic settings available to all components\n * @interface ComponentSettings\n * @property {string} type - Component type (ex: axis, point, ...)\n * @property {function} [preferredSize] - Function returning the preferred size\n * @property {function} [created] Called when the component has been created\n * @property {function} [beforeMount] Called before the component has been mounted\n * @property {function} [mounted] Called after the component has been mounted\n * @property {function} [beforeUpdate] Called before the component has been updated\n * @property {function} [updated] Called after the component has been updated\n * @property {function} [beforeRender] Called before the component has been rendered\n * @property {function} [beforeDestroy] Called before the component has been destroyed\n * @property {function} [destroyed] Called after the component has been destroyed\n * @property {object} [brush] Brush settings\n * @property {BrushTriggerSettings[]} [brush.trigger] Trigger settings\n * @property {BrushConsumeSettings[]} [brush.consume] Consume settings\n * @property {object} [layout] Layout settings\n * @property {number} [layout.displayOrder = 0]\n * @property {number} [layout.prioOrder = 0]\n * @property {string | {width: string, height: string}} [layout.minimumLayoutMode] Refer to layout sizes defined by layoutModes in `strategy`\n * @property {string} [layout.dock] left, right, top or bottom\n * @property {boolean} [show = true] If the component should be rendered\n * @property {string} [scale] Named scale. Will be provided to the component if it asks for it.\n * @property {string} [formatter] Named formatter. Fallback to create formatter from scale. Will be provided to the component if it asks for it.\n * @property {ComponentSettings[]} [components] Optional list of child components\n * @property {DockLayoutSettings|customLayoutFunction} [strategy] Layout strategy used for child components.\n * @property {DataExtraction|DataFieldExtraction} [data] Extracted data that should be available to the component\n */\n\n// mark strategy as experimental\n/**\n * @type {DockLayoutSettings|customLayoutFunction}\n * @name strategy\n * @memberof ComponentSettings\n * @experimental\n */\n\n// mark components as experimental\n/**\n * @type {ComponentSettings[]}\n * @name components\n * @memberof ComponentSettings\n * @experimental\n */\n\n/**\n * @typedef {object} BrushTriggerSettings\n * @property {string} [on] Type of interaction to trigger brush on\n * @property {string} [action] Type of interaction to respond with\n * @property {string[]} [contexts] Name of the brushing contexts to affect\n * @property {string[]} [data] The mapped data properties to add to the brush\n * @property {string} [propagation] Control the event propagation when multiple shapes are tapped. Disabled by default\n * @property {string} [globalPropagation] Control the event propagation between components. Disabled by default\n * @property {number} [touchRadius] Extend contact area for touch events. Disabled by default\n * @property {number} [mouseRadius] Extend contact area for regular mouse events. Disabled by default\n * @example\n * {\n *    on: 'tap',\n *    action: 'toggle',\n *    contexts: ['selection', 'tooltip'],\n *    data: ['x'],\n *    propagation: 'stop', // 'stop' => prevent trigger from propagating further than the first shape\n *    globalPropagation: 'stop', // 'stop' => prevent trigger of same type to be triggered on other components\n *    touchRadius: 24,\n *    mouseRadius: 10\n *  }\n */\n\n/**\n * @typedef {object} BrushConsumeSettings\n * @property {string} [context] Name of the brush context to observe\n * @property {string[]} [data] The mapped data properties to observe\n * @property {string} [mode] Data properties operator: and, or, xor.\n * @property {function} [filter] Filtering function\n * @property {object} [style] The style to apply to the shapes of the component\n * @property {object.<string, any>} [style.active] The style of active data points\n * @property {object.<string, any>} [style.inactive] The style of inactive data points\n * @example\n * {\n *    context: 'selection',\n *    data: ['x'],\n *    filter: (shape) => shape.type === 'circle',\n *    style: {\n *      active: {\n *        fill: 'red',\n *        stroke: '#333',\n *        strokeWidth: (shape) => shape.strokeWidth * 2,\n *      },\n *      inactive: {},\n *    },\n * }\n */\n\n/**\n * @typedef {object} BrushTargetConfig\n * @property {string} key - Component key\n * @property {string[]} [contexts] - Name of the brushing contexts to affect\n * @property {string[]} [data] - The mapped data properties to add to the brush\n * @property {string} [action='set'] - Type of action to respond with\n */\n\nfunction addComponentDelta(shape, containerBounds, componentBounds) {\n  const dx = containerBounds.left - componentBounds.left;\n  const dy = containerBounds.top - componentBounds.top;\n  const type = getShapeType(shape);\n  const deltaShape = extend(true, {}, shape);\n\n  switch (type) {\n    case 'circle':\n      deltaShape.cx += dx;\n      deltaShape.cy += dy;\n      break;\n    case 'polygon':\n      for (let i = 0, num = deltaShape.vertices.length; i < num; i++) {\n        const v = deltaShape.vertices[i];\n        v.x += dx;\n        v.y += dy;\n      }\n      break;\n    case 'geopolygon': // vertices is 2D array\n      for (let n = 0; n < deltaShape.vertices.length; n++) {\n        const vertices = deltaShape.vertices[n];\n        for (let i = 0, num = vertices.length; i < num; i++) {\n          const v = vertices[i];\n          v.x += dx;\n          v.y += dy;\n        }\n      }\n      break;\n    case 'line':\n      deltaShape.x1 += dx;\n      deltaShape.y1 += dy;\n      deltaShape.x2 += dx;\n      deltaShape.y2 += dy;\n      break;\n    case 'point':\n    case 'rect':\n      deltaShape.x += dx;\n      deltaShape.y += dy;\n      break;\n    default:\n      break;\n  }\n\n  return deltaShape;\n}\n\nconst moveToPosition = (element, comp, index) => {\n  const el = comp.instance.renderer().element();\n  if (isNaN(index) || !el || !element || !element.children) {\n    return;\n  }\n  const nodes = element.children;\n  const i = Math.max(0, index);\n  const node = nodes[i];\n  if (el === node) {\n    return;\n  }\n  const additionalEl = comp.instance.def.additionalElements && comp.instance.def.additionalElements().filter(Boolean);\n  if (element.insertBefore && typeof node !== 'undefined') {\n    element.insertBefore(el, node);\n    if (additionalEl) {\n      additionalEl.forEach((ae) => {\n        element.insertBefore(ae, el);\n      });\n    }\n  } else {\n    if (additionalEl) {\n      additionalEl.forEach((ae) => {\n        element.appendChild(ae, el);\n      });\n    }\n    element.appendChild(el);\n  }\n};\n\nexport function orderComponents(element, ordered) {\n  const elToIdx = [];\n  let numElements = 0;\n  ordered.forEach((comp) => {\n    elToIdx.push(numElements);\n\n    // assume each component has at least one element\n    numElements++;\n\n    // check additional elements\n    const additionalEl = comp.instance.def.additionalElements && comp.instance.def.additionalElements();\n    if (additionalEl) {\n      numElements += additionalEl.length;\n    }\n  });\n\n  ordered.forEach((comp, i) => moveToPosition(element, comp, elToIdx[i]));\n}\n\nfunction chartFn(definition, context) {\n  /**\n   * @typedef {object} ChartDefinition\n   */\n  let {\n    /**\n     * Element to attach chart to\n     * @type {HTMLElement}\n     * @memberof ChartDefinition\n     */\n    element,\n    /**\n     * Chart data\n     * @type {Array<DataSource>|DataSource}\n     * @memberof ChartDefinition\n     */\n    data = [],\n    /**\n     * Chart settings\n     * @type {ChartSettings}\n     * @memberof ChartDefinition\n     */\n    settings = {},\n    on = {},\n  } = definition;\n\n  const registries = context.registries;\n  const logger = context.logger;\n  const theme = themeFn(context.style, context.palettes);\n\n  const listeners = [];\n  /**\n   * Chart instance\n   * @alias Chart\n   * @interface\n   */\n  const instance = extend({}, definition);\n  const mediator = mediatorFactory();\n  let visibleComponents = [];\n\n  let currentScales = null; // Built scales\n  let currentFormatters = null; // Built formatters\n  let currentScrollApis = null; // Build scroll apis\n  let currentInteractions = [];\n\n  let dataset = () => {};\n  let dataCollection = () => {};\n  const brushes = {};\n  let stopBrushing = false;\n\n  const createComponent = (compSettings) => {\n    if (!registries.component.has(compSettings.type)) {\n      logger.warn(`Unknown component: ${compSettings.type}`);\n      return false;\n    }\n    const componentDefinition = registries.component(compSettings.type);\n    const compInstance = componentFactory(componentDefinition, {\n      settings: compSettings,\n      chart: instance,\n      mediator,\n      registries,\n      theme,\n      container: element,\n    });\n    return {\n      instance: compInstance,\n      settings: extend(true, {}, compSettings),\n      key: compSettings.key,\n      hasKey: typeof compSettings.key !== 'undefined',\n    };\n  };\n\n  const componentsC = componentCollectionFn({ createComponent });\n\n  // Create a callback that calls lifecycle functions in the definition and config (if they exist).\n  function createCallback(method, defaultMethod = () => {}) {\n    return function cb(...args) {\n      const inDefinition = typeof definition[method] === 'function';\n\n      let returnValue;\n      if (inDefinition) {\n        returnValue = definition[method].call(instance, ...args);\n      } else {\n        returnValue = defaultMethod.call(instance, ...args);\n      }\n      return returnValue;\n    };\n  }\n\n  function getElementRect(el) {\n    if (typeof el.getBoundingClientRect === 'function') {\n      const { width, height } = el.getBoundingClientRect();\n      return {\n        x: 0,\n        y: 0,\n        width,\n        height,\n      };\n    }\n    return {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n    };\n  }\n\n  const layout = () => {\n    let layoutSettings;\n    if (settings.dockLayout) {\n      logger.warn('Deprecation Warning: \"dockLayout\" property should be renamed to \"strategy\"');\n      layoutSettings = settings.dockLayout;\n    } else {\n      layoutSettings = settings.strategy;\n    }\n    const rect = getElementRect(element);\n\n    return componentsC.layout({ layoutSettings, rect });\n  };\n\n  const created = createCallback('created');\n  const beforeMount = createCallback('beforeMount');\n  const mounted = createCallback('mounted');\n  const beforeUpdate = createCallback('beforeUpdate');\n  const updated = createCallback('updated');\n  const beforeRender = createCallback('beforeRender');\n  const beforeDestroy = createCallback('beforeDestroy');\n  const destroyed = createCallback('destroyed');\n\n  const set = (_data, _settings, { partialData } = {}) => {\n    const { formatters = {}, scales = {}, scroll = {} } = _settings;\n\n    dataset = datasources(_data, { logger, types: registries.data });\n    if (!partialData) {\n      Object.keys(brushes).forEach((b) => brushes[b].clear());\n    }\n    if (_settings.palettes) {\n      theme.setPalettes(_settings.palettes);\n    }\n    if (_settings.style) {\n      theme.setStyle(_settings.style);\n    }\n    dataCollection = dataCollections(_settings.collections, { dataset }, { logger });\n\n    const deps = {\n      theme,\n      logger,\n    };\n    currentScales = scaleCollection(\n      scales,\n      { dataset, collection: dataCollection },\n      { ...deps, scale: registries.scale }\n    );\n    currentFormatters = formatterCollection(\n      formatters,\n      { dataset, collection: dataCollection },\n      { ...deps, formatter: registries.formatter }\n    );\n    currentScrollApis = buildScroll(scroll, currentScrollApis);\n  };\n\n  const render = () => {\n    const { components = [] } = settings;\n\n    beforeRender();\n\n    set(data, settings);\n\n    componentsC.set({ components });\n\n    const { visible, hidden, ordered } = layout();\n    visibleComponents = visible;\n\n    hidden.forEach((comp) => {\n      comp.instance.hide();\n      comp.visible = false;\n    });\n\n    visible.forEach((comp) => comp.instance.beforeMount());\n    visible.forEach((comp) => comp.instance.mount());\n    visible.forEach((comp) => comp.instance.beforeRender());\n\n    visible.forEach((comp) => comp.instance.render());\n    visible.forEach((comp) => comp.instance.mounted());\n    visible.forEach((comp) => {\n      comp.visible = true;\n    });\n    orderComponents(element, ordered);\n  };\n\n  function setInteractions(interactions = []) {\n    const current = {};\n    const newKeys = interactions.filter((it) => !!it.key).map((it) => it.key);\n    currentInteractions.forEach((cit) => {\n      if (cit.key && newKeys.indexOf(cit.key) !== -1) {\n        // keep old instance\n        current[cit.key] = cit;\n      } else {\n        cit.destroy();\n      }\n    });\n    currentInteractions = interactions.map((intSettings) => {\n      const intDefinition =\n        intSettings.key && current[intSettings.key]\n          ? current[intSettings.key]\n          : registries.interaction(intSettings.type)(instance, mediator, element);\n      intDefinition.set(intSettings);\n      return intDefinition;\n    });\n  }\n\n  const componentsFromPoint = (p) => {\n    const br = element.getBoundingClientRect();\n    const x = 'clientX' in p ? p.clientX : p.x;\n    const y = 'clientY' in p ? p.clientY : p.y;\n    const tp = { x: x - br.left, y: y - br.top };\n    const ret = [];\n    visibleComponents.forEach((c) => {\n      const r = c.instance.getRect();\n      // Do test on physical rect and use computed rect if available, otherwise fallback to computing a new rect for legacy support\n      if (\n        testRectPoint(\n          r.computedPhysical\n            ? r.computedPhysical\n            : {\n                x: r.margin.left + r.x * r.scaleRatio.x,\n                y: r.margin.top + r.y * r.scaleRatio.y,\n                width: r.width * r.scaleRatio.x,\n                height: r.height * r.scaleRatio.y,\n              },\n          tp\n        )\n      ) {\n        ret.push(c);\n      }\n    });\n    return ret;\n  };\n\n  const addDefaultEventListeners = () => {\n    if (listeners.length || !element) {\n      return;\n    }\n    Object.keys(on).forEach((key) => {\n      const listener = on[key].bind(instance);\n      element.addEventListener(key, listener);\n      listeners.push({\n        key,\n        listener,\n      });\n    });\n\n    const eventInfo = {};\n    const onTapDown = (e) => {\n      if (e.touches) {\n        eventInfo.x = e.touches[0].clientX;\n        eventInfo.y = e.touches[0].clientY;\n        eventInfo.multiTouch = e.touches.length > 1;\n      } else {\n        eventInfo.x = e.clientX;\n        eventInfo.y = e.clientY;\n        eventInfo.multiTouch = false;\n      }\n      eventInfo.time = Date.now();\n      eventInfo.comps = componentsFromPoint(eventInfo);\n    };\n\n    const onBrushTap = (e) => {\n      const comps = eventInfo.comps || componentsFromPoint(e);\n      if (comps.every((c) => c.instance.def.disableTriggers)) {\n        return;\n      }\n\n      if (e.type === 'touchend') {\n        e.preventDefault();\n      }\n      if (!isValidTapEvent(e, eventInfo)) {\n        return;\n      }\n\n      for (let i = comps.length - 1; i >= 0; i--) {\n        const comp = comps[i];\n        comp.instance.onBrushTap(e);\n        if (stopBrushing) {\n          stopBrushing = false;\n          break;\n        }\n      }\n    };\n\n    const onBrushOver = (e) => {\n      const comps = componentsFromPoint(e);\n      for (let i = comps.length - 1; i >= 0; i--) {\n        const comp = comps[i];\n        comp.instance.onBrushOver(e);\n        if (stopBrushing) {\n          stopBrushing = false;\n          break;\n        }\n      }\n    };\n\n    const brushEventList = [];\n\n    brushEventList.push({ key: 'mousedown', listener: onTapDown });\n    brushEventList.push({ key: 'mouseup', listener: onBrushTap });\n\n    if (detectTouchSupport(element)) {\n      brushEventList.push({ key: 'touchstart', listener: onTapDown });\n      brushEventList.push({ key: 'touchend', listener: onBrushTap });\n    }\n\n    brushEventList.push({ key: 'mousemove', listener: onBrushOver });\n\n    brushEventList.forEach((event) => {\n      element.addEventListener(event.key, event.listener);\n      listeners.push(event);\n    });\n  };\n\n  const removeDefaultEventListeners = () => {\n    listeners.forEach(({ key, listener }) => element.removeEventListener(key, listener));\n    listeners.length = 0;\n  };\n\n  // Browser only\n  const mount = () => {\n    element.innerHTML = '';\n\n    render();\n\n    addDefaultEventListeners();\n    setInteractions(settings.interactions);\n  };\n\n  const unmount = () => {\n    removeDefaultEventListeners();\n    setInteractions();\n  };\n\n  /**\n   * Update the chart with new settings and / or data\n   * @param {object} [def] - New chart definition\n   * @param {Array<DataSource>|DataSource} [def.data] Chart data\n   * @param {ChartSettings} [def.settings] Chart settings\n   * @param {boolean} [def.partialData=false] If set to true, will trigger a data update only. Meaning the layout will not be updated\n   * @param {string[]} [def.excludeFromUpdate=[]] Keys of components to not include in the update\n   */\n  instance.update = (newProps = {}) => {\n    const { partialData, excludeFromUpdate = [] } = newProps;\n    let visibleOrdered;\n    if (newProps.data) {\n      data = newProps.data;\n    }\n    if (newProps.settings) {\n      settings = newProps.settings;\n      setInteractions(newProps.settings.interactions);\n    }\n\n    beforeUpdate();\n\n    set(data, settings, { partialData });\n\n    const { formatters, scales, components = [] } = settings;\n\n    componentsC.update({ components, data, excludeFromUpdate, formatters, scales });\n\n    componentsC.forEach((comp) => {\n      if (comp.updateWith) {\n        comp.instance.set(comp.updateWith);\n      }\n    });\n    componentsC.forEach((comp) => {\n      if (comp.updateWith) {\n        comp.instance.beforeUpdate();\n      }\n    });\n\n    const toUpdate = [];\n    const toRender = [];\n    let toRenderOrUpdate;\n    if (partialData) {\n      componentsC.forEach((comp) => {\n        if (comp.updateWith && comp.visible) {\n          toUpdate.push(comp);\n        }\n      });\n      toRenderOrUpdate = toUpdate;\n    } else {\n      const { visible, hidden, ordered } = layout(); // Relayout\n      visibleComponents = visible;\n      toRenderOrUpdate = visible;\n      visibleOrdered = ordered;\n\n      visible.forEach((comp) => {\n        if (comp.updateWith && comp.visible) {\n          toUpdate.push(comp);\n        } else {\n          toRender.push(comp);\n        }\n      });\n\n      hidden.forEach((comp) => {\n        comp.instance.hide();\n        comp.visible = false;\n        delete comp.updateWith;\n      });\n    }\n\n    toRender.forEach((comp) => comp.instance.beforeMount());\n    toRender.forEach((comp) => comp.instance.mount());\n\n    toRenderOrUpdate.forEach((comp) => comp.instance.beforeRender());\n\n    toRenderOrUpdate.forEach((comp) => {\n      if (comp.updateWith && comp.visible) {\n        comp.instance.update();\n      } else {\n        comp.instance.render();\n      }\n    });\n\n    // Ensure that displayOrder is keept, only do so on re-layout update.\n    // Which is only the case if partialData is false.\n    if (!partialData) {\n      orderComponents(element, visibleOrdered);\n    }\n\n    toRender.forEach((comp) => comp.instance.mounted());\n    toUpdate.forEach((comp) => comp.instance.updated());\n\n    visibleComponents.forEach((comp) => {\n      delete comp.updateWith;\n      comp.visible = true;\n    });\n\n    updated();\n  };\n\n  /**\n   * Destroy the chart instance.\n   */\n  instance.destroy = () => {\n    beforeDestroy();\n    componentsC.destroy();\n    unmount();\n    delete instance.update;\n    delete instance.destroy;\n    destroyed();\n  };\n\n  /**\n   * Get all shapes associated with the provided context\n   * @param {string} context The brush context\n   * @param {string} mode Property comparison mode.\n   * @param {Array<string>} props Which specific data properties to compare\n   * @param {string} key Which component to get shapes from. Default gives shapes from all components.\n   * @return {Array<object>} Array of objects containing shape and parent element\n   */\n  instance.getAffectedShapes = (ctx, mode = 'and', props, key) => {\n    const shapes = [];\n    visibleComponents\n      .filter((comp) => key === undefined || key === null || comp.key === key)\n      .forEach((comp) => {\n        shapes.push(...comp.instance.getBrushedShapes(ctx, mode, props));\n      });\n    return shapes;\n  };\n\n  /**\n   * Get all nodes matching the provided selector\n   * @param {string} selector CSS selector [type, attribute, universal, class]\n   * @returns {Array<SceneNode>} Array of objects containing matching nodes\n   *\n   * @example\n   * chart.findShapes('Circle') // [<CircleNode>, <CircleNode>]\n   * chart.findShapes('Circle[fill=\"red\"][stroke!=\"black\"]') // [CircleNode, CircleNode]\n   * chart.findShapes('Container Rect') // [Rect, Rect]\n   */\n  instance.findShapes = (selector) => {\n    const shapes = [];\n    visibleComponents.forEach((c) => {\n      shapes.push(...c.instance.findShapes(selector));\n    });\n    return shapes;\n  };\n\n  /**\n   * Get components overlapping a point.\n   * @param {Point} p - Point with x- and y-coordinate. The coordinate is relative to the browser viewport.\n   * @returns {Array<Component>} Array of component contexts\n   */\n  instance.componentsFromPoint = (p) => componentsFromPoint(p).map((comp) => comp.instance.ctx);\n\n  /**\n   * Get all nodes colliding with a geometrical shape (circle, line, rectangle, point, polygon, geopolygon).\n   *\n   * The input shape is identified based on the geometrical attributes in the following order: circle => line => rectangle => point => polygon => geopolygon.\n   * Note that not all nodes on a scene have collision detection enabled.\n   * @param {Line|Rect|Point|Circle} shape - A geometrical shape. Coordinates are relative to the top-left corner of the chart instance container.\n   * @param {object} opts - Options\n   * @param {object[]} [opts.components] - Array of components to include in the lookup. If no components are specified, all components will be included.\n   * @param {string} [opts.components[].component.key] - Component key\n   * @param {string} [opts.components[].component.propagation] - if set to `stop`, will start lookup on top visible shape and propagate downwards until a shape is found.\n   * @param {string} [opts.propagation] - if set to `stop`, will start lookup on top visible component and propagate downwards until a component has at least a match.\n   * @returns {Array<SceneNode>} Array of objects containing colliding nodes\n   *\n   * @example\n   * chart.shapesAt(\n   *  {\n   *    x: 0,\n   *    y: 0,\n   *    width: 100,\n   *    height: 100\n   *  },\n   *  {\n   *    components: [\n   *      { key: 'key1', propagation: 'stop' },\n   *      { key: 'key2' }\n   *    ],\n   *    propagation: 'stop'\n   *  }\n   * );\n   */\n  instance.shapesAt = (shape, opts = {}) => {\n    const result = [];\n    const containerBounds = element.getBoundingClientRect();\n    let comps = visibleComponents; // Assume that visibleComponents is ordererd according to displayOrder\n\n    if (Array.isArray(opts.components) && opts.components.length > 0) {\n      const compKeys = opts.components.map((c) => c.key);\n      comps = visibleComponents\n        .filter((c) => compKeys.indexOf(c.key) !== -1)\n        .map((c) => ({\n          instance: c.instance,\n          opts: opts.components[compKeys.indexOf(c.key)],\n        }));\n    }\n\n    for (let i = comps.length - 1; i >= 0; i--) {\n      const c = comps[i];\n      const componentBounds = c.instance.renderer().element().getBoundingClientRect();\n      const deltaShape = addComponentDelta(shape, containerBounds, componentBounds);\n      const shapes = c.instance.shapesAt(deltaShape, c.opts);\n      const stopPropagation = shapes.length > 0 && opts.propagation === 'stop';\n\n      result.push(...shapes);\n\n      if (result.length > 0 && stopPropagation) {\n        return result;\n      }\n    }\n    return result;\n  };\n\n  /**\n   * Brush data by providing a collection of data bound shapes.\n   * @param {SceneNode[]} shapes - An array of data bound shapes.\n   * @param {object} config - Options\n   * @param {BrushTargetConfig[]} config.components - Array of components to include in the lookup\n   *\n   * @example\n   * const shapes = chartInstance.shapesAt(...);\n   * const config = {\n   *  components:[\n   *    {\n   *      key: 'key1',\n   *      contexts: ['myContext'],\n   *      data: [''],\n   *      action: 'add'\n   *    }\n   *  ]\n   * };\n   * chartInstance.brushFromShapes(shapes, config);\n   */\n  instance.brushFromShapes = (shapes, config = { components: [] }) => {\n    for (let i = 0; i < config.components.length; i++) {\n      const iKey = config.components[i].key;\n      visibleComponents\n        .filter((c) => iKey === c.key)\n        .forEach((c) => {\n          let compShapes = shapes.filter((shape) => shape.key === c.key);\n          c.instance.brushFromShapes(compShapes, config.components[i]);\n        });\n    }\n  };\n\n  /**\n   * @private\n   * @param {string} name - Name of scroll api\n   * @returns {object}\n   */\n  instance.scroll = function scroll(name = 'default') {\n    return getOrCreateScrollApi(name, currentScrollApis);\n  };\n\n  /**\n   * Get\n   * @param {string} key - Get the dataset identified by `key`\n   * @returns {Dataset}\n   */\n  instance.dataset = (key) => dataset(key);\n\n  instance.dataCollection = (key) => dataCollection(key);\n\n  /**\n   * Get all registered scales\n   * @returns {Object<string,Scale>}\n   */\n  instance.scales = function scales() {\n    return currentScales.all();\n  };\n\n  /**\n   * Get all registered formatters\n   * @returns {Object<string,formatter>}\n   */\n  instance.formatters = function formatters() {\n    return currentFormatters.all();\n  };\n\n  /**\n   * Get or create brush context for this chart\n   * @param {string} name - Name of the brush context. If no match is found, a new brush context is created and returned.\n   * @returns {Brush}\n   */\n  instance.brush = function brushFn(name = 'default') {\n    if (!brushes[name]) {\n      brushes[name] = brush();\n    }\n    return brushes[name];\n  };\n\n  /**\n   * Get or create a scale for this chart\n   * @param {string|object} v - Scale reference or scale options\n   * @returns {Scale}\n   * @example\n   * instance.scale('nameOfMyScale'); // Fetch an existing scale by name\n   * instance.scale({ scale: 'nameOfMyScale' }); // Fetch an existing scale by name\n   * instance.scale({ source: '0/1', type: 'linear' }); // Create a new scale\n   */\n  instance.scale = function scale(v) {\n    return currentScales.get(v);\n  };\n\n  /**\n   * Get or create a formatter for this chart\n   * @param {string|object} v - Formatter reference or formatter options\n   * @returns {formatter}\n   * @example\n   * instance.formatter('nameOfMyFormatter'); // Fetch an existing formatter by name\n   * instance.formatter({ formatter: 'nameOfMyFormatter' }); // Fetch an existing formatter by name\n   * instance.formatter({ type: 'q' }); // Fetch an existing formatter by type\n   * instance.formatter({\n   *  formatter: 'd3',\n   *  type: 'number',\n   *  format: '1.0.%'\n   * }); // Create a new formatter\n   */\n  instance.formatter = function formatter(v) {\n    return currentFormatters.get(v);\n  };\n\n  /**\n   * @param {boolean} [val] - Toggle brushing on or off. If value is omitted, a toggle action is applied to the current state.\n   */\n  instance.toggleBrushing = function toggleBrushing(val) {\n    if (typeof val !== 'undefined') {\n      stopBrushing = val;\n    } else {\n      stopBrushing = !stopBrushing;\n    }\n  };\n\n  /**\n   * Get a component context\n   * @param {string} key - Component key\n   * @returns {Component} Component context\n   */\n  instance.component = (key) => {\n    const component = componentsC.findComponentByKey(key);\n    return component?.instance.ctx;\n  };\n\n  instance.logger = () => logger;\n\n  instance.theme = () => theme;\n\n  /**\n   * Interaction instance\n   * @typedef {object} Interaction\n   * @property {function} on Enable interaction\n   * @property {function} off Disable interaction\n   * @property {function} destroy Destroy interaction\n   * @property {string} key Interaction identifier\n   */\n\n  /**\n   * Get all interaction instances\n   * @name Chart.interactions\n   * @type {object}\n   * @example\n   * chart.interactions.instances; // Array of all interaction instances\n   * chart.interactions.on(); // Toggle on all interactions instances\n   * chart.interactions.off(); // Toggle off all interactions instances\n   */\n  Object.defineProperty(instance, 'interactions', {\n    get() {\n      return /** @lends Chart.interactions */ {\n        /** @type Array<Interaction> */\n        instances: currentInteractions,\n        /** Enable all interaction instances */\n        on() {\n          addDefaultEventListeners();\n          currentInteractions.forEach((i) => i.on());\n        },\n        /** Disable all interaction instances */\n        off() {\n          removeDefaultEventListeners();\n          currentInteractions.forEach((i) => i.off());\n        },\n      };\n    },\n  });\n\n  created();\n\n  if (element) {\n    beforeMount();\n    mount(element);\n    mounted(element);\n    instance.element = element;\n  }\n\n  return instance;\n}\n\nexport default chartFn;\n","import EventEmitter from '../utils/event-emitter';\n\nexport default function mediator() {\n  const instance = {};\n  EventEmitter.mixin(instance);\n  return instance;\n}\n","// import types from './types';\n\n/**\n * @ignore\n * @param {Array<DataSource>} dataSources\n * @param {any} { logger }\n * @returns {function}\n */\nexport default function datasets(dataSources, { types, logger }) {\n  const data = {};\n\n  const sets = [];\n  if (!Array.isArray(dataSources)) {\n    logger.warn('Deprecated: \"data-source\" configuration\"');\n    sets.push(dataSources);\n  } else {\n    sets.push(...dataSources);\n  }\n\n  sets.forEach((d, i) => {\n    let datasetFactory = types(d.type);\n    if (datasetFactory) {\n      let key = d.key;\n      if (typeof d.key === 'undefined') {\n        logger.warn(`Missing key for dataset. Using index '${i}' as key.`);\n        key = i;\n      }\n      let dataset = datasetFactory({\n        key,\n        data: d.data,\n        config: d.config,\n      });\n      data[key] = dataset;\n    }\n  });\n\n  /**\n   * Returns the `dataset` which has `key` as identifier\n   * @ignore\n   * @param {string} key - The dataset identifier\n   * @returns {Dataset}\n   */\n  const fn = (key) => {\n    if (key) {\n      return data[key];\n    }\n    return data[Object.keys(data)[0]];\n  };\n  return fn;\n}\n\n/**\n * @typedef {object} DataSource\n * @property {string} key - Unique identifier for this data source\n * @property {string} type - The dataset type\n * @property {any} data - Data\n */\n","import extend from 'extend';\nimport extract from './extractor';\n\n/**\n * @interface CollectionSettings\n * @property {string} key Unique key for the collection\n * @property {DataExtraction} data Data configuration\n * @example\n * {\n    key: 'my-collection',\n    data: {\n      extract: [{\n        source: 'Products',\n        field: 'Product',\n        value: d => d.name,\n        label: d => `<${d.name}>`\n        props: {\n          year: { field: 'Year' }\n          num: { field: 'Sales' }\n        }\n      }],\n      filter: d => d.label !== 'Sneakers', // extract everything except Sneakers\n      sort: (a, b) => a.label > b.label ? -1 : 1, // sort descending\n    }\n * }\n */\n\nfunction create(config, d, opts, extractor = extract) {\n  const collections = {};\n\n  (config || []).forEach((cfg) => {\n    if (!cfg.key) {\n      throw new Error('Data collection is missing \"key\" property');\n    }\n    if (typeof cfg.data === 'object' && 'collection' in cfg.data) {\n      throw new Error('Data config for collections may not reference other collections');\n    }\n    collections[cfg.key] = () => extractor(cfg.data, d, opts);\n  });\n\n  const fn = (key) => {\n    let k;\n    let cfg;\n    if (typeof key === 'string') {\n      k = key;\n    } else if (typeof key === 'object') {\n      k = key.key;\n      cfg = key;\n    }\n    if (!(k in collections)) {\n      throw new Error(`Unknown data collection: ${k}`);\n    }\n    if (typeof collections[k] === 'function') {\n      collections[k] = collections[k]();\n    }\n    let coll = collections[k];\n    if (cfg) {\n      if (cfg.fields && cfg.fields.filter) {\n        let filtered = coll.fields.filter(cfg.fields.filter);\n        if (coll.fields.length !== filtered.length) {\n          coll = extend(coll, { fields: filtered });\n        }\n      }\n    }\n\n    return coll;\n  };\n\n  return fn;\n}\n\nexport { create as default };\n","import registry from '../utils/registry';\n\nconst rendererRegistry = (reg) => {\n  let f = registry(reg);\n  f.prio = (p) => (p ? f.default(p[0]) : [f.default()]);\n  f.types = () => f.getKeys();\n  return f;\n};\n\nexport { rendererRegistry as default };\n","import registry from '../utils/registry';\n\nconst componentRegistry = registry();\nexport { componentRegistry as default };\n","export function findField(query, { cache }) {\n  if (typeof query === 'number') {\n    return cache.fields[query];\n  }\n\n  // Find by key first\n  for (let i = 0; i < cache.fields.length; i++) {\n    if (cache.fields[i].key() === query) {\n      return cache.fields[i];\n    }\n  }\n  // find by title\n  for (let i = 0; i < cache.fields.length; i++) {\n    if (cache.fields[i].title() === query) {\n      return cache.fields[i];\n    }\n  }\n  return null;\n}\n\nconst filters = {\n  numeric: (values) => values.filter((v) => typeof v === 'number' && !isNaN(v)),\n};\n\nconst unfilteredReducers = {\n  sum: (values) => values.reduce((a, b) => a + b, 0),\n};\n\n// function isPrimitive(x) {\n//   const type = typeof x;\n//   return (type !== 'object' && type !== 'function');\n// }\n\n/**\n * [reducers description]\n * @type {Object}\n * @private\n */\nexport const reducers = {\n  first: (values) => values[0],\n  last: (values) => values[values.length - 1],\n  min: (values) => {\n    const filtered = filters.numeric(values);\n    return !filtered.length ? NaN : Math.min.apply(null, filtered);\n  },\n  max: (values) => {\n    const filtered = filters.numeric(values);\n    return !filtered.length ? NaN : Math.max.apply(null, filtered);\n  },\n  sum: (values) => {\n    const filtered = filters.numeric(values);\n    return !filtered.length ? NaN : filtered.reduce((a, b) => a + b, 0);\n  },\n  avg: (values) => {\n    const filtered = filters.numeric(values);\n    const len = filtered.length;\n    return !len ? NaN : unfilteredReducers.sum(filtered) / len;\n  },\n};\n\nfunction normalizeProperties(cfg, dataset, dataProperties, main) {\n  // console.log('======', cfg, main, dataset);\n  const props = {};\n  const mainField = main.field || (typeof cfg.field !== 'undefined' ? dataset.field(cfg.field) : null);\n  Object.keys(dataProperties).forEach((key) => {\n    const pConfig = dataProperties[key];\n    const prop = (props[key] = {});\n    if (['number', 'string', 'boolean'].indexOf(typeof pConfig) !== -1) {\n      prop.type = 'primitive';\n      prop.value = pConfig;\n    } else if (typeof pConfig === 'function') {\n      prop.type = 'function';\n      prop.value = pConfig;\n      prop.label = pConfig;\n      prop.field = mainField;\n    } else if (typeof pConfig === 'object') {\n      if (pConfig.fields) {\n        prop.fields = pConfig.fields.map((ff) => normalizeProperties(cfg, dataset, { main: ff }, main).main);\n      } else if (typeof pConfig.field !== 'undefined') {\n        prop.type = 'field';\n        prop.field = dataset.field(pConfig.field);\n        prop.value = prop.field.value;\n        prop.label = prop.field.label;\n      } else if (mainField) {\n        prop.value = mainField.value;\n        prop.label = mainField.label;\n        prop.field = mainField;\n      }\n\n      if (typeof pConfig.filter === 'function') {\n        prop.filter = pConfig.filter;\n      }\n      if (typeof pConfig.value !== 'undefined') {\n        prop.value = pConfig.value;\n      }\n      if (typeof pConfig.label !== 'undefined') {\n        prop.label = pConfig.label;\n      }\n      if (typeof pConfig.reduce === 'function') {\n        prop.reduce = pConfig.reduce;\n      } else if (pConfig.reduce) {\n        prop.reduce = reducers[pConfig.reduce];\n      } else if (prop.field && prop.field.reduce) {\n        prop.reduce = typeof prop.field.reduce === 'string' ? reducers[prop.field.reduce] : prop.field.reduce;\n      }\n\n      if (typeof pConfig.reduceLabel === 'function') {\n        prop.reduceLabel = pConfig.reduceLabel;\n      } else if (pConfig.reduceLabel) {\n        prop.reduceLabel = reducers[pConfig.reduceLabel];\n      } else if (prop.field && prop.field.reduceLabel) {\n        prop.reduceLabel =\n          typeof prop.field.reduceLabel === 'string' ? reducers[prop.field.reduceLabel] : prop.field.reduceLabel;\n      }\n    }\n  });\n\n  return props;\n}\n\n/*\nexample of configuration input\ncfg = {\n  field: 'State', // the 'top level' values are extracted from field state\n  value: d => d.qText, // the value of the output\n  props: { // additional data properties ammended to each item\n    a: 3, // constant value\n    b: d => d.qElemNumber, // function will receive the original field value\n    c: {\n      field: 'Country', // reference to another field\n      value: d => d.qText // extract the qText value from the referenced field\n    },\n    d: {\n      value: d => d.qRow //  extract qRow from field 'State'\n    }\n  }\n}\n\n// output\n[{\n  value: 'CA', source: { field: 'State' },\n  a: { value: 3 },\n  b: { value: 26, source: 'State' },\n  c: { value: 'USA', source: 'Country' },\n  d: { value: 131, source: 'State' }\n},\n...]\n*/\nexport function getPropsInfo(cfg, dataset) {\n  // console.log('222', cfg);\n  const { main } = normalizeProperties(\n    cfg,\n    dataset,\n    {\n      main: {\n        value: cfg.value,\n        label: cfg.label,\n        reduce: cfg.reduce,\n        filter: cfg.filter,\n      },\n    },\n    {}\n  );\n  const props = normalizeProperties(cfg, dataset, cfg.props || {}, main);\n  return { props, main };\n}\n\nfunction collectItems(items, cfg, formatter, prop) {\n  const values = Array(items.length);\n  const labels = Array(items.length);\n  let it;\n  for (let i = 0; i < items.length; i++) {\n    it = prop ? items[i][prop] : items[i];\n    values[i] = it.value;\n    labels[i] = it.label;\n  }\n\n  const reduce = cfg.reduce;\n  const reduceLabel = cfg.reduceLabel;\n  const v = reduce ? reduce(values) : values;\n  const b = reduceLabel ? reduceLabel(labels, v) : formatter ? formatter(v) : String(v); // eslint-disable-line no-nested-ternary\n\n  // // ret[prop].label = String(propsFormatters[prop](ret[prop].value));\n\n  const ret = {\n    value: v,\n    label: b,\n  };\n  if (prop && items[0][prop].source) {\n    ret.source = items[0][prop].source;\n    return ret;\n  }\n  if (!prop && items[0].source) {\n    ret.source = items[0].source;\n    return ret;\n  }\n\n  return ret;\n}\n\n// collect items that have been grouped and reduce per group and property\nexport function collect(trackedItems, { main, propsArr, props }) {\n  let dataItems = [];\n  const mainFormatter = main.field.formatter(); // || (v => v);\n  const propsFormatters = {};\n  propsArr.forEach((prop) => {\n    propsFormatters[prop] = props[prop].field ? props[prop].field.formatter() : (v) => v;\n  });\n  dataItems.push(\n    ...trackedItems.map((t) => {\n      const ret = collectItems(t.items, main, mainFormatter);\n\n      propsArr.forEach((prop) => {\n        ret[prop] = collectItems(t.items, props[prop], propsFormatters[prop], prop);\n      });\n      return ret;\n    })\n  );\n\n  return dataItems;\n}\n\nexport function track({ cfg, itemData, obj, target, tracker, trackType }) {\n  const trackId = trackType === 'function' ? cfg.trackBy(itemData) : itemData[cfg.trackBy];\n  let trackedItem = tracker[trackId];\n  if (!trackedItem) {\n    trackedItem = tracker[trackId] = {\n      items: [],\n      id: trackId,\n    };\n    target.push(trackedItem);\n  }\n  trackedItem.items.push(obj);\n}\n","import { getPropsInfo, collect, track as storeTracked } from './util';\n\nfunction datumExtract(propCfg, cell, { key }) {\n  const datum = {\n    value:\n      typeof propCfg.value === 'function' // eslint-disable-line no-nested-ternary\n        ? propCfg.value(cell)\n        : typeof propCfg.value !== 'undefined'\n        ? propCfg.value\n        : cell,\n  };\n\n  datum.label =\n    typeof propCfg.label === 'function' // eslint-disable-line no-nested-ternary\n      ? propCfg.label(cell)\n      : typeof propCfg.label !== 'undefined'\n      ? String(propCfg.label)\n      : String(datum.value);\n\n  if (propCfg.field) {\n    datum.source = {\n      key,\n      field: propCfg.field.key(),\n    };\n  }\n\n  return datum;\n}\n\nexport default function extract(config, dataset) {\n  const cfgs = Array.isArray(config) ? config : [config];\n  let dataItems = [];\n  cfgs.forEach((cfg) => {\n    if (typeof cfg.field !== 'undefined') {\n      const f = dataset.field(cfg.field);\n      const sourceKey = dataset.key();\n      if (!f) {\n        throw Error(`Field '${cfg.field}' not found`);\n      }\n      const { props, main } = getPropsInfo(cfg, dataset);\n      const propsArr = Object.keys(props);\n\n      const track = !!cfg.trackBy;\n      const trackType = typeof cfg.trackBy;\n      const tracker = {};\n      const trackedItems = [];\n\n      const items = f.items();\n      const mapped = [];\n      for (let idx = 0; idx < items.length; idx++) {\n        const mainCell = items[idx];\n        const exclude = main.filter && !main.filter(mainCell);\n        if (exclude) {\n          continue;\n        }\n        const ret = datumExtract(main, mainCell, { key: sourceKey });\n\n        // loop through all props that need to be mapped and\n        // assign 'value' and 'source' to each property\n        propsArr.forEach((prop) => {\n          const p = props[prop];\n          let propCell = p.field ? p.field.items()[idx] : mainCell;\n          ret[prop] = datumExtract(p, propCell, { key: sourceKey });\n        });\n\n        // collect items based on the trackBy value\n        // items with the same trackBy value are placed in an array and reduced later\n        if (track) {\n          storeTracked({\n            cfg,\n            itemData: mainCell,\n            obj: ret,\n            target: trackedItems,\n            tracker,\n            trackType,\n          });\n        }\n\n        mapped.push(ret);\n      }\n\n      // reduce if items have been grouped\n      if (track) {\n        dataItems.push(\n          ...collect(trackedItems, {\n            main,\n            propsArr,\n            props,\n          })\n        );\n      } else {\n        dataItems.push(...mapped);\n      }\n    }\n  });\n  return dataItems;\n}\n","import extend from 'extend';\nimport field from './field';\nimport extract from './extractor-matrix';\n\nimport { findField, getPropsInfo, collect, track } from './util';\n\nconst filters = {\n  numeric: (values) => values.filter((v) => typeof v === 'number' && !isNaN(v)),\n};\n\nfunction createFields({ source, data, cache, config }) {\n  let headers;\n  let content = data;\n  const parse = config && config.parse;\n  if (Array.isArray(data[0])) {\n    // assume 2d matrix of data\n    if (parse && parse.headers === false) {\n      headers = data[0].map((v, i) => i);\n    } else {\n      headers = data[0];\n      content = data.slice(1);\n    }\n  } else {\n    headers = Object.keys(data[0]);\n  }\n\n  const rowFn = !!parse && typeof parse.row === 'function' && parse.row;\n  let flds = headers;\n\n  if (parse && typeof parse.fields === 'function') {\n    flds = parse.fields(flds.slice());\n  } else {\n    flds = headers.map((h) => ({\n      key: h,\n      title: h,\n    }));\n  }\n\n  let fieldValues;\n  if (Array.isArray(data[0])) {\n    fieldValues = flds.map(() => []);\n  } else {\n    fieldValues = {};\n    flds.forEach((f) => {\n      fieldValues[f.key] = [];\n    });\n  }\n\n  for (let r = 0; r < content.length; r++) {\n    const row = rowFn ? rowFn(content[r], r, flds) : content[r];\n    if (!row) {\n      continue;\n    }\n    if (Array.isArray(row)) {\n      for (let c = 0; c < flds.length; c++) {\n        fieldValues[c].push(row[c]);\n      }\n    } else {\n      for (let c = 0; c < flds.length; c++) {\n        fieldValues[flds[c].key].push(row[flds[c].key]);\n      }\n    }\n  }\n  const fv = Array.isArray(fieldValues) ? (i) => fieldValues[i] : (i) => fieldValues[flds[i].key];\n  for (let c = 0; c < flds.length; c++) {\n    const values = fv(c);\n    const numericValues = filters.numeric(values);\n    const isMeasure = numericValues.length > 0;\n    const type = isMeasure ? 'measure' : 'dimension';\n    const min = isMeasure ? Math.min(...numericValues) : NaN;\n    const max = isMeasure ? Math.max(...numericValues) : NaN;\n\n    cache.fields.push(\n      field(\n        extend(\n          {\n            source,\n            key: c,\n            title: flds[c].title,\n            values,\n            min,\n            max,\n            type,\n          },\n          flds[c]\n        ),\n        {\n          value: flds[c].value,\n          label: flds[c].label,\n        }\n      )\n    );\n  }\n}\n\nconst dsv = ({ data, config }) => {\n  const rows = data.split('\\n');\n  const row0 = rows[0];\n  const row1 = rows[1];\n  let delimiter = ',';\n  if (config && config.parse && config.parse.delimiter) {\n    delimiter = config.parse.delimiter;\n  } else if (row0) {\n    // guess delimiter\n    const guesses = [/,/, /\\t/, /;/];\n    for (let i = 0; i < guesses.length; i++) {\n      const d = guesses[i];\n      if (row0 && row1) {\n        if (d.test(row0) && d.test(row1) && row0.split(d).length === row1.split(d).length) {\n          delimiter = d;\n          break;\n        }\n      } else if (d.test(row0)) {\n        delimiter = d;\n      }\n    }\n  }\n  return rows.map((row) => row.split(delimiter));\n};\n\nconst parseData = ({ key, data, cache, config }) => {\n  if (!data) {\n    return;\n  }\n  let dd = data;\n\n  if (typeof dd === 'string') {\n    // assume dsv\n    dd = dsv({ data, config });\n  }\n\n  if (!Array.isArray(dd)) {\n    return; // warn?\n  }\n\n  createFields({\n    data: dd,\n    cache,\n    source: key,\n    config,\n  });\n};\n\n/**\n * Create a new dataset with default settings\n * @private\n * @return {Dataset}\n */\nfunction ds({ key, data, config } = {}) {\n  const cache = {\n    fields: [],\n  };\n\n  /**\n   * @alias Dataset\n   * @interface\n   */\n  const dataset = {\n    /**\n     * Get the key identifying this dataset\n     * @returns {string}\n     */\n    key: () => key,\n\n    /**\n     * Get the raw data\n     * @returns {any}\n     */\n    raw: () => data,\n\n    /**\n     * Find a field within this dataset\n     * @param {string} query - The field to find\n     * @returns {Field}\n     */\n    field: (query) =>\n      findField(query, {\n        cache,\n        matrix: data,\n      }),\n\n    /**\n     * Get all fields within this dataset\n     * @returns {Array<Field>}\n     */\n    fields: () => cache.fields.slice(),\n\n    /**\n     * Extract data items from this dataset\n     * @param {DataExtraction~Extract|DataFieldExtraction} config\n     * @returns {Array<DatumExtract>}\n     */\n    extract: (cfg) => extract(cfg, dataset, cache),\n\n    /**\n     * @returns {null}\n     */\n    hierarchy: () => null,\n  };\n\n  parseData({\n    key,\n    data,\n    config,\n    cache,\n  });\n\n  return dataset;\n}\n\nds.util = {\n  normalizeConfig: getPropsInfo,\n  collect,\n  track,\n};\n\nexport { ds as default };\n\n/**\n * Callback function. Should return the key to stack by\n * @callback\n * @typedef {function} DataExtraction~StackKeyCallback\n * @param {DatumExtract} datum The extracted datum\n * @returns {any} The data value to stack by\n */\n\n/**\n * Callback function. Should return the data value to stack with\n * @callback\n * @typedef {function} DataExtraction~StackValueCallback\n * @param {DatumExtract} datum The extracted datum\n * @returns {any} The data value to stack with\n */\n\n/**\n * Callback function to filter the extracted data items\n * @callback\n * @typedef {function} DataExtraction~FilterCallback\n * @param {DatumExtract} datum The extracted datum\n * @returns {boolean} Return true if the datum should be included in the final data set\n */\n\n/**\n * Callback function to sort the extracted data items\n * @callback\n * @typedef {function} DataExtraction~SortCallback\n * @param {DatumExtract} a The extracted datum\n * @param {DatumExtract} b The extracted datum\n * @returns {number} If less than 0, sort a before b. If greater than 0, sort b before a\n */\n\n/**\n * Used to extract data from a `DataSource`\n * @typedef {object} DataExtraction\n * @property {DataExtraction~Extract} extract Extract definition\n * @property {object} [stack] If provided, defines how the data should be stacked\n * @property {DataExtraction~StackKeyCallback} stack.stackKey Callback function. Should return the key to stack by\n * @property {DataExtraction~StackValueCallback} stack.value Callback function. Should return the data value to stack with\n * @property {DataExtraction~FilterCallback} [filter] Callback function to filter the extracted data items\n * @property {DataExtraction~SortCallback} [sort] Callback function to sort the extracted data items\n * @example\n{\n  extract: [{\n    source: 'Products',\n    field: 'Product',\n    value: d => d.name,\n    label: d => `<${d.name}>`\n    props: {\n      year: { field: 'Year' }\n      num: { field: 'Sales' }\n    }\n  }],\n  filter: d => d.label !== 'Sneakers', // extract everything except Sneakers\n  sort: (a, b) => a.label > b.label ? -1 : 1, // sort descending\n}\n */\n\n/**\n * @typedef {object} DataFieldExtraction\n * @property {string} source - Which data source to extract from\n * @property {string} field - The field to extract data from\n * @property {DataExtraction~Extract~ValueFn|string|number|boolean} [value] - The field value accessor\n * @property {DataExtraction~Extract~LabelFn|string|number|boolean} [label] - The field label accessor\n * @example\n * {\n *  source: 'Products',\n *  field: 'Sales',\n *  value: (val) => Math.round(val),\n *  label: (val) => `<${val}>`\n * }\n */\n\n/**\n * Data extraction definition. Define how and what kind of data should be extracted from a `DataSource`.\n * @typedef {object} DataExtraction~Extract\n * @property {string} source - Which data source to extract from\n * @property {string} field - The field to extract data from\n * @property {DataExtraction~Extract~ValueFn|string|number|boolean} [value] - The field value accessor\n * @property {DataExtraction~Extract~LabelFn|string|number|boolean} [label] - The field label accessor\n * @property {DataExtraction~Extract~TrackByFn} [trackBy] - Track by value accessor\n * @property {DataExtraction~Extract~ReduceFn|string} [reduce] - Reducer function\n * @property {DataExtraction~Extract~ReduceLabelFn|string} [reduceLabel] - Label reducer function\n * @property {DataExtraction~Extract~FilterFn} [filter] - Filter function\n * @property {object.<string, DataExtraction~Extract~Props>} [props] - Additional properties to add to the extracted item\n * @example\n * {\n    source: 'Products',\n    field: 'Product',\n    value: (val) => val,\n    label: (val) => `<${val}>`\n    props: {\n      year: { field: 'Year' }\n      num: { field: 'Sales' }\n    }\n  }\n */\n\n/**\n * @typedef {object} DataExtraction~Extract~Props\n * @property {string} field - The field to extract data from\n * @property {DataExtraction~Extract~ValueFn|string|number|boolean} [value] - The field value accessor\n * @property {DataExtraction~Extract~LabelFn|string|number|boolean} [label] - The field label accessor\n * @example\n * {\n *  field: 'Sales',\n *  value: (val) => Math.round(val),\n *  label: (val) => `<${val}>`\n * }\n */\n\n/**\n * Value callback function\n * @callback DataExtraction~Extract~ValueFn\n * @param {any} cell The field cell\n * @returns {any}\n */\n\n/**\n * Label callback function\n * @callback DataExtraction~Extract~LabelFn\n * @param {any} cell The field cell\n * @returns {string}\n */\n\n/**\n * Filter callback function\n * @callback DataExtraction~Extract~FilterFn\n * @param {any} cell The field cell\n * @returns {boolean}\n */\n\n/**\n * TrackBy callback function\n * @callback DataExtraction~Extract~TrackByFn\n * @param {any} cell The field cell\n * @returns {any}\n */\n\n/**\n * Reduce callback function\n * @callback DataExtraction~Extract~ReduceFn\n * @param {any[]} values The collected values to reduce\n * @returns {any}\n */\n\n/**\n * ReduceLabel callback function\n * @callback DataExtraction~Extract~ReduceLabelFn\n * @param {any[]} labels The collected labels to reduce\n * @param {any} value Reduced value\n * @returns {string}\n */\n\n/**\n * @typedef {object} DatumExtract\n * @property {any} value - The extracted value\n * @property {string} label - The extracted value as a string\n * @property {object} source - The data source of the extracted data\n * @property {string} source.key - The data-source key\n * @property {string} source.field - The source field\n */\n","import registry from '../utils/registry';\nimport dataset from './dataset';\n\nconst dataRegistry = registry();\n\ndataRegistry.default('matrix');\n\ndataRegistry('matrix', dataset);\n\ndataRegistry('default', dataset); // deprecated\n\nexport { dataRegistry as default };\n","import registry from '../utils/registry';\nimport native from '../../web/interactions/native';\n\n/**\n * @interface InteractionSettings\n * @property {string} type Type of interaction handler\n * @property {string} [key] Unique key identifying the handler\n * @property {function|boolean} enable Enable or disable the interaction handler. If a callback function is provided, it must return either true or false\n * @example\n * {\n *  type: 'native',\n *  key: 'nativeHandler',\n *  enable: () => true,\n *  events: { // \"events\" is a property specific to the native handler\n *    mousemove: (e) => console.log('mousemove', e),\n *  }\n * }\n */\n\nconst reg = registry();\n\nreg('native', native);\n\nexport default reg;\n","/**\n * Short-hand for max(min())\n *\n * @param {number} min Minimum allowed value\n * @param {number} max Maximum allowed value\n * @param {number} value The actual value to cap\n * @ignore\n */\nexport function cap(min, max, value) {\n  return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Resolve a diff, i.e. resolveDiff(0.2, 0.6, 1, 100) = 20\n *\n * @param {object} params parameters\n * @param {number} params.start Normalized start value\n * @param {number} params.end Normalized end value\n * @param {number} params.minPx The minimum number of pixels\n * @param {number} params.maxPx Maximum number of pixels, i.e. the width or height\n * @ignore\n */\nexport function resolveDiff({ start, end, minPx = 0.1, maxPx = 1 }) {\n  const high = Math.max(start, end);\n  const low = Math.min(start, end);\n  const highModified = cap(-0.1, 1.2, high);\n  const lowModified = cap(-0.1, 1.2, low);\n\n  const wantedDiff = highModified * maxPx - lowModified * maxPx;\n  const actualDiff = Math.max(minPx, wantedDiff);\n  const startModifier = (actualDiff - wantedDiff) / 2;\n  const actualLow = lowModified * maxPx - startModifier;\n\n  return {\n    actualDiff,\n    startModifier,\n    actualLow,\n  };\n}\n","import extend from 'extend';\nimport { resolveDiff } from './box-math';\n\n/**\n * Out of bounds shape\n * @param {object} params parameters\n * @param {object} params.item Resolved styling item from box component with item.major\n * @param {number} params.value 0 or 1 depending on where to render the oob shape\n * @param {number} params.boxWidth Un-calculated box width in relative/normalized format\n * @param {number} params.boxPadding Un-calculated box padding in relative/normalized format\n * @param {number} params.rendWidth The pixel width of the area to render upon\n * @param {number} params.rendHeight The pixel height of the area to render upon\n * @param {boolean} params.flipXY Wether or not to flip X and Y coordinates together with Width and Height\n * @param {function} params.symbol Symbol library function from component\n * @ignore\n */\nexport function oob({ item, value, boxCenter, rendWidth, rendHeight, flipXY, symbol }) {\n  let x = 'x';\n  let y = 'y';\n  let calcwidth = rendWidth;\n  let calcheight = rendHeight;\n  let startAngle = value < 0.5 ? 90 : -90;\n\n  if (flipXY) {\n    x = 'y';\n    y = 'x';\n    calcwidth = rendHeight;\n    calcheight = rendWidth;\n    startAngle = value < 0.5 ? 180 : 0;\n  }\n\n  return symbol(\n    extend({}, item.oob, {\n      [x]: boxCenter * calcwidth,\n      [y]: Math.max(item.oob.size / 2, Math.min(value * calcheight, calcheight - item.oob.size / 2)),\n      startAngle,\n    })\n  );\n}\n\n/**\n * Box shape calculation function\n * @param {object} params parameters\n * @param {object} params.item Resolved styling item from box component with item.major\n * @param {number} params.boxWidth Un-calculated box width in relative/normalized format\n * @param {number} params.boxPadding Un-calculated box padding in relative/normalized format\n * @param {number} params.rendWidth The pixel width of the area to render upon\n * @param {number} params.rendHeight The pixel height of the area to render upon\n * @param {boolean} params.flipXY wether or not to flip X and Y coordinates together with Width and Height\n * @ignore\n */\nexport function box({ item, boxWidth, boxPadding, rendWidth, rendHeight, flipXY }) {\n  let x = 'x';\n  let y = 'y';\n  let width = 'width';\n  let height = 'height';\n  let calcwidth = rendWidth;\n  let calcheight = rendHeight;\n\n  if (flipXY) {\n    x = 'y';\n    y = 'x';\n    width = 'height';\n    height = 'width';\n    calcwidth = rendHeight;\n    calcheight = rendWidth;\n  }\n\n  const { actualDiff, actualLow } = resolveDiff({\n    start: item.start,\n    end: item.end,\n    minPx: item.box.minHeightPx,\n    maxPx: calcheight,\n  });\n\n  return extend({}, item.box, {\n    type: 'rect',\n    [x]: (boxPadding + item.major) * calcwidth,\n    [y]: actualLow,\n    [height]: actualDiff,\n    [width]: boxWidth * calcwidth,\n    data: item.data || {},\n    collider: {\n      type: null,\n    },\n  });\n}\n\n/**\n * A vertical line shape (for start - min, end - max values)\n * @param {object} params parameters\n * @param {object} params.item Resolved styling item from box component with item.major\n * @param {number} params.from Normalized from value\n * @param {number} params.to Normalized to value\n * @param {number} params.boxCenter Center coordinate for the box\n * @param {number} params.rendWidth The pixel width of the area to render upon\n * @param {number} params.rendHeight The pixel height of the area to render upon\n * @param {boolean} params.flipXY wether or not to flip X and Y coordinates together with Width and Height\n * @ignore\n */\nexport function verticalLine({ item, from, to, boxCenter, rendWidth, rendHeight, flipXY }) {\n  let x1 = 'x1';\n  let y1 = 'y1';\n  let x2 = 'x2';\n  let y2 = 'y2';\n  let calcwidth = rendWidth;\n  let calcheight = rendHeight;\n\n  if (flipXY) {\n    x1 = 'y1';\n    y1 = 'x1';\n    x2 = 'y2';\n    y2 = 'x2';\n    calcwidth = rendHeight;\n    calcheight = rendWidth;\n  }\n\n  return extend({}, item.line, {\n    type: 'line',\n    [y2]: Math.floor(from * calcheight),\n    [x1]: boxCenter * calcwidth,\n    [y1]: Math.floor(to * calcheight),\n    [x2]: boxCenter * calcwidth,\n    data: item.data || {},\n    collider: {\n      type: null,\n    },\n  });\n}\n\n/**\n * A horizontal line shape (for median and whiskers)\n * @param {object} params parameters\n * @param {object} params.item Resolved styling item from box component with item.major\n * @param {string} params.key Which key to use as style base in the item object\n * @param {number} params.position At which \"height\" (X) to position the horizontal line\n * @param {number} params.width Width of the horizontal line (i.e. box width or a multiple of it)\n * @param {number} params.boxCenter Center coordinate for the box\n * @param {number} params.rendWidth The pixel width of the area to render upon\n * @param {number} params.rendHeight The pixel height of the area to render upon\n * @param {boolean} params.flipXY wether or not to flip X and Y coordinates together with Width and Height\n * @ignore\n */\nexport function horizontalLine({ item, key, position, width, boxCenter, rendWidth, rendHeight, flipXY }) {\n  let x1 = 'x1';\n  let y1 = 'y1';\n  let x2 = 'x2';\n  let y2 = 'y2';\n  let calcwidth = rendWidth;\n  let calcheight = rendHeight;\n\n  if (flipXY) {\n    x1 = 'y1';\n    y1 = 'x1';\n    x2 = 'y2';\n    y2 = 'x2';\n    calcwidth = rendHeight;\n    calcheight = rendWidth;\n  }\n\n  const halfWidth = width / 2;\n\n  return extend({ type: 'line' }, item[key], {\n    [y1]: Math.floor(position * calcheight),\n    [x1]: (boxCenter - halfWidth) * calcwidth,\n    [y2]: Math.floor(position * calcheight),\n    [x2]: (boxCenter + halfWidth) * calcwidth,\n    r: halfWidth * calcwidth,\n    cx: boxCenter * calcwidth,\n    cy: position * calcheight,\n    width: width * calcwidth,\n    data: item.data || {},\n    collider: {\n      type: null,\n    },\n  });\n}\n\n/**\n * A horizontal line shape (for median and whiskers)\n * @param {number} bandwidth The current bandwidth for this item\n * @param {object} item A resolved style item to render with major and box width variables, minWidthPx and maxWidthPx\n * @param {number} maxMajorWidth The actual maximum major width\n * @ignore\n */\nexport function getBoxWidth(bandwidth, item, maxMajorWidth) {\n  const { width, maxWidthPx, minWidthPx } = item.box;\n  const sign = bandwidth >= 0 ? 1 : -1;\n  let boxWidth = Math.min(sign * bandwidth * width, isNaN(maxWidthPx) ? maxMajorWidth : maxWidthPx / maxMajorWidth);\n  boxWidth = isNaN(minWidthPx) ? boxWidth : Math.max(minWidthPx / maxMajorWidth, boxWidth);\n  return boxWidth * sign;\n}\n","/**\n * Manages event handlers for native events\n * @private\n */\nfunction native(chart, mediator, element) {\n  let instance = { chart, mediator, element };\n  let nativeEvents = [];\n  let settings;\n  let itKey;\n  let isOn = true;\n\n  /**\n   * Set default settings\n   * @private\n   */\n  function setDefaultSettings(newSettings) {\n    itKey = newSettings.key;\n    settings = newSettings;\n    settings.events = settings.events || [];\n    if (settings.enable === undefined) {\n      settings.enable = true;\n    }\n  }\n\n  /**\n   * Add native events based on settings\n   * @private\n   */\n  function addEvents() {\n    if (typeof settings.enable === 'function') {\n      settings.enable = settings.enable.bind(instance)();\n    }\n    if (!settings.enable) {\n      return; // interaction is disabled\n    }\n    Object.keys(settings.events).forEach((key) => {\n      const listener = settings.events[key].bind(instance);\n      element.addEventListener(key, listener);\n      nativeEvents.push({ key, listener });\n    });\n  }\n\n  /**\n   * Removes all added native events\n   * @private\n   */\n  function removeAddedEvents() {\n    // remove added native events\n    nativeEvents.forEach(({ key, listener }) => {\n      element.removeEventListener(key, listener);\n    });\n    nativeEvents = [];\n  }\n\n  return {\n    /**\n     * Getter for the key.\n     * @private\n     */\n    get key() {\n      return itKey;\n    },\n    /**\n     * Updates this with new settings\n     * @private\n     * @param {object} newSettings\n     * @param {string} [newSettings.type] - The interaction type. Is 'native' for this component\n     * @param {boolean|function} [newSettings.enable=true] - Should the interactions defined here be enabled or not.\n     * This is only run when adding event handlers. In effect at startup, update or during on/off.\n     * It does not run during every event loop.\n     * @param {array} [newSettings.gestures] - The keys in this object is the names of native events\n     * that should be added to the chart element and they should all point to function which\n     * will be the corresponding event handler.\n     */\n    set(newSettings) {\n      setDefaultSettings(newSettings);\n      removeAddedEvents();\n      if (isOn) {\n        addEvents();\n      }\n    },\n    /**\n     * Turns off interactions\n     * @private\n     */\n    off() {\n      isOn = false;\n      removeAddedEvents();\n    },\n    /**\n     * Turns off interactions\n     * @private\n     */\n    on() {\n      isOn = true;\n      if (nativeEvents.length === 0) {\n        addEvents();\n      }\n    },\n    /**\n     * Destroys and unbinds all event handlers\n     * @private\n     */\n    destroy() {\n      removeAddedEvents();\n      instance = null;\n      settings = null;\n    },\n  };\n}\n\nexport { native as default };\n","import buildShapes from './box-shapes';\nimport complexResolver from './box-resolver';\n\nconst DEFAULT_DATA_SETTINGS = {\n  oob: {\n    show: true,\n    type: 'n-polygon',\n    fill: '#999',\n    stroke: '#000',\n    strokeWidth: 0,\n    size: 10,\n    sides: 3,\n    startAngle: -90,\n  },\n  box: {\n    show: true,\n    fill: '#fff',\n    stroke: '#000',\n    strokeWidth: 1,\n    strokeLinejoin: 'miter',\n    width: 1,\n    maxWidthPx: undefined,\n    minWidthPx: 1,\n    minHeightPx: 1,\n  },\n  line: {\n    show: true,\n    stroke: '#000',\n    strokeWidth: 1,\n  },\n  median: {\n    show: true,\n    stroke: '#000',\n    strokeWidth: 1,\n  },\n  whisker: {\n    show: true,\n    stroke: '#000',\n    strokeWidth: 1,\n    fill: '',\n    type: 'line',\n    width: 1,\n  },\n};\n\nconst dataKeys = Object.keys(DEFAULT_DATA_SETTINGS);\n\nconst component = {\n  require: ['chart', 'resolver', 'symbol'],\n  defaultSettings: {\n    settings: {},\n    data: {},\n    style: {\n      box: '$shape',\n      line: '$shape-guide',\n      whisker: '$shape-guide',\n      median: '$shape-guide--inverted',\n    },\n  },\n  created() {\n    this.state = {};\n  },\n  render({ data }) {\n    const { width, height } = this.rect;\n\n    const flipXY = this.settings.settings.orientation === 'horizontal';\n\n    const { style, resolver, symbol } = this;\n\n    const keys = dataKeys.filter((key) => !this.settings.settings[key] || this.settings.settings[key].show !== false);\n    const defaultSettings = {};\n\n    keys.forEach((key) => (defaultSettings[key] = DEFAULT_DATA_SETTINGS[key]));\n\n    const resolved = complexResolver({\n      keys,\n      data,\n      defaultSettings,\n      style,\n      settings: this.settings.settings,\n      width,\n      height,\n      resolver,\n    });\n\n    const { settings, items } = resolved;\n\n    const shapes = buildShapes({\n      items,\n      settings,\n      width,\n      height,\n      flipXY,\n      resolved,\n      keys,\n      symbol,\n    });\n\n    return shapes;\n  },\n};\n\nexport default component;\n","import extend from 'extend';\n\n/**\n * Resolve a complex object using the built-in resolver from this.resolver in component\n * @ignore\n */\nexport default function complexResolver({ keys, data, defaultSettings, style, settings, width, height, resolver }) {\n  const defaults = extend(true, {}, defaultSettings || {}, style || {});\n  const scaled = {\n    major: settings.orientation === 'horizontal' ? height : width,\n    minor: settings.orientation === 'horizontal' ? width : height,\n  };\n\n  const majorSettings = settings.major;\n\n  let majorResolved;\n\n  if (\n    typeof majorSettings === 'object' &&\n    typeof majorSettings.ref === 'object' &&\n    typeof majorSettings.ref.start !== 'undefined' &&\n    typeof majorSettings.ref.end !== 'undefined'\n  ) {\n    // temporary backwards compatibility\n    majorResolved = resolver.resolve({\n      data,\n      defaults: {\n        start: 0,\n        end: 1,\n      },\n      scaled,\n      settings: extend(\n        true,\n        {},\n        {\n          binStart: { scale: settings.major.scale, ref: settings.major.ref.start },\n          binEnd: { scale: settings.major.scale, ref: settings.major.ref.end },\n        }\n      ),\n    });\n  } else if (\n    typeof majorSettings === 'object' &&\n    typeof majorSettings.binStart !== 'undefined' &&\n    typeof majorSettings.binEnd !== 'undefined'\n  ) {\n    majorResolved = resolver.resolve({\n      data,\n      defaults: {\n        start: 0,\n        end: 1,\n      },\n      scaled,\n      settings: extend(\n        true,\n        {},\n        {\n          binStart: { scale: settings.major.scale, ref: 'binStart' },\n          binEnd: { scale: settings.major.scale, ref: 'binEnd' },\n        },\n        settings.major\n      ),\n    });\n  } else {\n    majorResolved = resolver.resolve({\n      data,\n      scaled,\n      defaults: {\n        major: 0.5,\n      },\n      settings: {\n        major: settings.major,\n      },\n    });\n  }\n\n  const minorSettings = settings.minor || {};\n  const defaultMinorSettings = {};\n  ['start', 'end', 'min', 'max', 'med'].forEach((prop) => {\n    if (minorSettings[prop] || (data.items && data.items.length && data.items[0][prop])) {\n      defaultMinorSettings[prop] = { scale: minorSettings.scale, ref: prop };\n    }\n  });\n\n  const minorResolved = resolver.resolve({\n    data,\n    defaults: {\n      start: 0,\n      end: 1,\n    },\n    scaled,\n    settings: extend(true, {}, defaultMinorSettings, minorSettings),\n  });\n\n  let key;\n  let ext = {\n    major: majorResolved,\n    minor: minorResolved,\n  };\n\n  for (let ki = 0, len = keys.length; ki < len; ki++) {\n    if (!settings[key] || settings[key].show !== false) {\n      key = keys[ki];\n      ext[key] = resolver.resolve({\n        data,\n        defaults: defaults[key],\n        settings: settings[key],\n        scaled,\n      });\n    }\n  }\n\n  return ext;\n}\n","import extend from 'extend';\nimport * as boxShapesHelper from './box-shapes-helper';\n\nimport { isNumber } from '../../utils/is-number';\n\nexport default function buildShapes({ width, height, flipXY, resolved, keys, symbol }) {\n  // if (!settings || !settings.major || !settings.major.scale || !settings.minor || !settings.minor.scale) {\n  //   return [];\n  // }\n\n  const output = [];\n  const majorItems = resolved.major.items;\n\n  if (!majorItems.length) {\n    return output;\n  }\n\n  const rendWidth = width;\n  const rendHeight = height;\n  const maxMajorWidth = flipXY ? height : width;\n  const majorSettings = resolved.major.settings;\n  const minorProps = ['start', 'end', 'min', 'max', 'med'].filter(\n    (prop) => typeof resolved.minor.settings[prop] !== 'undefined'\n  );\n  const numMinorProps = minorProps.length;\n  const nonOobKeys = keys.filter((key) => key !== 'oob');\n\n  let children;\n  let major;\n  let minorItem;\n  let boxWidth;\n  let boxPadding;\n  let boxCenter;\n  let isLowerOutOfBounds;\n  let isHigherOutOfBounds;\n  let isOutOfBounds;\n  const numKeys = keys ? keys.length : 0;\n  const numNonOobKeys = nonOobKeys ? nonOobKeys.length : 0;\n\n  function addBox() {\n    /* THE BOX */\n    if (minorItem.box && isNumber(minorItem.start) && isNumber(minorItem.end)) {\n      children.push(\n        boxShapesHelper.box({\n          item: minorItem,\n          boxWidth,\n          boxPadding,\n          rendWidth,\n          rendHeight,\n          flipXY,\n        })\n      );\n    }\n  }\n\n  function addLine() {\n    /* LINES MIN - START, END - MAX */\n    if (isNumber(minorItem.min) && isNumber(minorItem.start)) {\n      children.push(\n        boxShapesHelper.verticalLine({\n          item: minorItem,\n          from: minorItem.min,\n          to: minorItem.start,\n          boxCenter,\n          rendWidth,\n          rendHeight,\n          flipXY,\n        })\n      );\n    }\n\n    if (isNumber(minorItem.max) && isNumber(minorItem.end)) {\n      children.push(\n        boxShapesHelper.verticalLine({\n          item: minorItem,\n          from: minorItem.max,\n          to: minorItem.end,\n          boxCenter,\n          rendWidth,\n          rendHeight,\n          flipXY,\n        })\n      );\n    }\n  }\n\n  function addMedian() {\n    /* MEDIAN */\n    if (minorItem.median && isNumber(minorItem.med)) {\n      children.push(\n        boxShapesHelper.horizontalLine({\n          item: minorItem,\n          key: 'median',\n          position: minorItem.med,\n          width: boxWidth,\n          boxCenter,\n          rendWidth,\n          rendHeight,\n          flipXY,\n        })\n      );\n    }\n  }\n\n  function addWhisker() {\n    /* WHISKERS */\n    if (minorItem.whisker) {\n      const whiskerWidth = boxWidth * minorItem.whisker.width;\n\n      if (isNumber(minorItem.min)) {\n        children.push(\n          boxShapesHelper.horizontalLine({\n            item: minorItem,\n            key: 'whisker',\n            position: minorItem.min,\n            width: whiskerWidth,\n            boxCenter,\n            rendWidth,\n            rendHeight,\n            flipXY,\n          })\n        );\n      }\n\n      if (isNumber(minorItem.max)) {\n        children.push(\n          boxShapesHelper.horizontalLine({\n            item: minorItem,\n            key: 'whisker',\n            position: minorItem.max,\n            width: whiskerWidth,\n            boxCenter,\n            rendWidth,\n            rendHeight,\n            flipXY,\n          })\n        );\n      }\n    }\n  }\n\n  function addOutOfBounds() {\n    /* OUT OF BOUNDS */\n    if (isLowerOutOfBounds) {\n      children.push(\n        boxShapesHelper.oob({\n          item: minorItem,\n          value: 0,\n          boxCenter,\n          rendWidth,\n          rendHeight,\n          flipXY,\n          symbol,\n        })\n      );\n    } else if (isHigherOutOfBounds) {\n      children.push(\n        boxShapesHelper.oob({\n          item: minorItem,\n          value: 1,\n          boxCenter,\n          rendWidth,\n          rendHeight,\n          flipXY,\n          symbol,\n        })\n      );\n    }\n  }\n\n  const addMarkerList = {\n    box: addBox,\n    line: addLine,\n    median: addMedian,\n    whisker: addWhisker,\n  };\n\n  function checkOutOfBounds() {\n    let value;\n    let max = -Number.MAX_VALUE;\n    let min = Number.MAX_VALUE;\n    for (let n = 0; n < numMinorProps; n++) {\n      value = minorItem[minorProps[n]];\n      if (isNumber(value)) {\n        if (max < value) {\n          max = value;\n        }\n        if (min > value) {\n          min = value;\n        }\n      }\n    }\n    isLowerOutOfBounds = max < 0 && max !== -Number.MAX_VALUE;\n    isHigherOutOfBounds = min > 1 && min !== Number.MAX_VALUE;\n    isOutOfBounds = isLowerOutOfBounds || isHigherOutOfBounds;\n  }\n\n  for (let i = 0, len = majorItems.length; i < len; i++) {\n    children = [];\n    major = null;\n    const majorItem = majorItems[i];\n    const d = majorItem.data;\n\n    let majorVal = null;\n    let majorEndVal = null;\n\n    if (typeof majorSettings.binStart !== 'undefined') {\n      // if start and end is defined\n      majorVal = majorItem.binStart;\n      majorEndVal = majorItem.binEnd;\n      major = majorSettings.binStart.scale;\n    } else {\n      major = majorSettings.major.scale;\n      majorVal = major ? majorItem.major : 0;\n    }\n\n    let bandwidth = 0;\n    if (!major) {\n      bandwidth = 1;\n    } else if (major.bandwidth) {\n      bandwidth = major.bandwidth();\n      majorVal -= bandwidth / 2;\n    } else {\n      bandwidth = majorEndVal - majorVal;\n    }\n\n    minorItem = extend(\n      {},\n      {\n        major: majorVal,\n        majorEnd: majorEndVal,\n      },\n      resolved.minor.items[i]\n    );\n\n    for (let j = 0; j < numKeys; j++) {\n      minorItem[keys[j]] = resolved[keys[j]].items[i];\n    }\n\n    boxWidth = boxShapesHelper.getBoxWidth(bandwidth, minorItem, maxMajorWidth);\n    boxPadding = (bandwidth - boxWidth) / 2;\n    boxCenter = boxPadding + minorItem.major + boxWidth / 2;\n\n    checkOutOfBounds();\n\n    if (!isOutOfBounds) {\n      for (let k = 0; k < numNonOobKeys; k++) {\n        if (minorItem[nonOobKeys[k]] && minorItem[nonOobKeys[k]].show === false) {\n          continue;\n        }\n        addMarkerList[nonOobKeys[k]]();\n      }\n    } else if (minorItem.oob) {\n      addOutOfBounds();\n    }\n\n    const container = {\n      type: 'container',\n      data: d,\n      collider: { type: 'bounds' },\n      children,\n    };\n\n    output.push(container);\n  }\n\n  return output;\n}\n","import extend from 'extend';\nimport { notNumber } from '../../utils/is-number';\n\nconst DEFAULT_ERROR_SETTINGS = {\n  errorShape: {\n    shape: 'saltire',\n    width: 2,\n    size: 0.5,\n    fill: '#333',\n    stroke: '#333',\n    strokeWidth: 0,\n  },\n};\n\nconst PX_RX = /px$/;\n\n/**\n * Component settings\n * @typedef {object}\n * @alias ComponentPoint.settings\n */\nconst DEFAULT_DATA_SETTINGS = {\n  /** Type of shape\n   * @type {DatumString=} */\n  shape: 'circle',\n  /** Label\n   * @type {DatumString=} */\n  label: '',\n  /** Fill color\n   * @type {DatumString=} */\n  fill: '#333',\n  /** Stroke color\n   * @type {DatumString=} */\n  stroke: '#ccc',\n  /** Stroke dash array\n   * @type {DatumString=} */\n  strokeDasharray: '',\n  /** Stroke width\n   * @type {DatumNumber=} */\n  strokeWidth: 0,\n  /** Stroke line join\n   * @type {DatumString=} */\n  strokeLinejoin: 'miter',\n  /** Opacity of shape\n   * @type {DatumNumber=} */\n  opacity: 1,\n  /** Normalized x coordinate\n   * @type {DatumNumber=} */\n  x: 0.5,\n  /** Normalized y coordinate\n   * @type {DatumNumber=} */\n  y: 0.5,\n  /** Normalized size of shape\n   * @type {DatumNumber=} */\n  size: 1,\n  /** Whether or not to show the point\n   * @type {DatumBoolean=} */\n  show: true,\n};\n\n/**\n * @typedef {object}\n * @alias ComponentPoint.settings.sizeLimits\n */\nconst SIZE_LIMITS = {\n  /** Maximum size of shape, in pixels\n   * @type {number=} */\n  maxPx: 10000,\n  /** Minimum size of shape, in pixels\n   * @type {number=} */\n  minPx: 1,\n  /** Maximum size relative linear scale extent\n   * @type {number=} */\n  maxRelExtent: 0.1,\n  /** Minimum size relative linear scale extent\n   * @type {number=} */\n  minRelExtent: 0.01,\n  /** Maximum size relative discrete scale banwidth\n   * @type {number=} */\n  maxRelDiscrete: 1,\n  /** Minimum size relative discrete scale banwidth\n   * @type {number=} */\n  minRelDiscrete: 0.1,\n};\n\nfunction getPxSpaceFromScale(s, space) {\n  if (s && typeof s.bandwidth === 'function') {\n    // some kind of ordinal scale\n    return {\n      isBandwidth: true,\n      value: Math.max(1, s.bandwidth() * space),\n    };\n  }\n  return {\n    isBandwidth: false,\n    value: Math.max(1, space),\n  };\n}\n\nfunction getPointSizeLimits(x, y, width, height, limits) {\n  const xSpacePx = getPxSpaceFromScale(x ? x.scale : undefined, width, limits);\n  const ySpacePx = getPxSpaceFromScale(y ? y.scale : undefined, height, limits);\n  let maxSizePx = Math.min(\n    xSpacePx.value * limits[xSpacePx.isBandwidth ? 'maxRelDiscrete' : 'maxRelExtent'],\n    ySpacePx.value * limits[ySpacePx.isBandwidth ? 'maxRelDiscrete' : 'maxRelExtent']\n  );\n  let minSizePx = Math.min(\n    xSpacePx.value * limits[xSpacePx.isBandwidth ? 'minRelDiscrete' : 'minRelExtent'],\n    ySpacePx.value * limits[ySpacePx.isBandwidth ? 'minRelDiscrete' : 'minRelExtent']\n  );\n  const min = Math.max(1, Math.floor(minSizePx));\n  const max = Math.max(1, Math.floor(maxSizePx));\n  return {\n    min,\n    max,\n    maxGlobal: limits.maxPx,\n    minGlobal: limits.minPx,\n  };\n}\n\nfunction getType(s) {\n  let type = DEFAULT_DATA_SETTINGS.shape;\n  let props = {};\n  if (typeof s.shape === 'object' && typeof s.shape.type === 'string') {\n    type = s.shape.type;\n    props = s.shape;\n  } else if (typeof s.shape === 'string') {\n    type = s.shape;\n  }\n  type = type === 'rect' ? 'square' : type;\n\n  return [type, props];\n}\n\nfunction createDisplayPoints(dataPoints, { width, height }, pointSize, shapeFn) {\n  return dataPoints\n    .filter((p) => p.show !== false && !isNaN(p.x + p.y))\n    .map((p) => {\n      let s = p;\n      let size = PX_RX.test(p.size) ? parseInt(p.size, 10) : pointSize.min + s.size * (pointSize.max - pointSize.min);\n      if (notNumber(size)) {\n        s = DEFAULT_ERROR_SETTINGS.errorShape;\n        size = pointSize.min + s.size * (pointSize.max - pointSize.min);\n      }\n\n      const [type, typeProps] = getType(s);\n      const shapeSpec = {\n        ...typeProps,\n        type,\n        label: p.label,\n        x: p.x * width,\n        y: p.y * height,\n        fill: s.fill,\n        size: Math.min(pointSize.maxGlobal, Math.max(pointSize.minGlobal, size)),\n        stroke: s.stroke,\n        strokeWidth: s.strokeWidth,\n        strokeDasharray: s.strokeDasharray,\n        opacity: s.opacity,\n      };\n      if (s === p.errorShape) {\n        shapeSpec.width = s.width;\n      }\n      const shape = shapeFn(shapeSpec);\n\n      shape.data = p.data;\n      return shape;\n    });\n}\n\nconst component = {\n  require: ['chart', 'resolver', 'symbol'],\n  defaultSettings: {\n    settings: {},\n    data: {},\n    animations: {\n      enabled: false,\n      trackBy: (node) => node.data.value,\n    },\n    style: {\n      item: '$shape',\n    },\n  },\n  render({ data }) {\n    const resolved = this.resolver.resolve({\n      data,\n      defaults: extend({}, DEFAULT_DATA_SETTINGS, this.style.item),\n      settings: this.settings.settings,\n      scaled: {\n        x: this.rect.width,\n        y: this.rect.height,\n      },\n    });\n    const { width, height } = this.rect;\n    const limits = extend({}, SIZE_LIMITS, this.settings.settings.sizeLimits);\n    const points = resolved.items;\n    const pointSize = getPointSizeLimits(resolved.settings.x, resolved.settings.y, width, height, limits);\n    return createDisplayPoints(points, this.rect, pointSize, this.settings.shapeFn || this.symbol);\n  },\n};\n\nexport default component;\n","import extend from 'extend';\nimport { pie, arc } from 'd3-shape';\n\n/**\n * Component settings\n * @typedef {object}\n * @alias ComponentPie.settings\n */\nconst DEFAULT_DATA_SETTINGS = {\n  /** Start angle of the pie, in radians\n   * @type {number=} */\n  startAngle: 0,\n  /** End angle of the pie, in radians\n   * @type {number=} */\n  endAngle: 2 * Math.PI,\n  /**\n   * @typedef {object}\n   */\n  slice: {\n    label: '',\n    /** Absolute value of the slice's arc length\n     * @type {number=} */\n    arc: 1,\n    /** Visibility of the slice\n     * @type {boolean=} */\n    show: true,\n    /** Fill color of the slice\n     * @type {string=} */\n    fill: '#333',\n    /** Stroke color of the slice\n     * @type {string=} */\n    stroke: '#ccc',\n    /** Stroke width of the slice\n     * @type {number=} */\n    strokeWidth: 1,\n    /** Stroke line join\n     * @type {string=} */\n    strokeLinejoin: 'round',\n    /** Opacity of the slice\n     * @type {number=} */\n    opacity: 1,\n    /** Inner radius of the slice\n     * @type {number=} */\n    innerRadius: 0,\n    /** Outer radius of the slice\n     * @type {number=} */\n    outerRadius: 0.8,\n    /** Corner radius of the slice, in pixels\n     * @type {number=} */\n    cornerRadius: 0,\n    /** Radial offset of the slice\n     * @type {number=} */\n    offset: 0,\n  },\n};\n\n/**\n * @typedef {object} ComponentPie\n * @extends ComponentSettings\n * @example\n * {\n *   type: 'pie',\n *   data: {\n *     extract: {\n *       field: 'Region',\n *       props: {\n *         num: { field: 'Population' }\n *       }\n *     }\n *   },\n *   settings: {\n *     startAngle: Math.PI / 2,\n *     endAngle: -Math.PI / 2,\n *     slice: {\n *       arc: { ref: 'num' },\n *       fill: 'green',\n *       stroke: 'red',\n *       strokeWidth: 2,\n *       strokeLinejoin: 'round',\n *       innerRadius: 0.6,\n *       outerRadius 0.8,\n *       opacity: 0.8,\n *       offset: 0.2\n *     }\n *   }\n * }\n */\n\nfunction offsetSlice(centroid, offset, outerRadius, innerRadius) {\n  let [vx, vy] = centroid;\n  const vlen = Math.sqrt(vx * vx + vy * vy);\n  vx /= vlen;\n  vy /= vlen;\n  const diff = outerRadius - innerRadius;\n  return { x: vx * offset * diff, y: vy * offset * diff };\n}\n\nfunction createDisplayPies(arcData, { x, y, width, height }, slices, sum) {\n  const arcGen = arc();\n  const center = { x: x + width / 2, y: y + height / 2 };\n  const innerRadius = Math.min(width, height) / 2;\n  const outerRadius = Math.min(width, height) / 2;\n  const cornerRadius = outerRadius / 100;\n  return arcData.map((a, i) => {\n    const slice = slices[i];\n    slice.type = 'path';\n    const or = outerRadius * slice.outerRadius;\n    const ir = innerRadius * slice.innerRadius;\n    arcGen.innerRadius(ir);\n    arcGen.outerRadius(or);\n    arcGen.cornerRadius(cornerRadius * slice.cornerRadius);\n    slice.d = arcGen(a);\n    const centroid = arcGen.centroid(a);\n    const offset = slice.offset ? offsetSlice(centroid, slice.offset, or, ir) : { x: 0, y: 0 };\n    slice.transform = `translate(${offset.x}, ${offset.y}) translate(${center.x}, ${center.y})`;\n    slice.desc = {\n      share: a.value / sum,\n      slice: {\n        start: a.startAngle,\n        end: a.endAngle,\n        innerRadius: ir,\n        outerRadius: or,\n        offset: { x: center.x + offset.x, y: center.y + offset.y },\n      },\n    };\n\n    return slice;\n  });\n}\n\nexport function arcValue(stngs, item) {\n  if (stngs.slice && 'arc' in stngs.slice) {\n    return item.arc;\n  }\n  return item.data.value;\n}\n\nconst pieComponent = {\n  require: ['chart', 'resolver'],\n  defaultSettings: {\n    settings: {\n      startAngle: 0,\n      endAngle: 2 * Math.PI,\n      padAngle: 0,\n      slice: {},\n    },\n    style: {\n      slice: '$shape',\n    },\n    data: {},\n  },\n  render({ data }) {\n    const arcValues = [];\n    const slices = [];\n    const stngs = this.settings.settings;\n    const { items } = this.resolver.resolve({\n      data,\n      defaults: extend({}, DEFAULT_DATA_SETTINGS.slice, this.style.slice),\n      settings: stngs.slice,\n    });\n\n    let sum = 0;\n    for (let i = 0, len = items.length; i < len; i++) {\n      const val = arcValue(stngs, items[i]);\n      if (val > 0 && items[i].outerRadius >= items[i].innerRadius) {\n        arcValues.push(val);\n        slices.push(items[i]);\n        sum += val;\n      }\n    }\n\n    const pieGen = pie().sortValues(null);\n    pieGen.startAngle(stngs.startAngle);\n    pieGen.endAngle(stngs.endAngle);\n    pieGen.padAngle(stngs.padAngle);\n    const arcData = pieGen(arcValues);\n\n    return createDisplayPies(arcData, extend({}, this.rect, { x: 0, y: 0 }), slices, sum);\n  },\n};\n\nexport default pieComponent;\n","import constant from \"./constant.js\";\nimport descending from \"./descending.js\";\nimport identity from \"./identity.js\";\nimport {tau} from \"./math.js\";\n\nexport default function() {\n  var value = identity,\n      sortValues = descending,\n      sort = null,\n      startAngle = constant(0),\n      endAngle = constant(tau),\n      padAngle = constant(0);\n\n  function pie(data) {\n    var i,\n        n = data.length,\n        j,\n        k,\n        sum = 0,\n        index = new Array(n),\n        arcs = new Array(n),\n        a0 = +startAngle.apply(this, arguments),\n        da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)),\n        a1,\n        p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n        pa = p * (da < 0 ? -1 : 1),\n        v;\n\n    for (i = 0; i < n; ++i) {\n      if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n        sum += v;\n      }\n    }\n\n    // Optionally sort the arcs by previously-computed values or by data.\n    if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n    else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n    // Compute the arcs! They are stored in the original data's order.\n    for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n      j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n        data: data[j],\n        index: i,\n        value: v,\n        startAngle: a0,\n        endAngle: a1,\n        padAngle: p\n      };\n    }\n\n    return arcs;\n  }\n\n  pie.value = function(_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), pie) : value;\n  };\n\n  pie.sortValues = function(_) {\n    return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n  };\n\n  pie.sort = function(_) {\n    return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n  };\n\n  pie.startAngle = function(_) {\n    return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : startAngle;\n  };\n\n  pie.endAngle = function(_) {\n    return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : endAngle;\n  };\n\n  pie.padAngle = function(_) {\n    return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), pie) : padAngle;\n  };\n\n  return pie;\n}\n","/**\n * Create a crispifier\n * @ignore\n *\n * @param  {Object} [crispMap] Optional crispmap if you need custom crisping.\n * @return {Function}          crispItem function\n *\n * @example\n * import { crispifierFactory } from \"core/crispifier\";\n *\n * let crispify = crispifierFactory(customCrispMap);\n *\n * // For a single item\n * crispify(myItem);\n *\n * // For multiple items\n * crispify.multiple(myArrayOfItems);\n */\nexport function crispifierFactory(crispMap) {\n  // Define the crispMap\n  if (crispMap === undefined) {\n    crispMap = {};\n\n    crispMap.line = {\n      append: ['x1', 'x2', 'y1', 'y2'],\n      round: [],\n      condition: (item) => item.x1 === item.x2 || item.y1 === item.y2,\n      conditionAppend: (item) => item.strokeWidth % 2 !== 0,\n    };\n\n    crispMap.rect = {\n      append: ['x', 'y'],\n      round: ['width', 'height'],\n      condition: () => true,\n      conditionAppend: (item) => item.strokeWidth % 2 !== 0,\n    };\n  }\n\n  // Re-map the crispmap\n  Object.keys(crispMap).forEach((type) => {\n    const self = crispMap[type];\n\n    self.items = [];\n\n    self.append.forEach((toAppend) => {\n      self.items.push({\n        key: toAppend,\n        type: 'append',\n      });\n    });\n\n    self.round.forEach((toAppend) => {\n      self.items.push({\n        key: toAppend,\n        type: 'round',\n      });\n    });\n  });\n\n  /**\n   * Crispify a single item\n   * @ignore\n   * @param  {Object} item  Item with renderer variables such as X, Y, and type.\n   * @return {Undefined}    Returns nothing, modifies the original item instead\n   */\n  function crispItem(item) {\n    if (crispMap[item.type] && crispMap[item.type].condition(item)) {\n      const self = crispMap[item.type];\n      const doAppend = self.conditionAppend === undefined || self.conditionAppend(item);\n\n      self.items.forEach((i) => {\n        const rounded = Math.round(item[i.key]);\n        const diff = item[i.key] - rounded;\n        item[i.key] = rounded;\n\n        if (doAppend && i.type === 'append') {\n          if (diff > 0) {\n            item[i.key] += 0.5;\n          } else {\n            item[i.key] -= 0.5;\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * Crispify multiple items\n   * @ignore\n   *\n   * @param  {Array} items  Array of objects to crispify\n   * @return {Undefined}    Returns nothing, modifies the original item instead\n   */\n  crispItem.multiple = (items) => items.forEach((item) => crispItem(item));\n\n  return crispItem;\n}\n\nconst crispifier = crispifierFactory();\n\nexport default crispifier;\n","import crispify from './crispifier';\n\nclass Transposer {\n  /**\n   * @private\n   */\n  constructor(...items) {\n    this.reset();\n\n    this.push(...items);\n  }\n\n  /**\n   * Evaluate a key for a transposed coordinate\n   *\n   * @param  {String} key   Key\n   * @return {String}         Actual key\n   */\n  static evaluateKey(key, flipXY) {\n    if (flipXY) {\n      const firstChar = key.substring(0, 1);\n      const rest = key.substring(1);\n\n      if (firstChar === 'x') {\n        return `y${rest}`;\n      }\n      if (firstChar === 'y') {\n        return `x${rest}`;\n      }\n      if (key === 'cx') {\n        return 'cy';\n      }\n      if (key === 'cy') {\n        return 'cx';\n      }\n      if (key === 'width') {\n        return 'height';\n      }\n      if (key === 'height') {\n        return 'width';\n      }\n    }\n\n    return key;\n  }\n\n  /**\n   * Transpose a coordinate according to this.flipXY and\n   * the available rendering area\n   *\n   * @param  {String} key        The key of the coordinate to transpose\n   * @param  {Number} coordinate The coordinate\n   * @return {Number}            The actual location of the coordinate\n   */\n  transposeCoordinate(key, coordinate, flipXY) {\n    if (typeof coordinate === 'number' && isFinite(coordinate)) {\n      const firstChar = key.substring(0, 1);\n\n      if (firstChar === 'x' || key === 'cx') {\n        return coordinate * this.width;\n      }\n      if (key === 'width') {\n        return coordinate * this.width;\n      }\n      if (key === 'r') {\n        return coordinate * (!flipXY ? this.width : this.height);\n      }\n      if (firstChar === 'y' || key === 'cy') {\n        return coordinate * this.height;\n      }\n      if (key === 'height') {\n        return coordinate * this.height;\n      }\n    }\n\n    return coordinate;\n  }\n\n  /**\n   * Push an item into the storage of the transposer\n   *\n   * @param  {Object} items An item to be drawed\n   * @return {Object}       Can be chained\n   */\n  push(...items) {\n    this.storage.push(...items);\n    return this;\n  }\n\n  processItem(item) {\n    let newItem = {};\n    const flipXY = typeof item.flipXY !== 'undefined' ? item.flipXY : this.flipXY;\n    const crisp = typeof item.crisp !== 'undefined' ? item.crisp : this.crisp;\n\n    if (item.fn && typeof item.fn === 'function') {\n      let width = flipXY ? this.height : this.width;\n      let height = flipXY ? this.width : this.height;\n\n      item = item.fn({ width, height, flipXY });\n\n      const objectKeys = Object.keys(item);\n\n      for (let ki = 0, kl = objectKeys.length; ki < kl; ki++) {\n        let key = objectKeys[ki];\n        const nkey = Transposer.evaluateKey(key, flipXY);\n        newItem[nkey] = item[key];\n      }\n    } else {\n      const objectKeys = Object.keys(item);\n\n      for (let ki = 0, kl = objectKeys.length; ki < kl; ki++) {\n        let key = objectKeys[ki];\n        const nkey = Transposer.evaluateKey(key, flipXY);\n        const nval = this.transposeCoordinate(nkey, item[key], flipXY);\n        newItem[nkey] = nval;\n      }\n    }\n\n    if (crisp) {\n      crispify(newItem);\n    }\n\n    return newItem;\n  }\n\n  /**\n   * Get the output of the transposer\n   *\n   * @return {Array}   Array of objects\n   */\n  output() {\n    let items = [];\n\n    for (let i = 0, l = this.storage.length; i < l; i++) {\n      let newItem = this.processItem(this.storage[i]);\n\n      items.push(newItem);\n    }\n\n    return items;\n  }\n\n  /**\n   * Reset the transposer\n   *\n   * @return {Undefined}  Does not return anything\n   */\n  reset() {\n    this.storage = [];\n    this.flipXY = false;\n    this.crisp = false;\n\n    this.width = 0;\n    this.height = 0;\n  }\n}\n\nexport function transposer(...items) {\n  return new Transposer(...items);\n}\n\nexport default Transposer;\n","import extend from 'extend';\nimport { transposer } from '../../transposer/transposer';\nimport { updateScaleSize } from '../../scales';\n\n/**\n * Generate array of lines (ticks) from scale\n *\n * @param {object} scale - A scale supplied by the chart\n * @param {object} settings - The settings object from the grid line component\n * @param {object} rect - The rect containing width and height to renderer in\n * @returns {array} - Returns an array of ticks\n * @ignore\n */\nfunction lineGen(scale, distance) {\n  if (!scale || !distance) {\n    return [];\n  }\n  return (scale.cachedTicks && scale.cachedTicks()) || scale.ticks({ distance });\n}\n\nconst gridLineComponent = {\n  created() {},\n\n  require: ['chart', 'renderer', 'resolver'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 0,\n    },\n    style: {\n      // Theming style\n      ticks: '$guide-line',\n      minorTicks: '$guide-line--minor',\n    },\n  },\n\n  beforeRender() {\n    this.blueprint = transposer();\n\n    this.blueprint.width = this.rect.width;\n    this.blueprint.height = this.rect.height;\n    this.blueprint.x = this.rect.x;\n    this.blueprint.y = this.rect.y;\n    this.blueprint.crisp = true;\n  },\n\n  render() {\n    // Setup scales\n    this.x = this.settings.x ? this.chart.scale(this.settings.x) : null;\n    this.y = this.settings.y ? this.chart.scale(this.settings.y) : null;\n    updateScaleSize(this, 'x', this.rect.width);\n    updateScaleSize(this, 'y', this.rect.height);\n\n    // Return an empty array to abort rendering when no scales are available to renderer\n    if (!this.x && !this.y) {\n      return [];\n    }\n\n    this.settings.ticks = extend({ show: true }, this.style.ticks, this.settings.ticks || {});\n    this.settings.minorTicks = extend({ show: false }, this.style.minorTicks, this.settings.minorTicks || {});\n\n    // Setup lines for X and Y\n    this.lines = {\n      x: [],\n      y: [],\n    };\n\n    // Use the lineGen function to generate appropriate ticks\n    this.lines.x = lineGen(this.x, this.rect.width);\n    this.lines.y = lineGen(this.y, this.rect.height);\n\n    // Set all Y lines to flipXY by default\n    // This makes the transposer flip them individually\n    this.lines.y = this.lines.y.map((i) => extend(i, { flipXY: true }));\n\n    let addTicks = ({ dir, isMinor }) => {\n      let items = this.lines[dir].filter((tick) => !!tick.isMinor === isMinor);\n      let settings = isMinor ? this.settings.minorTicks : this.settings.ticks;\n      let ticks = this.resolver.resolve({\n        settings,\n        data: {\n          items,\n          dir,\n        },\n      }).items;\n\n      ticks.forEach((style) => {\n        let p = style.data;\n\n        // If the style's show is falsy, don't renderer this item (to respect axis settings).\n        if (style.show) {\n          // Use the transposer to handle actual positioning\n          this.blueprint.push({\n            type: 'line',\n            x1: p.position,\n            y1: 0,\n            x2: p.position,\n            y2: 1,\n            stroke: style.stroke || 'black',\n            strokeWidth: typeof style.strokeWidth !== 'undefined' ? style.strokeWidth : 1,\n            strokeDasharray: typeof style.strokeDasharray !== 'undefined' ? style.strokeDasharray : undefined,\n            flipXY: p.flipXY || false, // This flips individual points (Y-lines)\n          });\n        }\n      });\n    };\n\n    addTicks({ dir: 'x', isMinor: false });\n    addTicks({ dir: 'x', isMinor: true });\n    addTicks({ dir: 'y', isMinor: false });\n    addTicks({ dir: 'y', isMinor: true });\n\n    return this.blueprint.output();\n  },\n};\n\nexport default gridLineComponent;\n","/**\n * Return a D property for a SVG path to get a direction marker\n *\n * @param {number} x - X coordinate\n * @param {number} y - Y coordinate\n * @param {number} r - Radius\n * @param {string} [d='bottom'] - Direction\n * @returns {string} - Finished D property\n * @ignore\n */\nexport function directionMarker(x, y, r, d = 'bottom') {\n  r *= 0.8;\n  if (d === 'left' || d === 'right') {\n    let right = d === 'right';\n    return `\n      M ${x} ${y - r}\n      A ${r * 1.25} ${r * 1.25}, 0, 1, ${right ? 0 : 1}, ${x} ${y + r}\n      L ${right ? x + r : x - r} ${y} Z\n    `;\n  }\n  let bottom = d === 'bottom';\n  return `\n    M ${x - r} ${y}\n    A ${r * 1.25} ${r * 1.25}, 0, 1, ${bottom ? 1 : 0}, ${x + r} ${y}\n    L ${x} ${bottom ? y + r : y - r} Z\n  `;\n}\n\nfunction directionTriangle(x, y, r, d = 'bottom') {\n  r *= 0.75;\n  if (d === 'left' || d === 'right') {\n    let right = d === 'right';\n    x += right ? r * 1.5 : -(r * 1.5);\n    return `\n      M ${x} ${y - r}\n      L ${x} ${y + r}\n      L ${right ? x + r : x - r} ${y} Z\n    `;\n  }\n  let bottom = d === 'bottom';\n  y += bottom ? r * 1.5 : -(r * 1.5);\n  return `\n    M ${x - r} ${y}\n    L ${x + r} ${y}\n    L ${x} ${bottom ? y + r : y - r} Z\n  `;\n}\n\n/**\n * Handle out of bound shapes\n * Does not return anything, modifies \"items\" property instead (should be re-considered)\n *\n * @param {object} oob - Out of bounds object from parent\n * @param {object} settings - Settings object from parent\n * @param {object[]} items - Array of all items (for collision detection)\n * @ignore\n */\nexport function oobManager({ blueprint, oob, settings, items }) {\n  const oobKeys = Object.keys(oob);\n  let style = settings.style.oob || {};\n\n  for (let i = 0, len = oobKeys.length; i < len; i++) {\n    const key = oobKeys[i];\n    const value = oob[key];\n\n    if (value.length > 0) {\n      let position = key.charAt(1);\n      let flipXY = key.charAt(0) === 'y';\n\n      let xPadding = style.padding.x + style.width;\n      let yPadding = style.padding.y + style.width;\n      let direction = 'bottom';\n\n      if (flipXY) {\n        direction = position === '1' ? 'bottom' : 'top';\n      } else {\n        direction = position === '1' ? 'right' : 'left';\n      }\n\n      let indicator = blueprint.processItem({\n        fn: ({ width, height }) => {\n          /* eslint no-loop-func: 0 */\n          let x = position * width + (position === '1' ? -xPadding : xPadding);\n          let y = flipXY ? yPadding : height - yPadding;\n\n          if (style.type === 'arc') {\n            return {\n              type: 'path',\n              d: directionMarker(flipXY ? y : x, flipXY ? x : y, style.width, direction),\n              x,\n              y,\n              stroke: style.stroke,\n              fill: style.fill,\n              strokeWidth: style.strokeWidth || 0,\n            };\n          }\n\n          return {\n            type: 'circle',\n            cx: x,\n            cy: y,\n            r: style.width,\n            stroke: style.stroke,\n            fill: style.fill,\n            strokeWidth: style.strokeWidth || 0,\n            opacity: style.opacity,\n            data: value,\n          };\n        },\n        flipXY,\n      });\n\n      let x = indicator.cx || indicator.x;\n      let y = indicator.cy || indicator.y;\n\n      let text = {\n        type: 'text',\n        text: value.length || '',\n        x: x - style.width * 0.4,\n        y: y + style.width * 0.4,\n        fontFamily: style.text.fontFamily,\n        fontSize: `${style.width * 1.3}px`,\n        stroke: style.text.stroke,\n        fill: style.text.fill,\n        strokeWidth: style.text.strokeWidth || 0,\n        opacity: style.text.opacity,\n      };\n\n      let triangle = {\n        type: 'path',\n        d: directionTriangle(x, y, style.width, direction),\n        x,\n        y,\n        stroke: style.triangle.stroke,\n        fill: style.triangle.fill,\n        strokeWidth: style.triangle.strokeWidth || 0,\n        opacity: style.triangle.opacity,\n      };\n\n      items.push(indicator, text, triangle);\n    }\n  }\n}\n","import extend from 'extend';\nimport { testRectRect, testRectLine } from '../../math/narrow-phase-collision';\n\nexport function refLabelDefaultSettings() {\n  return {\n    fill: '#000',\n    fontFamily: 'Arial',\n    fontSize: '12px',\n    opacity: 1,\n    maxWidth: 1,\n    maxWidthPx: 9999,\n    padding: 5,\n    background: {\n      fill: '#fff',\n      stroke: 'transparent',\n      strokeWidth: 0,\n      opacity: 0.5,\n    },\n  };\n}\n\n/**\n * Converts a numerical OR string value to a normalized value\n *\n * @param {string|number} align -Description how to align (Numerical from 0-1 or 'top', 'left', 'center', 'middle', 'bottom' or 'right')\n * @returns {number} - Normalized value 0...1\n * @ignore\n */\nexport function alignmentToNumber(align) {\n  if (typeof align === 'undefined') {\n    return 0;\n  }\n  if (typeof align === 'number' && isFinite(align)) {\n    return align;\n  }\n  if (typeof align === 'string') {\n    switch (align) {\n      case 'center':\n      case 'middle':\n        return 0.5;\n      case 'bottom':\n      case 'right':\n        return 1;\n      case 'top':\n      case 'left':\n      default:\n        return 0;\n    }\n  }\n\n  return 0;\n}\n\n/**\n * Create line and label (if applicable)\n * Does not return anything, modifies \"items\" property instead (should be re-considered)\n *\n * @param {object} p - Current point\n * @param {object} style - Applicable line styling\n * @param {object} settings - Settings object derived from parent\n * @param {object[]} items - Array of all items (for collision detection)\n * @ignore\n */\nexport function createLineWithLabel({ chart, blueprint, renderer, p, settings, items }) {\n  let doesNotCollide = true;\n  let line = false;\n  let rect = false;\n  let label = false;\n  let value = false;\n  let style = extend(true, {}, settings.style.line, p.line || {});\n\n  // Use the transposer to handle actual positioning\n  line = blueprint.processItem({\n    type: 'line',\n    x1: p.position,\n    y1: 0,\n    x2: p.position,\n    y2: 1,\n    stroke: style.stroke || 'black',\n    strokeWidth: style.strokeWidth || 1,\n    strokeDasharray: style.strokeDasharray,\n    flipXY: p.flipXY || false, // This flips individual points (Y-lines)\n  });\n\n  if (p.label) {\n    const item = extend(true, refLabelDefaultSettings(), settings.style.label || {}, { fill: style.stroke }, p.label);\n    let formatter;\n    let measuredValue = {\n      width: 0,\n      height: 0,\n    };\n    let valueString = '';\n\n    if (typeof p.formatter === 'string') {\n      formatter = chart.formatter(p.formatter);\n    } else if (typeof p.formatter === 'object') {\n      formatter = chart.formatter(p.formatter);\n    } else if (typeof p.scale !== 'undefined' && p.scale.data) {\n      // TODO - Add support for array as source into formatter\n      const scaleData = p.scale.data() && p.scale.data().fields;\n      formatter = scaleData && scaleData[0] ? scaleData[0].formatter() : null;\n    }\n\n    if (p.label.showValue !== false) {\n      if (formatter) {\n        valueString = ` (${formatter(p.value)})`;\n      } else if (p.scale) {\n        valueString = ` (${p.value})`;\n      }\n    }\n\n    if (valueString) {\n      measuredValue = renderer.measureText({\n        text: valueString,\n        fontFamily: item.fontFamily,\n        fontSize: item.fontSize,\n      });\n    }\n\n    // Measure the label text\n    let measuredLabel = renderer.measureText({\n      text: item.text || '',\n      fontFamily: item.fontFamily,\n      fontSize: item.fontSize,\n    });\n\n    let measured = {\n      width: measuredLabel.width + measuredValue.width,\n      height: Math.max(measuredLabel.height, measuredValue.height),\n    };\n\n    let labelPadding = item.padding;\n\n    // let anchor = item.anchor === 'end' ? 'end' : 'start';\n\n    let align = alignmentToNumber(p.flipXY ? item.vAlign : item.align);\n    let vAlign = alignmentToNumber(p.flipXY ? item.align : item.vAlign);\n\n    let calcWidth = Math.min(1 + measured.width + labelPadding * 2, item.maxWidth * blueprint.width, item.maxWidthPx);\n    let calcHeight = measured.height + labelPadding * 2;\n\n    let rectWidth = p.flipXY ? calcHeight : calcWidth;\n    let rectHeight = p.flipXY ? calcWidth : calcHeight;\n\n    rect = blueprint.processItem({\n      fn: ({ width, height }) => {\n        let x = p.position * width - (p.flipXY ? calcHeight : calcWidth) * (1 - align);\n        x = p.flipXY ? x : Math.max(x, 0);\n        const y = Math.max(Math.abs(vAlign * height - rectHeight * vAlign), 0);\n        return {\n          type: 'rect',\n          x,\n          y,\n          width: p.flipXY ? rectWidth : Math.min(rectWidth, blueprint.width - x),\n          height: rectHeight,\n          stroke: item.background.stroke,\n          strokeWidth: item.background.strokeWidth,\n          fill: item.background.fill,\n          opacity: item.background.opacity,\n        };\n      },\n      flipXY: p.flipXY || false, // This flips individual points (Y-lines)\n    });\n\n    if (\n      rect.x < -1 ||\n      rect.x + rect.width > blueprint.width + 1 ||\n      rect.y < -1 ||\n      rect.y + rect.height > blueprint.height + 1\n    ) {\n      // do not create labels if out of bounds\n      rect = undefined;\n    } else {\n      // Labels are just basic objects attached to a corner of a rect,\n      // and this rect needs to already be processed\n      // so there is no blueprint.processItem required here\n      label = {\n        type: 'text',\n        text: item.text || '',\n        fill: item.fill,\n        opacity: item.opacity,\n        fontFamily: item.fontFamily,\n        fontSize: item.fontSize,\n        x: rect.x + labelPadding,\n        y: rect.y + rect.height / 2 + measured.height / 3,\n        maxWidth: rect.width - labelPadding * 2 - measuredValue.width,\n        anchor: 'start',\n      };\n\n      if (valueString) {\n        value = {\n          type: 'text',\n          text: valueString || '',\n          fill: item.fill,\n          opacity: item.opacity,\n          fontFamily: item.fontFamily,\n          fontSize: item.fontSize,\n          x: label.x + 3 + (rect.width - (measuredValue.width + labelPadding * 2)),\n          y: label.y,\n        };\n      }\n\n      // Detect collisions with other labels/rects or lines\n      for (let i = 0, len = items.length; i < len; i++) {\n        let curItem = items[i];\n\n        if (curItem.type === 'rect') {\n          // We only detect rects here, since rects are always behind labels,\n          // and we wouldn't want to measure text one more time\n          if (testRectRect(rect, curItem)) {\n            doesNotCollide = false;\n          }\n        } else if (curItem.type === 'line') {\n          // This will only collide when flipXY are the same for both objects,\n          // So it only collides on objects on the same \"axis\"\n          if (p.flipXY === curItem.flipXY && testRectLine(rect, curItem)) {\n            doesNotCollide = false;\n          }\n        }\n      }\n    }\n  }\n\n  // Always push the line,\n  // but this is done after collision detection,\n  // because otherwise it would collide with it's own line\n  items.push(line);\n\n  // Only push rect & label if we haven't collided and both are defined\n  if (doesNotCollide && rect && label) {\n    items.push(rect, label);\n    if (value) {\n      items.push(value);\n    }\n  }\n}\n","import extend from 'extend';\nimport { transposer } from '../../transposer/transposer';\nimport { oobManager } from './oob';\nimport { createLineWithLabel } from './lines-and-labels';\n\nfunction createOobData(line) {\n  const data = {\n    value: line.value,\n  };\n\n  if (line.label) {\n    data.label = line.label.text;\n  }\n\n  return data;\n}\n\nfunction filterUndefinedValue(line) {\n  const value = typeof line.value === 'function' ? line.value() : line.value;\n  return typeof value !== 'undefined';\n}\n\nfunction isInvert(scale) {\n  const range = scale.range();\n  return range?.length === 2 && range[0] > range[1];\n}\n\nfunction getPosition(scale, value) {\n  const min = scale.min();\n  const max = scale.max();\n  if (min === max) {\n    const invert = isInvert(scale);\n    if (value < min) {\n      return invert ? 2 : -1;\n    }\n    if (value > min) {\n      return invert ? -1 : 2;\n    }\n  }\n  return scale(value);\n}\n\n/**\n * Component settings\n * @typedef {object} ComponentRefLine.settings\n * @property {object} lines - X & Y Lines\n * @property {ComponentRefLine~Line[]} [lines.x=[]] - Reference lines along X axis\n * @property {ComponentRefLine~Line[]} [lines.y=[]] - Reference lines along Y axis\n */\n\n/**\n * @private\n * @typedef {object} ComponentRefLine.style\n * @property {refline-oob-style} [oob=ComponentRefLine.style.oob] - Style for out of bounds object (oob)\n * @property {ComponentRefLine~Line} [line=ComponentRefLine~Line] - Generic style for lines\n * @property {ComponentRefLine~LineLabel} [label=ComponentRefLine~LineLabel] - Generic style for labels\n */\n\n/**\n * @typedef {object} ComponentRefLine.style.oob\n * @property {boolean} [show=true] - Show out of bounds items\n * @property {string} [type=undefined] - EXPERIMENTAL:  Set this to 'arc' for an experimental out of bounds shape (only works with SVG)\n * @property {number} [width=10] - Width of the out of bounds object\n * @property {string} [fill='#1A1A1A'] - Fill color of the OOB object\n * @property {string} [stroke='transparent'] - Stroke of the OOB object\n * @property {number} [strokeWidth=0] - Stroke width of the OOB object\n * @property {number} [opacity=1] - Opacity of the OOB object\n * @property {ComponentRefLine~GenericText} [text=ComponentRefLine~GenericText] - Text configuration for out of bounds\n * @property {ComponentRefLine~GenericObject} [triangle=ComponentRefLine~GenericObject] - The triangle in OOB\n * @property {object} [padding] - Padding on X\n * @property {number} [padding.x=28] - Padding on X\n * @property {number} [padding.y=5] - Padding on X\n */\n\n/**\n * @typedef {object} ComponentRefLine~GenericText\n * @property {string} [text=''] - Text (if applicable)\n * @property {string} [fontSize='12px'] - Font size (if applicable)\n * @property {string} [fontFamily='Arial'] - Font family\n * @property {string} [fill='#fff'] - Fill color\n * @property {string} [stroke='transparent'] - Stroke\n * @property {number} [strokeWidth=0] - Stroke width\n * @property {string} [strokeDasharray] - Stroke dash array\n * @property {number} [opacity=1] - Opacity\n */\n\n/**\n * @typedef {object} ComponentRefLine~Line\n * @property {number|function} value - The value of the reference line. If a scale is specified, it is applied.\n * @property {string} [scale] - Scale to use (if undefined will use normalized value 0-1)\n * @property {ComponentRefLine~GenericObject} [line=ComponentRefLine~GenericObject] - The style of the line\n * @property {ComponentRefLine~LineLabel} [label=ComponentRefLine~LineLabel] - The label style of the line\n */\n\n/**\n * @typedef {object} ComponentRefLine~LineLabel\n * @property {number} padding=5 - Padding inside the label\n * @property {string} [text=''] - Text\n * @property {string} [fontSize='12px'] - Font size\n * @property {string} [fontFamily='Arial'] - Font family\n * @property {string} [stroke='transparent'] - Stroke\n * @property {number} [strokeWidth=0] - Stroke width\n * @property {number} [opacity=1] - Opacity\n * @property {number|string} [align=0] - Alignment property left to right (0 = left, 1 = right). Also supports string ('left', 'center', 'middle', 'right')\n * @property {number|string} [vAlign=0] - Alignment property top to bottom (0 = top, 1 = bottom). Also supports string ('top', 'center', 'middle', 'bottom')\n * @property {number} [maxWidth=1] - The maximum relative width to the width of the rendering area (see maxWidthPx as well)\n * @property {number} [maxWidthPx=9999] - The maximum width in pixels. Labels will be rendered with the maximum size of the smallest value of maxWidth and maxWidthPx size, so you may specify maxWidth 0.8 but maxWidthPx 100 and will never be over 100px and never over 80% of the renderable area\n * @property {ComponentRefLine~LineLabelBackground} [background=ComponentRefLine~LineLabelBackground] - The background style (rect behind text)\n * @property {boolean} [showValue=true] - Show value label\n */\n\n/**\n * @typedef {object} ComponentRefLine~LineLabelBackground\n * @property {string} [fill='#fff'] - Fill color\n * @property {string} [stroke='transparent'] - Stroke\n * @property {number} [strokeWidth=0] - Stroke width\n * @property {number} [opacity=0.5] - Opacity\n */\n\n/**\n * @typedef {object} ComponentRefLine~GenericObject\n * @property {string} [fill='#fff'] - Fill color\n * @property {string} [stroke='transparent'] - Stroke\n * @property {number} [strokeWidth=0] - Stroke width\n * @property {number} [opacity=1] - Opacity\n */\n\nconst refLineComponent = {\n  require: ['chart', 'renderer'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 0,\n    },\n    style: {\n      oob: {\n        show: true,\n        width: 10,\n        fill: '#1A1A1A',\n        stroke: 'transparent',\n        strokeWidth: 0,\n        opacity: 1,\n        text: {\n          fontFamily: 'Arial',\n          stroke: 'transparent',\n          fill: '#fff',\n          strokeWidth: 0,\n          opacity: 1,\n        },\n        triangle: {\n          fill: '#4D4D4D',\n          stroke: 'transparent',\n          strokeWidth: 0,\n          opacity: 1,\n        },\n        padding: {\n          x: 28,\n          y: 5,\n        },\n      },\n      line: {\n        stroke: '#000',\n      },\n      label: {\n        strokeWidth: 0,\n      },\n    },\n  },\n\n  preferredSize() {\n    return 30;\n  },\n\n  beforeRender() {\n    this.blueprint = transposer();\n\n    this.blueprint.width = this.rect.width;\n    this.blueprint.height = this.rect.height;\n    this.blueprint.x = this.rect.x;\n    this.blueprint.y = this.rect.y;\n    this.blueprint.crisp = true;\n  },\n\n  render() {\n    let settings = this.settings;\n\n    // Setup lines for X and Y\n    this.lines = {\n      x: [],\n      y: [],\n    };\n\n    this.lines.x = (settings.lines && settings.lines.x) || [];\n    this.lines.y = (settings.lines && settings.lines.y) || [];\n\n    if (this.lines.x.length === 0 && this.lines.y.length === 0) {\n      return [];\n    }\n\n    const oob = {\n      x0: [],\n      x1: [],\n      y0: [],\n      y1: [],\n    };\n\n    // Convert a value to an actual position using the scale\n    this.lines.x = this.lines.x.filter(filterUndefinedValue).map((line) => {\n      if (typeof line.value === 'function') {\n        line.value = line.value();\n      }\n\n      if (line.scale) {\n        let scale = this.chart.scale(line.scale);\n        const position = getPosition(scale, line.value);\n        return extend(line, { scale, position });\n      }\n\n      return extend(line, { position: line.value });\n    });\n    // Set all Y lines to flipXY by default\n    // This makes the transposer flip them individually\n    this.lines.y = this.lines.y.filter(filterUndefinedValue).map((line) => {\n      if (typeof line.value === 'function') {\n        line.value = line.value();\n      }\n\n      if (line.scale) {\n        let scale = this.chart.scale(line.scale);\n        const position = getPosition(scale, line.value);\n        return extend(line, { scale, position, flipXY: true });\n      }\n\n      return extend(line, { position: line.value, flipXY: true });\n    });\n\n    // Move out of bounds lines (OOB) to separate rendering\n    this.lines.x = this.lines.x.filter((line) => {\n      if (line.position < 0 || line.position > 1) {\n        oob[`x${line.position > 1 ? 1 : 0}`].push(createOobData(line));\n        return false;\n      }\n      return true;\n    });\n\n    this.lines.y = this.lines.y.filter((line) => {\n      if (line.position < 0 || line.position > 1) {\n        oob[`y${line.position > 1 ? 1 : 0}`].push(createOobData(line));\n        return false;\n      }\n      return true;\n    });\n\n    let items = [];\n\n    // Loop through all X and Y lines\n    [...this.lines.x, ...this.lines.y].forEach((p) => {\n      let show = p.show === true || typeof p.show === 'undefined';\n\n      if (show) {\n        // Create line with labels\n        createLineWithLabel({\n          chart: this.chart,\n          blueprint: this.blueprint,\n          renderer: this.renderer,\n          p,\n          settings,\n          items,\n        });\n      }\n    });\n\n    // Handle out of bounds\n    if (settings.style.oob.show) {\n      oobManager({\n        blueprint: this.blueprint,\n        oob,\n        settings,\n        items,\n      });\n    }\n\n    return items;\n  },\n};\n\nexport default refLineComponent;\n","import extend from 'extend';\n\nfunction appendStyle(struct, buildOpts) {\n  extend(struct, buildOpts.style);\n  const halfWidth = struct.strokeWidth / 2;\n\n  if (buildOpts.align === 'top') {\n    struct.y1 -= halfWidth;\n    struct.y2 -= halfWidth;\n  } else if (buildOpts.align === 'bottom') {\n    struct.y1 += halfWidth;\n    struct.y2 += halfWidth;\n  } else if (buildOpts.align === 'left') {\n    struct.x1 -= halfWidth;\n    struct.x2 -= halfWidth;\n  } else if (buildOpts.align === 'right') {\n    struct.x1 += halfWidth;\n    struct.x2 += halfWidth;\n  }\n}\n\nexport default function buildLine(buildOpts) {\n  const struct = {\n    type: 'line',\n    x1: 0,\n    x2: 0,\n    y1: 0,\n    y2: 0,\n    collider: {\n      type: null,\n    },\n  };\n\n  if (buildOpts.align === 'top' || buildOpts.align === 'bottom') {\n    struct.x1 = buildOpts.innerRect.x - buildOpts.outerRect.x;\n    struct.x2 = buildOpts.innerRect.width + buildOpts.innerRect.x;\n    struct.y1 = struct.y2 =\n      buildOpts.align === 'top' ? buildOpts.innerRect.height - buildOpts.padding : buildOpts.padding;\n  } else {\n    struct.x1 = struct.x2 =\n      buildOpts.align === 'left' ? buildOpts.innerRect.width - buildOpts.padding : buildOpts.padding;\n    struct.y1 = buildOpts.innerRect.y - buildOpts.outerRect.y;\n    struct.y2 = buildOpts.innerRect.height + buildOpts.innerRect.y;\n  }\n\n  appendStyle(struct, buildOpts);\n\n  return struct;\n}\n","import { rotate as rotateVector } from '../../math/vector';\n\nfunction checkText(text) {\n  return typeof text === 'string' || typeof text === 'number' ? text : '-';\n}\n\nfunction appendStyle(struct, buildOpts) {\n  ['fill', 'fontSize', 'fontFamily'].forEach((style) => {\n    struct[style] = buildOpts.style[style];\n  });\n}\n\nfunction clampEnds(struct, buildOpts) {\n  if (buildOpts.tilted || buildOpts.stepSize) {\n    return;\n  }\n\n  if (buildOpts.align === 'top' || buildOpts.align === 'bottom') {\n    const leftBoundary = 0;\n    const rightBoundary = buildOpts.outerRect.width;\n    const textWidth = Math.min(buildOpts.maxWidth / 2, buildOpts.textRect.width / 2);\n    const leftTextBoundary = struct.x - textWidth;\n    const rightTextBoundary = struct.x + textWidth;\n    if (leftTextBoundary < leftBoundary) {\n      struct.anchor = 'start';\n      struct.x = buildOpts.innerRect.x - buildOpts.outerRect.x;\n    } else if (rightTextBoundary > rightBoundary) {\n      struct.anchor = 'end';\n      struct.x = buildOpts.innerRect.width + buildOpts.innerRect.x;\n    }\n  } else {\n    const topBoundary = 0;\n    const bottomBoundary = buildOpts.outerRect.height;\n    const textHeight = buildOpts.maxHeight / 2;\n    const topTextBoundary = struct.y - textHeight;\n    const bottomTextBoundary = struct.y + textHeight;\n    if (topTextBoundary < topBoundary) {\n      struct.y = buildOpts.innerRect.y - buildOpts.outerRect.y;\n      struct.baseline = 'text-before-edge';\n    } else if (bottomTextBoundary > bottomBoundary) {\n      struct.y = buildOpts.innerRect.height + (buildOpts.innerRect.y - buildOpts.outerRect.y);\n      struct.baseline = 'text-after-edge';\n    }\n  }\n}\n\nfunction appendPadding(struct, buildOpts) {\n  if (buildOpts.align === 'top') {\n    struct.y -= buildOpts.padding;\n  } else if (buildOpts.align === 'bottom') {\n    struct.y += buildOpts.padding + buildOpts.maxHeight;\n  } else if (buildOpts.align === 'left') {\n    struct.x -= buildOpts.padding;\n  } else if (buildOpts.align === 'right') {\n    struct.x += buildOpts.padding;\n  }\n}\n\nfunction appendTilting(struct, buildOpts) {\n  if (buildOpts.tilted) {\n    const r = -buildOpts.angle;\n    const radians = r * (Math.PI / 180);\n\n    if (buildOpts.align === 'bottom') {\n      struct.x -= (buildOpts.maxHeight * Math.sin(radians)) / 2;\n      struct.y -= buildOpts.maxHeight;\n      struct.y += (buildOpts.maxHeight * Math.cos(radians)) / 2;\n    } else {\n      struct.x -= (buildOpts.maxHeight * Math.sin(radians)) / 3;\n    }\n\n    struct.transform = `rotate(${r}, ${struct.x}, ${struct.y})`;\n    struct.anchor = (buildOpts.align === 'bottom') === buildOpts.angle < 0 ? 'start' : 'end';\n\n    // adjustForEnds\n    const textWidth = Math.cos(radians) * buildOpts.maxWidth;\n    if ((buildOpts.align === 'bottom') === buildOpts.angle < 0) {\n      // right\n      const rightBoundary = buildOpts.outerRect.width - buildOpts.paddingEnd;\n      const rightTextBoundary = struct.x + textWidth;\n      if (rightTextBoundary > rightBoundary) {\n        struct.maxWidth = (rightBoundary - struct.x - 10) / Math.cos(radians);\n      }\n    } else {\n      // left\n      const leftBoundary = buildOpts.paddingEnd;\n      const leftTextBoundary = struct.x - textWidth;\n      if (leftTextBoundary < leftBoundary) {\n        struct.maxWidth = (struct.x - leftBoundary - 10) / Math.cos(radians);\n      }\n    }\n  }\n}\n\nfunction bandwidthCollider(tick, struct, buildOpts) {\n  if (buildOpts.align === 'bottom' || buildOpts.align === 'top') {\n    const tickCenter = tick.position * buildOpts.innerRect.width;\n    const leftBoundary = tickCenter + (buildOpts.innerRect.x - buildOpts.outerRect.x - buildOpts.stepSize / 2);\n    struct.collider = {\n      type: 'rect',\n      x: leftBoundary,\n      y: 0,\n      width: leftBoundary < 0 ? buildOpts.stepSize + leftBoundary : buildOpts.stepSize, // Adjust collider so that it doesnt extend onto neighbor collider\n      height: buildOpts.innerRect.height,\n    };\n  } else {\n    const tickCenter = tick.position * buildOpts.innerRect.height;\n    const topBoundary = tickCenter + (buildOpts.innerRect.y - buildOpts.outerRect.y - buildOpts.stepSize / 2);\n    struct.collider = {\n      type: 'rect',\n      x: 0,\n      y: topBoundary,\n      width: buildOpts.innerRect.width,\n      height: topBoundary < 0 ? buildOpts.stepSize + topBoundary : buildOpts.stepSize, // Adjust collider so that it doesnt extend onto neighbor collider\n    };\n  }\n\n  // Clip edges of the collider, should not extend beyoned the outerRect\n  const collider = struct.collider;\n  collider.x = Math.max(collider.x, 0);\n  collider.y = Math.max(collider.y, 0);\n  const widthClip = collider.x + collider.width - (buildOpts.outerRect.x + buildOpts.outerRect.width);\n  collider.width = widthClip > 0 ? collider.width - widthClip : collider.width;\n  const heightClip = collider.y + collider.height - (buildOpts.outerRect.y + buildOpts.outerRect.height);\n  collider.height = heightClip > 0 ? collider.height - heightClip : collider.height;\n}\n\nfunction boundsCollider(tick, struct) {\n  struct.collider = {\n    type: 'polygon',\n    vertices: [\n      { x: struct.boundingRect.x, y: struct.boundingRect.y },\n      { x: struct.boundingRect.x + struct.boundingRect.width, y: struct.boundingRect.y },\n      { x: struct.boundingRect.x + struct.boundingRect.width, y: struct.boundingRect.y + struct.boundingRect.height },\n      { x: struct.boundingRect.x, y: struct.boundingRect.y + struct.boundingRect.height },\n    ],\n  };\n}\n\nfunction tiltedCollider(tick, struct, buildOpts) {\n  const radians = buildOpts.angle * (Math.PI / 180);\n  const halfWidth = Math.max(buildOpts.stepSize / 2, struct.boundingRect.height / 2); // Handle if bandwidth is zero\n  const startAnchor = struct.anchor === 'start';\n  const em = struct.anchor === 'end' && radians < 0;\n  const sp = struct.anchor === 'start' && radians >= 0;\n  const y = struct.boundingRect.y + (sp || em ? struct.boundingRect.height : 0);\n  // Generate starting points at bandwidth boundaries\n  const points = [\n    { x: struct.x - halfWidth, y },\n    { x: struct.x + halfWidth, y },\n  ].map((p) => rotateVector(p, radians, { x: struct.x, y: struct.y })); // Rotate around center point to counteract labels rotation\n\n  // Append points to wrap polygon around label\n  const margin = 10; // extend slightly to handle single char labels better\n  const leftPoint = {\n    x: startAnchor ? struct.boundingRect.x + struct.boundingRect.width + margin : struct.boundingRect.x - margin,\n    y: struct.boundingRect.y + struct.boundingRect.height,\n  };\n\n  const rightPoint = {\n    x: startAnchor ? struct.boundingRect.x + struct.boundingRect.width + margin : struct.boundingRect.x - margin,\n    y: struct.boundingRect.y,\n  };\n\n  const orderedPoints = radians >= 0 ? [leftPoint, rightPoint] : [rightPoint, leftPoint];\n  points.push(...orderedPoints);\n\n  struct.collider = {\n    type: 'polygon',\n    vertices: points,\n  };\n}\n\nfunction appendCollider(tick, struct, buildOpts) {\n  if (buildOpts.layered || !buildOpts.stepSize) {\n    boundsCollider(tick, struct);\n  } else if (buildOpts.tilted) {\n    tiltedCollider(tick, struct, buildOpts);\n  } else {\n    bandwidthCollider(tick, struct, buildOpts);\n  }\n}\n\nfunction appendBounds(struct, buildOpts) {\n  struct.boundingRect = buildOpts.textBounds(struct);\n}\n\nfunction wiggle(buildOpts, isVertical) {\n  const a = isNaN(buildOpts.style.align) ? 0.5 : Math.min(Math.max(buildOpts.style.align, 0), 1);\n  let w = 0;\n  if (buildOpts.tilted) {\n    w = buildOpts.stepSize * a;\n  } else {\n    const size = isVertical ? buildOpts.textRect.height : buildOpts.textRect.width;\n    w = Math.max(0, buildOpts.stepSize - size) * a;\n  }\n\n  return w;\n}\n\nexport default function buildNode(tick, buildOpts) {\n  const struct = {\n    type: 'text',\n    text: checkText(tick.label),\n    x: 0,\n    y: 0,\n    maxWidth: buildOpts.maxWidth,\n    maxHeight: buildOpts.maxHeight,\n  };\n\n  if (buildOpts.align === 'top' || buildOpts.align === 'bottom') {\n    struct.x =\n      tick.start * buildOpts.innerRect.width +\n      (buildOpts.innerRect.x - buildOpts.outerRect.x) +\n      wiggle(buildOpts, false);\n    struct.y = buildOpts.align === 'top' ? buildOpts.innerRect.height : 0;\n    struct.anchor = buildOpts.stepSize ? 'start' : 'middle';\n\n    struct.x += isNaN(buildOpts.style.offset) ? 0 : +buildOpts.style.offset;\n  } else {\n    struct.y =\n      tick.start * buildOpts.innerRect.height +\n      (buildOpts.innerRect.y - buildOpts.outerRect.y) +\n      wiggle(buildOpts, true);\n    struct.x = buildOpts.align === 'left' ? buildOpts.innerRect.width : 0;\n    struct.anchor = buildOpts.align === 'left' ? 'end' : 'start';\n    struct.baseline = buildOpts.stepSize ? 'text-before-edge' : 'central';\n\n    struct.y += isNaN(buildOpts.style.offset) ? 0 : +buildOpts.style.offset;\n  }\n\n  appendStyle(struct, buildOpts);\n  clampEnds(struct, buildOpts);\n  appendPadding(struct, buildOpts);\n  appendTilting(struct, buildOpts);\n  appendBounds(struct, buildOpts);\n  appendCollider(tick, struct, buildOpts);\n\n  return struct;\n}\n","import extend from 'extend';\n\nfunction appendStyle(struct, buildOpts) {\n  extend(struct, buildOpts.style);\n}\n\nfunction appendPadding(struct, buildOpts) {\n  if (buildOpts.align === 'top') {\n    struct.y1 -= buildOpts.padding;\n    struct.y2 -= buildOpts.padding;\n  } else if (buildOpts.align === 'bottom') {\n    struct.y1 += buildOpts.padding;\n    struct.y2 += buildOpts.padding;\n  } else if (buildOpts.align === 'left') {\n    struct.x1 -= buildOpts.padding;\n    struct.x2 -= buildOpts.padding;\n  } else if (buildOpts.align === 'right') {\n    struct.x1 += buildOpts.padding;\n    struct.x2 += buildOpts.padding;\n  }\n}\n\nfunction adjustForEnds(struct, buildOpts) {\n  const halfWidth = struct.strokeWidth / 2;\n\n  if (struct.x1 === buildOpts.innerRect.width) {\n    // outer end tick\n    struct.x1 -= halfWidth;\n    struct.x2 -= halfWidth;\n  } else if (struct.x1 === 0) {\n    // outer start tick\n    struct.x1 += halfWidth;\n    struct.x2 += halfWidth;\n  } else if (struct.y1 === buildOpts.innerRect.height) {\n    struct.y1 -= halfWidth;\n    struct.y2 -= halfWidth;\n  } else if (struct.y1 === 0) {\n    struct.y1 += halfWidth;\n    struct.y2 += halfWidth;\n  }\n}\n\nexport default function buildNode(tick, buildOpts) {\n  const struct = {\n    type: 'line',\n    x1: 0,\n    x2: 0,\n    y1: 0,\n    y2: 0,\n    collider: {\n      type: null,\n    },\n  };\n\n  if (buildOpts.align === 'top' || buildOpts.align === 'bottom') {\n    struct.x1 = struct.x2 = tick.position * buildOpts.innerRect.width + (buildOpts.innerRect.x - buildOpts.outerRect.x);\n    struct.y1 = buildOpts.align === 'top' ? buildOpts.innerRect.height : 0;\n    struct.y2 = buildOpts.align === 'top' ? struct.y1 - buildOpts.tickSize : struct.y1 + buildOpts.tickSize;\n  } else {\n    struct.y1 = struct.y2 =\n      tick.position * buildOpts.innerRect.height + (buildOpts.innerRect.y - buildOpts.outerRect.y);\n    struct.x1 = buildOpts.align === 'left' ? buildOpts.innerRect.width : 0;\n    struct.x2 = buildOpts.align === 'left' ? struct.x1 - buildOpts.tickSize : struct.x1 + buildOpts.tickSize;\n  }\n\n  appendStyle(struct, buildOpts);\n  appendPadding(struct, buildOpts);\n  adjustForEnds(struct, buildOpts);\n  return struct;\n}\n","function isMajorTick(tick) {\n  return !tick.isMinor && tick.position >= 0 && tick.position <= 1;\n}\n\nfunction isVerticalLabelOverlapping({ majorTicks, measureText, rect }) {\n  const size = rect.height;\n  const textHeight = measureText('M').height;\n  if (majorTicks.length < 2) {\n    return false;\n  }\n\n  const d = size * Math.abs(majorTicks[0].position - majorTicks[1].position);\n  if (d < textHeight) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction isHorizontalLabelOverlapping({ majorTicks, measureText, rect, state }) {\n  /*\n   * Currently isn't any good way of doing a accurate measurement on size available (bandWidth * width) for labels.\n   * It's a lifecycle limitation as components docked either left or right can affect the width available after the calculation is done.\n   * <number of components docked left/right> * <width of components> => Less accurate ===> Can result in only ellips char rendered as labels.\n   */\n  const m = state.labels.activeMode === 'layered' ? 2 : 1;\n  const size = rect.width;\n  const tickSize = majorTicks\n    .map((tick) => tick.label)\n    .map((l) => `${l.slice(0, 1)}${l.length > 1 ? '…' : ''}`) // Measure the size of 1 chars + the ellips char.\n    .map(measureText)\n    .map((r) => r.width);\n  for (let i = 0; i < majorTicks.length; ++i) {\n    const tick = majorTicks[i];\n    const d1 = m * size * Math.abs(tick.start - tick.end);\n    const d2 = tickSize[i];\n    if (d1 < d2) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction shouldAutoTilt({ majorTicks, measure, rect, state, settings }) {\n  const glyphCount = settings.labels.maxGlyphCount;\n  const m = state.labels.activeMode === 'layered' ? 2 : 1;\n  const magicSizeRatioMultipler = settings.labels.tiltThreshold ? settings.labels.tiltThreshold : 0.7; // So that if less the 70% of labels are visible, toggle on tilt or use variable tiltThreshold\n  const ellipsCharSize = measure('…').width; // include ellipsed char in calc as it's generally large then the char it replaces\n  const size = rect.width;\n  let maxLabelWidth = 0;\n  let d1 = 0;\n\n  if (!isNaN(glyphCount)) {\n    const minBandwidth = majorTicks.reduce((prev, curr) => Math.min(Math.abs(curr.start - curr.end), prev), Infinity);\n    d1 = m * size * minBandwidth;\n    maxLabelWidth = measure('M').width * magicSizeRatioMultipler * glyphCount;\n    if (maxLabelWidth + ellipsCharSize > d1) {\n      return true;\n    }\n  } else {\n    for (let i = 0; i < majorTicks.length; i++) {\n      const tick = majorTicks[i];\n      const label = tick.label;\n      const width = measure(label).width * (label.length > 1 ? magicSizeRatioMultipler : 1);\n      d1 = m * size * Math.abs(tick.start - tick.end);\n      if (width + ellipsCharSize > d1) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nfunction isTiltedLabelOverlapping({ majorTicks, measureText, rect, bleedSize, angle }) {\n  if (majorTicks.length < 2) {\n    return false;\n  }\n  if (angle === 0) {\n    return true; // TODO 0 angle should be considered non-tilted\n  }\n  const absAngle = Math.abs(angle);\n  const size = Math.min(rect.outer.width - bleedSize, rect.inner.width);\n  const stepSize = size * Math.abs(majorTicks[0].position - majorTicks[1].position);\n  const textHeight = measureText('M').height;\n  const reciprocal = 1 / stepSize; // 1 === Math.sin(90 * (Math.PI / 180))\n  const distanceBetweenLabels = Math.sin(absAngle * (Math.PI / 180)) / reciprocal;\n\n  return textHeight > distanceBetweenLabels;\n}\n\nfunction isToLarge({ rect, state, majorTicks, measure, horizontal }) {\n  if (horizontal) {\n    return isHorizontalLabelOverlapping({\n      majorTicks,\n      measureText: measure,\n      rect,\n      state,\n    });\n  }\n\n  return isVerticalLabelOverlapping({\n    majorTicks,\n    measureText: measure,\n    rect,\n    state,\n  });\n}\n\nexport function getClampedValue({ value, maxValue, minValue, range, modifier }) {\n  if (!isNaN(range) && !isNaN(modifier)) {\n    value = range * modifier;\n  }\n\n  if (value > maxValue) {\n    value = maxValue;\n  }\n\n  if (value < minValue) {\n    value = minValue;\n  }\n\n  return value;\n}\n\nexport default function getSize({ isDiscrete, rect, formatter, measureText, scale, settings, state }) {\n  let size = 0;\n  const edgeBleed = {\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0,\n  };\n  const { maxLengthPx: maxValue, minLengthPx: minValue } = settings.labels;\n\n  if (settings.labels.show) {\n    const align = settings.align;\n    const horizontal = align === 'top' || align === 'bottom';\n    const distance = horizontal ? rect.inner.width : rect.inner.height;\n    const majorTicks = scale\n      .ticks({\n        settings,\n        distance,\n        formatter,\n      })\n      .filter(isMajorTick);\n\n    const measure = (text) => {\n      const m = measureText({\n        text,\n        fontSize: settings.labels.fontSize,\n        fontFamily: settings.labels.fontFamily,\n      });\n      m.width = getClampedValue({ value: m.width, maxValue, minValue });\n      return m;\n    };\n\n    if (isDiscrete && horizontal && settings.labels.mode === 'auto') {\n      if (\n        shouldAutoTilt({\n          majorTicks,\n          measure,\n          rect: rect.inner,\n          state,\n          settings,\n        })\n      ) {\n        state.labels.activeMode = 'tilted';\n      } else {\n        state.labels.activeMode = 'horizontal';\n      }\n    }\n\n    if (\n      !settings.labels.filterOverlapping &&\n      state.labels.activeMode !== 'tilted' &&\n      isToLarge({\n        rect: rect.inner,\n        state,\n        majorTicks,\n        measure,\n        horizontal,\n      })\n    ) {\n      const toLargeSize = Math.max(rect.outer.width, rect.outer.height); // used to hide the axis\n      return { size: toLargeSize, isToLarge: true };\n    }\n\n    let sizeFromTextRect;\n    if (state.labels.activeMode === 'tilted') {\n      const radians = Math.abs(settings.labels.tiltAngle) * (Math.PI / 180); // angle in radians\n      sizeFromTextRect = (r) =>\n        getClampedValue({ value: r.width, maxValue, minValue }) * Math.sin(radians) + r.height * Math.cos(radians);\n    } else if (horizontal) {\n      sizeFromTextRect = (r) => r.height;\n    } else {\n      sizeFromTextRect = (r) => getClampedValue({ value: r.width, maxValue, minValue });\n    }\n\n    let labels;\n    if (horizontal && state.labels.activeMode !== 'tilted') {\n      labels = ['M'];\n    } else if (!isNaN(settings.labels.maxGlyphCount)) {\n      let label = '';\n      for (let i = 0; i < settings.labels.maxGlyphCount; i++) {\n        label += 'M';\n      }\n      labels = [label];\n    } else {\n      labels = majorTicks.map((tick) => tick.label);\n    }\n    const tickMeasures = labels.map(measure);\n    const labelSizes = tickMeasures.map(sizeFromTextRect);\n    const textSize = Math.max(...labelSizes, 0);\n    size += textSize;\n    size += settings.labels.margin;\n\n    if (state.labels.activeMode === 'layered') {\n      size *= 2;\n    }\n\n    if (state.labels.activeMode === 'tilted') {\n      const extendLeft = (settings.align === 'bottom') === settings.labels.tiltAngle >= 0;\n      const radians = Math.abs(settings.labels.tiltAngle) * (Math.PI / 180); // angle in radians\n      const h = measureText('M').height;\n      const maxWidth = (textSize - h * Math.cos(radians)) / Math.sin(radians);\n      const labelWidth = (r) => Math.min(maxWidth, r.width) * Math.cos(radians) + r.height;\n      const adjustByPosition = (s, i) => {\n        const pos = majorTicks[i] ? majorTicks[i].position : 0;\n        if (extendLeft) {\n          return s - pos * rect.inner.width;\n        }\n        return s - (1 - pos) * rect.inner.width;\n      };\n      const bleedSize =\n        Math.min(settings.labels.maxEdgeBleed, Math.max(...tickMeasures.map(labelWidth).map(adjustByPosition), 0)) +\n        settings.paddingEnd;\n      const bleedDir = extendLeft ? 'left' : 'right';\n      edgeBleed[bleedDir] = bleedSize;\n\n      if (\n        !settings.labels.filterOverlapping &&\n        isTiltedLabelOverlapping({\n          majorTicks,\n          measureText,\n          rect,\n          bleedSize,\n          angle: settings.labels.tiltAngle,\n        })\n      ) {\n        const toLargeSize = Math.max(rect.outer.width, rect.outer.height); // used to hide the axis\n        return { size: toLargeSize, isToLarge: true };\n      }\n    }\n  }\n\n  return { size, edgeBleed };\n}\n","const PADDING = 2;\n\nconst tickDistance = (rect, start, end) => rect.width * Math.abs(start.position - end.position);\n\nconst getLeftEdgeWidth = ({ innerRect, outerRect, tick, nextWidth }) => {\n  const leftEdgeBleed = innerRect.x - outerRect.x;\n  const left = innerRect.width * tick.position + leftEdgeBleed;\n  const minDubble = Math.min(nextWidth, left) * 2;\n  const minWidth = tick.position === 0 ? innerRect.width / 2 - PADDING : 0;\n\n  return Math.max(nextWidth, minDubble, minWidth);\n};\n\nconst getRightEdgeWidth = ({ innerRect, outerRect, tick, prevWidth }) => {\n  const leftEdgeBleed = innerRect.x - outerRect.x;\n  const rightEdgeBleed = outerRect.width - innerRect.width - leftEdgeBleed;\n  const right = innerRect.width - innerRect.width * tick.position + rightEdgeBleed;\n  const minDubble = Math.min(prevWidth, right) * 2;\n  const minWidth = tick.position === 1 ? innerRect.width / 2 - PADDING : 0;\n\n  return Math.max(prevWidth, minDubble, minWidth);\n};\n\nexport default function getHorizontalWidth({ layered, major, innerRect, outerRect, tick, index }) {\n  const step = layered ? 2 : 1;\n  const prev = major[index - step];\n  const next = major[index + step];\n  const prevWidth = prev ? tickDistance(innerRect, tick, prev) / 2 - PADDING : Infinity;\n  const nextWidth = next ? tickDistance(innerRect, tick, next) / 2 - PADDING : Infinity;\n\n  if (major.length < 2) {\n    return innerRect.width;\n  }\n\n  if (!prev) {\n    return getLeftEdgeWidth({\n      innerRect,\n      outerRect,\n      tick,\n      nextWidth,\n    });\n  }\n\n  if (!next) {\n    return getRightEdgeWidth({\n      innerRect,\n      outerRect,\n      tick,\n      prevWidth,\n    });\n  }\n\n  return Math.min(prevWidth, nextWidth) * 2;\n}\n","import buildLine from './axis-line-node';\nimport buildLabel from './axis-label-node';\nimport buildTick from './axis-tick-node';\nimport { testRectRect } from '../../math/narrow-phase-collision';\nimport { getClampedValue } from './axis-label-size';\nimport getHorizontalContinuousWidth from './get-continuous-label-rect';\nimport { expandRect } from '../../geometry/util';\n\nfunction tickSpacing(settings) {\n  let spacing = 0;\n  spacing += settings.paddingStart;\n  spacing += settings.line.show ? settings.line.strokeWidth : 0;\n  spacing += settings.ticks.show ? settings.ticks.margin : 0;\n  return spacing;\n}\n\nfunction tickMinorSpacing(settings) {\n  return settings.line.strokeWidth + settings.minorTicks.margin;\n}\n\nfunction labelsSpacing(settings) {\n  let spacing = 0;\n  spacing += settings.ticks.show ? settings.ticks.tickSize : 0;\n  spacing += tickSpacing(settings) + settings.labels.margin;\n  return spacing;\n}\n\nfunction calcActualTextRect({ style, measureText, tick }) {\n  return measureText({\n    text: tick.label,\n    fontSize: style.fontSize,\n    fontFamily: style.fontFamily,\n  });\n}\n\nfunction majorTicks(ticks) {\n  return ticks.filter((t) => !t.isMinor);\n}\n\nfunction minorTicks(ticks) {\n  return ticks.filter((t) => t.isMinor);\n}\n\nfunction tickBuilder(ticks, buildOpts) {\n  return ticks.map((tick) => buildTick(tick, buildOpts));\n}\n\nfunction tickBandwidth(scale, tick) {\n  return tick ? Math.abs(tick.end - tick.start) : scale.bandwidth();\n}\n\nfunction labelBuilder(ticks, buildOpts, resolveTickOpts) {\n  return ticks.map((tick, idx) => {\n    resolveTickOpts(tick, idx);\n    const label = buildLabel(tick, buildOpts);\n    label.data = tick.data;\n    return label;\n  });\n}\n\nfunction layeredLabelBuilder(ticks, buildOpts, settings, resolveTickOpts) {\n  const padding = buildOpts.padding;\n  const spacing = labelsSpacing(settings);\n  return ticks.map((tick, idx) => {\n    resolveTickOpts(tick, idx);\n    const padding2 = spacing + buildOpts.maxHeight + settings.labels.margin;\n    buildOpts.layer = idx % 2;\n    buildOpts.padding = idx % 2 === 0 ? padding : padding2;\n    const label = buildLabel(tick, buildOpts);\n    label.data = tick.data;\n    return label;\n  });\n}\n\nexport function filterOverlappingLabels(labels, ticks, buildOpts) {\n  let isOverlapping = (i, k) => {\n    const rect1 = expandRect(1, labels[i].boundingRect);\n    const rect2 = expandRect(1, labels[k].boundingRect);\n\n    return testRectRect(rect1, rect2);\n  };\n\n  if (buildOpts && buildOpts.tilted) {\n    const absAngle = Math.abs(buildOpts.angle);\n\n    isOverlapping = (i, k) => {\n      const stepSize = Math.abs(labels[i].x - labels[k].x);\n      const reciprocal = 1 / stepSize;\n      const distanceBetweenLabels = Math.sin(absAngle * (Math.PI / 180)) / reciprocal;\n\n      return labels[i].boundingRect.height > distanceBetweenLabels;\n    };\n  }\n\n  for (let i = 0; i <= labels.length - 1; i++) {\n    for (let k = i + 1; k <= Math.min(i + 5, i + (labels.length - 1)); k++) {\n      // TODO Find a better way to handle exteme/layered labels then to iterare over ~5 next labels\n      if (labels[i] && labels[k] && isOverlapping(i, k)) {\n        if (k === labels.length - 1) {\n          // On collition with last label, remove current label instead\n          labels.splice(i, 1);\n          if (ticks) {\n            ticks.splice(i, 1);\n          }\n        } else {\n          labels.splice(k, 1);\n          if (ticks) {\n            ticks.splice(k, 1);\n          }\n        }\n        k--;\n        i--;\n      }\n    }\n  }\n}\n\nfunction discreteCalcMaxTextRect({ textMetrics, settings, innerRect, scale, tilted, layered, tick }) {\n  const h = textMetrics.height;\n\n  const bandwidth = tickBandwidth(scale, tick);\n\n  const textRect = { width: 0, height: h };\n  if (settings.align === 'left' || settings.align === 'right') {\n    textRect.width = innerRect.width - labelsSpacing(settings) - settings.paddingEnd;\n  } else if (layered) {\n    textRect.width = bandwidth * innerRect.width * 2;\n  } else if (tilted) {\n    const radians = Math.abs(settings.labels.tiltAngle) * (Math.PI / 180);\n    textRect.width =\n      (innerRect.height - labelsSpacing(settings) - settings.paddingEnd - h * Math.cos(radians)) / Math.sin(radians);\n  } else {\n    textRect.width = bandwidth * innerRect.width;\n  }\n\n  textRect.width = getClampedValue({\n    value: textRect.width,\n    maxValue: settings.labels.maxLengthPx,\n    minValue: settings.labels.minLengthPx,\n  });\n\n  return textRect;\n}\n\nfunction continuousCalcMaxTextRect({\n  textMetrics,\n  settings,\n  innerRect,\n  outerRect,\n  tilted,\n  layered,\n  tick,\n  index,\n  major,\n}) {\n  const h = textMetrics.height;\n\n  const textRect = { width: 0, height: h };\n  if (settings.align === 'left' || settings.align === 'right') {\n    textRect.width = innerRect.width - labelsSpacing(settings) - settings.paddingEnd;\n  } else if (tilted) {\n    const radians = Math.abs(settings.labels.tiltAngle) * (Math.PI / 180);\n    textRect.width =\n      (innerRect.height - labelsSpacing(settings) - settings.paddingEnd - h * Math.cos(radians)) / Math.sin(radians);\n  } else {\n    textRect.width = getHorizontalContinuousWidth({\n      layered,\n      major,\n      innerRect,\n      outerRect,\n      tick,\n      index,\n    });\n  }\n\n  textRect.width = getClampedValue({\n    value: textRect.width,\n    maxValue: settings.labels.maxLengthPx,\n    minValue: settings.labels.minLengthPx,\n  });\n\n  return textRect;\n}\n\nfunction getStepSizeFn({ innerRect, scale, settings, tick }) {\n  const size = settings.align === 'top' || settings.align === 'bottom' ? innerRect.width : innerRect.height;\n  const bandwidth = tickBandwidth(scale, tick);\n  return size * bandwidth;\n}\n\nexport default function nodeBuilder(isDiscrete) {\n  let resolveLabelRect;\n\n  function continuous() {\n    resolveLabelRect = continuousCalcMaxTextRect;\n    return continuous;\n  }\n\n  function discrete() {\n    resolveLabelRect = discreteCalcMaxTextRect;\n    return discrete;\n  }\n\n  function build({ settings, scale, innerRect, outerRect, measureText, ticks, state, textBounds }) {\n    const nodes = [];\n    const major = majorTicks(ticks);\n    const minor = minorTicks(ticks);\n    const buildOpts = {\n      innerRect,\n      align: settings.align,\n      outerRect,\n    };\n    const tilted = state.labels.activeMode === 'tilted';\n    const layered = state.labels.activeMode === 'layered';\n    let majorTickNodes;\n\n    if (settings.line.show) {\n      buildOpts.style = settings.line;\n      buildOpts.padding = settings.paddingStart;\n\n      nodes.push(buildLine(buildOpts));\n    }\n    if (settings.ticks.show) {\n      buildOpts.style = settings.ticks;\n      buildOpts.tickSize = settings.ticks.tickSize;\n      buildOpts.padding = tickSpacing(settings);\n\n      majorTickNodes = tickBuilder(major, buildOpts);\n    }\n    if (settings.labels.show) {\n      const padding = labelsSpacing(settings);\n      buildOpts.style = settings.labels;\n      buildOpts.padding = padding;\n      buildOpts.tilted = tilted;\n      buildOpts.layered = layered;\n      buildOpts.angle = settings.labels.tiltAngle;\n      buildOpts.paddingEnd = settings.paddingEnd;\n      buildOpts.textBounds = textBounds;\n      const resolveTickOpts = (tick, index) => {\n        buildOpts.textRect = calcActualTextRect({ tick, measureText, style: buildOpts.style });\n        const maxSize = resolveLabelRect({\n          textMetrics: buildOpts.textRect,\n          settings,\n          innerRect,\n          outerRect,\n          scale,\n          tilted,\n          layered,\n          tick,\n          major,\n          index,\n        });\n        buildOpts.maxWidth = maxSize.width;\n        buildOpts.maxHeight = maxSize.height;\n        buildOpts.stepSize = getStepSizeFn({\n          innerRect,\n          scale,\n          ticks,\n          settings,\n          tick,\n        });\n      };\n\n      let labelNodes = [];\n      if (layered && (settings.align === 'top' || settings.align === 'bottom')) {\n        labelNodes = layeredLabelBuilder(major, buildOpts, settings, resolveTickOpts);\n      } else {\n        labelNodes = labelBuilder(major, buildOpts, resolveTickOpts);\n      }\n\n      // Remove labels (and paired tick) that are overlapping\n      if (settings.labels.filterOverlapping) {\n        filterOverlappingLabels(labelNodes, majorTickNodes, buildOpts);\n      }\n\n      nodes.push(...labelNodes);\n    }\n\n    if (settings.minorTicks && settings.minorTicks.show && minor.length > 0) {\n      buildOpts.style = settings.minorTicks;\n      buildOpts.tickSize = settings.minorTicks.tickSize;\n      buildOpts.padding = tickMinorSpacing(settings);\n\n      nodes.push(...tickBuilder(minor, buildOpts));\n    }\n\n    if (majorTickNodes) {\n      nodes.push(...majorTickNodes);\n    }\n\n    return nodes;\n  }\n\n  continuous.build = build;\n  discrete.build = build;\n\n  return isDiscrete ? discrete() : continuous();\n}\n","// const DEFAULT_LAYOUT_SETTINGS = { // TODO create dis and con specific settings\n//   anchor: 'auto', // TODO re-name from align..\n//   // orientation: 'auto', // TODO impl. v/h/auto\n//   // direction: 'auto', // TODO impl. left/right/top/bottom/auto\n//   padding: { // TODO use dock layout margin instead..\n//     start: 0,\n//     end: 10\n//   },\n//   maxGlyphCount: NaN,\n//   maxEdgeBleed: Infinity\n//   // labelMode: 'auto' // TODO move here? auto, horizontal, layered\n// };\n\n/**\n * @typedef {object} ComponentAxis\n * @extends ComponentSettings\n * @property {string} scale reference to band or linear scale\n * @property {ComponentAxis~DiscreteSettings|ComponentAxis~ContinuousSettings} settings discrete or continuous axis settings\n * @example\n * {\n *  type: 'axis',\n *  scale: '<name-of-scale>'\n * }\n */\n\n/**\n * Discrete axis settings\n * @typedef {object}\n * @alias ComponentAxis~DiscreteSettings\n * @example\n * {\n *  type: 'axis',\n *  scale: '<name-of-band-scale>',\n *  settings: {\n *    labels: {\n *      mode: 'tilted',\n *      tiltAngle: 40,\n *    },\n *  },\n * }\n */\nconst DEFAULT_DISCRETE_SETTINGS = {\n  /**\n   * @typedef {object}\n   */\n  labels: {\n    /** Toggle labels on/off\n     * @type {boolean=} */\n    show: true,\n    /** Tilting angle in degrees. Capped between -90 and 90. Only applicable when labels are in `tilted` mode.\n     * @type {number=} */\n    tiltAngle: 40,\n    /** Threshold for toggle of tilted labels. Capped between 0 and 1. For example, if it is set to 0.7, then tilted labels will be toggled if less than 70% of the labels are visible.\n     * @type {number=} */\n    tiltThreshold: 0.7,\n    /** Control the amount of space (in pixels) that labes can occupy outside their docking area. Only applicable when labels are in `tilted` mode.\n     * @type {number=} */\n    maxEdgeBleed: Infinity,\n    /** Space in pixels between the tick and label.\n     * @type {number=} */\n    margin: 4,\n    /** Max length of labels in pixels\n     * @type {number=} */\n    maxLengthPx: 150,\n    /** Min length of labels in pixels. Labels will always at least require this much space\n     * @type {number=} */\n    minLengthPx: 0,\n    /** Control how labels arrange themself. Availabe modes are `auto`, `horizontal`, `layered` and `tilted`. When set to `auto` the axis determines the best possible layout in the current context.\n     * @type {string=} */\n    mode: 'auto',\n    /** When only a sub-set of data is available, ex. when paging. This property can be used to let the axis estimate how much space the labels will consume, allowing it to give a consistent space estimate over the entire dataset when paging.\n     * @type {number=} */\n    maxGlyphCount: NaN,\n    /** Align act as a slider for the text bounding rect over the item bandwidth, given that the item have a bandwidth. Except when labels are tilted, then the align is a pure align that shifts the position of the label anchoring point.\n     * @type {number=} */\n    align: 0.5,\n    /** Offset in pixels along the axis direction.\n     * @type {number=} */\n    offset: 0,\n    /**\n     * Toggle whether labels should be filtered if they are overlapping. Filtering may be applied in a non-sequential order.\n     * If labels are overlapping and this setting is toggled off, the axis will automatically hide.\n     * @type {boolean=}\n     */\n    filterOverlapping: false,\n  },\n  /**\n   * @typedef {object}\n   */\n  ticks: {\n    /** Toggle ticks on/off\n     * @type {boolean=} */\n    show: false,\n    /** Space in pixels between the ticks and the line.\n     * @type {number=} */\n    margin: 0,\n    /** Size of the ticks in pixels.\n     * @type {number=} */\n    tickSize: 4,\n  },\n  /**\n   * @typedef {object}\n   */\n  line: {\n    /** Toggle line on/off\n     * @type {boolean=} */\n    show: false,\n  },\n  /** Padding in direction perpendicular to the axis\n   * @type {number=} */\n  paddingStart: 0,\n  /** Padding in direction perpendicular to the axis\n   * @type {number=} */\n  paddingEnd: 10,\n  /** Set the anchoring point of the axis. Available options are `auto/left/right/bottom/top`. In `auto` the axis determines the best option. The options are restricted based on the axis orientation, a vertical axis may only anchor on `left` or `right`\n   * @type {string=} */\n  align: 'auto',\n};\n\n/**\n * Continuous axis settings\n * @typedef {object}\n * @alias ComponentAxis~ContinuousSettings\n * @example\n * {\n *  type: 'axis',\n *  scale: '<name-of-linear-scale>',\n *  settings: {\n *    minorTicks: {\n *      show: false,\n *    },\n *  },\n * }\n */\nconst DEFAULT_CONTINUOUS_SETTINGS = {\n  /**\n   * @typedef {object}\n   */\n  labels: {\n    /** Toggle labels on/off\n     * @type {boolean=} */\n    show: true,\n    /** Space in pixels between the tick and label.\n     * @type {number=} */\n    margin: 4,\n    /** Max length of labels in pixels\n     * @type {number=} */\n    maxLengthPx: 150,\n    /** Min length of labels in pixels. Labels will always at least require this much space\n     * @type {number=} */\n    minLengthPx: 0,\n    /** Align act as a slider for the text bounding rect over the item bandwidth, given that the item have a bandwidth.\n     * @type {number=} */\n    align: 0.5,\n    /** Offset in pixels along the axis direction.\n     * @type {number=} */\n    offset: 0,\n    /**\n     * Toggle whether labels should be filtered if they are overlapping. Filtering may be applied in a non-sequential order.\n     * If labels are overlapping and this setting is toggled off, the axis will automatically hide.\n     * @type {boolean=}\n     */\n    filterOverlapping: true,\n  },\n  /**\n   * @typedef {object}\n   */\n  ticks: {\n    /** Toggle ticks on/off\n     * @type {boolean=} */\n    show: true,\n    /** Space in pixels between the ticks and the line.\n     * @type {number=} */\n    margin: 0,\n    /** Size of the ticks in pixels.\n     * @type {number=} */\n    tickSize: 8,\n  },\n  /**\n   * @typedef {object}\n   */\n  minorTicks: {\n    /** Toggle minor-ticks on/off\n     * @type {boolean=} */\n    show: false,\n    /** Size of the ticks in pixels.\n     * @type {number=} */\n    tickSize: 3,\n    /** Space in pixels between the ticks and the line.\n     * @type {number=} */\n    margin: 0,\n  },\n  /**\n   * @typedef {object}\n   */\n  line: {\n    /** Toggle line on/off\n     * @type {boolean=} */\n    show: true,\n  },\n  /** Padding in direction perpendicular to the axis\n   * @type {number=} */\n  paddingStart: 0,\n  /** Padding in direction perpendicular to the axis\n   * @type {number=} */\n  paddingEnd: 10,\n  /** Set the anchoring point of the axis. Available options are `auto/left/right/bottom/top`. In `auto` the axis determines the best option. The options are restricted based on the axis orientation, a vertical axis may only anchor on `left` or `right`\n   * @type {string=} */\n  align: 'auto',\n};\n\nexport { DEFAULT_DISCRETE_SETTINGS, DEFAULT_CONTINUOUS_SETTINGS };\n","import extend from 'extend';\n\nimport nodeBuilder from './axis-node-builder';\nimport { DEFAULT_CONTINUOUS_SETTINGS, DEFAULT_DISCRETE_SETTINGS } from './axis-default-settings';\nimport calcRequiredSize from './axis-size-calculator';\nimport crispify from '../../transposer/crispifier';\nimport { scaleWithSize } from '../../scales';\n\nfunction alignTransform({ align, inner }) {\n  if (align === 'left') {\n    return { x: inner.width + inner.x };\n  }\n  if (align === 'right' || align === 'bottom') {\n    return inner;\n  }\n  return { y: inner.y + inner.height };\n}\n\nfunction resolveAlign(align, dock) {\n  const horizontal = ['top', 'bottom'];\n  const vertical = ['left', 'right'];\n  if (horizontal.indexOf(align) !== -1 && vertical.indexOf(dock) === -1) {\n    return align;\n  }\n  if (vertical.indexOf(align) !== -1 && horizontal.indexOf(dock) === -1) {\n    return align;\n  }\n  return dock; // Invalid align, return current dock as default\n}\n\n/**\n * @ignore\n * @param {object} context - The component context\n */\nfunction resolveLocalSettings({ state, style, settings }) {\n  const defaultStgns = extend(\n    true,\n    {},\n    state.isDiscrete ? DEFAULT_DISCRETE_SETTINGS : DEFAULT_CONTINUOUS_SETTINGS,\n    style\n  );\n  const localStgns = extend(true, {}, defaultStgns, settings.settings);\n\n  const dock = settings.layout.dock || state.defaultDock;\n  localStgns.dock = dock;\n  localStgns.align = resolveAlign(settings.settings.align, dock);\n  localStgns.labels.tiltAngle = Math.max(-90, Math.min(localStgns.labels.tiltAngle, 90));\n\n  const { paddingStart, paddingEnd } = localStgns;\n  localStgns.paddingStart = typeof paddingStart === 'function' ? paddingStart.call(null) : paddingStart;\n  localStgns.paddingEnd = typeof paddingEnd === 'function' ? paddingEnd.call(null) : paddingEnd;\n\n  return localStgns;\n}\n\nfunction updateActiveMode(state, settings, isDiscrete) {\n  const mode = settings.labels.mode;\n\n  if (!isDiscrete || !state.isHorizontal) {\n    return 'horizontal';\n  }\n\n  if (mode === 'auto') {\n    return state.labels.activeMode;\n  }\n  if (['layered', 'tilted'].indexOf(settings.labels.mode) !== -1 && ['top', 'bottom'].indexOf(settings.dock) !== -1) {\n    return mode;\n  }\n  return 'horizontal';\n}\n\nconst axisComponent = {\n  require: ['chart', 'renderer', 'dockConfig'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 0,\n      prioOrder: 0,\n    },\n    settings: {},\n    style: {\n      labels: '$label',\n      ticks: '$guide-line',\n      minorTicks: '$guide-line--minor',\n      line: '$guide-line',\n    },\n  },\n  created() {\n    // State is a representation of properties that are private to this component defintion and may be modified by only in this context.\n    this.state = {\n      isDiscrete: !!this.scale.bandwidth,\n      isHorizontal: false,\n      labels: {\n        activeMode: 'horizontal',\n      },\n      ticks: [],\n      innerRect: {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0,\n      },\n      outerRect: {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0,\n      },\n      defaultDock: undefined,\n      concreteNodeBuilder: undefined,\n      settings: undefined,\n    };\n\n    if (this.state.isDiscrete) {\n      this.state.defaultDock = 'bottom';\n    } else {\n      this.state.defaultDock = 'left';\n    }\n\n    this.setState(this.settings);\n  },\n  setState() {\n    this.state.isDiscrete = !!this.scale.bandwidth;\n    this.state.settings = resolveLocalSettings(this);\n\n    this.state.concreteNodeBuilder = nodeBuilder(this.state.isDiscrete);\n\n    this.dockConfig.dock(this.state.settings.dock); // Override the dock setting (TODO should be removed)\n\n    this.state.isHorizontal = this.state.settings.align === 'top' || this.state.settings.align === 'bottom';\n    this.state.labels.activeMode = updateActiveMode(this.state, this.state.settings, this.state.isDiscrete);\n  },\n  preferredSize(opts) {\n    const { formatter, state, scale } = this;\n\n    const distance = this.state.isHorizontal ? opts.inner.width : opts.inner.height;\n\n    this.state.pxScale = scaleWithSize(scale, distance);\n\n    const reqSize = calcRequiredSize({\n      isDiscrete: this.state.isDiscrete,\n      rect: {\n        inner: opts.inner,\n        outer: opts.outer,\n      },\n      formatter,\n      measureText: this.renderer.measureText,\n      scale: this.state.pxScale,\n      settings: this.state.settings,\n      state,\n    });\n\n    return reqSize;\n  },\n  beforeUpdate(opts = {}) {\n    const { settings } = opts;\n    this.setState(settings);\n  },\n  resize(opts) {\n    const { inner, outer } = opts;\n\n    const extendedInner = extend(\n      {},\n      inner,\n      alignTransform({\n        align: this.state.settings.align,\n        inner,\n      })\n    );\n\n    const finalOuter = outer || extendedInner;\n    extend(this.state.innerRect, extendedInner);\n    extend(this.state.outerRect, finalOuter);\n\n    return outer;\n  },\n  beforeRender() {\n    const { scale, formatter } = this;\n\n    const distance = this.state.isHorizontal ? this.state.innerRect.width : this.state.innerRect.height;\n\n    this.state.pxScale = scaleWithSize(scale, distance);\n    this.state.ticks = this.state.pxScale\n      .ticks({\n        distance,\n        formatter,\n      })\n      .filter((t) => t.position >= 0 && t.position <= 1);\n  },\n  render() {\n    const { state } = this;\n\n    const nodes = [];\n    nodes.push(\n      ...this.state.concreteNodeBuilder.build({\n        settings: this.state.settings,\n        scale: this.state.pxScale,\n        innerRect: this.state.innerRect,\n        outerRect: this.state.outerRect,\n        measureText: this.renderer.measureText,\n        textBounds: this.renderer.textBounds,\n        ticks: this.state.ticks,\n        state,\n      })\n    );\n\n    crispify.multiple(nodes);\n\n    return nodes;\n  },\n};\n\nexport default axisComponent;\n","import getLabelSize from './axis-label-size';\n\nexport default function calcRequiredSize({ isDiscrete, rect, formatter, measureText, scale, settings, state }) {\n  let size = 0;\n\n  const { size: labelSize, edgeBleed, isToLarge } = getLabelSize({\n    isDiscrete,\n    rect,\n    formatter,\n    measureText,\n    scale,\n    settings,\n    state,\n  });\n\n  size += labelSize;\n\n  if (isToLarge) {\n    return { size };\n  }\n\n  if (settings.ticks.show) {\n    size += settings.ticks.margin;\n    size += settings.ticks.tickSize;\n  }\n  if (settings.minorTicks && settings.minorTicks.show) {\n    const minorTicksSize = settings.minorTicks.margin + settings.minorTicks.tickSize;\n    if (minorTicksSize > size) {\n      size = minorTicksSize;\n    }\n  }\n  if (settings.line.show) {\n    size += settings.line.strokeWidth;\n  }\n  size += settings.paddingStart;\n  size += settings.paddingEnd;\n\n  return { size, edgeBleed };\n}\n","/**\n * @typedef {object} ComponentContainer\n * @experimental\n * @extends ComponentSettings\n * @property {string} [type='container']\n * @example\n * {\n *  type: 'container',\n *  preferredSize: ({ inner, outer, dock, children }) => {\n *    const sizes = children.map(c => c.preferredSize({ inner, outer }));\n *    return Math.max(...sizes);\n *  },\n *  strategy: (rect, components) => {\n *    const height = rect.height / components.length;\n *    components.forEach((c, i) => {\n *      c.resize({ ...rect, height, y: rect.y + i * height })\n *    });\n *    return { visible: components, hidden: [], order: components };\n *  },\n *  components: [\n *     ...\n *  ],\n * }\n */\n\nconst containerComponent = {\n  render() {\n    return [];\n  },\n};\n\nexport default containerComponent;\n","import extend from 'extend';\n\nfunction parseTitle(text, join, scale) {\n  let title = '';\n  if (typeof text === 'function') {\n    title = text();\n  } else if (typeof text === 'string') {\n    title = text;\n  } else if (scale) {\n    let data = scale.data();\n    const titles = (data.fields || []).map((field) => field.title());\n    title = titles.join(join);\n  }\n\n  return title;\n}\n\nfunction getTextAnchor(dock, anchor) {\n  let val = 'middle';\n  if (dock === 'left') {\n    if (anchor === 'top') {\n      val = 'end';\n    } else if (anchor === 'bottom') {\n      val = 'start';\n    }\n  } else if (dock === 'right') {\n    if (anchor === 'top') {\n      val = 'start';\n    } else if (anchor === 'bottom') {\n      val = 'end';\n    }\n  } else if (anchor === 'left') {\n    val = 'start';\n  } else if (anchor === 'right') {\n    val = 'end';\n  }\n  return val;\n}\n\nfunction generateTitle({ title, definitionSettings, dock, rect, measureText, style }) {\n  const struct = {\n    type: 'text',\n    text: title,\n    x: 0,\n    y: 0,\n    dx: 0,\n    dy: 0,\n    anchor: getTextAnchor(dock, definitionSettings.anchor),\n    baseline: 'alphabetical',\n  };\n\n  extend(struct, style.text);\n  const textRect = measureText(struct);\n\n  if (dock === 'top' || dock === 'bottom') {\n    let x = rect.width / 2;\n    if (definitionSettings.anchor === 'left') {\n      x = definitionSettings.paddingLeft || 0;\n    } else if (definitionSettings.anchor === 'right') {\n      x = rect.width - (definitionSettings.paddingRight || 0);\n    }\n\n    struct.x = x;\n    struct.y =\n      dock === 'top'\n        ? rect.height - definitionSettings.paddingStart\n        : definitionSettings.paddingStart + textRect.height;\n    struct.dy = dock === 'top' ? -(textRect.height / 6) : -(textRect.height / 3);\n    struct.maxWidth = rect.width * 0.8;\n  } else {\n    let y = rect.height / 2;\n    if (definitionSettings.anchor === 'top') {\n      y = definitionSettings.paddingStart;\n    } else if (definitionSettings.anchor === 'bottom') {\n      y = rect.height - definitionSettings.paddingStart;\n    }\n\n    struct.y = y;\n    struct.x = dock === 'left' ? rect.width - definitionSettings.paddingStart : definitionSettings.paddingStart;\n    struct.dx = dock === 'left' ? -(textRect.height / 3) : textRect.height / 3;\n    const rotation = dock === 'left' ? 270 : 90;\n    struct.transform = `rotate(${rotation}, ${struct.x + struct.dx}, ${struct.y + struct.dy})`;\n    struct.maxWidth = rect.height * 0.8;\n  }\n\n  if (!isNaN(definitionSettings.maxLengthPx)) {\n    struct.maxWidth = Math.min(struct.maxWidth, definitionSettings.maxLengthPx);\n  }\n\n  return struct;\n}\n\n/**\n * @typedef {object} ComponentText\n * @extends ComponentSettings\n * @property {string|function} text Text to display\n * @example\n * {\n *  type: 'text',\n *  text: 'my title',\n *  dock: 'left',\n *  settings: {\n *    anchor: 'left',\n *  }\n * }\n */\n\n/**\n * @typedef {object} ComponentText.settings\n * @property {number} [paddingStart=5] - Start padding in pixels\n * @property {number} [paddingEnd=5] - End padding in pixels\n * @property {number} [paddingLeft=0] - Left padding in pixels\n * @property {number} [paddingRight=0] - Right padding in pixels\n * @property {string} [anchor='center'] - Where to v- or h-align the text. Supports `left`, `right`, `top`, `bottom` and `center`\n * @property {string} [join=', '] - String to add when joining titles from multiple sources\n * @property {number} [maxLengthPx] - Limit the text length\n */\nconst textComponent = {\n  require: ['renderer', 'chart'],\n  defaultSettings: {\n    layout: {\n      dock: 'bottom',\n      displayOrder: 0,\n      prioOrder: 0,\n    },\n    settings: {\n      paddingStart: 5,\n      paddingEnd: 5,\n      paddingLeft: 0,\n      paddingRight: 0,\n      anchor: 'center',\n      join: ', ',\n      maxLengthPx: NaN,\n    },\n    style: {\n      text: '$title',\n    },\n  },\n\n  created() {\n    this.definitionSettings = this.settings.settings;\n\n    const text = this.settings.text;\n    const join = this.definitionSettings.join;\n    this.title = parseTitle(text, join, this.scale);\n  },\n\n  preferredSize() {\n    const height = this.renderer.measureText({\n      text: this.title,\n      fontSize: this.style.text.fontSize,\n      fontFamily: this.style.text.fontFamily,\n    }).height;\n    return height + this.definitionSettings.paddingStart + this.definitionSettings.paddingEnd;\n  },\n\n  render() {\n    const { title, definitionSettings, rect } = this;\n    const nodes = [];\n    nodes.push(\n      generateTitle({\n        title,\n        dock: this.settings.layout.dock,\n        definitionSettings,\n        rect,\n        measureText: this.renderer.measureText,\n        style: this.style,\n      })\n    );\n    return nodes;\n  },\n\n  beforeUpdate(opts) {\n    if (opts.settings) {\n      extend(this.settings, opts.settings);\n      this.definitionSettings = opts.settings.settings;\n    }\n    const text = this.settings.text;\n    const join = this.definitionSettings.join;\n    this.title = parseTitle(text, join, this.scale);\n  },\n};\n\nexport default textComponent;\n","/**\n * @typedef {object} ComponentScrollbar\n * @extends ComponentSettings\n * @private\n */\n\n/**\n * @typedef {object} ComponentScrollbar.settings\n * @property {boolean} [backgroundColor = '#eee']\n * @property {boolean} [thumbColor = '#ccc']\n * @property {boolean} [width = 16]\n */\n\nfunction start(_scrollbar, pos) {\n  const dock = _scrollbar.settings.layout.dock;\n  const invert = _scrollbar.settings.settings.invert;\n  const horizontal = dock === 'top' || dock === 'bottom';\n  const lengthAttr = horizontal ? 'width' : 'height';\n  const length = _scrollbar.rect[lengthAttr];\n  const scroll = _scrollbar.chart.scroll(_scrollbar.settings.scroll);\n  let currentMove;\n\n  {\n    // local scope to allow reuse of variable names later\n    let offset = pos[horizontal ? 'x' : 'y'];\n    if (invert) {\n      offset = length - offset;\n    }\n    const scrollState = scroll.getState();\n\n    currentMove = {\n      startOffset: offset,\n      startScroll: scrollState.start,\n      swipe: false,\n    };\n\n    // Detect swipe start outsize the thumb & change startScroll to jump the scroll there.\n    const scrollPoint = (offset / length) * (scrollState.max - scrollState.min) + scrollState.min;\n    if (scrollPoint < scrollState.start) {\n      currentMove.startScroll = scrollPoint;\n    } else if (scrollPoint > scrollState.start + scrollState.viewSize) {\n      currentMove.startScroll = scrollPoint - scrollState.viewSize;\n    }\n  }\n\n  const update = (p) => {\n    let offset = p[horizontal ? 'x' : 'y'];\n    if (invert) {\n      offset = length - offset;\n    }\n    if (!currentMove.swipe) {\n      if (Math.abs(currentMove.startOffset - offset) <= 1) {\n        return;\n      }\n      currentMove.swipe = true;\n    }\n\n    const scrollState = scroll.getState();\n    const scrollMove = ((offset - currentMove.startOffset) / length) * (scrollState.max - scrollState.min);\n    const scrollStart = currentMove.startScroll + scrollMove;\n    scroll.moveTo(scrollStart);\n  };\n  const end = (p) => {\n    let offset = p[horizontal ? 'x' : 'y'];\n    if (invert) {\n      offset = length - offset;\n    }\n    const scrollState = scroll.getState();\n    if (currentMove.swipe) {\n      const scrollMove = ((offset - currentMove.startOffset) / length) * (scrollState.max - scrollState.min);\n      const scrollStart = currentMove.startScroll + scrollMove;\n      scroll.moveTo(scrollStart);\n    } else {\n      const scrollCenter = (offset / length) * (scrollState.max - scrollState.min) + scrollState.min;\n      const scrollStart = scrollCenter - scrollState.viewSize / 2;\n      scroll.moveTo(scrollStart);\n    }\n  };\n\n  return {\n    update,\n    end,\n  };\n}\n\nfunction getLocalPos(event, renderer) {\n  const containerRect = renderer.element().getBoundingClientRect();\n  return {\n    x: event.center.x - containerRect.left,\n    y: event.center.y - containerRect.top,\n  };\n}\n\nconst scrollbarComponent = {\n  require: ['chart', 'renderer'],\n  on: {\n    panStart(event) {\n      const pos = getLocalPos(event, this.renderer);\n      const startPos = {\n        x: pos.x - event.deltaX,\n        y: pos.y - event.deltaY,\n      };\n      this.currentMove = start(this, startPos);\n      this.currentMove.update(pos);\n    },\n    panMove(event) {\n      if (!this.currentMove) {\n        return;\n      }\n      const pos = getLocalPos(event, this.renderer);\n      this.currentMove.update(pos);\n    },\n    panEnd(event) {\n      if (!this.currentMove) {\n        return;\n      }\n      const pos = getLocalPos(event, this.renderer);\n      this.currentMove.end(pos);\n      this.currentMove = null;\n    },\n    panCancel() {\n      this.currentMove = null;\n    },\n    tap(event) {\n      const pos = getLocalPos(event, this.renderer);\n      const move = start(this, pos);\n      move.end(pos);\n    },\n  },\n  defaultSettings: {\n    settings: {\n      backgroundColor: '#eee',\n      thumbColor: '#ccc',\n      width: 16, // 32 for touch\n    },\n  },\n\n  preferredSize: function preferredSize(rect) {\n    const scrollState = this.chart.scroll(this.settings.scroll).getState();\n    // hide the scrollbar if it is not possible to scroll\n    if (scrollState.viewSize >= scrollState.max - scrollState.min) {\n      const toLargeSize = Math.max(rect.width, rect.height);\n      return toLargeSize;\n    }\n    return this.settings.settings.width;\n  },\n\n  render: function render(h) {\n    const dock = this.settings.layout.dock;\n    const invert = this.settings.settings.invert;\n    const horizontal = dock === 'top' || dock === 'bottom';\n    const lengthAttr = horizontal ? 'width' : 'height';\n\n    const _rect = this.rect;\n    const length = _rect[lengthAttr];\n\n    const scrollState = this.chart.scroll(this.settings.scroll).getState();\n    let thumbStart = (length * (scrollState.start - scrollState.min)) / (scrollState.max - scrollState.min);\n    const thumbRange = (length * scrollState.viewSize) / (scrollState.max - scrollState.min);\n\n    if (invert) {\n      thumbStart = length - thumbStart - thumbRange;\n    }\n\n    return h(\n      'div',\n      {\n        style: {\n          position: 'relative',\n          width: '100%',\n          height: '100%',\n          background: this.settings.settings.backgroundColor,\n          pointerEvents: 'auto',\n        },\n      },\n      [].concat(\n        h('div', {\n          class: 'scroller',\n          style: {\n            position: 'absolute',\n            [horizontal ? 'left' : 'top']: `${thumbStart}px`,\n            [horizontal ? 'top' : 'left']: '25%',\n            [horizontal ? 'height' : 'width']: '50%', // ${width}px\n            [lengthAttr]: `${Math.max(1, thumbRange)}px`,\n            background: this.settings.settings.thumbColor,\n          },\n        })\n      )\n    );\n  },\n\n  renderer: 'dom',\n};\n\nexport default function scrollbar(picasso) {\n  picasso.component('scrollbar', scrollbarComponent);\n}\n","import extend from 'extend';\n\nimport { TARGET_SIZE, VERTICAL } from './brush-range-const';\n\nfunction buildLine({ h, isVertical, value, pos, align, borderHit, state, idx }) {\n  const isAlignStart = align !== 'end';\n  const alignStart = { left: '0', top: '0' };\n  const alignEnd = { right: '0', bottom: '0' };\n  const alignStyle = isAlignStart ? alignStart : alignEnd;\n  let start = 0;\n  let width = '100%';\n  let height = '100%';\n\n  if (state.targetRect && state.settings.bubbles.align === 'start') {\n    width = `${state.targetRect.x + state.targetRect.width}px`;\n    height = `${state.targetRect.y + state.targetRect.height}px`;\n  } else if (state.targetRect && state.settings.bubbles.align === 'end') {\n    start = isVertical ? state.targetRect.x : state.targetRect.y;\n    width = `${state.rect.width - start}px`;\n    height = `${state.rect.height - start}px`;\n  }\n\n  if (!isAlignStart) {\n    pos -= borderHit;\n  }\n\n  // edge\n  return h(\n    'div',\n    {\n      onmouseover(e) {\n        e.srcElement.children[0].style.backgroundColor = '#000';\n        e.srcElement.children[0].style[isVertical ? 'height' : 'width'] = '2px';\n      },\n      onmouseout(e) {\n        e.srcElement.children[0].style.backgroundColor = state.style.line.stroke;\n        e.srcElement.children[0].style[isVertical ? 'height' : 'width'] = '1px';\n      },\n      'data-value': value,\n      'data-key': [state.key, 'edge', idx].join('-'),\n      style: {\n        cursor: isVertical ? 'ns-resize' : 'ew-resize',\n        position: 'absolute',\n        left: isVertical ? `${start}px` : `${pos}px`,\n        top: isVertical ? `${pos}px` : `${start}px`,\n        height: isVertical ? `${borderHit}px` : height,\n        width: isVertical ? width : `${borderHit}px`,\n        pointerEvents: 'auto',\n      },\n    },\n    [\n      // line\n      h('div', {\n        style: extend(\n          {\n            backgroundColor: state.style.line.stroke,\n            position: 'absolute',\n            height: isVertical ? `${1}px` : '100%',\n            width: isVertical ? '100%' : `${1}px`,\n            pointerEvents: 'none',\n          },\n          alignStyle\n        ),\n      }),\n    ]\n  );\n}\n\nfunction buildBubble({ h, isVertical, label, otherValue, rangeIdx, idx, pos, align, state, value }) {\n  const isAlignStart = align !== 'end';\n  const isOutside = state.settings.bubbles.placement === 'outside';\n  let outside = 'none';\n  let bubbleDock;\n  if (isVertical) {\n    bubbleDock = isAlignStart ? 'left' : 'right';\n    if (isOutside) {\n      outside = isAlignStart ? 'translate(-100%,  0px)' : 'translate(100%,  0px)';\n    }\n  } else {\n    bubbleDock = isAlignStart ? 'top' : 'bottom';\n    if (isOutside) {\n      outside = isAlignStart ? 'translate(0px, -100%)' : 'translate(0px,  100%)';\n    }\n  }\n\n  let inEdit = state.edit && state.edit.rangeIdx === rangeIdx && state.edit.bubbleIdx === idx;\n\n  const bubbleStyle = {\n    position: 'relative',\n    borderRadius: `${state.style.bubble.borderRadius}px`,\n    border: `${state.style.bubble.strokeWidth}px solid ${state.style.bubble.stroke}`,\n    backgroundColor: state.style.bubble.fill,\n    color: state.style.bubble.color,\n    fontFamily: state.style.bubble.fontFamily,\n    fontSize: state.style.bubble.fontSize,\n    padding: '4px 8px',\n    textAlign: 'center',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    whiteSpace: 'nowrap',\n    maxWidth: '150px',\n    minWidth: '50px',\n    minHeight: '1em',\n    pointerEvents: 'auto',\n    transform: isVertical ? 'translate(0,-50%)' : 'translate(-50%,0)',\n    cursor: isVertical ? 'ns-resize' : 'ew-resize',\n  };\n\n  let currentBorderColor = state.style.bubble.stroke;\n\n  const bubble = inEdit\n    ? h('input', {\n        type: 'text',\n        value,\n        style: {\n          ...bubbleStyle,\n          textAlign: 'start',\n          textOverflow: '',\n          fontSize: '13px', // TODO - make it styleable\n        },\n        onkeyup(e) {\n          if (e.key === 'Enter') {\n            e.preventDefault();\n            e.stopPropagation();\n            const newValue = parseFloat(e.target.value);\n            if (isNaN(newValue)) {\n              currentBorderColor = 'rgba(230, 78, 78, 0.6)';\n              e.target.style.border = `${state.style.bubble.strokeWidth}px solid ${currentBorderColor}`;\n            } else {\n              state.onEditConfirmed(rangeIdx, newValue, otherValue);\n            }\n          } else if (e.key === 'Escape') {\n            e.preventDefault();\n            e.stopPropagation();\n            state.onEditCanceled();\n          }\n        },\n      })\n    : h(\n        'div',\n        {\n          'data-key': [state.key, 'bubble', rangeIdx].join('-'),\n          'data-other-value': otherValue,\n          'data-idx': rangeIdx,\n          'data-bidx': idx,\n          style: bubbleStyle,\n        },\n        [label]\n      );\n\n  // bubble wrapper\n  return h(\n    'div',\n    {\n      style: {\n        position: 'absolute',\n        [bubbleDock]: '0',\n        [isVertical ? 'top' : 'left']: `${pos}px`,\n        transform: outside,\n      },\n    },\n    [\n      // bubble\n      bubble,\n    ]\n  );\n}\n\nfunction buildArea({ h, isVertical, top, height, color, on, opacity }) {\n  return h(\n    'div',\n    extend(\n      {\n        style: {\n          backgroundColor: color,\n          opacity,\n          position: 'absolute',\n          left: isVertical ? 0 : `${top}px`,\n          top: isVertical ? `${top}px` : 0,\n          height: isVertical ? `${height}px` : '100%',\n          width: isVertical ? '100%' : `${height}px`,\n          pointerEvents: 'auto',\n        },\n      },\n      on\n    ),\n    []\n  );\n}\n\nexport default function buildRange({ borderHit, els, isVertical, state, vStart, vEnd, idx }) {\n  let targetOffset = 0;\n  if (state.targetRect) {\n    targetOffset = isVertical ? state.targetRect.y : state.targetRect.x;\n  }\n  const hasScale = !!state.scale;\n  const start = hasScale ? state.scale.norm(vStart) * state.size : vStart;\n  const end = hasScale ? state.scale.norm(vEnd) * state.size : vEnd;\n  const height = Math.abs(start - end);\n  const top = Math.min(start, end) + targetOffset;\n  const bottom = top + height;\n\n  if (state.targetRect) {\n    const target = state.targetFillRect || state.targetRect;\n    const targetSize = isVertical ? target.height : target.width;\n    const targetStart = hasScale ? state.scale.norm(vStart) * targetSize : vStart;\n    const targetEnd = hasScale ? state.scale.norm(vEnd) * targetSize : vEnd;\n    const targetHeight = Math.abs(targetStart - targetEnd);\n    const targetTop = Math.min(targetStart, targetEnd);\n    const targetArea = {\n      h: state.h,\n      isVertical,\n      top: targetTop,\n      height: targetHeight,\n      color: state.style.target.fill,\n      opacity: state.style.target.opacity,\n    };\n    if (state.style.target.opacity < 0.8) {\n      targetArea.on = {\n        onmouseover(e) {\n          e.srcElement.style.opacity = state.style.target.opacity + 0.1;\n        },\n        onmouseout(e) {\n          e.srcElement.style.opacity = state.style.target.opacity;\n        },\n      };\n    }\n    els.push(\n      state.h(\n        'div',\n        {\n          style: {\n            position: 'absolute',\n            left: `${target.x}px`,\n            top: `${target.y}px`,\n            height: `${target.height}px`,\n            width: `${target.width}px`,\n          },\n        },\n        [buildArea(targetArea)]\n      )\n    );\n  }\n\n  // active range area\n  // els.push(buildArea({\n  //   h: state.h,\n  //   isVertical,\n  //   top,\n  //   height,\n  //   color: state.settings.fill\n  // }));\n\n  const valStart = start < end ? vStart : vEnd;\n  const valEnd = start < end ? vEnd : vStart;\n  const [min, max] = hasScale ? state.scale.domain() : [Math.min(vStart, vEnd), Math.max(vStart, vEnd)];\n\n  const isStartVisible = valStart + 1e-5 >= min && valStart - 1e-5 <= max; // accept minor floating point difference\n  const isEndVisible = valEnd - 1e-5 <= max && valEnd + 1e-5 >= min;\n\n  if (isStartVisible) {\n    els.push(\n      buildLine({\n        h: state.h,\n        isVertical,\n        borderHit,\n        value: valStart,\n        pos: top,\n        align: 'start',\n        state,\n        idx,\n      })\n    );\n  }\n\n  if (isEndVisible) {\n    els.push(\n      buildLine({\n        h: state.h,\n        isVertical,\n        borderHit,\n        value: valEnd,\n        pos: bottom,\n        align: 'end',\n        state,\n        idx,\n      })\n    );\n  }\n\n  const bubbles = state.settings.bubbles;\n  if (bubbles && bubbles.show) {\n    const fontSize = bubbles.fontSize;\n    const fontFamily = bubbles.fontFamily;\n    const fill = bubbles.fill;\n    const style = {\n      fontSize,\n      fontFamily,\n      color: fill,\n    };\n\n    const range = [vStart, vEnd];\n\n    if (isStartVisible) {\n      els.push(\n        buildBubble({\n          h: state.h,\n          isVertical,\n          align: bubbles.align,\n          style,\n          rangeIdx: idx,\n          idx: 0,\n          otherValue: valEnd,\n          value: valStart,\n          label: `${state.format(valStart, range)}`,\n          pos: top,\n          state,\n        })\n      );\n    }\n\n    if (isEndVisible) {\n      els.push(\n        buildBubble({\n          h: state.h,\n          isVertical,\n          align: bubbles.align,\n          style,\n          rangeIdx: idx,\n          idx: 1,\n          otherValue: valStart,\n          value: valEnd,\n          label: `${state.format(valEnd, range)}`,\n          pos: bottom,\n          state,\n        })\n      );\n    }\n  }\n}\n\nexport function getMoveDelta(state) {\n  const posDelta = state.active.limitHigh - state.active.end;\n  const negDelta = state.active.limitLow - state.active.start;\n  let delta = state.current - state.start;\n  if (delta < 0) {\n    delta = Math.max(delta, negDelta);\n  } else {\n    delta = Math.min(delta, posDelta);\n  }\n\n  return delta;\n}\n\nexport function nodes(state) {\n  let els = [];\n\n  const isVertical = state.direction === VERTICAL;\n\n  if (Array.isArray(state.ranges)) {\n    // add all other ranges\n    state.ranges.forEach((r, i) => {\n      if (!state.active || i !== state.active.idx) {\n        buildRange({\n          borderHit: TARGET_SIZE,\n          els,\n          isVertical,\n          state,\n          vStart: Math.min(r.min, r.max),\n          vEnd: Math.max(r.min, r.max),\n          idx: i,\n        });\n      }\n    });\n  }\n\n  if (state.active) {\n    // add active range\n    let vStart = state.start;\n    let vEnd = state.current;\n    if (state.active.idx !== -1) {\n      if (state.active.mode === 'foo') {\n        vStart = Math.min(state.active.start, state.active.end);\n        vEnd = Math.max(state.active.start, state.active.end);\n      } else if (state.active.mode === 'modify') {\n        vStart = Math.min(state.start, state.current);\n        vEnd = Math.max(state.start, state.current);\n      } else {\n        const delta = getMoveDelta(state);\n        vStart = state.active.start + delta;\n        vEnd = state.active.end + delta;\n      }\n    }\n\n    buildRange({\n      borderHit: TARGET_SIZE,\n      els,\n      isVertical,\n      state,\n      vStart,\n      vEnd,\n      idx: state.active.idx,\n    });\n  }\n\n  return els;\n}\n","const TARGET_SIZE = 5;\nconst VERTICAL = 0;\nconst HORIZONTAL = 1;\n\nexport { TARGET_SIZE, VERTICAL, HORIZONTAL };\n","import extend from 'extend';\nimport { testRectPoint } from '../../../core/math/narrow-phase-collision';\n\nfunction rangelimits(state) {\n  return {\n    min: state.scale.min(),\n    max: state.scale.max(),\n  };\n}\n\nfunction areaLimits(state) {\n  return {\n    min: 0,\n    max: state.direction ? state.rect.width : state.rect.height,\n  };\n}\n\nfunction findActive(state, value, limits) {\n  let rs = state.ranges;\n  let i;\n  let activeIdx = -1;\n  for (i = 0; i < rs.length; i++) {\n    if (rs[i].min <= value && value <= rs[i].max) {\n      activeIdx = i;\n      limits.min = i ? rs[i - 1].max : limits.min;\n      limits.max = i + 1 < rs.length ? rs[i + 1].min : limits.max;\n      break;\n    } else if (value < rs[i].min) {\n      limits.max = rs[i].min;\n      limits.min = i ? rs[i - 1].max : limits.min;\n      break;\n    }\n  }\n  if (activeIdx === -1 && rs.length && i >= rs.length) {\n    limits.min = rs[rs.length - 1].max;\n  }\n\n  let activeRange;\n\n  if (activeIdx !== -1) {\n    activeRange = {\n      idx: activeIdx,\n      start: rs[activeIdx].min,\n      end: rs[activeIdx].max,\n      limitLow: limits.min,\n      limitHigh: limits.max,\n      mode: 'foo',\n    };\n  }\n  state.active = activeRange;\n}\n\nexport function startArea({ state, e, renderer, ranges, targetSize }) {\n  if (state.started) {\n    return;\n  }\n  const x = e.center.x - e.deltaX;\n  const y = e.center.y - e.deltaY;\n  let target = document.elementFromPoint(x, y);\n  if (!renderer.element().contains(target)) {\n    target = null;\n  }\n\n  const tempState = {\n    started: true,\n  };\n\n  state.offset = renderer.element().getBoundingClientRect();\n  state.ranges = ranges(state);\n  const relX = x - state.offset.left; // coordinate relative renderer\n  const relY = y - state.offset.top;\n  const startPoint = e.center[state.cssCoord.coord] - e[state.cssCoord.pos] - state.offset[state.cssCoord.offset];\n  const relStart = e.center[state.cssCoord.coord] - state.offset[state.cssCoord.offset];\n  let v = relStart;\n  let vStart = startPoint;\n\n  tempState.start = startPoint;\n  tempState.current = relStart;\n\n  let rs = state.ranges;\n  const limits = areaLimits(state);\n  let i;\n  let activeIdx = -1;\n  if (target && target.hasAttribute('data-idx')) {\n    activeIdx = parseInt(target.getAttribute('data-idx'), 10);\n    limits.min = activeIdx > 0 ? rs[activeIdx - 1].max : limits.min;\n    limits.max = activeIdx + 1 < rs.length ? rs[activeIdx + 1].min : limits.max;\n  } else {\n    for (i = 0; i < rs.length; i++) {\n      if (rs[i].min <= vStart && vStart <= rs[i].max) {\n        activeIdx = i;\n        limits.min = i ? rs[i - 1].max : limits.min;\n        limits.max = i + 1 < rs.length ? rs[i + 1].min : limits.max;\n        break;\n      } else if (vStart < rs[i].min) {\n        limits.max = rs[i].min;\n        limits.min = i ? rs[i - 1].max : limits.min;\n        break;\n      }\n    }\n    if (activeIdx === -1 && rs.length && i >= rs.length) {\n      limits.min = rs[rs.length - 1].max;\n    }\n  }\n\n  if (activeIdx === -1 && !state.multi) {\n    tempState.ranges = [];\n    limits.min = 0;\n    limits.max = state.direction ? state.rect.width : state.rect.height;\n  }\n  let activeRange;\n\n  if (activeIdx !== -1) {\n    activeRange = {\n      idx: activeIdx,\n      start: rs[activeIdx].min,\n      end: rs[activeIdx].max,\n      limitLow: limits.min,\n      limitHigh: limits.max,\n      mode: 'move',\n    };\n\n    if (target && target.hasAttribute('data-other-value')) {\n      tempState.start = parseFloat(target.getAttribute('data-other-value'));\n      activeRange.mode = 'modify';\n    } else {\n      let pxStart = activeRange.start;\n      let pxEnd = activeRange.end;\n      if (Math.abs(startPoint - pxStart) <= targetSize) {\n        tempState.start = activeRange.end;\n        activeRange.mode = 'modify';\n      } else if (Math.abs(startPoint - pxEnd) <= targetSize) {\n        tempState.start = activeRange.start;\n        activeRange.mode = 'modify';\n      }\n    }\n  } else {\n    activeRange = {\n      idx: -1,\n      start: vStart,\n      end: v,\n      limitLow: limits.min,\n      limitHigh: limits.max,\n      mode: 'current',\n    };\n  }\n\n  tempState.active = activeRange;\n\n  if (activeRange.mode !== 'modify' && state.targetRect && !testRectPoint(state.targetRect, { x: relX, y: relY })) {\n    // do nothing\n  } else {\n    Object.keys(tempState).forEach((key) => (state[key] = tempState[key]));\n  }\n}\n\nexport function start({ state, e, renderer, ranges, targetSize }) {\n  if (state.started) {\n    return;\n  }\n  state.edit = null;\n  const x = e.center.x - e.deltaX;\n  const y = e.center.y - e.deltaY;\n  let target = document.elementFromPoint(x, y);\n  if (!renderer.element().contains(target)) {\n    target = null;\n  }\n\n  const tempState = {\n    started: true,\n  };\n\n  state.offset = extend({}, renderer.element().getBoundingClientRect());\n  const relX = x - state.offset.left; // coordinate relative renderer\n  const relY = y - state.offset.top;\n  state.offset.left += state.targetRect ? state.targetRect.x : 0; // make offset relative to targetRect\n  state.offset.top += state.targetRect ? state.targetRect.y : 0;\n  state.ranges = ranges(state, state.fauxBrushInstance || state.brushInstance);\n  const startPoint = e.center[state.cssCoord.coord] - e[state.cssCoord.pos] - state.offset[state.cssCoord.offset];\n  const relStart = e.center[state.cssCoord.coord] - state.offset[state.cssCoord.offset];\n  tempState.current = state.scale.normInvert(relStart / state.size);\n  tempState.start = state.scale.normInvert(startPoint / state.size);\n\n  let rs = state.ranges;\n  const limits = rangelimits(state);\n  let i;\n  let activeIdx = -1;\n  if (target && target.hasAttribute('data-idx')) {\n    activeIdx = parseInt(target.getAttribute('data-idx'), 10);\n    limits.min = activeIdx > 0 ? rs[activeIdx - 1].max : limits.min;\n    limits.max = activeIdx + 1 < rs.length ? rs[activeIdx + 1].min : limits.max;\n  } else {\n    for (i = 0; i < rs.length; i++) {\n      if (rs[i].min <= tempState.start && tempState.start <= rs[i].max) {\n        activeIdx = i;\n        limits.min = i ? rs[i - 1].max : limits.min;\n        limits.max = i + 1 < rs.length ? rs[i + 1].min : limits.max;\n        break;\n      } else if (tempState.start < rs[i].min) {\n        limits.max = rs[i].min;\n        limits.min = i ? rs[i - 1].max : limits.min;\n        break;\n      }\n    }\n    if (activeIdx === -1 && rs.length && i >= rs.length) {\n      limits.min = rs[rs.length - 1].max;\n    }\n  }\n\n  if (activeIdx === -1 && !state.multi) {\n    tempState.ranges = [];\n    limits.min = state.scale.min();\n    limits.max = state.scale.max();\n  }\n  let activeRange;\n\n  if (activeIdx !== -1) {\n    activeRange = {\n      idx: activeIdx,\n      start: rs[activeIdx].min,\n      end: rs[activeIdx].max,\n      limitLow: limits.min,\n      limitHigh: limits.max,\n      mode: 'move',\n    };\n\n    if (target && target.hasAttribute('data-other-value')) {\n      tempState.start = parseFloat(target.getAttribute('data-other-value'));\n      activeRange.mode = 'modify';\n    } else {\n      let pxStart = state.scale.norm(activeRange.start) * state.size;\n      let pxEnd = state.scale.norm(activeRange.end) * state.size;\n      if (Math.abs(startPoint - pxStart) <= targetSize) {\n        tempState.start = activeRange.end;\n        activeRange.mode = 'modify';\n      } else if (Math.abs(startPoint - pxEnd) <= targetSize) {\n        tempState.start = activeRange.start;\n        activeRange.mode = 'modify';\n      }\n    }\n  } else {\n    activeRange = {\n      idx: -1,\n      start: tempState.start,\n      end: tempState.current,\n      limitLow: limits.min,\n      limitHigh: limits.max,\n      mode: 'current',\n    };\n  }\n\n  tempState.active = activeRange;\n\n  if (activeRange.mode !== 'modify' && state.targetRect && !testRectPoint(state.targetRect, { x: relX, y: relY })) {\n    // do nothing\n  } else {\n    Object.keys(tempState).forEach((key) => (state[key] = tempState[key]));\n  }\n}\nexport function end(state, ranges) {\n  state.started = false;\n  state.ranges = ranges(state, state.fauxBrushInstance || state.brushInstance);\n  const limits = rangelimits(state);\n  findActive(state, state.current, limits);\n}\n\nexport function endArea(state, ranges) {\n  state.started = false;\n  state.ranges = ranges(state);\n  const limits = areaLimits(state);\n  findActive(state, state.current, limits);\n}\n\nexport function move(state, e) {\n  const relY = e.center[state.cssCoord.coord] - state.offset[state.cssCoord.offset];\n  const rel = relY / state.size;\n  const v = state.scale.normInvert(rel);\n  state.current = Math.max(Math.min(v, state.active.limitHigh), state.active.limitLow);\n}\n\nexport function moveArea(state, e) {\n  const rel = e.center[state.cssCoord.coord] - state.offset[state.cssCoord.offset];\n\n  state.current = Math.max(Math.min(rel, state.active.limitHigh), state.active.limitLow);\n}\n","import { nodes, getMoveDelta } from './brush-range-node-builder';\nimport { start, end, move } from './brush-range-interaction';\nimport linear from '../../../core/scales/linear';\nimport { scaleWithSize } from '../../../core/scales';\nimport brushFactory from '../../../core/brush';\nimport { TARGET_SIZE, VERTICAL, HORIZONTAL } from './brush-range-const';\nimport { pointsToRect, rectToPoints } from '../../../core/geometry/util';\n\nfunction render(state) {\n  state.renderer.render(nodes(state));\n}\n\nfunction ranges(state, brush) {\n  if (!brush || !brush.isActive()) {\n    return [];\n  }\n\n  const sourceData = state.scale.data();\n  const sourceFields = sourceData ? sourceData.fields || [] : [];\n  const sources = sourceFields.map((field) => field.id());\n  const rangeBrush = brush.brushes().filter((f) => f.type === 'range' && sources.indexOf(f.id) !== -1)[0];\n\n  if (!rangeBrush) {\n    return [];\n  }\n\n  return rangeBrush.brush.ranges();\n}\n\nfunction setRanges(state) {\n  let rs = state.ranges.map((r) => ({ min: r.min, max: r.max }));\n  if (state.active.idx !== -1) {\n    if (state.active.mode === 'modify') {\n      rs[state.active.idx].min = Math.min(state.start, state.current);\n      rs[state.active.idx].max = Math.max(state.start, state.current);\n    } else {\n      const delta = getMoveDelta(state);\n      rs[state.active.idx].min += delta;\n      rs[state.active.idx].max += delta;\n    }\n  } else {\n    rs.push({\n      min: Math.min(state.start, state.current),\n      max: Math.max(state.start, state.current),\n    });\n  }\n\n  const scaleData = state.scale.data();\n  if (scaleData && scaleData.fields) {\n    scaleData.fields.forEach((field) => {\n      if (state.fauxBrushInstance) {\n        let ordRS = ranges(state, state.fauxBrushInstance);\n        let oldValues = state.findValues(ordRS);\n        let values = state.findValues(rs);\n\n        let addedValues = values.filter((v) => oldValues.indexOf(v) === -1);\n        let removedValues = oldValues.filter((v) => values.indexOf(v) === -1);\n\n        let addItems = addedValues.map((v) => ({ key: field.id(), value: v }));\n        let removeItems = removedValues.map((v) => ({ key: field.id(), value: v }));\n\n        state.brushInstance.addAndRemoveValues(addItems, removeItems);\n\n        state.fauxBrushInstance.setRange(field.id(), rs);\n      } else {\n        state.brushInstance.setRange(field.id(), rs);\n      }\n    });\n  }\n}\n\nfunction setEditedRanges(state, idx, startValue, endValue) {\n  let rs = state.ranges.map((r) => ({ min: r.min, max: r.max }));\n  const limitMin = state.scale.min();\n  const limitMax = state.scale.max();\n  rs[idx] = {\n    min: Math.max(limitMin, Math.min(startValue, endValue)),\n    max: Math.min(limitMax, Math.max(startValue, endValue)),\n  };\n  state.ranges[idx] = { ...rs[idx] };\n\n  const scaleData = state.scale.data();\n  if (scaleData && scaleData.fields) {\n    scaleData.fields.forEach((field) => {\n      if (!state.fauxBrushInstance) {\n        state.brushInstance.setRange(field.id(), rs);\n      }\n    });\n  }\n}\n\nfunction findClosest(value, scale) {\n  let name;\n  let minDist = Infinity;\n  const domain = scale.domain();\n  const halfBandwidth = scale.bandwidth() / 2;\n  for (let i = 0; i < domain.length; ++i) {\n    const d = Math.abs(value - halfBandwidth - scale(domain[i]));\n    if (d < minDist) {\n      minDist = d;\n      name = domain[i];\n    }\n  }\n  return name;\n}\n\nfunction findClosestLabel(value, scale) {\n  const ticks = scale.ticks();\n  const idx = scale.domain().indexOf(findClosest(value, scale));\n  return idx !== -1 ? ticks[idx].label : '-';\n}\n\nfunction rangesOverlap(r1, r2) {\n  return Math.min(...r1) <= Math.max(...r2) && Math.max(...r1) >= Math.min(...r2);\n}\n\nfunction findValues(rangesValues, scale) {\n  const domain = scale.domain();\n  const scaleRange = scale.range();\n  const values = [];\n  rangesValues.forEach((range) => {\n    if (!rangesOverlap(scaleRange, [range.min, range.max])) {\n      return;\n    }\n    const startIdx = domain.indexOf(findClosest(range.min, scale));\n    const endIdx = domain.indexOf(findClosest(range.max, scale));\n    values.push.apply(\n      values,\n      domain.slice(Math.min(startIdx, endIdx), Math.max(startIdx, endIdx) + 1)\n    ); /* eslint prefer-spread:0 */\n  });\n\n  return values;\n}\n\nfunction resolveNodeBounds(targetNodes) {\n  const points = targetNodes.reduce((ary, node) => {\n    ary.push(...rectToPoints(node.bounds));\n    return ary;\n  }, []);\n  return pointsToRect(points);\n}\n\nfunction resolveTarget(ctx) {\n  const resolved = {\n    targetRect: null,\n    targetFillRect: null,\n    scale: null,\n    size: null,\n  };\n  const stngs = ctx.settings.settings;\n  const targets =\n    stngs.target &&\n    (stngs.target.components || (stngs.target.component ? [stngs.target.component] : []))\n      .map((c) => ctx.chart.component(c))\n      .filter((c) => !!c && !!c.rect);\n  const targetNodes = stngs.target && stngs.target.selector ? ctx.chart.findShapes(stngs.target.selector) : [];\n  const targetFillNodes =\n    stngs.target && stngs.target.fillSelector ? ctx.chart.findShapes(stngs.target.fillSelector) : [];\n  if (targetNodes.length > 0) {\n    const bounds = resolveNodeBounds(targetNodes);\n    resolved.size = bounds[ctx.state.direction === VERTICAL ? 'height' : 'width'];\n    resolved.scale = scaleWithSize(ctx.chart.scale(stngs.scale), resolved.size);\n    resolved.targetRect = bounds;\n    if (targetFillNodes.length > 0) {\n      const fillBounds = resolveNodeBounds(targetFillNodes);\n      resolved.targetFillRect = fillBounds;\n    }\n  } else if (targets && targets.length > 0) {\n    const targetRect = targets.slice(1).reduce(\n      (prev, curr) => ({\n        x0: Math.min(prev.x0, curr.rect.computedInner.x),\n        y0: Math.min(prev.y0, curr.rect.computedInner.y),\n        x1: Math.max(prev.x1, curr.rect.computedInner.x + curr.rect.computedInner.width),\n        y1: Math.max(prev.y1, curr.rect.computedInner.y + curr.rect.computedInner.height),\n      }),\n      {\n        x0: targets[0].rect.computedInner.x,\n        y0: targets[0].rect.computedInner.y,\n        x1: targets[0].rect.computedInner.x + targets[0].rect.computedInner.width,\n        y1: targets[0].rect.computedInner.y + targets[0].rect.computedInner.height,\n      }\n    );\n\n    resolved.targetRect = {\n      x: targetRect.x0 - ctx.state.rect.x,\n      y: targetRect.y0 - ctx.state.rect.y,\n      width: targetRect.x1 - targetRect.x0,\n      height: targetRect.y1 - targetRect.y0,\n    };\n  }\n\n  return resolved;\n}\n\n/**\n * @typedef {object} ComponentBrushRange.settings\n * @property {string|object} brush - Brush context to apply changes to\n * @property {string} scale - Scale to extract data from\n * @property {string} [direction=vertical] - Rendering direction [horizontal|vertical]\n * @property {object} [bubbles]\n * @property {boolean} [bubbles.show=true] - True to show label bubble, false otherwise\n * @property {string} [bubbles.align=start] - Where to anchor bubble [start|end]\n * @property {function} [bubbles.label] - Callback function for the labels\n * @property {object} [target]\n * @property {string[]} [target.components] - Render matching overlay on target components\n * @property {string} [target.selector] - Instead of targeting a component, target one or more shapes\n * @property {string} [target.fillSelector] - Target a subset of the selector as fill area. Only applicable if `selector` property is set\n */\n\n/**\n * @private\n * @typedef {object} ComponentBrushRangeStyle\n * @property {object} [bubble]\n * @property {string} [bubble.fontSize]\n * @property {string} [bubble.fontFamily]\n * @property {string} [bubble.fill]\n * @property {string} [bubble.color]\n * @property {string} [bubble.stroke]\n * @property {number} [bubble.strokeWidth]\n * @property {number} [bubble.borderRadius]\n * @property {object} [line]\n * @property {string} [line.stroke]\n * @property {number} [line.strokeWidth]\n * @property {object} [target]\n * @property {string} [target.fill]\n * @property {number} [target.strokeWidth]\n * @property {number} [target.opacity]\n */\n\nconst brushRangeComponent = {\n  require: ['chart', 'settings', 'renderer'],\n  defaultSettings: {\n    settings: {\n      bubbles: {\n        show: true,\n        align: 'start',\n      },\n    },\n    style: {\n      bubble: '$label-overlay',\n      line: '$shape-guide--inverted',\n      target: '$selection-area-target',\n    },\n  },\n  renderer: 'dom',\n  on: {\n    rangeStart(e) {\n      this.start(e);\n    },\n    rangeMove(e) {\n      this.move(e);\n    },\n    rangeEnd(e) {\n      this.end(e);\n    },\n    rangeClear(e) {\n      this.clear(e);\n    },\n    bubbleStart(e) {\n      this.bubbleStart(e);\n    },\n  },\n  created() {\n    this.state = {\n      key: this.settings.key || 'brush-range',\n    };\n  },\n  beforeRender(opts) {\n    this.state.rect = opts.size.computedInner;\n  },\n  renderRanges() {\n    if (!this.state.started) {\n      this.state.ranges = ranges(this.state, this.state.brushInstance);\n      this.state.active = null;\n      render(this.state);\n    }\n  },\n  render(h) {\n    const stngs = this.settings.settings;\n    this.state.direction = stngs.direction === 'vertical' ? VERTICAL : HORIZONTAL;\n    const offset = this.renderer.element().getBoundingClientRect();\n    const size = this.state.rect[this.state.direction === VERTICAL ? 'height' : 'width'];\n    let scale = scaleWithSize(this.chart.scale(stngs.scale), size);\n\n    const target = resolveTarget(this);\n    scale = target.scale ? target.scale : scale;\n    this.state.targetRect = target.targetRect;\n    this.state.targetFillRect = target.targetFillRect;\n    this.state.size = target.size === null ? size : target.size;\n\n    this.state.settings = stngs;\n    this.state.style = this.style;\n    this.state.offset = offset;\n    this.state.brush = typeof stngs.brush === 'object' ? stngs.brush.context : stngs.brush;\n    this.state.brushInstance = this.chart.brush(this.state.brush);\n    this.state.renderer = this.renderer;\n    this.state.multi = !!stngs.multiple;\n    this.state.h = h;\n    this.state.onEditConfirmed = (rangeIdx, value, otherValue) => {\n      this.state.edit = null;\n      setEditedRanges(this.state, rangeIdx, value, otherValue);\n      this.emit('bubbleEnd');\n      render(this.state);\n    };\n    this.state.onEditCanceled = () => {\n      this.state.edit = null;\n      render(this.state);\n    };\n    this.state.cssCoord = {\n      offset: this.state.direction === VERTICAL ? 'top' : 'left',\n      coord: this.state.direction === VERTICAL ? 'y' : 'x',\n      pos: this.state.direction === VERTICAL ? 'deltaY' : 'deltaX',\n    };\n    this.state.format =\n      typeof stngs.bubbles.label === 'function'\n        ? (v, r) =>\n            stngs.bubbles.label.call(undefined, {\n              datum: v,\n              data: r,\n              scale,\n              resources: {\n                scale: this.chart.scale,\n                formatter: this.chart.formatter,\n              },\n            })\n        : false;\n\n    if (!{}.hasOwnProperty.call(scale, 'norm')) {\n      // Non-linear scale if norm method is unavailable\n      this.state.editable = false;\n      this.state.scale = linear();\n      this.state.scale.data = scale.data;\n      if (!this.state.format) {\n        this.state.format = (v, r) => {\n          if (!rangesOverlap(scale.range(), r)) {\n            return '-';\n          }\n          return findClosestLabel(v, scale);\n        };\n      }\n      this.state.fauxBrushInstance = brushFactory();\n      this.state.findValues = (valueRanges) => findValues(valueRanges, scale);\n    } else {\n      this.state.editable = true;\n      this.state.observeBrush = typeof stngs.brush === 'object' ? stngs.brush.observe : false;\n      this.state.fauxBrushInstance = null;\n      this.state.findValues = null;\n      this.state.scale = scale;\n      const scaleData = this.state.scale.data();\n      if (!this.state.format && scaleData && scaleData.fields && scaleData.fields[0]) {\n        this.state.format = scaleData.fields[0].formatter();\n      }\n    }\n\n    this.state.ranges = ranges(this.state, this.state.brushInstance);\n\n    return this.state.observeBrush || this.state.sourcedFromThisComponent ? [nodes(this.state)] : [];\n  },\n  mounted() {\n    if (this.state.observeBrush && this.state.brushInstance) {\n      this.state.brushInstance.on('update', this.renderRanges);\n    }\n  },\n  beforeDestroy() {\n    if (this.state.observeBrush && this.state.brushInstance) {\n      this.state.brushInstance.removeListener('update', this.renderRanges);\n    }\n  },\n  start(e) {\n    start({\n      e,\n      state: this.state,\n      renderer: this.renderer,\n      ranges,\n      targetSize: TARGET_SIZE,\n    });\n  },\n  end() {\n    if (!this.state.started) {\n      return;\n    }\n    end(this.state, ranges);\n    render(this.state);\n    this.state.sourcedFromThisComponent = true;\n    this.state.active = null;\n  },\n  move(e) {\n    if (!this.state.started) {\n      return;\n    }\n    move(this.state, e);\n    setRanges(this.state);\n    render(this.state);\n  },\n  clear() {\n    if (this.state.fauxBrushInstance) {\n      this.state.fauxBrushInstance.clear();\n    }\n    this.state.renderer.render([]);\n    this.state.started = false;\n    this.state.active = null;\n    this.state.sourcedFromThisComponent = false;\n  },\n  bubbleStart(e) {\n    if (!this.state.editable) {\n      return;\n    }\n    const ee = e.srcEvent || e;\n\n    const target = ee.target;\n    const ed = {\n      rangeIdx: parseInt(target.getAttribute('data-idx'), 10),\n      bubbleIdx: parseInt(target.getAttribute('data-bidx'), 10),\n    };\n    if (isNaN(ed.rangeIdx) || JSON.stringify(ed) === JSON.stringify(this.state.edit)) {\n      return;\n    }\n    this.state.edit = ed;\n\n    ee.stopPropagation();\n    ee.stopImmediatePropagation();\n    ee.preventDefault();\n\n    const wrapper = target.parentNode;\n\n    render(this.state);\n    const inputEl = wrapper.querySelector('input');\n    inputEl.focus();\n    inputEl.select();\n  },\n};\n\nexport default brushRangeComponent;\n","import { getMoveDelta, nodes } from './brush-range-node-builder';\nimport { startArea, moveArea, endArea } from './brush-range-interaction';\nimport rangeCollection from '../../../core/brush/range-collection';\nimport { TARGET_SIZE, VERTICAL, HORIZONTAL } from './brush-range-const';\n\nfunction render(state) {\n  state.renderer.render(nodes(state));\n}\n\nfunction ranges(state) {\n  return state.rc.ranges();\n}\n\nfunction shapesFromRange(state, brushRange) {\n  const shapeAt = {\n    x: state.direction ? brushRange.min + state.rect.x : state.rect.x,\n    y: state.direction ? state.rect.y : brushRange.min + state.rect.y,\n    width: state.direction ? brushRange.max - brushRange.min : state.rect.width + state.rect.x,\n    height: state.direction ? state.rect.height + state.rect.y : brushRange.max - brushRange.min,\n  };\n  return state.chart.shapesAt(shapeAt, state.settings.brush);\n}\n\nfunction brushFromShape(state, newShapes) {\n  state.chart.brushFromShapes(newShapes, state.settings.brush);\n}\n\nfunction setRanges(state) {\n  const rs = state.ranges.map((r) => ({ min: r.min, max: r.max }));\n\n  if (state.active.idx !== -1) {\n    if (state.active.mode === 'modify') {\n      rs[state.active.idx].min = Math.min(state.start, state.current);\n      rs[state.active.idx].max = Math.max(state.start, state.current);\n    } else {\n      const delta = getMoveDelta(state);\n      rs[state.active.idx].min = state.active.start + delta;\n      rs[state.active.idx].max = state.active.end + delta;\n    }\n  } else {\n    rs.push({\n      min: Math.min(state.start, state.current),\n      max: Math.max(state.start, state.current),\n    });\n  }\n\n  state.rc.set(rs);\n\n  const shapes = [];\n  rs.forEach((range) => {\n    shapes.push(...shapesFromRange(state, range));\n  });\n\n  brushFromShape(state, shapes);\n}\n\nfunction getBubbleLabel(state, value, range) {\n  const min = Math.min(...range);\n  const max = Math.max(...range);\n  const shapeAt = {\n    x: state.direction ? min + state.rect.x : state.rect.x,\n    y: state.direction ? state.rect.y : min + state.rect.y,\n    width: state.direction ? max - min : state.rect.width + state.rect.x,\n    height: state.direction ? state.rect.height + state.rect.y : max - min,\n  };\n\n  const shapes = state.chart.shapesAt(shapeAt, state.settings.brush);\n\n  if (shapes.length === 0) {\n    return '-';\n  }\n\n  const labelShape = shapes.reduce((s0, s1) => {\n    // Min value\n    const bounds0 = s0.bounds;\n    const bounds1 = s1.bounds;\n\n    if (value === min) {\n      if (bounds0[state.cssCoord.coord] <= bounds1[state.cssCoord.coord]) {\n        return s0;\n      }\n      return s1;\n    }\n\n    // Max value\n    if (\n      bounds0[state.cssCoord.coord] + bounds0[state.cssCoord.area] >=\n      bounds1[state.cssCoord.coord] + bounds1[state.cssCoord.area]\n    ) {\n      return s0;\n    }\n    return s1;\n  });\n\n  const compConfig = state.settings.brush.components.reduce((c0, c1) => (c0.key === labelShape.key ? c0 : c1));\n\n  if (typeof state.settings.bubbles.label === 'function') {\n    return state.settings.bubbles.label(labelShape.data);\n  }\n  if (Array.isArray(compConfig.data) && compConfig.data.length) {\n    return labelShape.data[compConfig.data[0]].label;\n  }\n\n  return labelShape.data && labelShape.data.label ? labelShape.data.label : '-';\n}\n\n/**\n * @typedef {object} ComponentBrushAreaDir.settings\n * @property {object} brush\n * @property {BrushTargetConfig[]} brush.components\n * @property {string} [direction=vertical] - Rendering direction [horizontal|vertical]\n * @property {object} [bubbles]\n * @property {boolean} [bubbles.show=true] - True to show label bubble, false otherwise\n * @property {string} [bubbles.align=start] - Where to anchor bubble [start|end]\n * @property {function} [bubbles.label] - Callback function for the labels\n * @property {object} [target]\n * @property {string[]} [target.components] - Render matching overlay on target components\n */\n\n/**\n * @private\n * @typedef {object} ComponentBrushAreaDirStyle\n * @property {object} [bubble]\n * @property {string} [bubble.fontSize]\n * @property {string} [bubble.fontFamily]\n * @property {string} [bubble.fill]\n * @property {string} [bubble.color]\n * @property {string} [bubble.stroke]\n * @property {number} [bubble.strokeWidth]\n * @property {number} [bubble.borderRadius]\n * @property {object} [line]\n * @property {string} [line.stroke]\n * @property {number} [line.strokeWidth]\n * @property {object} [target]\n * @property {string} [target.fill]\n * @property {number} [target.strokeWidth]\n * @property {number} [target.opacity]\n */\n\nconst brushAreaDirectionalComponent = {\n  require: ['chart', 'settings', 'renderer'],\n  defaultSettings: {\n    settings: {\n      bubbles: {\n        show: true,\n        align: 'start',\n      },\n    },\n    style: {\n      bubble: '$label-overlay',\n      line: '$shape-guide--inverted',\n      target: '$selection-area-target',\n    },\n  },\n  renderer: 'dom',\n  on: {\n    areaStart(e) {\n      this.start(e);\n    },\n    areaMove(e) {\n      this.move(e);\n    },\n    areaEnd(e) {\n      this.end(e);\n    },\n    areaClear(e) {\n      this.clear(e);\n    },\n  },\n  created() {\n    this.state = {\n      key: this.settings.key || 'brush-area-dir',\n    };\n  },\n  render(h) {\n    this.state.rect = this.rect;\n\n    const stngs = this.settings.settings;\n    const direction = stngs.direction === 'vertical' ? VERTICAL : HORIZONTAL;\n    const size = this.state.rect[direction === VERTICAL ? 'height' : 'width'];\n    const offset = this.renderer.element().getBoundingClientRect();\n\n    const targets = (stngs.target ? stngs.target.components || [stngs.target.component] : [])\n      .map((c) => this.chart.component(c))\n      .filter((c) => !!c && !!c.rect);\n\n    const targetRect = targets[0]\n      ? targets.slice(1).reduce(\n          (prev, curr) => ({\n            x0: Math.min(prev.x0, curr.rect.x),\n            y0: Math.min(prev.y0, curr.rect.y),\n            x1: Math.max(prev.x1, curr.rect.x + curr.rect.width),\n            y1: Math.max(prev.y1, curr.rect.y + curr.rect.height),\n          }),\n          {\n            x0: targets[0].rect.x,\n            y0: targets[0].rect.y,\n            x1: targets[0].rect.x + targets[0].rect.width,\n            y1: targets[0].rect.y + targets[0].rect.height,\n          }\n        )\n      : null;\n\n    this.state.targetRect = targetRect\n      ? {\n          x: targetRect.x0 - this.rect.x,\n          y: targetRect.y0 - this.rect.y,\n          width: targetRect.x1 - targetRect.x0,\n          height: targetRect.y1 - targetRect.y0,\n        }\n      : null;\n\n    this.state.style = this.style;\n    this.state.chart = this.chart;\n    this.state.direction = direction;\n    this.state.settings = stngs;\n    this.state.offset = offset;\n    this.state.rc = rangeCollection();\n    this.state.renderer = this.renderer;\n    this.state.multi = !!stngs.multiple;\n    this.state.h = h;\n    this.state.size = size;\n    this.state.cssCoord = {\n      offset: this.state.direction === VERTICAL ? 'top' : 'left',\n      coord: this.state.direction === VERTICAL ? 'y' : 'x',\n      pos: this.state.direction === VERTICAL ? 'deltaY' : 'deltaX',\n      area: this.state.direction === VERTICAL ? 'height' : 'width',\n    };\n\n    this.state.format = function getFormat(v, r) {\n      return getBubbleLabel(this, v, r);\n    };\n\n    return [];\n  },\n  start(e) {\n    startArea({\n      e,\n      state: this.state,\n      renderer: this.renderer,\n      ranges,\n      targetSize: TARGET_SIZE,\n    });\n  },\n  end() {\n    if (!this.state.started) {\n      return;\n    }\n    endArea(this.state, ranges);\n    render(this.state);\n  },\n  move(e) {\n    if (!this.state.started) {\n      return;\n    }\n    moveArea(this.state, e);\n    setRanges(this.state);\n    render(this.state);\n  },\n  clear() {\n    if (this.state.rc) {\n      this.state.rc.clear();\n    }\n    this.state.renderer.render([]);\n  },\n};\n\nexport default brushAreaDirectionalComponent;\n","import { scaleWithSize } from '../../scales';\n\nconst FILL = '#ccc';\nconst OPACITY = 1;\n\nfunction ranges(state) {\n  const brush = state.brush;\n  if (!brush || !brush.isActive()) {\n    return [];\n  }\n\n  const sourceData = state.scale.data();\n  const sourceFields = sourceData ? sourceData.fields || [] : [];\n  const sources = sourceFields.map((field) => field.id());\n  const rangeBrush = brush.brushes().filter((f) => f.type === 'range' && sources.indexOf(f.id) !== -1)[0];\n\n  if (!rangeBrush) {\n    return [];\n  }\n\n  return rangeBrush.brush.ranges();\n}\n\nfunction shapes(state) {\n  const isVertical = state.direction === 'vertical';\n  const size = state.rect[isVertical ? 'height' : 'width'];\n  const otherSize = state.rect[isVertical ? 'width' : 'height'];\n  return ranges(state).map((range) => {\n    const start = state.scale(range.min) * size;\n    const end = state.scale(range.max) * size;\n    const low = Math.min(start, end);\n    const s = Math.abs(start - end);\n    return {\n      type: 'rect',\n      fill: state.fill,\n      opacity: state.opacity,\n      x: isVertical ? 0 : low,\n      width: isVertical ? otherSize : s,\n      y: isVertical ? low : 0,\n      height: isVertical ? s : otherSize,\n    };\n  });\n}\n\nfunction onStart(state) {\n  state.renderer.render(shapes(state));\n}\n\nfunction onUpdate(state) {\n  state.renderer.render(shapes(state));\n}\n\nfunction onEnd(state) {\n  state.renderer.render(shapes(state));\n}\n\nfunction setup(state, brush, scale, renderer) {\n  state.brush = brush;\n\n  if (!brush) {\n    return;\n  }\n\n  function start() {\n    onStart(state);\n  }\n\n  function update() {\n    onUpdate(state);\n  }\n\n  function end() {\n    onEnd(state);\n  }\n\n  brush.on('start', start);\n  brush.on('update', update);\n  brush.on('end', end);\n\n  state.start = start;\n  state.update = update;\n  state.end = end;\n  state.brush = brush;\n  state.scale = scale;\n  state.renderer = renderer;\n}\n\nfunction teardown(state) {\n  if (state.brush) {\n    state.brush.removeListener('start', state.start);\n    state.brush.removeListener('update', state.update);\n    state.brush.removeListener('end', state.end);\n  }\n\n  state.start = undefined;\n  state.update = undefined;\n  state.end = undefined;\n  state.brush = undefined;\n  state.scale = undefined;\n  state.renderer = undefined;\n}\n\n/**\n * @private\n * @typedef {object} ComponentRange\n * @extends ComponentSettings\n */\n\n/**\n * @typedef {object} ComponentRange.settings\n * @property {string} brush - Name of brush instance\n * @property {string} scale - Name of a scale\n * @property {string} [direction='horizontal'] - Direction of the brush\n * @property {string} [fill='#ccc'] - Fill color\n * @property {number} [opacity=1] - Layer opacity\n */\n\nconst rangeComponent = {\n  require: ['chart', 'settings', 'renderer'],\n  defaultSettings: {\n    settings: {},\n  },\n  preferredSize: () => 50,\n  created() {\n    this.state = {};\n  },\n  render() {\n    const stngs = this.settings.settings;\n    const brush = this.chart.brush(stngs.brush);\n    const direction = stngs.direction || 'horizontal';\n    const distance = direction === 'horizontal' ? this.rect.width : this.rect.height;\n    const scale = scaleWithSize(this.chart.scale(stngs.scale), distance);\n\n    teardown(this.state);\n    setup(this.state, brush, scale, this.renderer);\n\n    this.state.rect = this.rect;\n    this.state.fill = stngs.fill || FILL;\n    this.state.opacity = typeof stngs.opacity !== 'undefined' ? stngs.opacity : OPACITY;\n    this.state.direction = direction;\n\n    return shapes(this.state);\n  },\n  beforeDestroy() {\n    teardown(this.state);\n  },\n};\n\nexport default rangeComponent;\n","import { sqrDistance } from '../../math/vector';\n\nfunction getPoint(rendererBounds, event) {\n  const eventOffsetX = event.center.x;\n  const eventOffsetY = event.center.y;\n  return {\n    x: eventOffsetX - rendererBounds.left,\n    y: eventOffsetY - rendererBounds.top,\n  };\n  // return {\n  //   x: Math.min(Math.max(eventOffsetX - rendererBounds.left, 0), rendererBounds.width),\n  //   y: Math.min(Math.max(eventOffsetY - rendererBounds.top, 0), rendererBounds.height)\n  // };\n}\n\nfunction withinThreshold(p, state, settings) {\n  const startPoint = state.points[0];\n  const sqrDist = sqrDistance(p, startPoint);\n  return sqrDist < Math.pow(settings.settings.snapIndicator.threshold, 2);\n}\n\nfunction appendToPath(state, p) {\n  if (state.path.d == null) {\n    state.path.d = `M${p.x} ${p.y} `;\n  } else {\n    state.path.d += `L${p.x} ${p.y} `;\n  }\n  state.points.push(p);\n}\n\nfunction render(state, renderer) {\n  const nodes = [state.startPoint, state.path, state.snapIndicator].filter((node) => node.visible);\n\n  renderer.render(nodes);\n}\n\nfunction setSnapIndictor({ state, start = null, end = null }) {\n  if (start !== null) {\n    state.snapIndicator.x1 = start.x;\n    state.snapIndicator.y1 = start.y;\n  }\n  if (end !== null) {\n    state.snapIndicator.x2 = end.x;\n    state.snapIndicator.y2 = end.y;\n  }\n}\n\nfunction showSnapIndicator(state, show) {\n  state.snapIndicator.visible = show;\n}\n\nfunction setStartPoint(state, p) {\n  state.startPoint.cx = p.x;\n  state.startPoint.cy = p.y;\n}\n\nfunction getComponentDelta(chart, rendererBounds) {\n  const chartBounds = chart.element.getBoundingClientRect();\n  return {\n    x: rendererBounds.left - chartBounds.left,\n    y: rendererBounds.top - chartBounds.top,\n  };\n}\n\nfunction doLineBrush(state, chart) {\n  if (state.active) {\n    const p1 = state.points[state.points.length - 2];\n    const p2 = state.points[state.points.length - 1];\n    state.lineBrushShape.x1 = p1.x + state.componentDelta.x;\n    state.lineBrushShape.y1 = p1.y + state.componentDelta.y;\n    state.lineBrushShape.x2 = p2.x + state.componentDelta.x;\n    state.lineBrushShape.y2 = p2.y + state.componentDelta.y;\n\n    const shapes = chart.shapesAt(state.lineBrushShape, { components: state.brushConfig });\n    chart.brushFromShapes(shapes, { components: state.brushConfig });\n  }\n}\n\nfunction doPolygonBrush(state, chart) {\n  if (state.active) {\n    const dx = state.componentDelta.x;\n    const dy = state.componentDelta.y;\n    const vertices = state.points.map((p) => ({\n      x: p.x + dx,\n      y: p.y + dy,\n    }));\n\n    const shapes = chart.shapesAt({ vertices }, { components: state.brushConfig });\n    chart.brushFromShapes(shapes, { components: state.brushConfig });\n  }\n}\n\nfunction initPath(stgns) {\n  return {\n    visible: true,\n    type: 'path',\n    d: null,\n    fill: stgns.fill,\n    stroke: stgns.stroke,\n    strokeWidth: stgns.strokeWidth,\n    opacity: stgns.opacity,\n    strokeDasharray: stgns.strokeDasharray,\n    collider: {\n      type: null,\n    },\n  };\n}\n\nfunction initSnapIndicator(stgns) {\n  return {\n    visible: false,\n    type: 'line',\n    x1: 0,\n    y1: 0,\n    x2: 0,\n    y2: 0,\n    strokeDasharray: stgns.strokeDasharray,\n    stroke: stgns.stroke,\n    strokeWidth: stgns.strokeWidth,\n    opacity: stgns.opacity,\n    collider: {\n      type: null,\n    },\n  };\n}\n\nfunction initStartPoint(stgns) {\n  return {\n    visible: true,\n    type: 'circle',\n    cx: 0,\n    cy: 0,\n    r: stgns.r,\n    fill: stgns.fill,\n    opacity: stgns.opacity,\n    stroke: stgns.stroke,\n    strokeWidth: stgns.strokeWidth,\n    collider: {\n      type: null,\n    },\n  };\n}\n\nfunction getBrushConfig(settings) {\n  return settings.settings.brush.components.map((b) => ({\n    key: b.key,\n    contexts: b.contexts || ['lassoBrush'],\n    data: b.data || [''],\n    action: b.action || 'add',\n  }));\n}\n\nfunction endBrush(state, chart) {\n  state.brushConfig.forEach((config) => {\n    config.contexts.forEach((context) => {\n      chart.brush(context).end();\n    });\n  });\n}\n\nfunction resetState() {\n  return {\n    points: [],\n    active: false,\n    path: null,\n    snapIndicator: null,\n    startPoint: null,\n    rendererBounds: null,\n    componentDelta: null,\n    brushConfig: null,\n    lineBrushShape: {\n      x1: 0,\n      y1: 0,\n      x2: 0,\n      y2: 0,\n    }, // Keep a single shape instance to avoid instantiating a new object on each lookup\n  };\n}\n\n/**\n * @typedef {object} ComponentBrushLasso\n * @extends ComponentSettings\n * @example\n * {\n *  type: 'brush-lasso',\n *  settings: {\n *    brush: {\n *      components: [{ key: '<target-component>', contexts: ['<brush-context>'] }]\n *    }\n *  },\n * }\n */\n\n/**\n * Component settings\n * @typedef {object} ComponentBrushLasso.settings\n * @property {object} [lasso] - Lasso style settings\n * @property {string} [lasso.fill='transparent']\n * @property {string} [lasso.stroke='black']\n * @property {number} [lasso.strokeWidth=2]\n * @property {number} [lasso.opacity=0.7]\n * @property {number} [lasso.strokeDasharray]\n * @property {object} [snapIndicator] - Snap indicator settings\n * @property {number} [snapIndicator.threshold=75] - The distance in pixel to show the snap indicator, if less then threshold the indicator is dispalyed\n * @property {string} [snapIndicator.strokeDasharray='5, 5']\n * @property {string} [snapIndicator.stroke='black']\n * @property {number} [snapIndicator.strokeWidth=2]\n * @property {number} [snapIndicator.opacity=0.5]\n * @property {object} [startPoint] - Start point style settings\n * @property {number} [startPoint.r=10] - Circle radius\n * @property {string} [startPoint.stroke='green']\n * @property {number} [startPoint.strokeWidth=1]\n * @property {number} [startPoint.opacity=1]\n * @property {object} [brush]\n * @property {object[]} brush.components - Array of components to brush on.\n * @property {string} [brush.components[].component.key] - Component key\n * @property {string[]} [brush.components[].component.contexts=['brushLasso']] - Name of the brushing contexts to affect\n * @property {string[]} [brush.components[].component.data=['']] - The mapped data properties to add to the brush\n * @property {string} [brush.components[].component.action='add'] - Type of action to respond with\n */\n\nconst brushLassoComponent = {\n  require: ['chart', 'renderer', 'settings'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 0,\n    },\n    settings: {\n      brush: {\n        components: [],\n      },\n      snapIndicator: {\n        threshold: 75,\n        strokeDasharray: '5, 5',\n        stroke: 'black',\n        strokeWidth: 2,\n        opacity: 0.5,\n      },\n      lasso: {\n        fill: 'transparent',\n        stroke: 'black',\n        strokeWidth: 2,\n        opacity: 0.7,\n        strokeDasharray: '20, 10',\n      },\n      startPoint: {\n        r: 10,\n        fill: 'green',\n        stroke: 'black',\n        strokeWidth: 1,\n        opacity: 1,\n      },\n    },\n  },\n  on: {\n    lassoStart(e) {\n      this.start(e);\n    },\n    lassoEnd(e) {\n      this.end(e);\n    },\n    lassoMove(e) {\n      this.move(e);\n    },\n    lassoCancel() {\n      this.cancel();\n    },\n  },\n  created() {\n    this.state = resetState();\n  },\n  start(e) {\n    this.state.active = true;\n    this.state.path = initPath(this.settings.settings.lasso);\n    this.state.snapIndicator = initSnapIndicator(this.settings.settings.snapIndicator);\n    this.state.startPoint = initStartPoint(this.settings.settings.startPoint);\n    this.state.rendererBounds = this.renderer.element().getBoundingClientRect();\n    this.state.componentDelta = getComponentDelta(this.chart, this.state.rendererBounds);\n    this.state.brushConfig = getBrushConfig(this.settings);\n\n    const p = getPoint(this.state.rendererBounds, e);\n\n    appendToPath(this.state, p);\n    setSnapIndictor({ state: this.state, start: p });\n    setStartPoint(this.state, p);\n  },\n  move(e) {\n    if (!this.state.active) {\n      return;\n    }\n\n    const p = getPoint(this.state.rendererBounds, e);\n\n    if (withinThreshold(p, this.state, this.settings)) {\n      showSnapIndicator(this.state, true);\n    } else {\n      showSnapIndicator(this.state, false);\n    }\n\n    appendToPath(this.state, p);\n    setSnapIndictor({ state: this.state, end: p });\n    render(this.state, this.renderer);\n\n    doLineBrush(this.state, this.chart);\n  },\n  end(e) {\n    if (!this.state.active) {\n      return;\n    }\n\n    showSnapIndicator(this.state, false);\n    const p = getPoint(this.state.rendererBounds, e);\n    const shouldSnap = withinThreshold(p, this.state, this.settings);\n\n    if (shouldSnap) {\n      doPolygonBrush(this.state, this.chart);\n    }\n\n    this.state = resetState();\n    this.renderer.render([]);\n  },\n  cancel() {\n    if (!this.state.active) {\n      return;\n    }\n    endBrush(this.state, this.chart);\n    this.state = resetState();\n    this.renderer.render([]);\n  },\n  render() {\n    // Do nothing\n  },\n};\n\nexport default brushLassoComponent;\n","import { testRectRect } from '../../../math/narrow-phase-collision';\n\n/**\n * Using the basic example found here: https://en.wikipedia.org/wiki/Binary_search_algorithm\n *\n * Finds the first node that may intersect the label.\n * @private\n */\nexport function binaryLeftSearch(labelBounds, ary, coord, side, extractBounds) {\n  let left = 0;\n  let right = ary.length - 1;\n  let bounds;\n\n  while (left < right) {\n    let m = Math.floor((left + right) / 2);\n    bounds = extractBounds(ary[m]);\n    if (bounds[coord] + bounds[side] < labelBounds[coord]) {\n      // label is on right side\n      left = m + 1;\n    } else {\n      // label is on the left side\n      right = m;\n    }\n  }\n\n  return left;\n}\n\n/**\n * The purpose of this module is to act as a filtering function to remove any labels\n * that meets one of the following criterias:\n * -- The label is not fully inside the container, such that it would be fully or partially clipped if rendered\n * -- The label overlaps another label\n * -- The label overlaps another bar which is not the bar the label is originating from\n *\n * Assumes that the nodes are sorted from left/top to right/down, as that allows\n * some optimizations to be performed.\n * @private\n * @returns {function} Filter function, returns false if label be removed and true otherwise\n */\nexport default function filterOverlappingLabels(\n  { orientation, targetNodes, labels, container },\n  findLeft = binaryLeftSearch\n) {\n  const renderLabels = [];\n  const coord = orientation === 'v' ? 'x' : 'y';\n  const side = orientation === 'v' ? 'width' : 'height';\n  const getTextBounds = (item) => item.textBounds;\n  const getNodeBounds = (item) => item.node.localBounds;\n\n  return (doNotUse, labelIndex) => {\n    const { textBounds: labelBounds, node: labelNode } = labels[labelIndex];\n\n    // ### Test if label is not fully inside container based on the orientation ###\n    if (\n      labelBounds[coord] < container[coord] ||\n      labelBounds[coord] + labelBounds[side] > container[coord] + container[side]\n    ) {\n      return false;\n    }\n\n    // ### Test label to label collision ###\n    const leftStartLabel = findLeft(labelBounds, renderLabels, coord, side, getTextBounds);\n    for (let i = leftStartLabel; i < renderLabels.length; i++) {\n      if (testRectRect(labelBounds, renderLabels[i].textBounds)) {\n        return false;\n      }\n    }\n\n    // ### Test label to node collision ###\n    const leftStartNode = findLeft(labelBounds, targetNodes, coord, side, getNodeBounds);\n    const labelRightBoundary = labelBounds[coord] + labelBounds[side];\n    for (let i = leftStartNode; i < targetNodes.length; i++) {\n      const node = targetNodes[i].node;\n      // Do not test beyond this node, as they are assumed to not collide with the label\n      if (labelRightBoundary < node.localBounds[coord]) {\n        break;\n      }\n\n      if (testRectRect(labelBounds, node.localBounds) && labelNode !== node) {\n        return false;\n      }\n    }\n\n    // No collision occured, allow the label to be rendered\n    renderLabels.push(labels[labelIndex]);\n    return true;\n  };\n}\n","import extend from 'extend';\nimport { testRectRect } from '../../../math/narrow-phase-collision';\nimport filterOverlapping from './bars-overlapping-filter';\n\nconst PADDING = 4;\n// const DOUBLE_PADDING = PADDING * 2;\n\nfunction cbContext(node, chart) {\n  return {\n    node,\n    data: node.data,\n    scale: chart.scale,\n    formatter: chart.formatter,\n    dataset: chart.dataset,\n  };\n}\n\nfunction isValidText(text) {\n  const type = typeof text;\n  return (type === 'string' || type === 'number') && text !== '';\n}\n\nfunction toBackground(label) {\n  return {\n    type: 'rect',\n    rx: 2,\n    ry: 2,\n    fill: label.backgroundColor,\n    ...label.backgroundBounds,\n  };\n}\n\nfunction isTextWidthInRectWidth(rect, label, rotate) {\n  return rotate ? rect.width >= label.height : rect.width >= label.width;\n}\n\nfunction isTextHeightInRectHeight(rect, label, rotate) {\n  return rotate ? rect.height >= label.width : rect.height >= label.height;\n}\n\nfunction isGoodPlacement(orientation, rect, label, fitsHorizontally, overflow) {\n  let fitWidth;\n  let fitHeight;\n  if (orientation === 'v') {\n    fitWidth = fitsHorizontally || overflow || isTextWidthInRectWidth(rect, label, true);\n    fitHeight = isTextHeightInRectHeight(rect, label, !fitsHorizontally);\n  } else {\n    fitWidth = isTextWidthInRectWidth(rect, label);\n    fitHeight = overflow || isTextHeightInRectHeight(rect, label, false);\n  }\n  return fitWidth && fitHeight;\n}\n\nexport function isTextInRect(rect, label, opts) {\n  return isTextWidthInRectWidth(rect, label, opts.rotate) && isTextHeightInRectHeight(rect, label, opts.rotate);\n}\n\nexport function placeSegmentInSegment(majorSegmentPosition, majorSegmentSize, minorSegmentSize, align) {\n  const majorSegmentCenter = majorSegmentPosition + majorSegmentSize * 0.5;\n  const offset = (align - 0.5) * (majorSegmentSize - minorSegmentSize);\n  const minorSegmentCenter = majorSegmentCenter + offset;\n  const minorSegmentPosition = minorSegmentCenter - minorSegmentSize * 0.5;\n  return minorSegmentPosition;\n}\n\nexport function placeTextInRect(rect, text, opts) {\n  const label = {\n    type: 'text',\n    text,\n    maxWidth: opts.rotate ? rect.height : rect.width,\n    x: 0,\n    y: rect.y,\n    dx: 0,\n    dy: 0,\n    fill: opts.fill,\n    anchor: opts.rotate ? 'end' : 'start',\n    baseline: 'central',\n    fontSize: `${opts.fontSize}px`,\n    fontFamily: opts.fontFamily,\n  };\n\n  const textMetrics = opts.textMetrics;\n  if (!opts.overflow && !isTextInRect(rect, textMetrics, opts)) {\n    return false;\n  }\n  const baseLineOffset = textMetrics.height * 0.5;\n  if (opts.rotate) {\n    label.x = placeSegmentInSegment(rect.x, rect.width, textMetrics.height, opts.align) + baseLineOffset;\n    label.y = placeSegmentInSegment(rect.y, rect.height, textMetrics.width, opts.justify);\n    label.transform = `rotate(-90, ${label.x + label.dx}, ${label.y + label.dy})`;\n  } else {\n    label.x = placeSegmentInSegment(rect.x, rect.width, textMetrics.width, opts.align);\n    label.y = placeSegmentInSegment(rect.y, rect.height, textMetrics.height, opts.justify) + baseLineOffset;\n  }\n\n  return label;\n}\n\nfunction limitBounds(bounds, view) {\n  const minY = Math.max(0, Math.min(bounds.y, view.height));\n  const maxY = Math.max(0, Math.min(bounds.y + bounds.height, view.height));\n  const minX = Math.max(0, Math.min(bounds.x, view.width));\n  const maxX = Math.max(0, Math.min(bounds.x + bounds.width, view.width));\n  bounds.x = minX;\n  bounds.width = maxX - minX;\n  bounds.y = minY;\n  bounds.height = maxY - minY;\n}\n\nfunction pad(bounds, padding = {}) {\n  const { top = PADDING, bottom = PADDING, left = PADDING, right = PADDING } = padding;\n  bounds.x += left;\n  bounds.width -= left + right;\n  bounds.y += top;\n  bounds.height -= top + bottom;\n}\n\nexport function getBarRect({ bar, view, direction, position, padding = PADDING }) {\n  const bounds = {};\n  extend(bounds, bar);\n\n  if (!position || position === 'inside') {\n    // do nothing\n  } else if (direction === 'up' || direction === 'down') {\n    const start = Math.max(0, Math.min(bar.y, view.height));\n    const end = Math.max(0, Math.min(bar.y + bar.height, view.height));\n\n    if ((position === 'outside' && direction === 'up') || (position === 'opposite' && direction === 'down')) {\n      bounds.y = 0;\n      bounds.height = start;\n    } else if ((position === 'outside' && direction === 'down') || (position === 'opposite' && direction === 'up')) {\n      bounds.y = end;\n      bounds.height = view.height - end;\n    }\n  } else {\n    const start = Math.max(0, Math.min(bar.x, view.width));\n    const end = Math.max(0, Math.min(bar.x + bar.width, view.width));\n\n    if ((position === 'outside' && direction === 'left') || (position === 'opposite' && direction === 'right')) {\n      bounds.x = 0;\n      bounds.width = start;\n    } else if ((position === 'outside' && direction === 'right') || (position === 'opposite' && direction === 'left')) {\n      bounds.x = end;\n      bounds.width = view.width - end;\n    }\n  }\n\n  limitBounds(bounds, view);\n  pad(bounds, padding);\n\n  return bounds;\n}\n\nexport function findBestPlacement(\n  {\n    direction,\n    fitsHorizontally,\n    // lblStngs,\n    measured,\n    node,\n    orientation,\n    // placements,\n    placementSettings,\n    rect,\n  },\n  barRect = getBarRect\n) {\n  let largest;\n  let bounds;\n  let placement;\n  let testBounds;\n  let p;\n  const boundaries = [];\n  const dimension = orientation === 'h' ? 'width' : 'height';\n  for (p = 0; p < placementSettings.length; p++) {\n    placement = placementSettings[p];\n    testBounds = barRect({\n      bar: node.localBounds,\n      view: rect,\n      direction,\n      position: placement.position,\n      padding: placement.padding,\n    });\n    boundaries.push(testBounds);\n    largest = !p || testBounds[dimension] > largest[dimension] ? testBounds : largest;\n\n    if (isGoodPlacement(orientation, testBounds, measured, fitsHorizontally, placement.overflow)) {\n      bounds = testBounds;\n      break;\n    }\n  }\n\n  // fallback strategy - place the text in the largest rectangle\n  if (!bounds) {\n    bounds = largest;\n    p = boundaries.indexOf(bounds);\n  }\n  placement = placementSettings[p];\n\n  return { bounds, placement };\n}\n\nfunction approxTextBounds(label, textMetrics, rotated, rect, padding = {}) {\n  const { top = PADDING, bottom = PADDING, left = PADDING, right = PADDING } = padding;\n  const x0 = label.x + label.dx;\n  const y0 = label.y + label.dy;\n  const height = rotated ? Math.min(textMetrics.width, rect.height) : Math.min(textMetrics.height, rect.width);\n  const width = rotated ? Math.min(textMetrics.height, rect.height) : Math.min(textMetrics.width, rect.width);\n  const offset = textMetrics.height * 0.5;\n  const PADDING_OFFSET = 1e-9; // Needed to support a case when multiple bars are on the same location\n  const x = rotated ? x0 - offset : x0;\n  const y = rotated ? y0 : y0 - offset;\n  const bounds = {\n    x: x - left - PADDING_OFFSET,\n    y: y - top - PADDING_OFFSET,\n    width: width + (left + right) - PADDING_OFFSET,\n    height: height + (top + bottom) - PADDING_OFFSET,\n  };\n  return bounds;\n}\n\nexport function placeInBars(\n  { chart, targetNodes, rect, fitsHorizontally, collectiveOrientation },\n  findPlacement = findBestPlacement,\n  placer = placeTextInRect,\n  postFilter = filterOverlapping\n) {\n  const labels = [];\n  const postFilterContext = {\n    container: rect,\n    targetNodes,\n    labels: [],\n    orientation: collectiveOrientation,\n  };\n  let label;\n  let target;\n  let node;\n  let text;\n  let justify;\n  let bounds;\n  let fill;\n  let measured;\n  let direction;\n  let lblStngs;\n  let placement;\n  let placements;\n  let arg;\n  let orientation;\n\n  for (let i = 0, len = targetNodes.length; i < len; i++) {\n    bounds = null;\n    target = targetNodes[i];\n    node = target.node;\n    arg = cbContext(node, chart);\n    direction = target.direction;\n    orientation = direction === 'left' || direction === 'right' ? 'h' : 'v';\n\n    for (let j = 0; j < target.texts.length; j++) {\n      text = target.texts[j];\n      if (!isValidText(text)) {\n        continue;\n      }\n      lblStngs = target.labelSettings[j];\n      measured = target.measurements[j];\n      placements = lblStngs.placements;\n\n      const bestPlacement = findPlacement({\n        direction,\n        fitsHorizontally,\n        lblStngs,\n        measured,\n        node,\n        orientation,\n        placements,\n        placementSettings: target.placementSettings[j],\n        rect,\n      });\n\n      bounds = bestPlacement.bounds;\n      placement = bestPlacement.placement;\n\n      if (bounds && placement) {\n        justify = placement.justify;\n        const linkData = typeof lblStngs.linkData === 'function' ? lblStngs.linkData(arg, i) : undefined;\n        const overflow = typeof placement.overflow === 'function' ? placement.overflow(arg, i) : placement.overflow;\n\n        if (direction === 'up') {\n          justify = 1 - justify;\n        }\n        if (placement.position === 'opposite') {\n          justify = 1 - justify;\n        }\n        if (direction === 'left') {\n          justify = 1 - justify;\n        }\n\n        const isRotated = !(collectiveOrientation === 'h' || fitsHorizontally);\n        label = placer(bounds, text, {\n          justify: orientation === 'h' ? placement.align : justify,\n          align: orientation === 'h' ? justify : placement.align,\n          fontSize: lblStngs.fontSize,\n          fontFamily: lblStngs.fontFamily,\n          textMetrics: measured,\n          rotate: isRotated,\n          overflow: !!overflow,\n        });\n\n        if (label) {\n          const textBounds = approxTextBounds(label, measured, isRotated, bounds, placement.padding);\n          fill = typeof placement.fill === 'function' ? placement.fill({ ...arg, textBounds }, i) : placement.fill;\n          label.fill = fill;\n          if (typeof linkData !== 'undefined') {\n            label.data = linkData;\n          }\n          if (typeof placement.background === 'object') {\n            label.backgroundColor =\n              typeof placement.background.fill === 'function'\n                ? placement.background.fill({ ...arg, textBounds }, i)\n                : placement.background.fill;\n            if (typeof label.backgroundColor !== 'undefined') {\n              label.backgroundBounds = approxTextBounds(\n                label,\n                measured,\n                isRotated,\n                bounds,\n                placement.background.padding\n              );\n            }\n          }\n          labels.push(label);\n          postFilterContext.labels.push({\n            node,\n            textBounds,\n          });\n        }\n      }\n    }\n  }\n\n  const filteredLabels = labels.filter(postFilter(postFilterContext));\n  const backgrounds = filteredLabels.filter((lb) => typeof lb.backgroundBounds !== 'undefined').map(toBackground);\n\n  return [...backgrounds, ...filteredLabels];\n}\n\nexport function precalculate({ nodes, rect, chart, labelSettings, placementSettings, settings, renderer }) {\n  const labelStruct = {};\n  const targetNodes = [];\n  let target;\n  let fitsHorizontally = true;\n  let hasHorizontalDirection = false;\n  let node;\n  let text;\n  let bounds;\n  let measured;\n  let lblStng;\n  let direction;\n\n  for (let i = 0; i < nodes.length; i++) {\n    node = nodes[i];\n    bounds = node.localBounds;\n    if (!testRectRect(bounds, rect)) {\n      continue;\n    }\n    let arg = cbContext(node, chart);\n\n    target = {\n      node,\n      texts: [],\n      measurements: [],\n      labelSettings: [],\n      placementSettings: [],\n      // direction: 'up'\n    };\n\n    for (let j = 0; j < labelSettings.length; j++) {\n      lblStng = labelSettings[j];\n      text = typeof lblStng.label === 'function' ? lblStng.label(arg, i) : undefined;\n      if (!isValidText(text)) {\n        continue; // eslint-ignore-line\n      }\n      direction = typeof settings.direction === 'function' ? settings.direction(arg, i) : settings.direction || 'up';\n      hasHorizontalDirection = hasHorizontalDirection || direction === 'left' || direction === 'right';\n\n      labelStruct.fontFamily = lblStng.fontFamily;\n      labelStruct.fontSize = `${lblStng.fontSize}px`;\n      labelStruct.text = text;\n\n      measured = renderer.measureText(labelStruct);\n      target.measurements.push(measured);\n      target.texts.push(text);\n      target.labelSettings.push(lblStng);\n      target.placementSettings.push(placementSettings[j]);\n      target.direction = direction;\n      fitsHorizontally = fitsHorizontally && measured.width <= bounds.width - PADDING * 2;\n    }\n\n    targetNodes.push(target);\n  }\n\n  return {\n    targetNodes,\n    fitsHorizontally,\n    hasHorizontalDirection,\n  };\n}\n\n/**\n * @typedef {object} ComponentLabels~BarsLabelStrategy\n * @property {string} type='bar' Name of strategy\n */\n\n/**\n * Bars strategy settings\n * @typedef {object} ComponentLabels~BarsLabelStrategy.settings\n * @property {string|function} [direction='up'] - The direction in which the bars are growing: 'up', 'down', 'right' or 'left'.\n * @property {string} [fontFamily='Arial']\n * @property {number} [fontSize=12]\n * @property {Array<object>} labels\n * @property {string|function} labels[].label - The text value\n * @property {function} labels[].linkData - Link data to the label\n * @property {Array<object>} labels[].placements\n * @property {string} labels[].placements[].position - 'inside' | 'outside' | 'opposite'\n * @property {number} [labels[].placements[].justify=0] - Placement of the label along the direction of the bar\n * @property {number} [labels[].placements[].align=0.5] - Placement of the label along the perpendicular direction of the bar\n * @property {string} [labels[].placements[].fill='#333'] - Color of the label\n * @property {boolean} [labels[].placements[].overflow=false] - True if the label is allowed to overflow the bar\n * @property {object} labels[].placements[].padding - Padding between the label and the bar\n * @property {number} [labels[].placements[].padding.top=4] - Padding-top between the label and the bar\n * @property {number} [labels[].placements[].padding.bottom=4] - Padding-bottom between the label and the bar\n * @property {number} [labels[].placements[].padding.left=4] - Padding-left between the label and the bar\n * @property {number} [labels[].placements[].padding.right=4] - Padding-right between the label and the bar\n * @property {object} labels[].placements[].background - Background of the label\n * @property {string|function} labels[].placements[].background.fill - Background color of the label\n * @property {object} labels[].placements[].background.padding - Padding between the label and the background\n * @property {number} [labels[].placements[].background.padding.top=4] - Padding-top between the label and the background\n * @property {number} [labels[].placements[].background.padding.bottom=4] - Padding-bottom between the label and the background\n * @property {number} [labels[].placements[].background.padding.left=4] - Padding-left between the label and the background\n * @property {number} [labels[].placements[].background.padding.right=4] - Padding-right between the label and the background\n */\n\nexport function bars({ settings, chart, nodes, rect, renderer, style }, placer = placeInBars) {\n  const defaults = extend(\n    {\n      fontSize: 12,\n      fontFamily: 'Arial',\n      align: 0.5,\n      justify: 0,\n      fill: '#333',\n    },\n    style.label\n  );\n\n  defaults.fontSize = parseInt(defaults.fontSize, 10);\n\n  const labelSettings = settings.labels.map((labelSetting) => extend({}, defaults, settings, labelSetting));\n\n  const placementSettings = settings.labels.map((labelSetting) =>\n    labelSetting.placements.map((placement) => extend({}, defaults, settings, labelSetting, placement))\n  );\n\n  const { fitsHorizontally, hasHorizontalDirection, targetNodes } = precalculate({\n    nodes,\n    chart,\n    renderer,\n    settings,\n    rect,\n    labelSettings,\n    placementSettings,\n  });\n\n  const coord = hasHorizontalDirection ? 'y' : 'x';\n  const side = hasHorizontalDirection ? 'height' : 'width';\n  targetNodes.sort(\n    (a, b) =>\n      a.node.localBounds[coord] + a.node.localBounds[side] - (b.node.localBounds[coord] + b.node.localBounds[side])\n  );\n\n  return placer({\n    chart,\n    targetNodes,\n    stngs: settings,\n    rect,\n    fitsHorizontally,\n    collectiveOrientation: hasHorizontalDirection ? 'h' : 'v',\n  });\n}\n","import extend from 'extend';\nimport { testCircleRect, testRectLine, testRectRect } from '../../../math/narrow-phase-collision';\nimport { rectContainsRect } from '../../../math/intersection';\n\nconst LABEL_OVERLAP_THRESHOLD_X = 4;\n\nfunction normalize(angle) {\n  const PI2 = Math.PI * 2;\n  return ((angle % PI2) + PI2) % PI2; // normalize\n}\n\nfunction pad(bounds, padding) {\n  bounds.x += padding;\n  bounds.width -= padding * 2;\n  bounds.y += padding;\n  bounds.height -= padding * 2;\n}\n\nfunction getTopLeftBounds(bounds) {\n  const x = bounds.x;\n  const y = bounds.y - bounds.height / 2;\n\n  return {\n    x,\n    y,\n    width: bounds.width,\n    height: bounds.height,\n  };\n}\n\n// assume 0 <= angle < (PI / 2)\nfunction getLineCircleIntersection(radius, offset, angle) {\n  let { x, y } = offset;\n\n  if (x * x + y * y > radius * radius) {\n    return null;\n  }\n\n  let dx = Math.sin(angle);\n  let dy = Math.cos(angle);\n  let D = x * dy - y * dx;\n\n  let d = radius * radius - D * D;\n  if (d < 0) {\n    return null;\n  }\n  let sqrtD = Math.sqrt(d);\n  return {\n    x: D * dy + dx * sqrtD,\n    y: -(D * dx) + dy * sqrtD,\n  };\n}\n\n// assume 0 <= angle < (PI * 2)\nfunction getRectFromCircleIntersection({ radius, size, angle }) {\n  let { width, height } = size;\n  let lineOffset = { x: width / 2, y: height / 2 };\n  let section = Math.floor(angle / (Math.PI / 2));\n  let intersection;\n  let offset;\n  switch (section) {\n    case 0:\n      intersection = getLineCircleIntersection(radius, lineOffset, angle);\n      if (!intersection) {\n        return null;\n      }\n      intersection.y *= -1;\n      offset = { x: -width, y: 0 };\n      break;\n    case 1:\n      intersection = getLineCircleIntersection(radius, lineOffset, Math.PI - angle);\n      if (!intersection) {\n        return null;\n      }\n      offset = { x: -width, y: -height };\n      break;\n    case 2:\n      intersection = getLineCircleIntersection(radius, lineOffset, angle - Math.PI);\n      if (!intersection) {\n        return null;\n      }\n      intersection.x *= -1;\n      offset = { x: 0, y: -height };\n      break;\n    case 3:\n      intersection = getLineCircleIntersection(radius, lineOffset, 2 * Math.PI - angle);\n      if (!intersection) {\n        return null;\n      }\n      intersection.x *= -1;\n      intersection.y *= -1;\n      offset = { x: 0, y: 0 };\n      break;\n    default:\n      throw new Error('invalid angle');\n  }\n  let bounds = {\n    x: intersection.x + offset.x,\n    y: intersection.y + offset.y,\n    width,\n    height,\n  };\n  return bounds;\n}\n\nfunction getHorizontalInsideSliceRect({ slice, padding, measured, store }) {\n  const { start, end, outerRadius } = slice;\n  const middle = normalize((start + end) / 2);\n\n  const size = {\n    width: measured.width + padding * 2,\n    height: measured.height + padding * 2,\n  };\n\n  let bounds = getRectFromCircleIntersection({\n    radius: outerRadius,\n    size,\n    angle: middle,\n  });\n\n  if (!bounds) {\n    return null;\n  }\n\n  bounds.baseline = 'top';\n\n  pad(bounds, padding);\n\n  if (store.insideLabelBounds.some((rect) => testRectRect(rect, bounds))) {\n    return null;\n  }\n\n  store.insideLabelBounds.push({\n    x: bounds.x - LABEL_OVERLAP_THRESHOLD_X,\n    y: bounds.y,\n    width: bounds.width + LABEL_OVERLAP_THRESHOLD_X * 2,\n    height: bounds.height,\n  }); // Copy as bounds is mutated else where\n\n  return bounds;\n}\n\nfunction getHorizontalIntoSliceRect({ slice, padding, measured }) {\n  let { start, end, innerRadius, outerRadius } = slice;\n  const middle = normalize((start + end) / 2);\n\n  let size = {\n    width: measured.width + padding * 2,\n    height: measured.height + padding * 2,\n  };\n\n  let bounds = getRectFromCircleIntersection({\n    radius: outerRadius,\n    size,\n    angle: middle,\n  });\n\n  if (!bounds) {\n    return null;\n  }\n\n  bounds.baseline = 'top';\n\n  let startLine = {\n    x1: 0,\n    y1: 0,\n    x2: Math.sin(start) * outerRadius,\n    y2: -Math.cos(start) * outerRadius,\n  };\n  if (testRectLine(bounds, startLine)) {\n    return null;\n  }\n  let endLine = {\n    x1: 0,\n    y1: 0,\n    x2: Math.sin(end) * outerRadius,\n    y2: -Math.cos(end) * outerRadius,\n  };\n  if (testRectLine(bounds, endLine)) {\n    return null;\n  }\n  let circle = { cx: 0, cy: 0, r: innerRadius };\n  if (testCircleRect(circle, bounds)) {\n    return null;\n  }\n\n  pad(bounds, padding);\n\n  return bounds;\n}\n\n// TODO: this case can support a justify setting\nfunction getRotatedInsideSliceRect({ slice, measured, padding }) {\n  let { start, end, innerRadius, outerRadius } = slice;\n\n  let maxWidth = outerRadius - innerRadius - padding * 2;\n  let size = end - start;\n  if (size < Math.PI) {\n    let x = (measured.height / 2 + padding) / Math.tan(size / 2);\n    if (x > innerRadius) {\n      maxWidth = outerRadius - x - padding * 2;\n    }\n  }\n  if (maxWidth < 0 || maxWidth < measured.minReqWidth) {\n    return null;\n  }\n\n  const middle = normalize((start + end) / 2);\n  let r = outerRadius - padding;\n  let bounds = {\n    x: Math.sin(middle) * r,\n    y: -Math.cos(middle) * r,\n    width: maxWidth,\n    height: measured.height,\n  };\n  if (middle < Math.PI) {\n    bounds.angle = middle - Math.PI / 2;\n    bounds.anchor = 'end';\n  } else {\n    bounds.angle = middle + Math.PI / 2;\n    bounds.anchor = 'start';\n  }\n  return bounds;\n}\n\nfunction getRotatedOusideSliceRect({ slice, measured, padding, view }) {\n  let { start, end, outerRadius, offset } = slice;\n  let r = outerRadius + padding;\n  let size = end - start;\n  if (size < Math.PI) {\n    let minR = (measured.height / 2 + padding) / Math.tan(size / 2);\n    if (minR > r) {\n      return null;\n    }\n  }\n  const middle = normalize((start + end) / 2);\n  let x = Math.sin(middle) * r;\n  let y = -Math.cos(middle) * r;\n\n  let maxWidth = measured.width;\n  let v = middle % Math.PI;\n  if (v > Math.PI / 2) {\n    v = Math.PI - v;\n  }\n  if (Math.cos(v) > 0.001) {\n    let edge = y < 0 ? view.y : view.y + view.height;\n    let d = Math.abs(edge - offset.y);\n    let w = d / Math.cos(v) - Math.tan(v) * (measured.height / 2) - padding * 2 - outerRadius;\n    if (w < maxWidth) {\n      maxWidth = w;\n    }\n  }\n  if (Math.sin(v) > 0.001) {\n    let edge = x < 0 ? view.x : view.x + view.width;\n    let d = Math.abs(edge - offset.x);\n    let w = d / Math.sin(v) - measured.height / 2 / Math.tan(v) - padding * 2 - outerRadius;\n    if (w < maxWidth) {\n      maxWidth = w;\n    }\n  }\n\n  if (maxWidth <= 0 || maxWidth < measured.minReqWidth) {\n    return null;\n  }\n\n  let bounds = {\n    x,\n    y,\n    width: maxWidth,\n    height: measured.height,\n  };\n  if (middle < Math.PI) {\n    bounds.angle = middle - Math.PI / 2;\n    bounds.anchor = 'start';\n  } else {\n    bounds.angle = middle + Math.PI / 2;\n    bounds.anchor = 'end';\n  }\n  return bounds;\n}\n\nfunction outOfSpace(context, section, view) {\n  switch (section) {\n    case 0:\n      return context.q1maxY < 0;\n    case 1:\n      return context.q2minY > view.height;\n    case 2:\n      return context.q3minY > view.height;\n    case 3:\n      return context.q4maxY < 0;\n    default:\n      return true;\n  }\n}\nfunction adjustBounds(bounds, context, slice) {\n  const LINE_PADDING = 2;\n  const LIMIT = 1;\n\n  const { start, end, offset, outerRadius } = slice;\n  const middle = normalize((start + end) / 2);\n  let section = Math.floor(middle / (Math.PI / 2));\n\n  switch (section) {\n    case 0:\n      if (context.q1maxY !== undefined) {\n        let y = Math.min(bounds.y, context.q1maxY - bounds.height);\n        let dy = bounds.y - y;\n        bounds.y = y;\n        if (dy > LIMIT) {\n          let r = outerRadius + LINE_PADDING;\n          bounds.line = {\n            type: 'line',\n            x1: bounds.x - LINE_PADDING,\n            y1: bounds.y + LINE_PADDING,\n            x2: offset.x + Math.sin(middle) * r,\n            y2: offset.y - Math.cos(middle) * r,\n            strokeWidth: 1,\n          };\n        }\n      }\n      break;\n    case 1:\n      if (context.q2minY !== undefined) {\n        let y = Math.max(bounds.y, context.q2minY);\n        let dy = y - bounds.y;\n        bounds.y = y;\n        if (dy > LIMIT) {\n          let r = outerRadius + LINE_PADDING;\n          bounds.line = {\n            type: 'line',\n            x1: bounds.x - LINE_PADDING,\n            y1: bounds.y - LINE_PADDING,\n            x2: offset.x + Math.sin(middle) * r,\n            y2: offset.y - Math.cos(middle) * r,\n            strokeWidth: 1,\n          };\n        }\n      }\n      break;\n    case 2:\n      if (context.q3minY !== undefined) {\n        let y = Math.max(bounds.y, context.q3minY);\n        let dy = y - bounds.y;\n        bounds.y = y;\n        if (dy > LIMIT) {\n          let r = outerRadius + LINE_PADDING;\n          bounds.line = {\n            type: 'line',\n            x1: bounds.x + LINE_PADDING,\n            y1: bounds.y - LINE_PADDING,\n            x2: offset.x + Math.sin(middle) * r,\n            y2: offset.y - Math.cos(middle) * r,\n            strokeWidth: 1,\n          };\n        }\n      }\n      break;\n    case 3:\n      if (context.q4maxY !== undefined) {\n        let y = Math.min(bounds.y, context.q4maxY - bounds.height);\n        let dy = bounds.y - y;\n        bounds.y = y;\n        if (dy > LIMIT) {\n          let r = outerRadius + LINE_PADDING;\n          bounds.line = {\n            type: 'line',\n            x1: bounds.x + LINE_PADDING,\n            y1: bounds.y + LINE_PADDING,\n            x2: offset.x + Math.sin(middle) * r,\n            y2: offset.y - Math.cos(middle) * r,\n            strokeWidth: 1,\n          };\n        }\n      }\n      break;\n    default:\n      break;\n  }\n}\nfunction updateContext({ context, node, bounds }) {\n  const PADDING = 2;\n  let { start, end } = node.desc.slice;\n  const middle = normalize((start + end) / 2);\n\n  let section = Math.floor(middle / (Math.PI / 2));\n  switch (section) {\n    case 0:\n      context.q1maxY = bounds.y - PADDING;\n      if (context.q2minY === undefined) {\n        context.q2minY = bounds.y + bounds.height + PADDING;\n      }\n      break;\n    case 1:\n      context.q2minY = bounds.y + bounds.height + PADDING;\n      break;\n    case 2:\n      context.q3minY = bounds.y + bounds.height + PADDING;\n      break;\n    case 3:\n      context.q4maxY = bounds.y - PADDING;\n      if (context.q3minY === undefined) {\n        context.q3minY = bounds.y + bounds.height + PADDING;\n      }\n      break;\n    default:\n      break;\n  }\n}\n\nfunction getHorizontalOusideSliceRect({ slice, measured, padding, view, context }) {\n  let { start, end, outerRadius, offset } = slice;\n  const middle = normalize((start + end) / 2);\n\n  let section = Math.floor(middle / (Math.PI / 2));\n  if (outOfSpace(context, section, view)) {\n    return null;\n  }\n\n  let r = outerRadius + padding + measured.height / 2;\n  let x = Math.sin(middle) * r;\n  let y = -Math.cos(middle) * r;\n\n  let maxWidth = measured.width;\n  if (middle < Math.PI) {\n    let w = Math.abs(view.x + view.width - (x + offset.x));\n    if (w < maxWidth) {\n      maxWidth = w;\n    }\n  } else {\n    let w = Math.abs(view.x - (x + offset.x));\n    if (w < maxWidth) {\n      maxWidth = w;\n    }\n  }\n\n  if (maxWidth < measured.minReqWidth) {\n    return null;\n  }\n\n  let bounds = {\n    x,\n    y,\n    width: maxWidth,\n    height: measured.height,\n  };\n\n  if (middle < Math.PI) {\n    bounds.anchor = 'start';\n  } else {\n    bounds.anchor = 'end';\n  }\n\n  return bounds;\n}\n\nfunction cbContext(node, chart) {\n  return {\n    node,\n    data: node.data,\n    scale: chart.scale,\n    formatter: chart.formatter,\n    dataset: chart.dataset,\n  };\n}\n\nfunction placeTextOnPoint(rect, text, opts) {\n  const label = {\n    type: 'text',\n    text,\n    maxWidth: rect.width,\n    x: rect.x,\n    y: rect.y + (rect.baseline === 'top' ? rect.height / 2 : 0),\n    fill: opts.fill,\n    anchor: rect.anchor || 'start',\n    baseline: 'middle',\n    fontSize: `${opts.fontSize}px`,\n    fontFamily: opts.fontFamily,\n  };\n\n  if (!isNaN(rect.angle)) {\n    let angle = rect.angle * (360 / (Math.PI * 2));\n    label.transform = `rotate(${angle}, ${label.x}, ${label.y})`;\n  }\n\n  return label;\n}\n\nexport function getSliceRect({ slice, direction, position, padding, measured, view, context, store }) {\n  let { start, end, innerRadius, offset } = slice;\n\n  let bounds;\n  let s;\n  switch (position) {\n    case 'into':\n      if (direction === 'rotate') {\n        bounds = getRotatedInsideSliceRect({ slice, measured, padding });\n      } else {\n        bounds = getHorizontalIntoSliceRect({ slice, measured, padding });\n      }\n      break;\n    case 'inside':\n      s = {\n        start,\n        end,\n        innerRadius: 0,\n        outerRadius: innerRadius,\n      };\n      if (direction === 'rotate') {\n        bounds = getRotatedInsideSliceRect({ slice: s, measured, padding });\n      } else {\n        bounds = getHorizontalInsideSliceRect({\n          slice: s,\n          measured,\n          padding,\n          store,\n        });\n      }\n      break;\n    case 'outside':\n      if (direction === 'rotate') {\n        bounds = getRotatedOusideSliceRect({\n          slice,\n          measured,\n          padding,\n          view,\n        });\n      } else {\n        bounds = getHorizontalOusideSliceRect({\n          slice,\n          measured,\n          padding,\n          view,\n          context,\n        });\n      }\n      break;\n    default:\n      throw new Error('not implemented');\n  }\n  if (bounds) {\n    bounds.x += offset.x;\n    bounds.y += offset.y;\n    if (position === 'outside' && direction !== 'rotate') {\n      adjustBounds(bounds, context, slice);\n    }\n  }\n  return bounds;\n}\n\nfunction findBestPlacement(\n  { context, direction, measured, node, placementSettings, rect, store },\n  sliceRect = getSliceRect\n) {\n  for (let p = 0; p < placementSettings.length; p++) {\n    let placement = placementSettings[p];\n    let bounds = sliceRect({\n      context,\n      slice: node.desc.slice,\n      view: rect,\n      direction,\n      position: placement.position,\n      measured,\n      padding: placement.padding,\n      store,\n    });\n\n    if (!bounds) {\n      continue;\n    }\n\n    return { bounds, placement };\n  }\n  return { bounds: null, placement: null };\n}\n\n/*\n * Sorts the nodes so that\n *   in each quarter sort nodes from the center (in y) outwards\n *   first quarter before the second\n *   forth quarter before the third\n */\nfunction sortNodes(nodes) {\n  const q1 = [];\n  const q2 = [];\n  const q3 = [];\n  const q4 = [];\n  for (let i = 0; i < nodes.length; ++i) {\n    const { start, end } = nodes[i].desc.slice;\n    const middle = normalize((start + end) / 2);\n    let section = Math.floor(middle / (Math.PI / 2));\n    switch (section) {\n      case 0:\n        q1.push(nodes[i]);\n        break;\n      case 1:\n        q2.push(nodes[i]);\n        break;\n      case 2:\n        q3.push(nodes[i]);\n        break;\n      case 3:\n        q4.push(nodes[i]);\n        break;\n      default:\n        break;\n    }\n  }\n\n  const sortFn = (a, b) => {\n    const middleA = normalize((a.desc.slice.start + a.desc.slice.end) / 2);\n    const middleB = normalize((b.desc.slice.start + b.desc.slice.end) / 2);\n    return middleA - middleB;\n  };\n  const reverseSortFn = (a, b) => sortFn(b, a);\n\n  q1.sort(reverseSortFn);\n  q2.sort(sortFn);\n  q3.sort(reverseSortFn);\n  q4.sort(sortFn);\n  return q1.concat(q2, q4, q3);\n}\n\nfunction measureText(text, stgns, renderer) {\n  const fontFamily = stgns.fontFamily;\n  const fontSize = `${stgns.fontSize}px`;\n  const metrics = renderer.measureText({ text, fontFamily, fontSize });\n\n  metrics.minReqWidth = Math.min(\n    metrics.width,\n    renderer.measureText({\n      text: `${text[0]}…`,\n      fontFamily,\n      fontSize,\n    }).width\n  );\n\n  return metrics;\n}\n\n/**\n * @typedef {object} ComponentLabels~SlicesLabelStrategy\n * @property {string} type='slice' Name of strategy\n */\n\n/**\n * Slices strategy settings\n * @typedef {object} ComponentLabels~SlicesLabelStrategy.settings\n * @property {string|function} [direction='horizontal'] - The direction of the text: 'horizontal' or 'rotate'.\n * @property {string} [fontFamily='Arial']\n * @property {number} [fontSize=12]\n * @property {Array<object>} labels\n * @property {string|function} labels[].label - The text value\n * @property {function} labels[].linkData - Link data to the label\n * @property {Array<object>} labels[].placements\n * @property {string} [labels[].placements[].position='into'] - 'inside' | 'into' | 'outside' (outside is not implmented yet)\n * @property {string} [labels[].placements[].fill='#333'] - Color of the label\n */\n\nexport function slices(\n  { settings, chart, nodes, rect, renderer, style },\n  findPlacement = findBestPlacement,\n  placer = placeTextOnPoint\n) {\n  const defaults = extend(\n    {\n      fontSize: 12,\n      fontFamily: 'Arial',\n      fill: '#333',\n      padding: 4,\n      position: 'into',\n    },\n    style.label\n  );\n\n  defaults.fontSize = parseInt(defaults.fontSize, 10);\n\n  const labelSettings = settings.labels.map((labelSetting) => extend({}, defaults, settings, labelSetting));\n\n  const placementSettings = settings.labels.map((labelSetting) =>\n    labelSetting.placements.map((placement) => extend({}, defaults, settings, labelSetting, placement))\n  );\n\n  const labels = [];\n  const store = {\n    insideLabelBounds: [],\n  };\n\n  nodes = sortNodes(nodes);\n  const context = {};\n\n  for (let i = 0, len = nodes.length; i < len; i++) {\n    const node = nodes[i];\n    const arg = cbContext(node, chart);\n\n    for (let j = 0; j < labelSettings.length; j++) {\n      const lblStngs = labelSettings[j];\n      const text = typeof lblStngs.label === 'function' ? lblStngs.label(arg, i) : '';\n      if (!text) {\n        continue;\n      }\n      const direction =\n        typeof lblStngs.direction === 'function' ? lblStngs.direction(arg, i) : lblStngs.direction || 'horizontal';\n      const linkData = typeof lblStngs.linkData === 'function' ? lblStngs.linkData(arg, i) : undefined;\n      const measured = measureText(text, lblStngs, renderer);\n      const bestPlacement = findPlacement({\n        context,\n        direction,\n        lblStngs,\n        measured,\n        node,\n        placementSettings: placementSettings[j],\n        rect,\n        store,\n      });\n\n      const bounds = bestPlacement.bounds;\n      const placement = bestPlacement.placement;\n\n      if (bounds && placement) {\n        if (placement.position === 'outside' && direction !== 'rotate') {\n          updateContext({ context, node, bounds });\n\n          const topLeftBounds = getTopLeftBounds(bounds);\n\n          if (!rectContainsRect(topLeftBounds, rect)) {\n            continue;\n          }\n        }\n\n        const fill = typeof placement.fill === 'function' ? placement.fill(arg, i) : placement.fill;\n\n        const label = placer(bounds, text, {\n          fill,\n          fontSize: lblStngs.fontSize,\n          fontFamily: lblStngs.fontFamily,\n          textMetrics: measured,\n        });\n\n        if (label) {\n          if (typeof linkData !== 'undefined') {\n            label.data = linkData;\n          }\n          labels.push(label);\n          if (bounds.line) {\n            bounds.line.stroke = fill;\n            labels.push(bounds.line);\n          }\n        }\n      }\n    }\n  }\n\n  return labels;\n}\n","const LINEBREAK_REGEX = /\\n+|\\r+|\\r\\n/;\nconst WHITESPACE_REGEX = /\\s/;\nconst HYPHEN_REGEX = /[a-zA-Z\\u00C0-\\u00F6\\u00F8-\\u00FF\\u00AD]/;\nexport const NO_BREAK = 0;\nexport const MANDATORY = 1;\nexport const BREAK_ALLOWED = 2;\n\nexport function includesLineBreak(c) {\n  if (typeof c === 'string') {\n    return c.search(LINEBREAK_REGEX) !== -1;\n  }\n  return String(c).search(LINEBREAK_REGEX) !== -1;\n}\n\nfunction includesWhiteSpace(c) {\n  return c.search(WHITESPACE_REGEX) !== -1;\n}\n\nfunction hyphenationAllowed(c) {\n  /* Latin character set. Excluding numbers, sign and symbol characters, but including soft hyphen */\n  return c.search(HYPHEN_REGEX) !== -1;\n}\n\nfunction resolveBreakOpportunity(chunk, i, chunks, mandatory, noBreakAllowed) {\n  if (mandatory.some((fn) => fn(chunk, i, chunks))) {\n    return MANDATORY;\n  }\n  if (noBreakAllowed.some((fn) => fn(chunk, i, chunks))) {\n    return NO_BREAK;\n  }\n\n  return BREAK_ALLOWED;\n}\n\nfunction cleanEmptyChunks(chunks) {\n  if (chunks[0] === '') {\n    chunks.shift();\n  }\n  if (chunks[chunks.length - 1] === '') {\n    chunks.pop();\n  }\n}\n\nfunction clamp(val, min, max) {\n  return Math.max(min, Math.min(max, val));\n}\n\nexport default function stringTokenizer({\n  string,\n  separator = '',\n  reverse = false,\n  measureText = (text) => ({ width: text.length, height: 1 }),\n  mandatoryBreakIdentifiers = [includesLineBreak],\n  noBreakAllowedIdentifiers = [],\n  suppressIdentifier = [includesWhiteSpace, includesLineBreak, (chunk) => chunk === ''],\n  hyphenationIdentifiers = [hyphenationAllowed],\n} = {}) {\n  const chunks = String(string).split(separator);\n  cleanEmptyChunks(chunks);\n  const length = chunks.length;\n  const isNotDone = reverse ? (p) => p >= 0 : (p) => p < length;\n  let position = reverse ? length : -1; // Set init position 1 step before or after to make first next call go to first position\n\n  function peek(peekAt) {\n    const i = clamp(peekAt, 0, length - 1);\n    const chunk = chunks[i];\n    const textMeasure = measureText(chunk);\n    const opportunity = resolveBreakOpportunity(chunk, i, chunks, mandatoryBreakIdentifiers, noBreakAllowedIdentifiers);\n\n    return {\n      index: i,\n      value: chunk,\n      breakOpportunity: opportunity,\n      suppress: suppressIdentifier.some((fn) => fn(chunk, i, chunks)),\n      hyphenation: hyphenationIdentifiers.some((fn) => fn(chunk, i, chunks)),\n      width: textMeasure.width,\n      height: textMeasure.height,\n      done: false,\n    };\n  }\n\n  function next(jumpToPosition) {\n    if (isNaN(jumpToPosition)) {\n      if (reverse) {\n        position--;\n      } else {\n        position++;\n      }\n    } else {\n      position = clamp(jumpToPosition, 0, length - 1);\n    }\n\n    if (isNotDone(position)) {\n      return peek(position);\n    }\n    return { done: true };\n  }\n\n  return {\n    next,\n    peek,\n    length,\n  };\n}\n","const HYPHENS_CHAR = '\\u2010';\nconst ELLIPSIS_CHAR = '…';\n\nexport { HYPHENS_CHAR, ELLIPSIS_CHAR };\n","const BASE = 24;\nconst PAD = 4;\nconst BUMP = 1e-12;\nconst DEFAULT_FONT_HEIGHT = 16;\nconst DEFAULT_LINE_HEIGHT = 1.2;\nconst TEXT_REGEX = /^\\s*\\d+(\\.\\d+)?px\\s*$/i;\n\nfunction isValidFontSize(val) {\n  const type = typeof val;\n  if (type === 'string') {\n    return TEXT_REGEX.test(val);\n  }\n\n  return false;\n}\n\nexport function fontSizeToHeight(fontSize) {\n  if (isValidFontSize(fontSize)) {\n    const size = parseFloat(fontSize);\n    const m = PAD * Math.ceil((size + BUMP) / BASE);\n\n    return size + m;\n  }\n\n  return DEFAULT_FONT_HEIGHT;\n}\n\nexport function fontSizeToLineHeight(node) {\n  const fontSize = node['font-size'] || node.fontSize;\n  if (isValidFontSize(fontSize)) {\n    return parseFloat(fontSize) * Math.max(isNaN(node.lineHeight) ? DEFAULT_LINE_HEIGHT : node.lineHeight, 0);\n  }\n\n  return DEFAULT_FONT_HEIGHT * DEFAULT_LINE_HEIGHT;\n}\n","import stringTokenizer, { MANDATORY, BREAK_ALLOWED } from './string-tokenizer';\nimport { HYPHENS_CHAR } from './text-const';\nimport { fontSizeToLineHeight } from './font-size-to-height';\n\nfunction resolveMaxAllowedLines(node) {\n  const maxHeight = node.maxHeight;\n  const maxLines = Math.max(node.maxLines, 1) || Infinity;\n\n  if (isNaN(maxHeight)) {\n    return maxLines;\n  }\n\n  const computedLineHeight = fontSizeToLineHeight(node);\n\n  return Math.max(1, Math.min(Math.floor(maxHeight / computedLineHeight), maxLines));\n}\n\nfunction initState(node, measureText) {\n  return {\n    lines: [],\n    line: '',\n    width: 0,\n    maxLines: resolveMaxAllowedLines(node),\n    maxWidth: node.maxWidth,\n    hyphens: {\n      enabled: node.hyphens === 'auto',\n      char: HYPHENS_CHAR,\n      metrics: measureText(HYPHENS_CHAR),\n    },\n  };\n}\n\nfunction newLine(state) {\n  state.lines.push(state.line);\n  state.line = '';\n  state.width = 0;\n}\n\nfunction appendToLine(state, token) {\n  state.line += token.value;\n  state.width += token.width;\n}\n\nfunction insertHyphenAndJump(state, token, iterator) {\n  if (token.width > state.maxWidth) {\n    return token;\n  }\n\n  const startIndex = token.index;\n\n  for (let i = 1; i < 5; i++) {\n    const pairToken = iterator.peek(token.index - 1);\n\n    if (!token.hyphenation || !pairToken.hyphenation || token.index === 0) {\n      return token;\n    }\n    if (state.width + state.hyphens.metrics.width <= state.maxWidth) {\n      state.line += state.hyphens.char;\n      return token;\n    }\n    if (state.line.length === 1) {\n      return token;\n    }\n\n    token = iterator.next(startIndex - i);\n    state.line = state.line.slice(0, -1);\n    state.width -= token.width;\n  }\n\n  return token;\n}\n\nfunction breakSequence(state, token, measureText) {\n  const charTokenIterator = stringTokenizer({\n    string: token.value,\n    measureText,\n  });\n\n  while (state.lines.length < state.maxLines) {\n    let charToken = charTokenIterator.next();\n    if (charToken.done) {\n      break;\n    } else if (\n      state.width + charToken.width > state.maxWidth &&\n      charToken.breakOpportunity === BREAK_ALLOWED &&\n      state.line.length > 0\n    ) {\n      charToken = state.hyphens.enabled ? insertHyphenAndJump(state, charToken, charTokenIterator) : charToken;\n      newLine(state);\n      appendToLine(state, charToken);\n    } else {\n      appendToLine(state, charToken);\n    }\n  }\n}\n\nexport function breakAll(node, measureText) {\n  const text = node.text;\n  const iterator = stringTokenizer({\n    string: text,\n    separator: '',\n    measureText,\n    noBreakAllowedIdentifiers: [(chunk, i) => i === 0],\n  });\n  const state = initState(node, measureText);\n  let reduced = true;\n\n  while (state.lines.length < state.maxLines) {\n    let token = iterator.next();\n\n    if (token.done) {\n      newLine(state);\n      reduced = false;\n      break;\n    } else if (token.breakOpportunity === MANDATORY) {\n      newLine(state);\n    } else if (state.width + token.width > state.maxWidth && token.breakOpportunity === BREAK_ALLOWED) {\n      if (token.suppress) {\n        // Token is suppressable and can be ignored\n        state.width += token.width;\n      } else {\n        token = state.hyphens.enabled ? insertHyphenAndJump(state, token, iterator) : token;\n        newLine(state);\n        appendToLine(state, token);\n      }\n    } else {\n      appendToLine(state, token);\n    }\n  }\n\n  return {\n    lines: state.lines,\n    reduced,\n  };\n}\n\nexport function breakWord(node, measureText) {\n  const text = node.text;\n  const iterator = stringTokenizer({\n    string: text,\n    separator: /(\\s|-|\\u2010)/,\n    measureText,\n  });\n  const state = initState(node, measureText);\n  let reduced = true;\n\n  while (state.lines.length < state.maxLines) {\n    let token = iterator.next();\n\n    if (token.done) {\n      newLine(state);\n      reduced = false;\n      break;\n    } else if (token.breakOpportunity === MANDATORY) {\n      newLine(state);\n    } else if (state.width + token.width > state.maxWidth && token.breakOpportunity === BREAK_ALLOWED) {\n      if (token.suppress) {\n        // Token is suppressable and can be ignored\n        newLine(state);\n      } else if (token.width > state.maxWidth) {\n        // Single sequence is wider then maxWidth, break sequence into multiple lines\n        breakSequence(state, token, measureText);\n      } else {\n        newLine(state);\n        appendToLine(state, token);\n      }\n    } else {\n      appendToLine(state, token);\n    }\n  }\n\n  return {\n    lines: state.lines,\n    reduced,\n  };\n}\n","import extend from 'extend';\nimport { breakAll, breakWord } from './word-break';\nimport { ELLIPSIS_CHAR } from './text-const';\nimport { includesLineBreak } from './string-tokenizer';\nimport { fontSizeToLineHeight } from './font-size-to-height';\n\nfunction generateLineNodes(result, item, halfLead, height) {\n  const container = { type: 'container', children: [] };\n\n  if (typeof item.id !== 'undefined') {\n    // TODO also inherit data attribute and more?\n    container.id = item.id;\n  }\n\n  let currentY = 0;\n\n  result.lines.forEach((line, i) => {\n    const node = extend({}, item);\n    node.text = line;\n    node._lineBreak = true; // Flag node as processed to avoid duplicate linebreak run\n    currentY += halfLead; // leading height above\n\n    if (result.reduced && i === result.lines.length - 1) {\n      node.text += ELLIPSIS_CHAR;\n    } else {\n      delete node.maxWidth;\n    }\n\n    node.dy = isNaN(node.dy) ? currentY : node.dy + currentY;\n    currentY += height;\n    currentY += halfLead; // Leading height below\n    container.children.push(node);\n  });\n\n  return container;\n}\n\nfunction shouldLineBreak(item) {\n  // If type text and not already broken into lines\n  return item.type === 'text' && !item._lineBreak;\n}\n\nfunction wrappedMeasureText(node, measureText) {\n  return (text) =>\n    measureText({\n      text,\n      fontSize: node.fontSize,\n      fontFamily: node.fontFamily,\n    });\n}\n\nexport function resolveLineBreakAlgorithm(node) {\n  const WORDBREAK = {\n    'break-all': breakAll,\n    'break-word': breakWord,\n  };\n\n  return WORDBREAK[node.wordBreak];\n}\n\n/**\n * Apply wordBreak rules to text nodes.\n * @ignore\n * @param {function} measureText\n * @returns {function} Event function to convert a text node into multiple nodes\n */\nexport function onLineBreak(measureText) {\n  return (state) => {\n    const item = state.node;\n    if (shouldLineBreak(item)) {\n      const wordBreakFn = resolveLineBreakAlgorithm(item);\n      if (!wordBreakFn) {\n        return;\n      }\n\n      const tm = measureText(item);\n      if (tm.width > item.maxWidth || includesLineBreak(item.text)) {\n        const diff = fontSizeToLineHeight(item) - tm.height;\n        const halfLead = diff / 2;\n        const result = wordBreakFn(item, wrappedMeasureText(item, measureText));\n\n        state.node = generateLineNodes(result, item, halfLead, tm.height); // Convert node to container\n      }\n    }\n  };\n}\n","import { ELLIPSIS_CHAR } from './text-const';\n\nexport default function ellipsText({ text, 'font-size': fontSize, 'font-family': fontFamily, maxWidth }, measureText) {\n  // eslint-disable-line import/prefer-default-export\n  text = typeof text === 'string' ? text : `${text}`;\n  if (maxWidth === undefined) {\n    return text;\n  }\n  let textWidth = measureText({ text, fontSize, fontFamily }).width;\n  if (textWidth <= maxWidth) {\n    return text;\n  }\n\n  let min = 0;\n  let max = text.length - 1;\n  while (min <= max) {\n    let reduceIndex = Math.floor((min + max) / 2);\n    let reduceText = text.substr(0, reduceIndex) + ELLIPSIS_CHAR;\n    textWidth = measureText({ text: reduceText, fontSize, fontFamily }).width;\n    if (textWidth <= maxWidth) {\n      min = reduceIndex + 1;\n    } else {\n      // textWidth > maxWidth\n      max = reduceIndex - 1;\n    }\n  }\n  return text.substr(0, max) + ELLIPSIS_CHAR;\n}\n","/**\n * Currently some browsers, IE11 and Edge confirmed, doesn't support the dominant-baseline svg-attribute and\n * the browser that does, have different implementations. Thus giving an unpredictable result when rendering'\n * text and predicting it's position (ex. in collision detection).\n *\n * To supplement and the aid in aligning/positioning text with various items, this function can be used\n * to follow a common heuristic across supported renderers.\n * @ignore\n * @param {object} textNode\n * @param {string|number} [textNode['font-size']=0] - String in px format or number\n * @param {string} [textNode['dominant-baseline']] - If baseline is omitted dominant-baseline is used\n * @param {string} [textNode.baseline]\n * @returns {number} Delta-y required to adjust for baseline\n */\nexport default function baselineHeuristic(textNode) {\n  const baseline = textNode.baseline || textNode['dominant-baseline'];\n  let dy = 0;\n\n  const fontSize = parseInt(textNode.fontSize || textNode['font-size'], 10) || 0;\n\n  switch (baseline) {\n    case 'hanging':\n      dy = fontSize * 0.75;\n      break;\n    case 'text-before-edge':\n      dy = fontSize * 0.85;\n      break;\n    case 'middle':\n      dy = fontSize * 0.25;\n      break;\n    case 'central':\n      dy = fontSize * 0.35;\n      break;\n    case 'mathemetical':\n      dy = fontSize / 2;\n      break;\n    case 'text-after-edge':\n    case 'ideographic':\n      dy = -fontSize * 0.2;\n      break;\n    default:\n      dy = 0;\n      break;\n  }\n\n  return dy;\n}\n","import extend from 'extend';\nimport { resolveLineBreakAlgorithm } from './line-break-resolver';\nimport baselineHeuristic from './baseline-heuristic';\nimport { ELLIPSIS_CHAR } from './text-const';\nimport { fontSizeToHeight, fontSizeToLineHeight } from './font-size-to-height';\nimport { includesLineBreak } from './string-tokenizer';\n\nconst heightCache = {};\nconst widthCache = {};\nconst contextCache = {\n  fontSize: undefined,\n  fontFamily: undefined,\n};\nlet context;\n\nfunction setContext() {\n  context = context || document.createElement('canvas').getContext('2d');\n}\n\nfunction setFont(fontSize, fontFamily) {\n  if (contextCache.fontSize === fontSize && contextCache.fontFamily === fontFamily) {\n    return;\n  }\n\n  context.font = fontSize + ' ' + fontFamily; // eslint-disable-line\n  contextCache.fontSize = fontSize;\n  contextCache.fontFamily = fontFamily;\n}\n\nfunction measureTextWidth(text, fontSize, fontFamily) {\n  const key = text + fontSize + fontFamily;\n  if (typeof widthCache[key] !== 'number') {\n    setContext();\n    setFont(fontSize, fontFamily);\n    widthCache[key] = context.measureText(text).width;\n  }\n\n  return widthCache[key];\n}\n\nfunction measureTextHeight(fontSize) {\n  if (typeof heightCache[fontSize] !== 'number') {\n    heightCache[fontSize] = fontSizeToHeight(fontSize);\n  }\n\n  return heightCache[fontSize];\n}\n\n/**\n * @private\n * @param {object} opts\n * @param {string} opts.text - Text to measure\n * @param {string} opts.fontSize - Font size with a unit definition, ex. 'px' or 'em'\n * @param {string} opts.fontFamily - Font family\n * @return {object} Width and height of text in pixels\n * @example\n * measureText({\n *  text: 'my text',\n *  fontSize: '12px',\n *  fontFamily: 'Arial'\n * }); // returns { width: 20, height: 12 }\n */\nexport function measureText({ text, fontSize, fontFamily }) {\n  const w = measureTextWidth(text, fontSize, fontFamily);\n  const h = measureTextHeight(fontSize);\n  return { width: w, height: h };\n}\n\n/**\n * Calculates the bounding rectangle of a text node.\n * The bounding rectangle is a approximate of the \"em square\" seen here (http://www.w3resource.com/html5-canvas/html5-canvas-text.php)\n * @ignore\n * @param {object} attrs - Text node definition\n * @param {number} [attrs.x] - X-coordinate\n * @param {number} [attrs.y] - Y-coordinate\n * @param {number} [attrs.dx] - Delta x-coordinate\n * @param {number} [attrs.dy] - Delta y-coordinate\n * @param {string} [attrs.anchor] - Text anchor\n * @param {number} [attrs.maxWidth] - Maximum allowed text width\n * @return {object} The bounding rectangle\n */\nfunction calcTextBounds(attrs, measureFn = measureText) {\n  const fontSize = attrs['font-size'] || attrs.fontSize;\n  const fontFamily = attrs['font-family'] || attrs.fontFamily;\n  const textMeasure = measureFn({ text: attrs.text, fontFamily, fontSize });\n  const calWidth = Math.min(attrs.maxWidth || textMeasure.width, textMeasure.width); // Use actual value if max is not set\n  const x = attrs.x || 0;\n  const y = attrs.y || 0;\n  const dx = attrs.dx || 0;\n  const dy = (attrs.dy || 0) + baselineHeuristic(attrs);\n\n  const boundingRect = {\n    x: 0,\n    y: y + dy - textMeasure.height * 0.75, // Magic number for alphabetical baseline\n    width: calWidth,\n    height: textMeasure.height,\n  };\n\n  const anchor = attrs['text-anchor'] || attrs.anchor;\n\n  if (anchor === 'middle') {\n    boundingRect.x = x + dx - calWidth / 2;\n  } else if (anchor === 'end') {\n    boundingRect.x = x + dx - calWidth;\n  } else {\n    boundingRect.x = x + dx;\n  }\n\n  return boundingRect;\n}\n\n/**\n * Calculates the bounding rectangle of a text node. Including any line breaks.\n * @ignore\n * @param {object} node\n * @param {string} node.text - Text to measure\n * @param {number} [node.x=0] - X-coordinate\n * @param {number} [node.y=0] - Y-coordinate\n * @param {number} [node.dx=0] - Delta x-coordinate\n * @param {number} [node.dy=0] - Delta y-coordinate\n * @param {string} [node.anchor='start'] - Text anchor\n * @param {string} [node.fontSize] - Font size\n * @param {string} [node.fontFamily] - Font family\n * @param {string} [node['font-size']] - Font size\n * @param {string} [node['font-family']] - Font family\n * @param {string} [node.wordBreak] - Word-break option\n * @param {number} [node.maxWidth] - Maximum allowed text width\n * @param {number} [node.maxHeight] - Maximum allowed text height. If both maxLines and maxHeight are set, the property that results in the fewest number of lines is used\n * @param {number} [node.maxLines] - Maximum number of lines allowed.\n * @param {number} [node.lineHeight=1.2] - Line height\n * @param {function} [measureFn] - Optional text measure function\n * @return {object} The bounding rectangle\n */\nexport function textBounds(node, measureFn = measureText) {\n  const lineBreakFn = resolveLineBreakAlgorithm(node);\n  const fontSize = node['font-size'] || node.fontSize;\n  const fontFamily = node['font-family'] || node.fontFamily;\n  const tm = measureFn({ text: node.text, fontFamily, fontSize });\n\n  if (lineBreakFn && (tm.width > node.maxWidth || includesLineBreak(node.text))) {\n    const resolvedLineBreaks = lineBreakFn(node, (text) => measureFn({ text, fontFamily, fontSize }));\n    const nodeCopy = extend({}, node);\n    let maxWidth = 0;\n    let widestLine = '';\n    for (let i = 0, len = resolvedLineBreaks.lines.length; i < len; i++) {\n      let line = resolvedLineBreaks.lines[i];\n      line += i === len - 1 && resolvedLineBreaks.reduced ? ELLIPSIS_CHAR : '';\n      const width = measureFn({ text: line, fontSize, fontFamily }).width;\n      if (width >= maxWidth) {\n        maxWidth = width;\n        widestLine = line;\n      }\n    }\n    nodeCopy.text = widestLine;\n    const bounds = calcTextBounds(nodeCopy, measureFn);\n    bounds.height = fontSizeToLineHeight(node) * resolvedLineBreaks.lines.length;\n\n    return bounds;\n  }\n\n  return calcTextBounds(node, measureFn);\n}\n","import extend from 'extend';\n\nimport { ellipsText } from '../../../../web/text-manipulation';\nimport { ELLIPSIS_CHAR } from '../../../../web/text-manipulation/text-const';\n\nconst LINE_HEIGHT = 1.2;\nconst CIRCLE_FACTOR = 0.9;\n\nfunction cbContext(node, chart) {\n  return {\n    node,\n    data: node.data,\n    scale: chart.scale,\n    formatter: chart.formatter,\n    dataset: chart.dataset,\n  };\n}\n\nexport function placeTextInRect(rect, text, opts) {\n  const label = {\n    type: 'text',\n    text,\n    maxWidth: rect.width,\n    x: 0,\n    y: rect.y,\n    dx: 0,\n    dy: 0,\n    fill: opts.fill,\n    anchor: 'start',\n    baseline: 'alphabetical',\n    fontSize: `${opts.fontSize}px`,\n    fontFamily: opts.fontFamily,\n  };\n\n  const textMetrics = opts.textMetrics;\n\n  if (rect.width < opts.fontSize) {\n    return false;\n  }\n\n  const wiggleWidth = Math.max(0, rect.width - textMetrics.width);\n  label.x = rect.x + opts.align * wiggleWidth;\n  label.y = rect.y + textMetrics.height / LINE_HEIGHT;\n\n  return label;\n}\n\nfunction getRectFromCircle({ cx, cy, r }) {\n  return {\n    type: 'circle',\n    bounds: { cx, cy, r },\n  };\n}\nfunction getSliceBounds(slice) {\n  const EPSILON = 1e-12;\n  let { start, end, innerRadius, outerRadius, offset } = slice;\n  if (Math.abs(start + 2 * Math.PI - end) > EPSILON) {\n    return { type: null, bounds: null };\n  }\n  let r = innerRadius !== 0 ? innerRadius : outerRadius;\n  return getRectFromCircle({ cx: offset.x, cy: offset.y, r });\n}\n\nfunction getBounds(node) {\n  if (node.desc && node.desc.slice) {\n    return getSliceBounds(node.desc.slice);\n  }\n  if (node.type === 'circle') {\n    return getRectFromCircle(node.attrs);\n  }\n  if (node.type === 'rect') {\n    return { type: 'rect', bounds: node.bounds };\n  }\n  // defualt to node.bounds ?\n  return { type: null, bounds: null };\n}\n\n/**\n * @typedef {object} ComponentLabels~RowsLabelStrategy\n * @property {string} type='rows' Name of strategy\n */\n\n/**\n * Rows strategy settings\n * @typedef {object} ComponentLabels~RowsLabelStrategy.settings\n * @property {string} [fontFamily='Arial']\n * @property {number} [fontSize=12]\n * @property {number} [justify=0.5]\n * @property {number} [padding=4]\n * @property {Array<object>} labels\n * @property {string|function} labels[].label - The text value\n * @property {function} labels[].linkData - Link data to the label\n * @property {number} [labels[].align=0.5]\n * @property {string|function} [labels[].fill='#333']\n */\n\nexport function rows({ settings, chart, nodes, renderer, style }, placer = placeTextInRect) {\n  const defaults = extend(\n    {\n      fontSize: 12,\n      fontFamily: 'Arial',\n      fill: '#333',\n      padding: 4,\n      align: 0.5,\n      justify: 0.5,\n    },\n    style.label\n  );\n\n  defaults.fontSize = parseInt(defaults.fontSize, 10);\n\n  const rowSettings = extend({}, defaults, settings);\n\n  const labelSettings = settings.labels.map((labelSetting) => extend({}, rowSettings, labelSetting));\n\n  const labelStruct = {};\n  const labels = [];\n\n  for (let i = 0, len = nodes.length; i < len; i++) {\n    let node = nodes[i];\n    let arg = cbContext(node, chart);\n\n    let { type, bounds } = getBounds(node);\n    if (!bounds) {\n      continue;\n    }\n\n    let totalHeight = 0;\n    let measurements = [];\n    let texts = [];\n\n    let maxHeight = type === 'circle' ? 2 * bounds.r * CIRCLE_FACTOR : bounds.height;\n    totalHeight += rowSettings.padding;\n    let j;\n    for (j = 0; j < labelSettings.length; j++) {\n      let lblStngs = labelSettings[j];\n      let text = typeof lblStngs.label === 'function' ? lblStngs.label(arg, i) : '';\n\n      labelStruct.fontFamily = lblStngs.fontFamily;\n      labelStruct.fontSize = `${lblStngs.fontSize}px`;\n      labelStruct.text = text;\n      let measured = renderer.measureText(labelStruct);\n      totalHeight += measured.height + lblStngs.padding;\n      if (totalHeight > maxHeight) {\n        break;\n      }\n      texts.push(text);\n      measurements.push(measured);\n    }\n\n    const labelCount = j;\n    const wiggleHeight = Math.max(0, maxHeight - totalHeight);\n    let currentY;\n    if (type === 'circle') {\n      currentY = bounds.cy - bounds.r * CIRCLE_FACTOR;\n    } else {\n      currentY = bounds.y;\n    }\n    currentY += rowSettings.justify * wiggleHeight + rowSettings.padding;\n\n    for (j = 0; j < labelCount; j++) {\n      let lblStngs = labelSettings[j];\n      let rect;\n      if (type === 'circle') {\n        let maxYDistToCenter = Math.max(\n          Math.abs(currentY - bounds.cy),\n          Math.abs(currentY + measurements[j].height - bounds.cy)\n        );\n        let halfWidth = Math.sqrt(bounds.r * bounds.r - maxYDistToCenter * maxYDistToCenter);\n        rect = {\n          x: bounds.cx - halfWidth + rowSettings.padding,\n          y: currentY,\n          width: 2 * halfWidth - 2 * rowSettings.padding,\n          height: measurements[j].height,\n        };\n      } else {\n        rect = {\n          x: bounds.x + rowSettings.padding,\n          y: currentY,\n          width: bounds.width - 2 * rowSettings.padding,\n          height: measurements[j].height,\n        };\n      }\n\n      currentY += measurements[j].height + rowSettings.padding;\n      let fill = typeof lblStngs.fill === 'function' ? lblStngs.fill(arg, i) : lblStngs.fill;\n      const linkData = typeof lblStngs.linkData === 'function' ? lblStngs.linkData(arg, i) : undefined;\n      let label = placer(rect, texts[j], {\n        fill,\n        align: lblStngs.align,\n        fontSize: lblStngs.fontSize,\n        fontFamily: lblStngs.fontFamily,\n        textMetrics: measurements[j],\n      });\n      if (label) {\n        if (label.text && label.text !== ELLIPSIS_CHAR) {\n          const ellipsed = ellipsText(label, renderer.measureText);\n          if (ELLIPSIS_CHAR === ellipsed) {\n            // don't include label if it's only an ellipsis\n            continue;\n          }\n          label.ellipsed = ellipsed;\n        }\n        if (typeof linkData !== 'undefined') {\n          label.data = linkData;\n        }\n        labels.push(label);\n      }\n    }\n  }\n\n  return labels;\n}\n","import { bars } from './bars';\nimport { slices } from './slices';\nimport { rows } from './rows';\n\nexport default {\n  bar: bars,\n  slice: slices,\n  rows,\n};\n","import strategies from './strategies';\n\n/**\n * @typedef {object} ComponentLabels\n * @extends ComponentSettings\n * @example\n{\n  type: 'labels',\n  settings: {\n    sources: [\n      {\n        component: 'bars',\n        selector: 'rect', // select all 'rect' shapes from the 'bars' component\n        strategy: {\n          type: 'bar', // the strategy type\n          settings: {\n            labels: [\n              {\n                label({ data }) {\n                  return data ? data.end.label : '';\n                },\n                placements: [\n                  // label placements in prio order. Label will be placed in the first place it fits into\n                  { position: 'inside', fill: '#fff' },\n                  { position: 'outside', fill: '#666' },\n                ],\n              },\n            ],\n          },\n        },\n      },\n    ],\n  },\n}\n */\n\n/**\n * Component settings\n * @typedef {object} ComponentLabels.settings\n * @property {Array<ComponentLabels~Source>} sources Source settings\n */\n\n/**\n * @typedef {object} ComponentLabels~Source\n * @property {string} component Key of target component\n * @property {string} selector Shape selector\n * @property {ComponentLabels~BarsLabelStrategy|ComponentLabels~RowsLabelStrategy|ComponentLabels~SlicesLabelStrategy} strategy Strategy settings\n */\n\nexport function strategy({ chart, source, rect, renderer, style }, fn) {\n  const component = chart.component(source.component);\n  if (!component) {\n    return [];\n  }\n  const nodes = chart.findShapes(source.selector).filter((n) => n.key === source.component);\n\n  return fn({\n    chart,\n    settings: source.strategy.settings,\n    nodes,\n    rect: {\n      x: 0,\n      y: 0,\n      width: rect.width,\n      height: rect.height,\n    },\n    renderer,\n    style,\n  });\n}\n\nconst labelsComponent = {\n  require: ['chart', 'renderer', 'settings'],\n  defaultSettings: {\n    settings: {},\n    style: {\n      label: '$label',\n    },\n  },\n  render() {\n    const stngs = this.settings.settings;\n    const labels = [];\n\n    (stngs.sources || []).forEach((source) => {\n      if (source.strategy && strategies[source.strategy.type] && source.component) {\n        labels.push(\n          ...strategy(\n            {\n              chart: this.chart,\n              rect: this.rect,\n              renderer: this.renderer,\n              source,\n              style: this.style,\n            },\n            strategies[source.strategy.type]\n          )\n        );\n      }\n    });\n\n    return labels;\n  },\n};\n\nexport default labelsComponent;\n","import extend from 'extend';\n\n/**\n * Component settings\n * @typedef {object}\n * @alias ComponentLegendCat.settings\n */\nconst DEFAULT_SETTINGS = {\n  /**\n   * @typedef {object=}\n   */\n  layout: {\n    /**\n     * Maximum number of columns (vertical) or rows (horizontal)\n     * @type {number=}\n     */\n    size: 1,\n    /**\n     * Layout direction. Either `'ltr'` or `'rtl'`\n     * @type {string=}\n     */\n    direction: 'ltr',\n    /** Initial scroll offset\n     * @type {number=} */\n    scrollOffset: 0,\n  },\n  /**\n   * Settings applied per item\n   * @typedef {object=}\n   */\n  item: {\n    /** Whether to show the current item\n     * @type {boolean=} */\n    show: true,\n    /** Justify item\n     * @type {number=} */\n    justify: 0.5,\n    /** Align item\n     * @type {number=} */\n    align: 0.5,\n    /**\n     * @typedef {object=} */\n    label: {\n      /** Font size in pixels\n       * @type {string=} */\n      fontSize: '12px',\n      /** Font family\n       * @type {string=} */\n      fontFamily: 'Arial',\n      fill: '#595959',\n      /** Word break rule, how to apply line break if label text overflows its maxWidth property. Either `'break-word'` or `'break-all'`\n       * @type {string=} */\n      wordBreak: 'none',\n      /** Max number of lines allowed if label is broken into multiple lines (only applicable with wordBreak)\n       * @type {number=} */\n      maxLines: 2,\n      /** Maximum width of label, in px\n       * @type {number=} */\n      maxWidth: 136,\n      /** Line height as a multiple of the font size\n       * @type {number=} */\n      lineHeight: 1.2,\n    },\n    /**\n     * @typedef {object=} */\n    shape: {\n      /**\n       * Type of shape\n       * @type {string=} */\n      type: 'square',\n      /**\n       * Size of shape in pixels\n       * @type {number=} */\n      size: 12,\n    },\n  },\n  /**\n   * @typedef {object=} */\n  title: {\n    /** Whether to show the title\n     * @type {boolean=} */\n    show: true,\n    /** Title text. Defaults to the title of the provided data field\n     * @type {string=} */\n    text: undefined,\n    /** Horizontal alignment of the text. Allowed values are `'start'`, `'middle'` and `'end'`\n     * @type {string}\n     */\n    anchor: 'start',\n    /** Font size in pixels\n     * @type {string=} */\n    fontSize: '16px',\n    /** Font family\n     * @type {string=} */\n    fontFamily: 'Arial',\n    /** Title color\n     * @type {string=} */\n    fill: '#595959',\n    /** Word break rule, how to apply line break if label text overflows its maxWidth property. Either `'break-word'` or `'break-all'`\n     * @type {string=} */\n    wordBreak: 'none',\n    /** Max number of lines allowed if label is broken into multiple lines, is only appled when `wordBreak` is not set to `'none'`\n     * @type {number=} */\n    maxLines: 2,\n    /** Maximum width of title, in px\n     * @type {number=} */\n    maxWidth: 156,\n    /** Line height as a multiple of the font size\n     * @type {number=} */\n    lineHeight: 1.25,\n  },\n  /**\n   * @typedef {object=} */\n  navigation: {\n    /**\n     * @typedef {object=} */\n    button: {\n      /**\n       * @type {object<string, boolean>=} */\n      class: undefined,\n      /**\n       * @type {function} */\n      content: undefined,\n      /**\n       * @type {number=} */\n      tabIndex: undefined,\n    },\n    /** Whether the button should be disabled or not\n     * @type {boolean=} */\n    disabled: false,\n  },\n};\n\n/**\n * Resolve settings based on input, defaults, and data\n *\n * @ignore\n * @param {legendComponent} comp - The component instance\n */\nexport default function resolveSettings(comp) {\n  const domain = comp.scale.domain();\n  let data = { items: [] };\n  const dock = comp.settings.layout.dock;\n  if (comp.scale.type === 'threshold-color') {\n    const fields = comp.scale.data().fields;\n    const sourceField = fields[0];\n    let formatter = (v) => String(v);\n\n    if (comp.settings.formatter) {\n      formatter = comp.chart.formatter(comp.settings.formatter);\n    } else if (sourceField) {\n      formatter = sourceField.formatter();\n    }\n\n    for (let i = 0; i < domain.length - 1; i++) {\n      const it = {\n        value: domain[i],\n        label: `${formatter(domain[i])} - < ${formatter(domain[i + 1])}`,\n      };\n      if (sourceField) {\n        it.source = {\n          field: sourceField.id(),\n        };\n      }\n      data.items.push(it);\n    }\n    const orientation = dock === 'top' || dock === 'bottom' ? 'horizontal' : 'vertical';\n\n    if (orientation === 'vertical') {\n      data.items.reverse();\n    }\n  } else {\n    const labels = comp.scale.labels ? comp.scale.labels() : null;\n    data.items = domain.map((d, idx) => {\n      const datum = comp.scale.datum ? extend({}, comp.scale.datum(d)) : { value: d };\n      datum.value = d;\n\n      if (comp.scale.label) {\n        datum.label = comp.scale.label(d);\n      } else if (labels) {\n        datum.label = labels[idx];\n      }\n\n      return datum;\n    });\n  }\n\n  const title = comp.resolver.resolve({\n    data: {\n      fields: comp.scale.data().fields,\n    },\n    defaults: extend(true, {}, DEFAULT_SETTINGS.title, comp.style.title),\n    settings: comp.settings.settings.title,\n  });\n\n  const layout = comp.resolver.resolve({\n    data: {\n      fields: comp.scale.data().fields,\n    },\n    defaults: DEFAULT_SETTINGS.layout,\n    settings: comp.settings.settings.layout,\n  });\n\n  const labels = comp.resolver.resolve({\n    data,\n    defaults: extend(true, {}, DEFAULT_SETTINGS.item.label, comp.style.item.label),\n    settings: (comp.settings.settings.item || {}).label,\n  });\n\n  const shapeSettings = extend(true, {}, (comp.settings.settings.item || {}).shape);\n\n  if (typeof shapeSettings.fill === 'undefined' && comp.settings.scale) {\n    shapeSettings.fill = {\n      scale: comp.settings.scale,\n    };\n  }\n\n  const symbols = comp.resolver.resolve({\n    data,\n    defaults: extend(true, {}, DEFAULT_SETTINGS.item.shape, comp.style.item.shape),\n    settings: shapeSettings,\n  });\n\n  const items = comp.resolver.resolve({\n    data,\n    defaults: extend(\n      true,\n      {},\n      {\n        show: DEFAULT_SETTINGS.item.show,\n      }\n    ),\n    settings: {\n      show: (comp.settings.settings.item || {}).show,\n    },\n  });\n\n  function range(item, i) {\n    let v = item.data.value;\n    let next = domain[i + 1];\n    item.data.value = [v, next];\n  }\n\n  if (comp.scale.type === 'threshold-color') {\n    const orientation = dock === 'top' || dock === 'bottom' ? 'horizontal' : 'vertical';\n\n    if (orientation === 'vertical') {\n      items.items.reverse().forEach(range);\n      items.items.reverse();\n    } else {\n      items.items.forEach(range);\n    }\n  }\n\n  return {\n    title,\n    labels,\n    symbols,\n    items,\n    layout,\n  };\n}\n","import extend from 'extend';\n\n/* eslint no-mixed-operators:0 */\n\nfunction placeTextInRect(rect, label, opts) {\n  const textMetrics = opts.textMetrics;\n\n  if (rect.height < textMetrics.height) {\n    return false;\n  }\n\n  const wiggleWidth = Math.max(0, rect.width - textMetrics.width);\n  label.baseline = 'text-before-edge';\n  const wiggleHeight = Math.max(0, rect.height - textMetrics.height);\n  label.x = rect.x + opts.align * wiggleWidth;\n  label.y = rect.y + opts.justify * wiggleHeight + parseInt(label.fontSize, 10) * 0.175; // 0.175 - basline offset\n\n  return label;\n}\n\nfunction wiggleSymbol(container, size, opts) {\n  const wiggleWidth = Math.max(0, container.width - size);\n  const wiggleHeight = Math.max(0, container.height - size);\n\n  return {\n    x: container.x + size / 2 + opts.align * wiggleWidth,\n    y: container.y + size / 2 + opts.justify * wiggleHeight,\n  };\n}\n\nexport function createRenderItem({ x = 0, y, item, globalMetrics, createSymbol, direction = 'ltr' }) {\n  let label = item.label.displayObject;\n  let labelBounds = item.label.bounds;\n  let symbolItem = item.symbol.meta;\n  const rtl = direction === 'rtl';\n\n  let labelRect = {\n    x: rtl ? x + globalMetrics.maxLabelBounds.width : x + globalMetrics.maxSymbolSize + globalMetrics.spacing,\n    y,\n    width: globalMetrics.maxLabelBounds.width,\n    height: Math.max(globalMetrics.maxSymbolSize, globalMetrics.maxLabelBounds.height),\n  };\n\n  let wiggled = wiggleSymbol(\n    {\n      x: rtl ? x + globalMetrics.maxLabelBounds.width + globalMetrics.spacing : x,\n      y,\n      width: globalMetrics.maxSymbolSize,\n      height: labelRect.height,\n    },\n    symbolItem.size,\n    {\n      align: typeof symbolItem.align === 'undefined' ? 0.5 : symbolItem.align,\n      justify: typeof symbolItem.justify === 'undefined' ? 0.5 : symbolItem.justify,\n    }\n  );\n\n  const symbol = createSymbol(extend({}, symbolItem, wiggled));\n\n  delete symbol.collider;\n\n  label.anchor = rtl ? 'end' : 'start';\n\n  placeTextInRect(labelRect, label, {\n    textMetrics: labelBounds,\n    fontSize: parseInt(label.fontSize, 10),\n    align: 0.0,\n    justify: 0.5,\n  });\n\n  let container = {\n    type: 'container',\n    data: item.label.displayObject.data,\n    children: [symbol, label],\n    collider: {\n      type: 'rect',\n      x,\n      y,\n      width: globalMetrics.maxItemBounds.width,\n      height: globalMetrics.maxItemBounds.height,\n    },\n  };\n\n  return {\n    item: container,\n    metrics: labelRect,\n  };\n}\n\nexport function getItemsToRender({ viewRect }, rect, { itemized, create = createRenderItem, parallels, createSymbol }) {\n  const direction = itemized.layout.direction;\n  const globalMetrics = itemized.globalMetrics;\n  const legendItems = itemized.items;\n  const isHorizontal = itemized.layout.orientation === 'horizontal';\n  let s = 0;\n\n  const renderItems = [];\n  const fixedHeight = globalMetrics.maxItemBounds.height;\n  const fixedWidth = globalMetrics.maxItemBounds.width;\n  const rowHeight = itemized.layout.margin.vertical + fixedHeight;\n  const columnWidth = itemized.layout.margin.horizontal + fixedWidth;\n  let x = rect.x;\n  let y = rect.y;\n\n  let shift = viewRect.x - rect.x;\n\n  for (let i = 0; i < legendItems.length; i++) {\n    let renderItem = create({\n      y,\n      x: direction === 'rtl' ? viewRect.x + shift + viewRect.width - fixedWidth - (x - rect.x) : x,\n      item: legendItems[i],\n      globalMetrics,\n      direction,\n      createSymbol,\n    });\n\n    if ((isHorizontal && x >= viewRect.x - fixedWidth) || (!isHorizontal && y >= viewRect.y - fixedHeight)) {\n      renderItems.push(renderItem.item);\n    }\n\n    s++;\n    if (s >= parallels) {\n      s = 0;\n      if (isHorizontal) {\n        x += columnWidth; // next column\n        y = rect.y; // reset y to first row\n      } else {\n        y += rowHeight; // next row\n        x = rect.x; // reset x to first column\n      }\n    } else if (isHorizontal) {\n      y += rowHeight; // next row\n    } else {\n      x += columnWidth; // next column\n    }\n\n    if (!isHorizontal && y > viewRect.y + viewRect.height) {\n      break;\n    } else if (isHorizontal && x > viewRect.x + viewRect.width) {\n      break;\n    }\n  }\n  return renderItems;\n}\n\nexport function itemize({ resolved, dock }, renderer) {\n  let label;\n  let items = [];\n  let item;\n  let sourceItems = resolved.items.items;\n  let sourceSymbols = resolved.symbols.items;\n  let sourceLabels = resolved.labels.items;\n\n  let maxSymbolSize = 0;\n  let maxLabelWidth = 0;\n  let maxLabelHeight = 0;\n\n  for (let i = 0; i < sourceItems.length; i++) {\n    if (sourceItems[i].show === false) {\n      continue;\n    }\n\n    const text = typeof sourceLabels[i].text !== 'undefined' ? sourceLabels[i].text : sourceLabels[i].data.label || '';\n    label = extend({}, sourceLabels[i], {\n      // create the displayObject here in order to measure it\n      type: 'text',\n      fontSize: `${parseInt(sourceLabels[i].fontSize, 10)}px`,\n      text,\n      title: text,\n    });\n\n    item = {\n      symbol: {\n        // can't create a displayObject here due to need to wiggle the center position of the symbol later on,\n        // just store the object needed later on\n        meta: sourceSymbols[i],\n      },\n      label: {\n        displayObject: label,\n        bounds: renderer.textBounds(label),\n      },\n    };\n\n    items.push(item);\n\n    maxSymbolSize = Math.max(sourceSymbols[i].size, maxSymbolSize);\n    maxLabelWidth = Math.max(item.label.bounds.width, maxLabelWidth);\n    maxLabelHeight = Math.max(item.label.bounds.height, maxLabelHeight);\n  }\n\n  return {\n    items,\n    globalMetrics: {\n      spacing: 8,\n      maxSymbolSize,\n      maxItemBounds: {\n        height: Math.max(maxSymbolSize, maxLabelHeight),\n        width: maxSymbolSize + 8 + maxLabelWidth,\n      },\n      maxLabelBounds: {\n        width: maxLabelWidth,\n        height: maxLabelHeight,\n      },\n    },\n    layout: {\n      margin: {\n        vertical: typeof resolved.layout.item.vertical !== 'undefined' ? resolved.layout.item.vertical : 4,\n        horizontal: typeof resolved.layout.item.horizontal !== 'undefined' ? resolved.layout.item.horizontal : 4,\n      },\n      mode: resolved.layout.item.mode,\n      size: resolved.layout.item.size,\n      orientation: dock === 'top' || dock === 'bottom' ? 'horizontal' : 'vertical',\n      direction: resolved.layout.item.direction,\n      scrollOffset: resolved.layout.item.scrollOffset,\n    },\n  };\n}\n\nexport function extent(itemized, parallels) {\n  const count = itemized.items.length;\n  const size = Math.ceil(count / parallels);\n  const property = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n  const margin = property === 'width' ? 'horizontal' : 'vertical';\n  return itemized.globalMetrics.maxItemBounds[property] * size + (size - 1) * itemized.layout.margin[margin];\n}\n\nexport function spread(itemized, parallels) {\n  const size = parallels;\n  const property = itemized.layout.orientation === 'horizontal' ? 'height' : 'width';\n  const margin = property === 'width' ? 'horizontal' : 'vertical';\n  return (\n    itemized.globalMetrics.maxItemBounds[property] * size + // expected vertical size of items\n    (size - 1) * itemized.layout.margin[margin]\n  ); // expected spacing between items\n}\n\nexport function parallelize(availableExtent, availableSpread, itemized) {\n  const count = itemized.items.length;\n  const extentProperty = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n  const margin = extentProperty === 'width' ? 'horizontal' : 'vertical';\n  const extentInPx =\n    itemized.globalMetrics.maxItemBounds[extentProperty] * count + (count - 1) * itemized.layout.margin[margin];\n  let numNeeded = Math.ceil(extentInPx / availableExtent);\n\n  if (availableSpread != null) {\n    const spreadProperty = itemized.layout.orientation === 'horizontal' ? 'height' : 'width';\n    const spreadMargin = spreadProperty === 'width' ? 'horizontal' : 'vertical';\n    const spreadMarginSize = itemized.layout.margin[spreadMargin] || 4;\n    const numAllowed = Math.floor(\n      (availableSpread + spreadMarginSize) / (spreadMarginSize + itemized.globalMetrics.maxItemBounds[spreadProperty])\n    );\n    numNeeded = Math.min(numNeeded, numAllowed);\n  }\n\n  const numInput = isNaN(itemized.layout.size) ? 1 : itemized.layout.size;\n  return Math.max(1, Math.min(numNeeded, numInput));\n}\n\nexport default function (legend, { onScroll = () => {} }) {\n  let itemized;\n  let parallels;\n  let viewRect;\n  let containerRect;\n  let offset = null;\n  let overflow = 0;\n\n  const api = {\n    itemize: (obj) => {\n      itemized = itemize(obj, legend.renderer);\n      offset = !isNaN(itemized.layout.scrollOffset) ? itemized.layout.scrollOffset : offset; // Set the initial offset\n    },\n    getItemsToRender: (obj) => {\n      viewRect = obj.viewRect;\n      overflow = api.getContentOverflow(viewRect);\n      const ext = api.extent();\n      offset = Math.max(0, Math.min(offset, overflow));\n\n      containerRect = extend({}, viewRect);\n\n      const offsetProperty = api.orientation() === 'horizontal' ? 'x' : 'y';\n      containerRect[offsetProperty] -= offset;\n      containerRect[offsetProperty === 'x' ? 'width' : 'height'] = ext;\n\n      return getItemsToRender(obj, containerRect, { itemized, parallels, createSymbol: legend.symbol });\n    },\n    parallelize: (availableExtent, availableSpread) => {\n      parallels = parallelize(availableExtent, availableSpread, itemized);\n      return parallels;\n    },\n    hasContentOverflow: () => {\n      const property = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n      return extent(itemized, parallels) > viewRect[property];\n    },\n    getContentOverflow: (rect = viewRect) => {\n      const property = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n      return Math.max(0, extent(itemized, parallels) - rect[property]);\n    },\n    getNextSize: () => {\n      // TODO - calculate the actual size to next item to ensure alignment\n      const property = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n      const margin = property === 'width' ? 'horizontal' : 'vertical';\n      return itemized.globalMetrics.maxItemBounds[property] + itemized.layout.margin[margin];\n    },\n    getPrevSize: () => {\n      // TODO - calculate the actual size to next item to ensure alignment\n      const property = itemized.layout.orientation === 'horizontal' ? 'width' : 'height';\n      const margin = property === 'width' ? 'horizontal' : 'vertical';\n      return itemized.globalMetrics.maxItemBounds[property] + itemized.layout.margin[margin];\n    },\n    hasNext: () => {\n      if (api.orientation() === 'horizontal') {\n        return viewRect.x + viewRect.width < containerRect.x + containerRect.width;\n      }\n      return viewRect.y + viewRect.height < containerRect.y + containerRect.height;\n    },\n    hasPrev: () => {\n      if (api.orientation() === 'horizontal') {\n        return containerRect.x < viewRect.x;\n      }\n      return containerRect.y < viewRect.y;\n    },\n    next: () => {\n      api.scroll(-api.getNextSize());\n    },\n    prev: () => {\n      api.scroll(api.getPrevSize());\n    },\n    scroll: (delta) => {\n      const current = Math.max(0, Math.min(overflow, offset - delta));\n      if (current === offset) {\n        return;\n      }\n      offset = current;\n      onScroll();\n    },\n    offset: () => offset,\n    orientation: () => itemized.layout.orientation,\n    direction: () => itemized.layout.direction,\n    extent: () => extent(itemized, parallels), // total amount of space along orientation\n    spread: () => spread(itemized, parallels), // total amount of space perpendicular to orientation\n  };\n\n  return api;\n}\n","/**\n * Concatenate object keys into a space separated string. Use for transforming a 'class name map' into a class string\n * @private\n * @param  {Object} classMap Object with class names as keys and true or false values depending on if they should be in the returned class string or not\n * @return {String} Space separated string with class names\n */\nexport default function classString(classMap) {\n  return Object.keys(classMap)\n    .filter((className) => classMap[className])\n    .join(' ');\n}\n","import extend from 'extend';\nimport classString from '../../utils/class-string';\n\nconst DIR = {\n  up: '\\u25B2',\n  right: '\\u25B6',\n  down: '\\u25BC',\n  left: '\\u25C0',\n};\n\nfunction itemize({\n  // resolved,\n  dock,\n  navigation,\n}) {\n  return {\n    layout: {\n      orientation: dock === 'top' || dock === 'bottom' ? 'vertical' : 'horizontal',\n    },\n    navigation,\n  };\n}\n\nfunction btn(h, { size, isActive, direction, nav, attrs }) {\n  let c = {};\n  let content = '';\n  const attrsMerged = attrs;\n  if (nav && nav.button) {\n    if (typeof nav.button.class === 'function') {\n      c = nav.button.class({ direction });\n    } else if (nav.button.class) {\n      c = nav.button.class;\n    }\n    if (typeof nav.button.content === 'function') {\n      content = nav.button.content(h, { direction });\n    }\n    if (nav.button.tabIndex !== undefined) {\n      attrsMerged.tabindex = nav.button.tabIndex;\n    }\n  }\n  const style = {\n    width: `${size}px`,\n    minWidth: `${size}px`,\n    height: `${size}px`,\n  };\n\n  if (!Object.keys(c).length) {\n    // if no classes are set, add some basic styling\n    style.border = '0';\n    style.background = 'none';\n  }\n\n  if (!isActive || (nav && nav.disabled)) {\n    attrsMerged.disabled = 'disabled';\n  }\n\n  return h(\n    'button',\n    extend(\n      {\n        class: classString(c),\n        style,\n      },\n      attrsMerged\n    ),\n    [\n      content ||\n        h(\n          'span',\n          {\n            style: {\n              pointerEvents: 'none',\n            },\n          },\n          [DIR[direction]]\n        ),\n    ]\n  );\n}\n\nfunction render(renderer, { rect, itemRenderer }, itemized, legend) {\n  if (!renderer || !renderer.renderArgs) {\n    return;\n  }\n  renderer.size(rect);\n  const h = renderer.renderArgs[0];\n\n  const isVertical = itemized.layout.orientation === 'vertical'; // orientation of the navigation (not the legend)\n  const isRtl = itemRenderer.direction() === 'rtl';\n\n  const hasNext = itemRenderer.hasNext();\n  const hasPrev = itemRenderer.hasPrev();\n\n  if (!hasPrev && !hasNext) {\n    renderer.render([]);\n    return;\n  }\n\n  const buttonSize = 32;\n\n  const order = isVertical ? ['right', 'left'] : ['down', 'up'];\n\n  if (isRtl && isVertical) {\n    order.reverse();\n  }\n\n  const nodes = [\n    h(\n      'div',\n      {\n        style: {\n          position: 'relative',\n          display: 'flex',\n          'flex-direction': isVertical ? 'column' : 'row',\n          'justify-content': 'center',\n          height: '100%',\n          pointerEvents: 'auto',\n        },\n        dir: isRtl && !isVertical ? 'rtl' : 'ltr',\n      },\n      [\n        btn(h, {\n          size: buttonSize,\n          isActive: hasNext,\n          direction: order[0],\n          attrs: {\n            'data-action': 'next',\n            'data-component-key': legend.settings.key,\n          },\n          nav: itemized.navigation,\n        }),\n        btn(h, {\n          size: buttonSize,\n          isActive: hasPrev,\n          direction: order[1],\n          attrs: {\n            'data-action': 'prev',\n            'data-component-key': legend.settings.key,\n          },\n          nav: itemized.navigation,\n        }),\n      ]\n    ),\n  ];\n  renderer.render(nodes);\n}\n\nexport default function (legend) {\n  let itemized;\n\n  const nav = {\n    itemize: (obj) => {\n      itemized = itemize(obj);\n    },\n    render: (obj) => render(nav.renderer, obj, itemized, legend),\n    extent: () => 32,\n    spread: () => 64,\n  };\n\n  return nav;\n}\n","import extend from 'extend';\n\nfunction itemize({ resolved }, legend) {\n  if (resolved.title.item.show === false) {\n    return null;\n  }\n  const t = extend({}, resolved.title.item, {\n    type: 'text',\n  });\n\n  if (resolved.layout.item.direction === 'rtl') {\n    if (!t.anchor || t.anchor === 'start') {\n      t.anchor = 'end';\n    } else if (t.anchor === 'end') {\n      t.anchor = 'start';\n    }\n  }\n\n  if (typeof resolved.title.settings.text === 'undefined') {\n    const fields = legend.scale.data().fields;\n    t.text = fields && fields[0] ? fields[0].title() : '';\n  }\n\n  return {\n    displayObject: t,\n    bounds: legend.renderer.textBounds(t),\n  };\n}\n\nfunction render({ rect }, renderer, itemized) {\n  if (!renderer) {\n    return;\n  }\n  const nodes = [];\n  renderer.size(rect);\n  if (itemized) {\n    const align = {\n      start: 0,\n      end: rect.width,\n      middle: rect.width / 2,\n    };\n    nodes.push(\n      extend({}, itemized.displayObject, {\n        x: align[itemized.displayObject.anchor] || 0,\n        y: 0,\n        baseline: 'text-before-edge',\n        title: itemized.displayObject.text,\n      })\n    );\n  }\n  renderer.render(nodes);\n}\n\nexport default function (legend) {\n  let itemized;\n\n  const api = {\n    itemize: (obj) => {\n      itemized = itemize(obj, legend);\n    },\n    render: (obj) => {\n      render(obj, api.renderer, itemized);\n    },\n    spread: () => (itemized ? itemized.bounds.height : 0),\n    extent: () => (itemized ? itemized.bounds.width : 0),\n  };\n\n  return api;\n}\n","import extend from 'extend';\n/* eslint no-mixed-operators:0 */\n\nexport default function layout(\n  rect,\n  display,\n  orientation,\n  { itemRenderer, navigationRenderer, titleRenderer, isPreliminary = false }\n) {\n  let title;\n  let content;\n  let navigation;\n  let preferredSize = 0;\n\n  const paddedRect = {\n    x: display.spacing,\n    y: display.spacing,\n    width: rect.width - 2 * display.spacing,\n    height: rect.height - 2 * display.spacing,\n  };\n\n  title = {\n    x: paddedRect.x,\n    y: paddedRect.y,\n    width: paddedRect.width,\n    height: titleRenderer.spread(),\n  };\n\n  if (orientation === 'horizontal') {\n    // const titleAtTop = false;\n    // if (titleAtTop) { // this might be a nicer layout sometimes\n    //   // |------------------|\n    //   // |title             |\n    //   // |------------|-----|\n    //   // |content     | nav |\n    //   // |------------|-----|\n\n    //   // available space for items without navigation UI\n    //   const availableExtentForItems = paddedRect.width;\n    //   const availableSpreadForItems = paddedRect.height - (title.y + title.height) + 8;\n    //   const isRtl = itemRenderer.direction() === 'rtl';\n    //   itemRenderer.parallelize(availableExtentForItems, isPreliminary ? undefined : availableSpreadForItems);\n\n    //   const navigationSize = itemRenderer.extent() > availableExtentForItems ? navigationRenderer.extent() : 0;\n    //   content = {\n    //     x: paddedRect.x,\n    //     y: title.y + title.height,\n    //     width: paddedRect.width - navigationSize,\n    //     height: availableSpreadForItems\n    //   };\n    //   navigation = {\n    //     x: content.x + content.width,\n    //     y: title.y + title.height,\n    //     width: navigationSize,\n    //     height: paddedRect.height - (title.y + title.height) + 8\n    //   };\n\n    //   if (isRtl) { // switch navigation and content\n    //     navigation.x = content.x;\n    //     content.x = navigation.x + navigation.width;\n    //     // totalContent.x = navigation.x;\n    //   }\n    //   preferredSize = title.height + Math.max(navigationRenderer.spread(), itemRenderer.spread());\n    // } else {\n    // |-----|------------|-----|\n    // |title|content     | nav |\n    // |-----|------------|-----|\n\n    title = {\n      x: paddedRect.x,\n      y: paddedRect.y,\n      width: titleRenderer.extent(),\n      height: titleRenderer.spread(),\n    };\n\n    // available space for items without navigation UI\n    const availableExtentForItems = paddedRect.width - title.width - (title.width ? display.spacing : 0);\n    const availableSpreadForItems = paddedRect.height;\n    itemRenderer.parallelize(availableExtentForItems, isPreliminary ? undefined : availableSpreadForItems);\n\n    const navigationSize = itemRenderer.extent() > availableExtentForItems ? navigationRenderer.extent() : 0;\n    const spread = itemRenderer.spread();\n    const navigationSpread = navigationSize ? navigationRenderer.spread() : 0;\n    content = {\n      x: title.x + title.width + (title.width ? display.spacing : 0),\n      y: paddedRect.y + Math.max(0, (navigationSpread - spread) / 2),\n      width:\n        paddedRect.width -\n        navigationSize -\n        title.width -\n        (navigationSize ? display.spacing : 0) -\n        (title.width ? display.spacing : 0),\n      height: availableSpreadForItems,\n    };\n    navigation = {\n      x: content.x + content.width + (navigationSize ? display.spacing : 0),\n      y: paddedRect.y,\n      width: navigationSize,\n      height: paddedRect.height,\n    };\n\n    title.y = content.y;\n\n    const isRtl = itemRenderer.direction() === 'rtl';\n    if (isRtl) {\n      // switch title, content and navigation\n      navigation.x = paddedRect.x;\n      content.x = navigation.x + navigation.width + (navigation.width ? display.spacing : 0);\n      title.x = content.x + content.width + (title.width ? display.spacing : 0);\n    }\n    preferredSize = Math.max(title.height, navigationSpread, itemRenderer.spread());\n    // }\n  } else {\n    // |------------|\n    // |title       |\n    // |------------|\n    // |content     |\n    // |------------|\n    // |navigation  |\n    // |------------|\n\n    const availableExtentForItems = paddedRect.height - title.height - (title.height ? display.spacing : 0);\n    const availableSpreadForItems = paddedRect.width;\n    itemRenderer.parallelize(availableExtentForItems, isPreliminary ? undefined : availableSpreadForItems);\n\n    const navigationSize = itemRenderer.extent() > availableExtentForItems ? navigationRenderer.extent() : 0;\n    navigation = {\n      x: paddedRect.x,\n      y: paddedRect.y + paddedRect.height - navigationSize,\n      width: paddedRect.width,\n      height: navigationSize,\n    };\n\n    content = {\n      x: paddedRect.x,\n      y: title.y + title.height + (title.height ? display.spacing : 0),\n      width: paddedRect.width,\n      height:\n        paddedRect.height -\n        title.height -\n        (title.height ? display.spacing : 0) -\n        navigation.height -\n        (navigation.height ? display.spacing : 0),\n    };\n\n    preferredSize = Math.max(\n      titleRenderer.extent(),\n      navigationSize ? navigationRenderer.spread() : 0,\n      itemRenderer.spread()\n    );\n  }\n\n  content = extend({}, rect, {\n    x: rect.x + content.x,\n    y: rect.y + content.y,\n    width: content.width,\n    height: content.height,\n  });\n\n  navigation.x += rect.x;\n  navigation.y += rect.y;\n\n  title.x += rect.x;\n  title.y += rect.y;\n\n  return {\n    title: extend({}, rect, title),\n    content: extend({}, rect, content),\n    navigation: extend({}, rect, navigation),\n    orientation,\n    preferredSize,\n  };\n}\n","import extend from 'extend';\nimport resolveSettings from './legend-resolver';\nimport itemRendererFactory from './item-renderer';\nimport navigationRendererFactory from './navigation-renderer';\nimport titleRendererFactory from './title-renderer';\nimport layout from './legend-layout';\n\nfunction update(comp) {\n  comp.state.resolved = resolveSettings(comp);\n  comp.titleRenderer.itemize({\n    resolved: comp.state.resolved,\n    dock: comp.settings.layout.dock || 'center',\n  });\n  comp.itemRenderer.itemize({\n    resolved: comp.state.resolved,\n    dock: comp.settings.layout.dock || 'center',\n  });\n  comp.navigationRenderer.itemize({\n    resolved: comp.state.resolved,\n    dock: comp.settings.layout.dock || 'center',\n    navigation: comp.settings.settings.navigation,\n  });\n\n  comp.state.display = {\n    spacing: 8,\n  };\n}\n\nfunction preferredSize(comp, size) {\n  let s = 0;\n  const dock = comp.settings.layout.dock || 'center';\n  const orientation = dock === 'top' || dock === 'bottom' ? 'horizontal' : 'vertical';\n  const d = comp.state.display;\n  const tempLayout = layout(size.inner, d, orientation, {\n    itemRenderer: comp.itemRenderer,\n    navigationRenderer: comp.navigationRenderer,\n    titleRenderer: comp.titleRenderer,\n    isPreliminary: true,\n  });\n  s += d.spacing; // start padding in both vertical and horizontal mode\n  s += tempLayout.preferredSize;\n  s += d.spacing; // end padding in both vertical and horizontal mode\n  return s;\n}\n\nfunction render(legend) {\n  const { rect, settings, state, itemRenderer, navigationRenderer, titleRenderer } = legend;\n  const dock = settings.layout.dock;\n  const orientation = dock === 'top' || dock === 'bottom' ? 'horizontal' : 'vertical';\n  const l = layout(rect, state.display, orientation, {\n    itemRenderer,\n    navigationRenderer,\n    titleRenderer,\n  });\n\n  legend.renderer.size(l.content);\n\n  // l.content.x = 0;\n  // l.content.y = 0;\n\n  // l.navigation.x += rect.x;\n  // l.navigation.y += rect.y;\n\n  // l.title.x += rect.x;\n  // l.title.y += rect.y;\n\n  let contentItems = itemRenderer.getItemsToRender({\n    viewRect: extend({}, l.content, { x: 0, y: 0 }),\n  });\n\n  navigationRenderer.render({\n    rect: l.navigation,\n    itemRenderer,\n  });\n\n  titleRenderer.render({\n    rect: l.title,\n  });\n\n  legend.state.views = {\n    layout: l,\n  };\n\n  return contentItems;\n}\n\nconst component = {\n  require: ['chart', 'settings', 'renderer', 'update', 'resolver', 'registries', 'symbol'],\n  defaultSettings: {\n    settings: {},\n    style: {\n      item: {\n        label: '$label',\n        shape: '$shape',\n      },\n      title: '$title',\n    },\n  },\n  mounted(renderElement) {\n    if (renderElement && renderElement.parentNode) {\n      this.navigationRenderer.renderer.appendTo(renderElement.parentNode);\n      this.titleRenderer.renderer.appendTo(renderElement.parentNode);\n\n      renderElement.parentNode.insertBefore(this.navigationRenderer.renderer.element(), renderElement);\n      renderElement.parentNode.insertBefore(this.titleRenderer.renderer.element(), renderElement);\n    }\n    this.navigationRenderer.render({\n      rect: this.state.views.layout.navigation,\n      itemRenderer: this.itemRenderer,\n    });\n\n    this.titleRenderer.render({\n      rect: this.state.views.layout.title,\n    });\n  },\n  beforeUnmount() {\n    this.navigationRenderer.renderer.clear();\n    this.titleRenderer.renderer.clear();\n  },\n  on: {\n    panstart() {\n      if (this.state.interaction.started) {\n        return;\n      }\n      const contentOverflow = this.itemRenderer.getContentOverflow();\n      if (!contentOverflow) {\n        return;\n      }\n      this.state.interaction.started = true;\n      this.state.interaction.delta = 0;\n    },\n    panmove(e) {\n      if (!this.state.interaction.started) {\n        return;\n      }\n      const delta =\n        this.itemRenderer.orientation() === 'horizontal'\n          ? (this.itemRenderer.direction() === 'rtl' ? -1 : 1) * e.deltaX\n          : e.deltaY;\n      this.itemRenderer.scroll(delta - this.state.interaction.delta);\n      this.state.interaction.delta = delta;\n    },\n    panend() {\n      this.state.interaction.started = false;\n    },\n    scroll(delta) {\n      this.itemRenderer.scroll(-delta);\n    },\n    next() {\n      this.itemRenderer.next();\n    },\n    prev() {\n      this.itemRenderer.prev();\n    },\n  },\n  created() {\n    this.state = {\n      interaction: {},\n    };\n    this.onScroll = () => {\n      const items = render(this);\n      this.update(items);\n    };\n    this.itemRenderer = itemRendererFactory(this, {\n      onScroll: this.onScroll,\n    });\n    this.navigationRenderer = navigationRendererFactory(this);\n    this.titleRenderer = titleRendererFactory(this);\n    this.navigationRenderer.renderer = this.registries.renderer('dom')();\n    this.titleRenderer.renderer = this.registries.renderer(this.settings.renderer)();\n    update(this);\n  },\n  preferredSize(obj) {\n    return preferredSize(this, obj);\n  },\n  beforeUpdate() {\n    update(this);\n  },\n  render() {\n    return render(this);\n  },\n  beforeDestroy() {\n    this.navigationRenderer.renderer.destroy();\n    this.titleRenderer.renderer.destroy();\n  },\n  additionalElements() {\n    return [this.titleRenderer.renderer.element(), this.navigationRenderer.renderer.element()];\n  },\n  _DO_NOT_USE_getInfo() {\n    return {\n      offset: this.itemRenderer.offset(),\n    };\n  },\n};\n\nexport default component;\n","function applyAlignJustify(ctx, node) {\n  let wiggle = 0;\n  const cmd = {\n    type: ctx.state.isVertical ? 'justify' : 'align',\n    coord: ctx.state.isVertical ? 'y' : 'x',\n    pos: ctx.state.isVertical ? 'height' : 'width',\n    fn: ctx.state.isVertical ? 'requiredHeight' : 'requiredWidth',\n  };\n\n  wiggle = ctx.state.rect[cmd.pos] - ctx.state.legend.length() - ctx.state.title[cmd.fn]();\n  wiggle *= Math.min(1, Math.max(ctx.stgns[cmd.type], 0));\n  node[cmd.coord] += wiggle;\n}\n\nexport function generateStopNodes(ctx) {\n  const fillScale = ctx.state.legend.fillScale;\n  const majorScale = ctx.state.legend.majorScale;\n  const stops = fillScale.domain().map((d) => ({\n    type: 'stop',\n    color: fillScale(d),\n    offset: Math.min(1, Math.max(0, majorScale.norm(d))),\n  }));\n\n  return stops.sort((a, b) => a.offset - b.offset);\n}\n\nexport function createTitleNode(ctx) {\n  const state = ctx.state;\n  const settings = ctx.stgns;\n  const isTickLeft = state.ticks.anchor === 'left';\n  const isTickTop = state.ticks.anchor === 'top';\n  let x = state.rect.x;\n  let y = state.rect.y;\n  let textAnchor = 'start';\n\n  if (state.title.anchor === 'left') {\n    x += state.title.requiredWidth() - settings.title.padding;\n    y += state.title.textMetrics.height;\n    y += isTickTop ? state.rect.height - state.title.textBounds.height : 0;\n    textAnchor = 'end';\n  } else if (state.title.anchor === 'right') {\n    x += state.legend.length();\n    x += settings.title.padding;\n    y += state.title.textMetrics.height;\n    y += isTickTop ? state.rect.height - state.title.textBounds.height : 0;\n  } else if (state.title.anchor === 'top') {\n    x += isTickLeft ? state.rect.width : 0;\n    y += state.title.textMetrics.height;\n    textAnchor = isTickLeft ? 'end' : 'start';\n  }\n\n  const node = {\n    tag: 'legend-title',\n    type: 'text',\n    x,\n    y: Math.min(y, state.rect.y + state.rect.height),\n    text: settings.title.text,\n    fill: settings.title.fill,\n    fontSize: settings.title.fontSize,\n    fontFamily: settings.title.fontFamily,\n    maxWidth: settings.title.maxLengthPx,\n    maxLines: settings.title.maxLines,\n    wordBreak: settings.title.wordBreak,\n    hyphens: settings.title.hyphens,\n    lineHeight: settings.title.lineHeight,\n    anchor: textAnchor,\n    title: settings.title.text,\n  };\n\n  applyAlignJustify(ctx, node);\n  return node;\n}\n\nexport function createLegendRectNode(ctx, stops) {\n  const state = ctx.state;\n  const settings = ctx.stgns;\n  const container = state.rect;\n  let x = container.x;\n  let y = container.y;\n  let width = state.isVertical ? settings.size : state.legend.length();\n  let height = state.isVertical ? state.legend.length() : settings.size;\n\n  if (state.ticks.anchor === 'left') {\n    x += state.rect.width - settings.size;\n  } else if (state.ticks.anchor === 'top') {\n    y += state.rect.height - settings.size;\n  }\n\n  if (state.title.anchor === 'top') {\n    y += state.title.requiredHeight();\n  } else if (state.title.anchor === 'left') {\n    x += state.title.requiredWidth();\n  }\n\n  const node = {\n    type: 'rect',\n    x,\n    y,\n    width,\n    height,\n    fill: {\n      type: 'gradient',\n      stops,\n      degree: state.isVertical ? 90 : 180,\n    },\n  };\n\n  applyAlignJustify(ctx, node);\n  return node;\n}\n\nexport function createTickNodes(ctx, legendNode) {\n  const state = ctx.state;\n  const settings = ctx.stgns;\n  let anchor = 'start';\n  const rangeSelectorRect = {\n    type: 'rect',\n    x: legendNode.x,\n    y: legendNode.y,\n    width: state.isVertical ? 0 : legendNode.width,\n    height: state.isVertical ? legendNode.height : 0,\n    fill: 'transparent',\n  };\n\n  const nodes = state.ticks.values.map((tick) => {\n    let x = 0;\n    let y = 0;\n    let dx = 0;\n    let dy = 0;\n    let baseline = 'alphabetical';\n\n    if (state.isVertical) {\n      y = legendNode.y + legendNode.height * tick.pos;\n      baseline = tick.pos === 0 ? 'text-before-edge' : 'text-after-edge';\n    } else {\n      x = legendNode.x + legendNode.width * tick.pos;\n    }\n\n    if (state.ticks.anchor === 'right') {\n      x = legendNode.x + settings.size + settings.tick.padding;\n\n      rangeSelectorRect.x = legendNode.x + legendNode.width;\n    } else if (state.ticks.anchor === 'left') {\n      x = legendNode.x - settings.tick.padding;\n      anchor = 'end';\n    } else if (state.ticks.anchor === 'top') {\n      y = legendNode.y - settings.tick.padding;\n      dy -= tick.textMetrics.height * 0.25;\n      anchor = tick.pos === 0 ? 'start' : 'end';\n    } else if (state.ticks.anchor === 'bottom') {\n      y = legendNode.y + legendNode.height + settings.tick.padding;\n      dy = tick.textMetrics.height * 0.8;\n      anchor = tick.pos === 0 ? 'start' : 'end';\n\n      rangeSelectorRect.y = legendNode.y + legendNode.height;\n    }\n\n    const node = {\n      type: 'text',\n      x,\n      y,\n      dx,\n      dy,\n      text: tick.label,\n      fontSize: settings.tick.fontSize,\n      fontFamily: settings.tick.fontFamily,\n      fill: settings.tick.fill,\n      maxWidth: state.isVertical\n        ? settings.tick.maxLengthPx\n        : Math.min(settings.tick.maxLengthPx, state.legend.length() / 2),\n      anchor,\n      textBoundsFn: ctx.renderer.textBounds,\n      title: tick.label,\n      baseline,\n    };\n\n    return node;\n  });\n\n  return {\n    type: 'container',\n    id: 'legend-seq-ticks',\n    children: [...nodes, rangeSelectorRect],\n  };\n}\n","import { createTitleNode, generateStopNodes, createLegendRectNode, createTickNodes } from './node-builder';\n\nfunction resolveAnchor(dock, anchor, map) {\n  const mapped = map[dock];\n  if (typeof mapped === 'object') {\n    if (mapped.valid.indexOf(anchor) !== -1) {\n      return anchor;\n    }\n    return mapped.default;\n  }\n\n  return map.default;\n}\n\nfunction resolveTickAnchor(settings) {\n  const dock = settings.layout.dock;\n  const anchor = settings.settings.tick.anchor;\n\n  const dockAnchorMap = {\n    left: { valid: ['left', 'right'], default: 'left' },\n    right: { valid: ['left', 'right'], default: 'right' },\n    top: { valid: ['top', 'bottom'], default: 'top' },\n    bottom: { valid: ['top', 'bottom'], default: 'bottom' },\n    default: 'right',\n  };\n\n  return resolveAnchor(dock, anchor, dockAnchorMap);\n}\n\nfunction resolveTitleAnchor(settings) {\n  const dockAnchorMap = {\n    left: { valid: ['top'], default: 'top' },\n    right: { valid: ['top'], default: 'top' },\n    top: { valid: ['left', 'right'], default: 'left' },\n    bottom: { valid: ['left', 'right'], default: 'left' },\n    default: 'top',\n  };\n\n  const dock = settings.layout.dock;\n  const anchor = settings.settings.title.anchor;\n\n  return resolveAnchor(dock, anchor, dockAnchorMap);\n}\n\nfunction initRect(ctx, size) {\n  const rect = {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n  const padding = ctx.stgns.padding;\n  rect.x = padding.left;\n  rect.y = padding.top;\n  rect.width = size.width - padding.left - padding.right;\n  rect.height = size.height - padding.top - padding.bottom;\n\n  return rect;\n}\n\nfunction getTicks(ctx, majorScale) {\n  const values = majorScale.domain();\n  let labels = values;\n  let labelFn = ctx.stgns.tick.label;\n  if (!labelFn && ctx.formatter) {\n    labelFn = ctx.formatter;\n  } else if (!labelFn && majorScale.data().fields) {\n    labelFn = majorScale.data().fields[0].formatter();\n  }\n  if (typeof labelFn === 'function') {\n    labels = values.map(labelFn).map(String);\n  }\n\n  const ticks = values.map((value, i) => {\n    const label = labels[i];\n    return {\n      value,\n      label,\n      pos: majorScale.norm(parseFloat(value, 10)),\n      textMetrics: ctx.renderer.measureText({\n        text: label,\n        fontSize: ctx.stgns.tick.fontSize,\n        fontFamily: ctx.stgns.tick.fontFamily,\n      }),\n    };\n  });\n\n  return ticks;\n}\n\nfunction initState(ctx) {\n  const isVertical = ctx.settings.layout.dock !== 'top' && ctx.settings.layout.dock !== 'bottom';\n  const titleStgns = ctx.stgns.title;\n\n  const fillScale = ctx.chart.scale(ctx.stgns.fill);\n  const majorScale = ctx.chart.scale(ctx.stgns.major);\n  const tickValues = getTicks(ctx, majorScale);\n  const tickAnchor = resolveTickAnchor(ctx.settings);\n\n  if (typeof titleStgns.text === 'undefined') {\n    const fields = majorScale.data().fields;\n    titleStgns.text = fields && fields[0] ? fields[0].title() : '';\n  }\n\n  const titleTextMetrics = ctx.renderer.measureText({\n    text: titleStgns.text,\n    fontSize: titleStgns.fontSize,\n    fontFamily: titleStgns.fontFamily,\n  });\n\n  const titleTextBounds = ctx.renderer.textBounds({\n    text: titleStgns.text,\n    fontSize: titleStgns.fontSize,\n    fontFamily: titleStgns.fontFamily,\n    maxLines: titleStgns.maxLines,\n    maxWidth: titleStgns.maxLengthPx,\n    wordBreak: titleStgns.wordBreak,\n    hyphens: titleStgns.hyphens,\n    lineHeight: titleStgns.lineHeight,\n  });\n\n  const state = {\n    isVertical,\n    nodes: [],\n    title: {\n      anchor: resolveTitleAnchor(ctx.settings),\n      textMetrics: titleTextMetrics,\n      textBounds: titleTextBounds,\n      requiredWidth: () => {\n        if (!titleStgns.show) {\n          return 0;\n        }\n        let w = titleTextBounds.width;\n        let mw = titleStgns.maxLengthPx;\n        if (!isVertical) {\n          w += titleStgns.padding;\n          mw += titleStgns.padding;\n        }\n        return Math.min(w, mw, state.rect.width);\n      },\n      requiredHeight: () => {\n        if (!titleStgns.show) {\n          return 0;\n        }\n        let h = titleTextBounds.height;\n        if (isVertical) {\n          h += titleStgns.padding;\n        }\n        return Math.min(h, state.rect.height);\n      },\n    },\n    ticks: {\n      values: tickValues,\n      anchor: tickAnchor,\n      length: Math.min(Math.max(...tickValues.map((t) => t.textMetrics.width)), ctx.stgns.tick.maxLengthPx),\n      requiredHeight: () =>\n        tickAnchor === 'top'\n          ? Math.max(...state.ticks.values.map((t) => t.textMetrics.height)) + ctx.stgns.tick.padding\n          : 0,\n      height: Math.max(...tickValues.map((t) => t.textMetrics.height)),\n    },\n    legend: {\n      fillScale,\n      majorScale,\n      length: () => {\n        const pos = isVertical ? 'height' : 'width';\n        const fnPos = isVertical ? 'requiredHeight' : 'requiredWidth';\n        const len = Math.min(state.rect[pos], state.rect[pos] * ctx.stgns.length) - state.title[fnPos]();\n        return Math.max(0, Math.min(len, ctx.stgns.maxLengthPx));\n      },\n    },\n  };\n\n  return state;\n}\n\n/**\n * Component settings\n * @typedef {object} ComponentLegendSeq.settings\n * @property {string} fill - Reference to definition of sequential color scale\n * @property {string} major - Reference to definition of linear scale\n * @property {number} [size=15] - Size in pixels of the legend, if vertical is the width and height otherwise\n * @property {number} [length=1] - A value in the range 0-1 indicating the length of the legend node\n * @property {number} [maxLengthPx=250] - Max length in pixels\n * @property {number} [align=0.5] - A value in the range 0-1 indicating horizontal alignment of the legend's content. 0 aligns to the left, 1 to the right.\n * @property {number} [justify=0] - A value in the range 0-1 indicating vertical alignment of the legend's content. 0 aligns to the top, 1 to the bottom.\n * @property {object} [padding]\n * @property {number} [padding.left=5] - Size in pixels\n * @property {number} [padding.right=5] - Size in pixels\n * @property {number} [padding.top=5] - Size in pixels\n * @property {number} [padding.bottom=5] - Size in pixels\n * @property {object} [tick]\n * @property {function} [tick.label] - Function applied to all tick values. Return value should be a string and is used as label\n * @property {string} [tick.fill='#595959'] - Tick color\n * @property {string} [tick.fontSize='12px'] - Font size in pixels\n * @property {string} [tick.fontFamily='Arial'] - Font family\n * @property {number} [tick.maxLengthPx=150] - Max length in pixels\n * @property {string} [tick.anchor=''] - Where to anchor the tick in relation to the legend node, supported values are [top, bottom, left and right] or empty string to auto anchor\n * @property {number} [tick.padding=5] - padding in pixels to the legend node\n * @property {object} [title] - Title settings\n * @property {boolean} [title.show=true] - Toggle title on/off\n * @property {string} [title.text=''] - Title text. Defaults to the title of the provided data field\n * @property {string} [title.fill='#595959'] - Title color\n * @property {string} [title.fontSize='12px'] - Font size in pixels\n * @property {string} [title.fontFamily='Arial'] - Font family\n * @property {number} [title.maxLengthPx=100] - Max length in pixels\n * @property {number} [title.padding=5] - padding in pixels to the legend node\n * @property {string} [title.anchor=''] - Where to anchor the title in relation to the legend node, supported values are [top, left and right] or empty string to auto anchor\n * @property {string} [title.wordBreak='none'] - How overflowing title is handled, if it should insert line breaks at word boundries (break-word) or character boundries (break-all)\n * @property {string} [title.hyphens='auto'] - How words should be hyphenated when text wraps across multiple lines (only applicable with wordBreak)\n * @property {number} [title.maxLines=2] - Number of allowed lines if title contains line breaks (only applicable with wordBreak)\n * @property {number} [title.lineHeight=1.2] - A multiplier defining the distance between lines (only applicable with wordBreak)\n */\n\nconst legendDef = {\n  require: ['chart', 'settings', 'renderer'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 0,\n      dock: 'right',\n    },\n    settings: {\n      size: 15,\n      length: 0.5,\n      maxLengthPx: 250,\n      align: 0.5,\n      justify: 0,\n      padding: {\n        left: 5,\n        right: 5,\n        top: 5,\n        bottom: 5,\n      },\n      tick: {\n        label: null,\n        fill: '#595959',\n        fontSize: '12px',\n        fontFamily: 'Arial',\n        maxLengthPx: 100,\n        anchor: null, // Use default based on dock\n        padding: 5,\n      },\n      title: {\n        show: true,\n        text: undefined,\n        fill: '#595959',\n        fontSize: '12px',\n        fontFamily: 'Arial',\n        maxLengthPx: 100,\n        padding: 5,\n        maxLines: 2,\n        wordBreak: 'none',\n        lineHeight: 1.2,\n        hyphens: 'auto',\n        anchor: null, // Use default based on dock\n      },\n    },\n  },\n  preferredSize(opts) {\n    const state = this.state;\n    state.rect = initRect(this, opts.inner);\n\n    // Init with size of legend\n    let prefSize = this.stgns.size;\n\n    // Append paddings\n    const paddings = state.isVertical\n      ? this.stgns.padding.left + this.stgns.padding.right\n      : this.stgns.padding.top + this.stgns.padding.bottom;\n    prefSize += paddings;\n\n    // Append tick size\n    const maxSize = Math.max(opts.inner.width, opts.inner.height);\n    if (state.ticks.anchor === 'left' || state.ticks.anchor === 'right') {\n      const tHeight = state.ticks.values.reduce((sum, t) => sum + t.textMetrics.height, 0);\n      if (tHeight > this.state.legend.length()) {\n        return maxSize;\n      }\n      prefSize += state.ticks.length;\n    } else {\n      const tWidth = state.ticks.length;\n      if (tWidth > this.state.legend.length()) {\n        return maxSize;\n      }\n      prefSize += Math.max(...state.ticks.values.map((t) => t.textMetrics.height));\n    }\n    prefSize += this.stgns.tick.padding;\n\n    // Append or use title size\n    if (this.stgns.title.show) {\n      if (state.title.anchor === 'left' || state.title.anchor === 'right') {\n        prefSize = Math.max(state.title.textBounds.height + paddings, prefSize);\n      } else {\n        prefSize = Math.max(prefSize, state.title.requiredWidth() + paddings);\n      }\n    }\n\n    this.state.preferredSize = prefSize;\n    return prefSize;\n  },\n  created() {\n    this.stgns = this.settings.settings;\n\n    this.state = initState(this);\n  },\n  beforeUpdate(opts) {\n    this.stgns = opts.settings.settings;\n\n    this.state = initState(this);\n  },\n  beforeRender(opts) {\n    this.state.nodes = [];\n    this.state.rect = initRect(this, opts.size);\n\n    if (this.stgns.title.show) {\n      const titleNode = createTitleNode(this);\n      this.state.nodes.push(titleNode);\n    }\n\n    const stopNodes = generateStopNodes(this);\n    const rectNode = createLegendRectNode(this, stopNodes);\n    const tickNodes = createTickNodes(this, rectNode);\n\n    const targetNode = {\n      // The target node enables range selection component to limit its range to a specific area\n      id: 'legend-seq-target',\n      type: 'container',\n      children: [rectNode, tickNodes],\n    };\n\n    this.state.nodes.push(targetNode);\n  },\n  render() {\n    return this.state.nodes;\n  },\n};\n\nexport default legendDef;\n","import extend from 'extend';\nimport {\n  area,\n  curveLinear,\n  curveStep,\n  curveStepAfter,\n  curveStepBefore,\n  curveBasis,\n  curveCardinal,\n  curveCatmullRom,\n  curveMonotoneX,\n  curveMonotoneY,\n  curveNatural,\n} from 'd3-shape';\n\nconst CURVES = {\n  step: curveStep,\n  stepAfter: curveStepAfter,\n  stepBefore: curveStepBefore,\n  linear: curveLinear,\n  basis: curveBasis,\n  cardinal: curveCardinal.tension(0),\n  catmullRom: curveCatmullRom,\n  monotonex: curveMonotoneX,\n  monotoney: curveMonotoneY,\n  natural: curveNatural,\n};\n\n/**\n * Callback function for layer sort\n * @callback ComponentLine~LayerSort\n * @param {object} a\n * @param {string} a.id\n * @param {Array<DatumExtract>} a.data\n * @param {object} b\n * @param {string} b.id\n * @param {Array<DatumExtract>} b.data\n */\n\n/**\n * Component settings\n * @typedef {object}\n * @alias ComponentLine.settings\n */\nconst SETTINGS = {\n  /**\n   * @typedef {object}\n   */\n  coordinates: {\n    /**\n     * @type {number} */\n    minor: 0.5,\n    /**\n     * @type {number} */\n    major: 0.5,\n    /**\n     * @type {number=} */\n    layerId: 0,\n    /**\n     * @type {DatumBoolean=} */\n    defined: true,\n  },\n  /**\n   * @type {boolean=} */\n  connect: false,\n  /**\n   * @type {string=} */\n  orientation: 'horizontal',\n  /**\n   * @typedef {object} */\n  layers: {\n    /**\n     * @type {string=} */\n    curve: 'linear',\n    /**\n     * @type {boolean=} */\n    show: true,\n    /**\n     * @type {ComponentLine~LayerSort=} */\n    sort: undefined,\n    /**\n     * @typedef {object} */\n    line: {\n      /**\n       * @type {string=} */\n      stroke: '#ccc',\n      /**\n       * @type {number=} */\n      strokeWidth: 1,\n      /**\n       * @type {string=} */\n      strokeLinejoin: 'miter',\n      /**\n       * @type {string=} */\n      strokeDasharray: undefined,\n      /**\n       * @type {number=} */\n      opacity: 1,\n      /**\n       * @type {boolean=} */\n      show: true,\n      /**\n       * @type {boolean=} */\n      showMinor0: true,\n    },\n    /**\n     * @typedef {object} */\n    area: {\n      /**\n       * @type {string=} */\n      fill: '#ccc',\n      /**\n       * @type {number=} */\n      opacity: 0.8,\n      /**\n       * @type {boolean=} */\n      show: true,\n    },\n  },\n};\n\nfunction createDisplayLayer(points, { generator, item, data }, fill = '') {\n  const path = generator(points);\n  const d = {\n    type: 'path',\n    d: path,\n    opacity: item.opacity,\n    stroke: item.stroke,\n    strokeWidth: item.strokeWidth,\n    strokeLinejoin: item.strokeLinejoin,\n    fill: fill || item.fill,\n    data,\n  };\n\n  if (item.strokeDasharray) {\n    d.strokeDasharray = item.strokeDasharray;\n  }\n\n  return d;\n}\n\nfunction createDisplayLayers(layers, { width, height, missingMinor0, stngs }) {\n  const nodes = [];\n  const layerStngs = stngs.layers || {};\n  layers.forEach((layer) => {\n    const { lineObj, layerObj, areaObj, points } = layer;\n\n    const areaGenerator = area();\n    const defined = stngs.coordinates ? stngs.coordinates.defined : null;\n    let lineGenerator;\n    let secondaryLineGenerator;\n    let minor = { size: height, p: 'y' };\n    let major = { size: width, p: 'x' };\n    if (stngs.orientation === 'vertical') {\n      const temp = extend(true, {}, major);\n      major = extend(true, {}, minor);\n      minor = extend(true, {}, temp);\n    }\n\n    areaGenerator[major.p]((d) => d.major * major.size) // eslint-disable-line no-unexpected-multiline\n      [`${minor.p}1`]((d) => d.minor * minor.size) // eslint-disable-line no-unexpected-multiline\n      [`${minor.p}0`]((d) => d.minor0 * minor.size) // eslint-disable-line no-unexpected-multiline\n      .curve(CURVES[layerObj.curve === 'monotone' ? `monotone${major.p}` : layerObj.curve]);\n    if (defined) {\n      areaGenerator.defined((d) => !d.dummy && typeof d.minor === 'number' && !isNaN(d.minor) && d.defined);\n    } else {\n      areaGenerator.defined((d) => !d.dummy && typeof d.minor === 'number' && !isNaN(d.minor));\n    }\n\n    const filteredPoints = stngs.connect ? points.filter(areaGenerator.defined()) : points;\n    lineGenerator = areaGenerator[`line${minor.p.toUpperCase()}1`]();\n    secondaryLineGenerator = areaGenerator[`line${minor.p.toUpperCase()}0`]();\n\n    // area layer\n    if (layerStngs.area && areaObj.show !== false) {\n      nodes.push(\n        createDisplayLayer(filteredPoints, {\n          data: layer.consumableData,\n          item: areaObj,\n          generator: areaGenerator,\n        })\n      );\n    }\n\n    // main line layer\n    if (lineObj && lineObj.show !== false) {\n      nodes.push(\n        createDisplayLayer(\n          filteredPoints,\n          {\n            data: layer.consumableData,\n            item: lineObj,\n            generator: lineGenerator,\n          },\n          'none'\n        )\n      );\n\n      // secondary line layer, used only when rendering area\n      if (!missingMinor0 && layerStngs.area && areaObj.show !== false && lineObj.showMinor0 !== false) {\n        nodes.push(\n          createDisplayLayer(\n            filteredPoints,\n            {\n              data: layer.consumableData,\n              item: lineObj,\n              generator: secondaryLineGenerator,\n            },\n            'none'\n          )\n        );\n      }\n    }\n  });\n\n  return nodes;\n}\n\nfunction resolve({ data, stngs, rect, resolver, style, domain }) {\n  const { width, height } = rect;\n  const coordinates = resolver.resolve({\n    data,\n    defaults: SETTINGS.coordinates,\n    settings: stngs.coordinates || {},\n    scaled: {\n      major: stngs.orientation === 'vertical' ? height : width,\n      minor: stngs.orientation === 'vertical' ? width : height,\n    },\n  });\n\n  // there are two cases when a line should be interrupted:\n  // 1. When the minor value is undefined (this case is easily handled by the lineGenerator.defined).\n  // 2. When a line is moving over a domain that may not coincide with the domain on the major scale.\n  // For the second case, dummy points need to be injected in order to create values which will cause gaps as they fulfill the first case.\n  // These dummy points need to be injected only when: the domain is discrete, connect !== false and multiple layers are defined\n  const injectDummy =\n    !stngs.connect &&\n    domain.length > 2 &&\n    (typeof stngs.coordinates.layerId === 'function' || typeof stngs.coordinates.layerId === 'object');\n\n  // collect points into layers\n  const layerIds = {};\n  let numLines = 0;\n  for (let i = 0; i < coordinates.items.length; i++) {\n    let p = coordinates.items[i];\n    let lid = p.layerId;\n    if (injectDummy) {\n      // inject dummy if the previous point on the major domain is not the same as the prev point on the line's domain.\n      // this works only if a datum's value property is the same primitive as in the domain.\n      const lastItem = layerIds[lid] ? layerIds[lid].items[layerIds[lid].items.length - 1] : null;\n      const lastOrderIdx = lastItem\n        ? domain.indexOf(lastItem.data.major ? lastItem.data.major.value : lastItem.data.value)\n        : null;\n      if (lastItem && domain.indexOf(p.data.major ? p.data.major.value : p.data.value) - 1 !== lastOrderIdx) {\n        layerIds[lid].items.push({ dummy: true });\n      }\n    }\n    layerIds[lid] = layerIds[lid] || {\n      order: numLines++,\n      id: lid,\n      items: [],\n      dataItems: [],\n      consumableData: {},\n    };\n    layerIds[lid].dataItems.push(p.data);\n    layerIds[lid].items.push(p);\n  }\n\n  const metaLayers = Object.keys(layerIds).map((lid) => {\n    layerIds[lid].consumableData = {\n      points: layerIds[lid].dataItems,\n      ...layerIds[lid].dataItems[0],\n    };\n    return layerIds[lid];\n  });\n\n  const layersData = {\n    items: metaLayers.map((layer) => layer.consumableData),\n  };\n  const layerStngs = stngs.layers || {};\n\n  const layersResolved = resolver.resolve({\n    data: layersData,\n    defaults: {\n      curve: SETTINGS.layers.curve,\n      show: SETTINGS.layers.show,\n    },\n    settings: {\n      curve: layerStngs.curve,\n      show: layerStngs.show,\n    },\n  });\n\n  const linesResolved = resolver.resolve({\n    data: layersData,\n    defaults: extend({}, SETTINGS.layers.line, style.line),\n    settings: layerStngs.line,\n  });\n\n  const areasResolved = resolver.resolve({\n    data: layersData,\n    defaults: extend({}, SETTINGS.layers.area, style.area),\n    settings: layerStngs.area,\n  });\n\n  return {\n    coordinates,\n    metaLayers,\n    layers: layersResolved,\n    lines: linesResolved,\n    areas: areasResolved,\n  };\n}\n\nfunction calculateVisibleLayers(opts) {\n  const { metaLayers, coordinates, layers, lines, areas } = resolve(opts);\n\n  const visibleLayers = [];\n  metaLayers.forEach((layer, ix) => {\n    const layerObj = layers.items[ix];\n    if (layerObj.show === false) {\n      return;\n    }\n\n    // layerObj.points = [];\n    layerObj.datum = layerObj.data;\n    layerObj.data = [];\n    layerObj.id = layer.id;\n\n    const values = [];\n    const points = [];\n    let point;\n    let pData;\n    for (let i = 0; i < layer.items.length; i++) {\n      point = layer.items[i];\n      pData = point.data;\n      if (!point.dummy) {\n        if (isNaN(point.major)) {\n          continue;\n        }\n        if (opts.missingMinor0) {\n          point.minor0 = coordinates.settings.minor.scale\n            ? coordinates.settings.minor.scale(pData.minor0 ? pData.minor0.value : 0)\n            : 0;\n        }\n        if (!isNaN(point.minor)) {\n          values.push(point.minor);\n        }\n        layerObj.data.push(point.data);\n      }\n      points.push(point);\n    }\n\n    const median = values.sort((a, b) => a - b)[Math.floor((values.length - 1) / 2)];\n\n    visibleLayers.push({\n      layerObj,\n      lineObj: lines.items[ix],\n      areaObj: areas.items[ix],\n      median,\n      points,\n      consumableData: layer.consumableData,\n    });\n  });\n\n  return visibleLayers;\n}\n\nconst lineMarkerComponent = {\n  require: ['chart', 'resolver'],\n  defaultSettings: {\n    style: {\n      area: '$shape',\n      line: '$shape-outline',\n    },\n  },\n  created() {},\n  render({ data }) {\n    // console.log(\"DATA\", data);\n    const { width, height } = this.rect;\n    this.stngs = this.settings.settings || {};\n    const missingMinor0 = !this.stngs.coordinates || typeof this.stngs.coordinates.minor0 === 'undefined';\n\n    const visibleLayers = calculateVisibleLayers({\n      data,\n      stngs: this.stngs,\n      rect: this.rect,\n      resolver: this.resolver,\n      style: this.style,\n      missingMinor0,\n      domain:\n        this.stngs.coordinates && this.stngs.coordinates.major && this.stngs.coordinates.major.scale\n          ? this.chart.scale(this.stngs.coordinates.major.scale).domain()\n          : [],\n    });\n\n    if (this.stngs.layers && this.stngs.layers.sort) {\n      const sortable = visibleLayers\n        .map((v) => ({\n          id: v.layerObj.id,\n          data: v.layerObj.data,\n        }))\n        .sort(this.stngs.layers.sort)\n        .map((s) => s.id);\n      visibleLayers.sort((a, b) => sortable.indexOf(a.layerObj.id) - sortable.indexOf(b.layerObj.id));\n    } else {\n      visibleLayers.sort((a, b) => a.median - b.median);\n    }\n\n    // generate visuals\n    return createDisplayLayers(visibleLayers, {\n      width,\n      height,\n      missingMinor0,\n      stngs: this.stngs,\n    });\n  },\n};\n\nexport default lineMarkerComponent;\n","import extend from 'extend';\nimport { testRectPoint } from '../../../core/math/narrow-phase-collision';\n\n/**\n * @typedef {object}\n * @alias ComponentBrushArea.settings\n */\nconst DEFAULT_SETTINGS = {\n  /**\n   * @type {object}\n   */\n  brush: {\n    /**\n     * @type {Array<BrushTargetConfig>}\n     */\n    components: [],\n  },\n};\n\n/**\n * Transform the incoming event into point in the local coordinate system. That is the coordinate system of the component.\n * @private\n * @param {object} ctx - Context\n * @param {object} event - Incoming event, either native event or hammer event\n * @param {boolean} clamp - True to clamp the point inside the component bounds\n * @returns {point}\n */\nfunction getLocalPoint(ctx, event, clamp = true) {\n  let x;\n  let y;\n\n  if (typeof event.center === 'object') {\n    x = event.center.x;\n    y = event.center.y;\n  } else {\n    x = event.clientX;\n    y = event.clientY;\n  }\n\n  const localX = x - ctx.state.boundingRect.left;\n  const localY = y - ctx.state.boundingRect.top;\n\n  return {\n    x: clamp ? Math.max(0, Math.min(localX, ctx.rect.width)) : localX,\n    y: clamp ? Math.max(0, Math.min(localY, ctx.rect.height)) : localY,\n  };\n}\n\n/**\n * Transform a local point into a point in the chart coordinate system.\n * @private\n * @param {object} ctx - Context\n * @param {object} p - Point to transform\n * @returns {point}\n */\nfunction localToChartPoint(ctx, p) {\n  return {\n    x: p.x + ctx.rect.x,\n    y: p.y + ctx.rect.y,\n  };\n}\n\n/**\n * Extract and apply default brush configuration.\n * @private\n * @param {object} settings\n * @returns {object[]} An Array of brush configurations\n */\nfunction getBrushConfig(settings) {\n  return settings.settings.brush.components.map((b) => ({\n    key: b.key,\n    contexts: b.contexts,\n    data: b.data,\n    action: b.action || 'set',\n  }));\n}\n\n/**\n * End all active brush contexts.\n * @private\n * @param {oject} state\n * @param {object} chart - Chart instance\n */\nfunction doEndBrush(state, chart) {\n  state.brushConfig.forEach((config) => {\n    if (Array.isArray(config.contexts)) {\n      config.contexts.forEach((context) => {\n        chart.brush(context).end();\n      });\n    }\n  });\n}\n\n/**\n * Convert two points into a rectangle.\n * @private\n * @param {Point} p0\n * @param {Point} p1\n * @returns {Rect}\n */\nfunction toRect(p0, p1) {\n  const xMin = Math.min(p0.x, p1.x);\n  const yMin = Math.min(p0.y, p1.y);\n  const xMax = Math.max(p0.x, p1.x);\n  const yMax = Math.max(p0.y, p1.y);\n\n  return {\n    x: xMin,\n    y: yMin,\n    width: xMax - xMin,\n    height: yMax - yMin,\n  };\n}\n\n/**\n * Perform a brush on the given area.\n * @private\n * @param {object} ctx\n */\nfunction doAreaBrush(ctx) {\n  if (ctx.state.active) {\n    const start = localToChartPoint(ctx, ctx.state.start);\n    const end = localToChartPoint(ctx, ctx.state.end);\n\n    const shapes = ctx.chart.shapesAt(toRect(start, end), { components: ctx.state.brushConfig });\n    ctx.chart.brushFromShapes(shapes, { components: ctx.state.brushConfig });\n  }\n}\n\nfunction render(ctx) {\n  ctx.renderer.render([extend({ type: 'rect' }, toRect(ctx.state.start, ctx.state.end), ctx.style.area)]);\n}\n\nfunction resetState() {\n  return {\n    start: { x: 0, y: 0 },\n    end: { x: 0, y: 0 },\n    active: false,\n  };\n}\n\nconst definition = {\n  require: ['chart', 'renderer'],\n  defaultSettings: {\n    layout: {\n      displayOrder: 99,\n    },\n    settings: DEFAULT_SETTINGS,\n    style: {\n      area: '$selection-area-target',\n    },\n  },\n  on: {\n    areaStart(e) {\n      this.start(e);\n    },\n    areaMove(e) {\n      this.move(e);\n    },\n    areaEnd(e) {\n      this.end(e);\n    },\n    areaCancel() {\n      this.cancel();\n    },\n  },\n  created() {\n    this.state = resetState();\n  },\n  preferredSize() {\n    return 0;\n  },\n  render() {},\n  start(e) {\n    this.state.boundingRect = this.renderer.element().getBoundingClientRect();\n    const p = getLocalPoint(this, e, false);\n\n    // Require event to be inside the component bounds\n    if (\n      !testRectPoint(\n        {\n          x: 0,\n          y: 0,\n          width: this.rect.width,\n          height: this.rect.height,\n        },\n        p\n      )\n    ) {\n      return;\n    }\n\n    this.state.brushConfig = getBrushConfig(this.settings);\n    this.state.start = getLocalPoint(this, e);\n    this.state.active = true;\n  },\n  move(e) {\n    if (!this.state.active) {\n      return;\n    }\n\n    this.state.end = getLocalPoint(this, e);\n\n    doAreaBrush(this);\n    render(this);\n  },\n  end() {\n    if (!this.state.active) {\n      return;\n    }\n\n    this.state = resetState();\n    this.renderer.render([]);\n  },\n  cancel() {\n    if (!this.state.active) {\n      return;\n    }\n    doEndBrush(this.state, this.chart);\n    this.state = resetState();\n    this.renderer.render([]);\n  },\n};\n\nexport default definition;\n","import extend from 'extend';\nimport classString from '../../../core/utils/class-string';\n\nfunction resolveClasses(props, opts) {\n  return {\n    tooltip: typeof props.tooltipClass === 'function' ? props.tooltipClass({ dock: opts.dock }) : props.tooltipClass,\n    content: typeof props.contentClass === 'function' ? props.contentClass({ dock: opts.dock }) : props.contentClass,\n    arrow: typeof props.arrowClass === 'function' ? props.arrowClass({ dock: opts.dock }) : props.arrowClass,\n  };\n}\n\nfunction resolveContent(h, data, style, props) {\n  return props.content({\n    h,\n    style,\n    data,\n  });\n}\n\nexport default function render(data, placement, { renderer, style, props, h }) {\n  const classes = resolveClasses(props, placement);\n  const content = resolveContent(h, data, style, props);\n\n  const tooltipDefaultStyle = {\n    position: 'relative',\n    display: 'inline-block',\n  };\n\n  const tooltipNode = (\n    <div\n      dir={props.direction}\n      class={classString(extend({ 'pic-tooltip': true }, classes.tooltip))}\n      style={extend(tooltipDefaultStyle, placement.computedTooltipStyle)}\n    >\n      <div style={style.content} class={classString(extend({ 'pic-tooltip-content': true }, classes.content))}>\n        {content}\n      </div>\n      <div\n        class={classString(extend({ 'pic-tooltip-arrow': true }, classes.arrow))}\n        style={extend({}, style.arrow, style[`arrow-${placement.dock}`], placement.computedArrowStyle)}\n      ></div>\n    </div>\n  );\n\n  renderer.render(tooltipNode);\n\n  return renderer.element().children[0];\n}\n","// Successfull flow: pending -> active -> fulfilled (only with duration)\n// Cancelled flow: pending -> active -> cancelled\n// Rejected flow: pending -> rejected\n// Debounced flow: pending -> debounced -> pending -> [rejected|fulfilled]\nfunction dispatcherState() {\n  const fn = function fn() {};\n  const on = {\n    pending: [],\n    debounced: [],\n    active: [],\n    cancelled: [],\n    rejected: [],\n    fulfilled: [],\n  };\n  let state;\n\n  fn.set = (s) => {\n    state = s;\n    on[state].forEach((event) => event(s));\n  };\n\n  fn.on = (key, event) => {\n    if (Array.isArray(key)) {\n      key.forEach((k) => on[k].push(event));\n    } else {\n      on[key].push(event);\n    }\n  };\n\n  fn.destroy = () => {\n    Object.keys(on).forEach((key) => {\n      on[key].length = 0;\n    });\n  };\n\n  // fn.on(['pending', 'debounced', 'active', 'cancelled', 'rejected', 'fulfilled'], (e) => {\n  //   console.log(e);\n  // });\n\n  return fn;\n}\n\nexport default function timeSpanDispatcher({ defaultDuration, defaultDelay }) {\n  let actionId = null;\n  let fulfilledId = null;\n  let isActive = false;\n  const state = dispatcherState();\n  const fn = function fn() {};\n  const fulfilled = () => {\n    actionId = null;\n    fulfilledId = null;\n    isActive = false;\n    state.set('fulfilled');\n  };\n\n  fn.invoke = (action, duration = defaultDuration, delay = defaultDelay) => {\n    if (actionId) {\n      clearTimeout(actionId);\n      state.set('debounced');\n    }\n\n    state.set('pending');\n    actionId = setTimeout(() => {\n      action();\n      isActive = true;\n      actionId = null;\n      state.set('active');\n    }, delay);\n\n    if (duration > 0) {\n      if (fulfilledId) {\n        clearTimeout(fulfilledId);\n      }\n      fulfilledId = setTimeout(fulfilled, duration + Math.max(delay, 0));\n    }\n  };\n\n  fn.clear = () => {\n    if (isActive) {\n      state.set('cancelled');\n    } else if (actionId) {\n      clearTimeout(actionId);\n      state.set('rejected');\n    }\n    if (fulfilledId) {\n      clearTimeout(fulfilledId);\n    }\n    actionId = null;\n    fulfilledId = null;\n    isActive = false;\n  };\n\n  fn.on = (key, event) => {\n    state.on(key, event);\n  };\n\n  fn.destroy = () => {\n    fn.clear();\n    state.destroy();\n  };\n\n  return fn;\n}\n","import extend from 'extend';\n\nfunction getDockTransform(offset = 0) {\n  return {\n    left: `translate(-100%,-50%) translateX(${-offset}px)`,\n    right: `translate(${offset}px, -50%)`,\n    top: `translate(-50%, -100%) translateY(${-offset}px)`,\n    bottom: `translate(-50%, ${offset}px)`,\n  };\n}\n\nfunction getDockOffset(width, height, offset = 0) {\n  return {\n    left: { x: -width - offset, y: -height / 2 },\n    right: { x: offset, y: -height / 2 },\n    top: { x: -width / 2, y: -height - offset },\n    bottom: { x: -width / 2, y: offset },\n  };\n}\n\nfunction getComputedArrowStyle(offset) {\n  return {\n    left: {\n      left: '100%',\n      top: `calc(50% - ${offset}px)`,\n      borderWidth: `${offset}px`,\n    },\n    right: {\n      left: `${-offset * 2}px`,\n      top: `calc(50% - ${offset}px)`,\n      borderWidth: `${offset}px`,\n    },\n    top: {\n      left: `calc(50% - ${offset}px)`,\n      top: '100%',\n      borderWidth: `${offset}px`,\n    },\n    bottom: {\n      left: `calc(50% - ${offset}px)`,\n      top: `${-offset * 2}px`,\n      borderWidth: `${offset}px`,\n    },\n  };\n}\n\nfunction isInsideArea(area, vx, vy, width, height, offset) {\n  const rect = {\n    x: vx + offset.x,\n    y: vy + offset.y,\n    width,\n    height,\n  };\n\n  if (rect.x < 0 || rect.y < 0) {\n    return false;\n  }\n  if (rect.x + rect.width > area.width || rect.y + rect.height > area.height) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * @private\n * @param {vx} vx X-coordinate realative to the area\n * @param {vy} vy Y-coordinate realative to the area\n */\nexport function calcOffset({ area, vx, vy, width, height, offset }) {\n  const rect = {\n    x: vx + offset.x,\n    y: vy + offset.y,\n    width,\n    height,\n  };\n\n  let offsetX = rect.x < 0 ? -rect.x : 0;\n  let offsetY = rect.y < 0 ? -rect.y : 0;\n\n  offsetX += rect.x + rect.width > area.width ? -(rect.x + rect.width - area.width) : 0;\n  offsetY += rect.y + rect.height > area.height ? -(rect.y + rect.height - area.height) : 0;\n\n  return {\n    x: offsetX,\n    y: offsetY,\n  };\n}\n\nfunction alignToBounds({ resources, nodes, pointer, width: elmWidth, height: elmHeight, options }) {\n  const { targetBounds } = pointer;\n  const { x, y, width, height } = resources.getNodeBoundsRelativeToTarget(nodes[0]);\n\n  const docks = {\n    left: { x, y: y + height / 2 },\n    right: { x: x + width, y: y + height / 2 },\n    top: { x: x + width / 2, y },\n    bottom: { x: x + width / 2, y: y + height },\n  };\n\n  // Check if explicit dock\n  const dockTransforms = getDockTransform(options.offset);\n  const transform = dockTransforms[options.dock];\n  if (transform) {\n    return {\n      computedTooltipStyle: {\n        left: `${docks[options.dock].x}px`,\n        top: `${docks[options.dock].y}px`,\n        transform,\n      },\n      computedArrowStyle: getComputedArrowStyle(options.offset)[options.dock],\n      dock: options.dock,\n    };\n  }\n\n  const area = {\n    width: options.area === 'target' ? targetBounds.width : window.innerWidth,\n    height: options.area === 'target' ? targetBounds.height : window.innerHeight,\n  };\n  const dockOffsets = getDockOffset(elmWidth, elmHeight, options.offset);\n  const dockOrder = ['top', 'left', 'right', 'bottom'];\n\n  for (let i = 0; i < dockOrder.length; i += 1) {\n    const dock = dockOrder[i];\n    const vx = options.area === 'target' ? docks[dock].x : targetBounds.left + docks[dock].x;\n    const vy = options.area === 'target' ? docks[dock].y : targetBounds.top + docks[dock].y;\n    if (isInsideArea(area, vx, vy, elmWidth, elmHeight, dockOffsets[dock])) {\n      return {\n        computedTooltipStyle: {\n          left: `${docks[dock].x}px`,\n          top: `${docks[dock].y}px`,\n          transform: dockTransforms[dock],\n        },\n        computedArrowStyle: getComputedArrowStyle(options.offset)[dock],\n        dock,\n      };\n    }\n  }\n\n  return {\n    computedTooltipStyle: {\n      left: `${docks.top.x}px`,\n      top: `${docks.top.y}px`,\n      transform: dockTransforms.top,\n    },\n    computedArrowStyle: getComputedArrowStyle(options.offset).top,\n    dock: 'top',\n  };\n}\n\nfunction alignToPoint({ options, pointer, width, height, dockOrder, x, y }) {\n  const { targetBounds } = pointer;\n\n  // Check if explicit dock\n  const dockTransforms = getDockTransform(options.offset);\n  const transform = dockTransforms[options.dock];\n  if (transform) {\n    return {\n      computedTooltipStyle: {\n        left: `${x}px`,\n        top: `${y}px`,\n        transform,\n      },\n      computedArrowStyle: getComputedArrowStyle(options.offset)[options.dock],\n      dock: options.dock,\n    };\n  }\n\n  const area = {\n    width: options.area === 'target' ? targetBounds.width : window.innerWidth,\n    height: options.area === 'target' ? targetBounds.height : window.innerHeight,\n  };\n  const dockOffsets = getDockOffset(width, height, options.offset);\n\n  const results = [];\n  const edgeMargin = 20;\n  const vx = options.area === 'target' ? x : targetBounds.left + x;\n  const vy = options.area === 'target' ? y : targetBounds.top + y;\n\n  for (let i = 0; i < dockOrder.length; i += 1) {\n    const dock = dockOrder[i];\n\n    const offset = calcOffset({\n      area,\n      vx,\n      vy,\n      width,\n      height,\n      offset: dockOffsets[dock],\n    });\n\n    const computedTooltipStyle = {\n      left: `${x}px`,\n      top: `${y}px`,\n      transform: dockTransforms[dock],\n    };\n    const computedArrowStyle = getComputedArrowStyle(options.offset)[dock];\n\n    if (offset.x !== 0) {\n      computedTooltipStyle.width = `${width - edgeMargin - Math.abs(offset.x)}px`;\n\n      if (dock === 'top' || dock === 'bottom') {\n        computedTooltipStyle.left = `${x + offset.x}px`;\n\n        computedArrowStyle.left = `calc(50% ${offset.x > 0 ? '-' : '+'} ${Math.abs(offset.x)}px)`;\n      }\n    }\n\n    const result = {\n      computedTooltipStyle,\n      computedArrowStyle,\n      dock,\n      rect: {\n        width,\n        height,\n      },\n    };\n\n    if (offset.x === 0 && offset.y === 0) {\n      return result;\n    }\n\n    result.offset = offset;\n\n    results.push(result);\n  }\n\n  results.sort((a, b) => Math.abs(a.offset.x) - Math.abs(b.offset.x));\n\n  return results[0];\n}\n\nfunction alignToPointer({ options, pointer, width, height }) {\n  const { x, y } = pointer;\n\n  return alignToPoint({\n    x,\n    y,\n    pointer,\n    width,\n    height,\n    options,\n    dockOrder: ['top', 'left', 'right', 'bottom'],\n  });\n}\n\nfunction alignToSlice({ options, pointer, width, height, nodes, resources }) {\n  const node = nodes[0];\n  const { dx, dy } = pointer;\n  const componentBounds = resources.getComponentBoundsFromNode(node);\n\n  // cx and cy relative to targetBounds\n  const center = {\n    x: dx + componentBounds.x + componentBounds.width / 2,\n    y: dy + componentBounds.y + componentBounds.height / 2,\n  };\n\n  const { start, end, outerRadius } = node.desc.slice;\n\n  // Node origin is at 12 o clock, clockwise, but Math uses 3 a clock, so it's transformed to origin at 3 a clock\n  const middle = (start + end) / 2 - Math.PI / 2;\n  const PI2 = Math.PI * 2;\n  const radians = ((middle % PI2) + PI2) % PI2;\n  let dockOrder = ['top', 'left', 'right', 'bottom'];\n\n  if (options.dock === 'auto') {\n    if (radians <= Math.PI / 4 || radians >= (Math.PI * 7) / 4) {\n      dockOrder = ['right', 'top', 'bottom', 'left'];\n    } else if (radians <= (Math.PI * 3) / 4) {\n      dockOrder = ['bottom', 'left', 'right', 'top'];\n    } else if (radians <= (Math.PI * 5) / 4) {\n      dockOrder = ['left', 'top', 'bottom', 'right'];\n    } else {\n      dockOrder = ['top', 'left', 'right', 'bottom'];\n    }\n  }\n\n  return alignToPoint({\n    x: center.x + outerRadius * componentBounds.scaleRatio.x * Math.cos(radians),\n    y: center.y + outerRadius * componentBounds.scaleRatio.y * Math.sin(radians),\n    pointer,\n    width,\n    height,\n    options,\n    dockOrder,\n  });\n}\n\nfunction getComponentBoundsFromNode(node, pointer, chart) {\n  const comp = node.key\n    ? chart.component(node.key)\n    : chart.componentsFromPoint({ x: pointer.clientX, y: pointer.clientY })[0];\n\n  if (!comp) {\n    return {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n      scaleRatio: {\n        x: 1,\n        y: 1,\n      },\n    };\n  }\n\n  const componentSize = comp.rect;\n  return extend({ scaleRatio: componentSize.scaleRatio }, componentSize.computedInner);\n}\n\nfunction getNodeBoundsRelativeToTarget(node, pointer, chart) {\n  const componentBounds = getComponentBoundsFromNode(node, pointer, chart);\n  const bounds = node.bounds;\n\n  return {\n    x: componentBounds.x + pointer.dx + bounds.x,\n    y: componentBounds.y + pointer.dy + bounds.y,\n    width: bounds.width,\n    height: bounds.height,\n  };\n}\n\nconst STRATEGIES = {\n  bounds: alignToBounds,\n  pointer: alignToPointer,\n  slice: alignToSlice,\n};\n\nexport default function placement({ width, height }, { chart, state, props }) {\n  const propCtx = {\n    resources: {\n      formatter: chart.formatter,\n      scale: chart.scale,\n      component: chart.component,\n      getComponentBoundsFromNode: (node) => getComponentBoundsFromNode(node, state.pointer, chart),\n      getNodeBoundsRelativeToTarget: (node) => getNodeBoundsRelativeToTarget(node, state.pointer, chart),\n    },\n    nodes: state.activeNodes,\n    pointer: state.pointer,\n    width,\n    height,\n  };\n  const type = typeof props.placement;\n\n  if (type === 'object' && typeof props.placement.fn === 'function') {\n    // Custom placement strategy function\n    return props.placement.fn(propCtx);\n  }\n\n  let opts = {\n    type: 'pointer',\n    offset: 8,\n    dock: 'auto',\n    area: 'viewport',\n  };\n  if (type === 'function') {\n    // Custom placement function\n    opts = extend(opts, props.placement(propCtx));\n  }\n\n  if (type === 'object' && STRATEGIES[props.placement.type]) {\n    // Predefined placement function with options\n    opts = extend(opts, props.placement);\n  } else if (type === 'string' && STRATEGIES[props.placement]) {\n    // Predefined placement function without options\n    opts = extend(opts, { type: props.placement });\n  }\n\n  propCtx.options = opts;\n  const plcm = STRATEGIES[opts.type](propCtx);\n\n  let { x: minX, y: minY, width: maxX, height: maxY } = propCtx.resources.getComponentBoundsFromNode(propCtx.nodes[0]);\n  minX += propCtx.pointer.dx;\n  maxX += minX;\n  minY += propCtx.pointer.dy;\n  maxY += minY;\n\n  // Clamp tooltip position\n  plcm.computedTooltipStyle.left = `${Math.min(Math.max(0, minX, parseFloat(plcm.computedTooltipStyle.left)), maxX)}px`;\n  plcm.computedTooltipStyle.top = `${Math.min(Math.max(0, minY, parseFloat(plcm.computedTooltipStyle.top)), maxY)}px`;\n\n  return plcm;\n}\n","let instance;\n\nexport function setActive(action) {\n  instance = action;\n}\n\nexport function removeActive(action) {\n  if (instance === action) {\n    instance = null;\n    return true;\n  }\n\n  return false;\n}\n\nexport function cancelActive(a) {\n  if (instance && instance !== a) {\n    instance();\n  }\n}\n\nexport function getActive() {\n  return instance;\n}\n\nexport function remove() {\n  instance = null;\n}\n","import extend from 'extend';\nimport extractor from './extractor';\nimport render from './render';\nimport timeSpanDispatcher from './timespan-dispatcher';\nimport placement from './placement';\nimport { setActive, removeActive, cancelActive, remove } from './instance-handler';\n\n/**\n * @typedef {object}\n * @alias ComponentTooltip.settings\n */\nconst DEFAULT_SETTINGS = {\n  /**\n   * How long the tooltip is visible, in milliseconds\n   * @type {number=}\n   */\n  duration: 8000,\n  /**\n   * Delay before the tooltip is rendered, in milliseconds\n   * @type {number=}\n   */\n  delay: 500,\n  /**\n   * Callback function to filter incoming nodes to only a set of applicable nodes. Is called as a part of the `show` event.\n   *\n   * Should return an array of SceneNodes.\n   * @type {function=}\n   * @callback\n   * @param {SceneNode[]} nodes Array of SceneNodes\n   * @returns {SceneNode[]} An array of SceneNodes\n   * @example\n   * filter: (nodes) => nodes.filter((node) => node.data && typeof node.data.value !== 'undefined')\n   */\n  filter: (nodes) => nodes.filter((node) => node.data && typeof node.data.value !== 'undefined'),\n  /**\n   * Callback function called for each node to extract data. Can return any type.\n   * @type {function=}\n   * @callback\n   * @param {object} ctx Callback context\n   * @param {SceneNode} ctx.node Node\n   * @returns {any} Return data\n   * @example\n   * (ctx) => ctx.node.data.value\n   */\n  extract: (ctx) => ctx.node.data.value,\n  /**\n   * Callback function to generate content. Should return an array of Virtual DOM Elements.\n   * @type {function=}\n   * @callback\n   * @param {object} ctx Callback context\n   * @param {any[]} ctx.data An array of data generated from the `extract` function\n   * @param {object} ctx.h A function for creating Virtual DOM Elements. See API reference for preactjs `h` function\n   * @returns {object[]} An array of Virtual DOM Elements\n   * @example\n   * ({ h, data }) => data.map((datum) => h('div', {}, datum))\n   */\n  content: ({ h, data }) => data.map((datum) => h('div', {}, datum)),\n  /**\n   * Comparison function. If evaluted to true, the incoming nodes in the `show` event are ignored. If evaluated to false, any active tooltip is cleared and a new tooltip is queued.\n   *\n   * The function gets two parameters, the first is the currently active set of nodes, if any, and the second is the incoming set of nodes. By default the two set of nodes are considered equal if their data attributes are the same.\n   * @type {function=}\n   * @callback\n   * @param {SceneNode[]} prev Previous array of SceneNodes\n   * @param {SceneNode[]} curr Current array of SceneNodes\n   * @returns {boolean}\n   */\n  isEqual: (prev, curr) =>\n    prev.length &&\n    prev.length === curr.length &&\n    prev.every((p, i) => curr[i] && JSON.stringify(p.data) === JSON.stringify(curr[i].data)),\n  /**\n   * @typedef {object=}\n   */\n  placement: {\n    /**\n     * Available types: [pointer | bounds | slice]\n     * @type {string=}\n     */\n    type: 'pointer',\n    /**\n     * Docking position of the tooltip. Available positions: [left | right | top | bottom | auto]\n     * @type {string=}\n     */\n    dock: 'auto',\n    /**\n     * Distance from the content area to the tooltip position, in px.\n     * @type {number=}\n     */\n    offset: 8,\n    /**\n     * Specify the limiting area, where target is the component area unless the appendTo property is set, in which case it referes to the appendTo element. Viewport is the browser viewport.\n     *\n     * Available options are: [viewport | target]\n     * @type {number=}\n     */\n    area: 'viewport',\n  },\n  /**\n   * Set tooltip class.\n   * @type {object<string, boolean>=}\n   */\n  tooltipClass: {},\n  /**\n   * Set content class.\n   * @type {object<string, boolean>=}\n   */\n  contentClass: {},\n  /**\n   * Set arrow class.\n   * @type {object<string, boolean>=}\n   */\n  arrowClass: {},\n  /**\n   * Content direction [ltr | rtl]\n   * @type {string=}\n   */\n  direction: 'ltr',\n  /**\n   * Explicitly set a target element. This allows the tooltip to attach itself outside the picasso container.\n   * @type {HTMLElement=}\n   */\n  appendTo: undefined,\n  /**\n   * Component lifecycle hook. Called before the tooltip is displayed.\n   * @type {function=}\n   * @callback\n   */\n  beforeShow: undefined,\n  /**\n   * Component lifecycle hook. Called after the tooltip have been displayed.\n   * @type {function=}\n   * @callback\n   */\n  afterShow: undefined,\n  /**\n   * Component lifecycle hook. Called before the tooltip is hidden.\n   * @type {function=}\n   * @callback\n   * @param {object} ctx Callback paramater\n   * @param {HTMLElement} ctx.element The element the tooltip is appended to\n   */\n  beforeHide: undefined,\n  /**\n   * Component lifecycle hook. Called when the toolip is hidden. By default this deletes the tooltip element.\n   * @type {function=}\n   * @callback\n   * @param {object} ctx Callback paramater\n   * @param {HTMLElement} ctx.element The element the tooltip is appended to\n   */\n  onHide: undefined,\n  /**\n   * Component lifecycle hook. Called after the tooltip is hidden.\n   * @type {function=}\n   * @callback\n   */\n  afterHide: undefined,\n};\n\nconst DEFAULT_STYLE = {\n  tooltip: {},\n  content: {\n    backgroundColor: '$gray-25',\n    color: '$font-color--inverted',\n    fontFamily: '$font-family',\n    fontSize: '$font-size',\n    lineHeight: '$line-height',\n    borderRadius: '4px',\n    padding: '8px',\n    opacity: 0.9,\n  },\n  arrow: {\n    position: 'absolute',\n    width: '0px',\n    height: '0px',\n    borderStyle: 'solid',\n    color: '$gray-25',\n    opacity: 0.9,\n  },\n  'arrow-bottom': {\n    borderTopColor: 'transparent',\n    borderLeftColor: 'transparent',\n    borderRightColor: 'transparent',\n  },\n  'arrow-top': {\n    borderBottomColor: 'transparent',\n    borderLeftColor: 'transparent',\n    borderRightColor: 'transparent',\n  },\n  'arrow-right': {\n    borderTopColor: 'transparent',\n    borderLeftColor: 'transparent',\n    borderBottomColor: 'transparent',\n  },\n  'arrow-left': {\n    borderTopColor: 'transparent',\n    borderBottomColor: 'transparent',\n    borderRightColor: 'transparent',\n  },\n};\n\nfunction toPoint(event, { chart, state }) {\n  let x = 0;\n  let y = 0;\n  if (event.center) {\n    x += event.center.x;\n    y += event.center.y;\n  } else {\n    x += event.clientX;\n    y += event.clientY;\n  }\n  // TODO Don't do getBoundingClientRect lookup here. It's performance heavy.\n  const chartBounds = chart.element.getBoundingClientRect();\n  const targetBounds = state.targetElement.getBoundingClientRect();\n  const clientX = x;\n  const clientY = y;\n  const dx = chartBounds.left - targetBounds.left;\n  const dy = chartBounds.top - targetBounds.top;\n  const cx = x - chartBounds.left;\n  const cy = y - chartBounds.top;\n  x -= targetBounds.left;\n  y -= targetBounds.top;\n  return {\n    x, // Target point relative to the target bounds\n    y,\n    dx, // Delta from target bounds to the chart bounds\n    dy,\n    cx, // Target point relative to the chart bounds\n    cy,\n    clientX,\n    clientY,\n    targetBounds, // Target bounding rect\n    chartBounds, // Chart bounding rect\n  };\n}\n\nconst component = {\n  require: ['chart', 'renderer'],\n  defaultSettings: {\n    settings: DEFAULT_SETTINGS,\n    style: DEFAULT_STYLE,\n  },\n  renderer: 'dom',\n  on: {\n    hide() {\n      this.hide();\n    },\n    show(event, opts = {}) {\n      this.show(event, opts);\n    },\n    prevent(p) {\n      this.prevent(p);\n    },\n  },\n  hide() {\n    this.dispatcher.clear();\n    this.state.activeNodes = [];\n    this.state.pointer = {};\n  },\n  show(event, { nodes, duration, delay } = {}) {\n    if (this.state.prevent) {\n      return;\n    }\n\n    // Set pointer here to always expose latest pointer to invokeRenderer\n    this.state.pointer = toPoint(event, this);\n\n    let fNodes;\n    if (Array.isArray(nodes)) {\n      fNodes = this.props.filter(nodes);\n    } else {\n      fNodes = this.props.filter(\n        this.chart.shapesAt({\n          x: this.state.pointer.cx,\n          y: this.state.pointer.cy,\n        })\n      );\n    }\n\n    if (this.props.isEqual(this.state.activeNodes, fNodes)) {\n      return;\n    }\n\n    this.dispatcher.clear();\n    this.state.activeNodes = fNodes;\n\n    if (this.state.activeNodes.length) {\n      this.dispatcher.invoke(() => this.invokeRenderer(this.state.activeNodes), duration, delay);\n    }\n  },\n  prevent(p) {\n    this.state.prevent = !!p;\n  },\n  init(settings) {\n    this.state = {\n      activeNodes: [],\n      pointer: {},\n      targetElement: null,\n      prevent: false,\n    };\n    this.props = settings.settings;\n    this.dispatcher = timeSpanDispatcher({\n      defaultDuration: this.props.duration,\n      defaultDelay: this.props.delay,\n    });\n\n    const instanceId = this.dispatcher.clear;\n    this.dispatcher.on('pending', () => {\n      // Cancel only if the active is another instance\n      cancelActive(instanceId);\n      setActive(instanceId);\n\n      if (typeof this.props.beforeShow === 'function') {\n        this.props.beforeShow.call(undefined, {\n          resources: {\n            formatter: this.chart.formatter,\n            scale: this.chart.scale,\n          },\n        });\n      }\n    });\n\n    this.dispatcher.on(['cancelled', 'fulfilled'], () => {\n      const listenerCtx = {\n        resources: {\n          formatter: this.chart.formatter,\n          scale: this.chart.scale,\n        },\n      };\n\n      if (typeof this.props.beforeHide === 'function') {\n        this.props.beforeHide.call(undefined, extend({ element: this.state.tooltipElm }, listenerCtx));\n      }\n\n      if (typeof this.props.onHide === 'function') {\n        this.props.onHide.call(undefined, extend({ element: this.state.tooltipElm }, listenerCtx));\n      } else {\n        this.renderer.clear([]); // Hide tooltip\n      }\n\n      if (typeof this.props.afterHide === 'function') {\n        this.props.afterHide.call(undefined, listenerCtx);\n      }\n\n      removeActive(instanceId);\n      this.state.tooltipElm = undefined;\n    });\n\n    this.dispatcher.on('active', () => {\n      if (typeof this.props.afterShow === 'function') {\n        this.props.afterShow.call(undefined, {\n          element: this.state.tooltipElm,\n          resources: {\n            formatter: this.chart.formatter,\n            scale: this.chart.scale,\n          },\n        });\n      }\n    });\n  },\n  created() {\n    this.init(this.settings);\n  },\n  beforeUpdate({ settings }) {\n    if (this.dispatcher) {\n      this.dispatcher.destroy();\n      remove();\n    }\n    this.init(settings);\n  },\n  render(h) {\n    this.h = h;\n    return []; // Nothing to render initially.\n  },\n  beforeDestroy() {\n    this.dispatcher.destroy();\n    remove();\n  },\n  appendTo() {\n    if (this.props.appendTo) {\n      this.state.targetElement =\n        typeof this.props.appendTo === 'function'\n          ? this.props.appendTo({\n              resources: {\n                formatter: this.chart.formatter,\n                scale: this.chart.scale,\n              },\n            })\n          : this.props.appendTo;\n      const { width, height } = this.state.targetElement.getBoundingClientRect();\n      this.renderer.destroy();\n      this.renderer.size({ width, height });\n      this.renderer.appendTo(this.state.targetElement);\n    } else {\n      this.state.targetElement = this.renderer.element();\n    }\n  },\n  mounted() {\n    this.appendTo();\n  },\n  updated() {\n    // Append here to, otherwise the picasso displayOrder logic screw things up\n    this.appendTo();\n  },\n  invokeRenderer(nodes) {\n    const items = extractor(nodes, this);\n    const pseudoElement = render(items, { style: { left: '0px', top: '0px', visibility: 'hidden' } }, this);\n    const pos = placement(pseudoElement.getBoundingClientRect(), this);\n    this.state.tooltipElm = render(items, pos, this);\n  },\n};\n\nexport { component as default };\n","import extend from 'extend';\n\nexport default function extractor(nodes, { chart, scale, props, h }) {\n  const dataCtx = {\n    resources: {\n      dataset: chart.dataset,\n      scale: chart.scale,\n      formatter: chart.formatter,\n    },\n    scale,\n    h,\n  };\n\n  const data = [];\n  nodes.forEach((node) => {\n    if (typeof props.extract === 'function') {\n      const ctx = extend({ node }, dataCtx);\n      data.push(props.extract(ctx));\n    }\n  });\n\n  return data;\n}\n","const debugColliderDef = {\n  require: ['renderer', 'chart'],\n  defaultSettings: {\n    settings: {\n      target: '',\n      selector: '*',\n      fill: 'rgba(0, 255, 0, 0.1)',\n      stroke: 'lime',\n      opacity: 1,\n      useOuterRect: false,\n    },\n  },\n  on: {\n    update() {\n      this.draw();\n    },\n  },\n  draw() {\n    const shapes = this.chart.findShapes(this.props.selector).filter((s) => s.key === this.props.target); // Find all shapes\n    const colliders = shapes.filter((s) => s.collider).map((s) => s.collider);\n\n    colliders.forEach((c) => {\n      c.fill = this.props.fill;\n      c.stroke = this.props.stroke;\n      c.opacity = this.props.opacity;\n      c.collider = { type: null };\n    });\n\n    this.renderer.render(colliders);\n  },\n  created() {\n    this.props = this.settings.settings;\n  },\n  resize({ outer, inner }) {\n    if (this.props.useOuterRect) {\n      return outer;\n    }\n    return inner;\n  },\n  render() {},\n  mounted() {\n    this.draw();\n  },\n  updated() {\n    this.props = this.settings.settings;\n    this.draw();\n  },\n};\n\nexport default debugColliderDef;\n","import { toRadians } from './angles';\n\nconst PI_X2 = Math.PI * 2;\n\n/**\n * Implementation of F.6.5 https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n * @ignore\n * @param {number} rx - Arc x-radius\n * @param {number} ry - Arc y-radius\n * @param {number} rotation - Arc rotation in degrees (0-360)\n * @param {boolean} largeArcFlag\n * @param {boolean} sweepFlag\n * @param {number} endX - X-coordinate for end of arc\n * @param {number} endY - Y-coordinate for end of arc\n * @param {number} startX - X-coordinate for start of arc\n * @param {number} startY - Y-coordinate for start of arc\n * @returns {object}\n */\nfunction arcToCenter(rx, ry, rotation, largeArcFlag, sweepFlag, endX, endY, startX, startY) {\n  let startAngle;\n  let endAngle;\n  let sweepAngle;\n  let cx;\n  let cy;\n  let radiusRatio;\n\n  const rad = toRadians(rotation % 360);\n\n  // F.6.5.1\n  const cos = Math.cos(rad);\n  const sin = Math.sin(rad);\n  const hdx = (startX - endX) / 2;\n  const hdy = (startY - endY) / 2;\n\n  const x1d = cos * hdx + sin * hdy;\n  const y1d = cos * hdy - sin * hdx;\n\n  // F.6.6\n  rx = Math.abs(rx);\n  ry = Math.abs(ry);\n\n  radiusRatio = Math.pow(x1d, 2) / Math.pow(rx, 2) + Math.pow(y1d, 2) / Math.pow(ry, 2);\n  if (radiusRatio > 1) {\n    radiusRatio = Math.sqrt(radiusRatio);\n    rx *= radiusRatio;\n    ry *= radiusRatio;\n  }\n\n  // F.6.5.2\n  const rxry = rx * ry;\n  const rxy1d = rx * y1d;\n  const ryx1d = ry * x1d;\n  const den = Math.pow(rxy1d, 2) + Math.pow(ryx1d, 2);\n  const num = Math.pow(rxry, 2) - den;\n\n  let frac = Math.sqrt(Math.max(num / den, 0));\n\n  if (largeArcFlag === sweepFlag) {\n    frac = -frac;\n  }\n\n  const cxd = frac * (rxy1d / ry);\n  const cyd = frac * -(ryx1d / rx);\n\n  // F.6.5.3\n  const mx = (startX + endX) / 2;\n  const my = (startY + endY) / 2;\n  cx = cos * cxd - sin * cyd + mx;\n  cy = sin * cxd + cos * cyd + my;\n\n  // F.6.5.6 clockwise angle\n  const ux = (x1d - cxd) / rx;\n  const uy = (y1d - cyd) / ry;\n  const vx = (-x1d - cxd) / rx;\n  const vy = (-y1d - cyd) / ry;\n  startAngle = Math.atan2(uy, ux);\n  startAngle += startAngle < 0 ? PI_X2 : 0;\n  endAngle = Math.atan2(vy, vx);\n  endAngle += endAngle < 0 ? PI_X2 : 0;\n\n  sweepAngle = endAngle - startAngle;\n\n  if (!sweepFlag && startAngle < endAngle) {\n    sweepAngle -= PI_X2;\n  } else if (sweepFlag && endAngle < startAngle) {\n    sweepAngle += PI_X2;\n  }\n\n  sweepAngle %= PI_X2;\n\n  return {\n    startAngle,\n    sweepAngle,\n    cx,\n    cy,\n    rx,\n    ry,\n  };\n}\n\nexport { arcToCenter as default, PI_X2 };\n","import flatness from './curve-flattness';\n\nfunction mid(p0, p1) {\n  return {\n    x: (p0.x + p1.x) * 0.5,\n    y: (p0.y + p1.y) * 0.5,\n  };\n}\n\nfunction interpolate(t, s, cp1, cp2, e) {\n  const td = 1 - t;\n  const t0 = Math.pow(td, 3) * s;\n  const t1 = 3 * Math.pow(td, 2) * t * cp1;\n  const t2 = 3 * td * Math.pow(t, 2) * cp2;\n  const t3 = Math.pow(t, 3) * e;\n\n  return t0 + t1 + t2 + t3;\n}\n\n/**\n * Recursive subdivision of a curve using de Casteljau algorithm.\n * Splits the curve into multiple line segments where each segments is choosen based on a level of flatness.\n *\n * At most it will be able to generate 2**maxNbrOfSplits + 1 = 257 points\n * @ignore\n * @param {Point} s - Start point\n * @param {Point} cp1 - First control point\n * @param {Point} cp2 - Second control point\n * @param {Point} e - End point\n * @param {array} points - Initial set of points\n * @returns {point[]} Array of points\n */\nfunction toPoints(s, cp1, cp2, e, points = [], maxNbrOfSplits = 8) {\n  if (maxNbrOfSplits < 1 || flatness(s, cp1, cp2, e) <= 10) {\n    if (points[points.length - 1] !== s) {\n      points.push(s);\n    }\n\n    points.push(e);\n\n    return points;\n  }\n\n  const t = 0.5;\n\n  const m0 = mid(s, cp1);\n  const m1 = mid(cp1, cp2);\n  const m2 = mid(cp2, e);\n\n  const b = {\n    // Split curve at point\n    x: interpolate(t, s.x, cp1.x, cp2.x, e.x),\n    y: interpolate(t, s.y, cp1.y, cp2.y, e.y),\n  };\n\n  const q0 = mid(m0, m1); // New cp2 for left curve\n  const q1 = mid(m1, m2); // New cp1 for right curve\n\n  toPoints(s, m0, q0, b, points, maxNbrOfSplits - 1); // left curve\n  toPoints(b, q1, m2, e, points, maxNbrOfSplits - 1); // Right curve\n\n  return points;\n}\n\nexport { toPoints as default, interpolate };\n","/**\n * Measure the flatnass of a cubic bezier curve\n * @ignore\n * @param {Point} s - Start point\n * @param {Point} cp1 - First control point\n * @param {Point} cp2 - Second control point\n * @param {Point} e - End point\n */\nexport default function flatness(s, cp1, cp2, e) {\n  const ux = Math.abs(s.x + cp2.x - (cp1.x + cp1.x));\n  const uy = Math.abs(s.y + cp2.y - (cp1.y + cp1.y));\n  const vx = Math.abs(cp1.x + e.x - (cp2.x + cp2.x));\n  const vy = Math.abs(cp1.y + e.y - (cp2.y + cp2.y));\n\n  return ux + uy + vx + vy;\n}\n","import cubicToPoints from './cubic-bezier-curve-interpolation';\n\nfunction interpolate(t, s, cp, e) {\n  const td = 1 - t;\n\n  return Math.pow(td, 2) * s + 2 * td * t * cp + Math.pow(t, 2) * e;\n}\n\nfunction toCubic(s, cp, e) {\n  const cp1x = s.x + (2 / 3) * (cp.x - s.x);\n  const cp1y = s.y + (2 / 3) * (cp.y - s.y);\n  const cp2x = e.x + (2 / 3) * (cp.x - e.x);\n  const cp2y = e.y + (2 / 3) * (cp.y - e.y);\n  const cp1 = { x: cp1x, y: cp1y };\n  const cp2 = { x: cp2x, y: cp2y };\n\n  return { cp1, cp2 };\n}\n\n/**\n * Recursive subdivision of a curve using de Casteljau algorithm.\n * Splits the curve into multiple line segments where each segments is choosen based on a level of flatness.\n * @ignore\n * @param {Point} s - Start point\n * @param {Point} cp - Control point\n * @param {Point} e - End point\n * @returns {Point[]} Array of points\n */\nfunction toPoints(s, cp, e) {\n  const { cp1, cp2 } = toCubic(s, cp, e);\n\n  return cubicToPoints(s, cp1, cp2, e);\n}\n\nexport { interpolate, toPoints as default };\n","import p2dp from 'path2d-polyfill';\nimport arcToCenter, { PI_X2 } from '../math/arc-to-center';\nimport cubicCurveToPoints from '../math/cubic-bezier-curve-interpolation';\nimport quadCurveToPoints from '../math/quad-bezier-curve-interpolation';\n\nconst EPSILON = 1e-12;\n\nfunction removeDuplicates(points) {\n  for (let i = 0; i < points.length - 1; i++) {\n    const p0 = points[i];\n    const p1 = points[i + 1];\n    if (Math.abs(p0.x - p1.x) < EPSILON && Math.abs(p0.y - p1.y) < EPSILON) {\n      points.splice(i, 1);\n      i--;\n    }\n  }\n}\n\n/**\n * Transform an arc to a set of points a long the arc.\n * Specifiction F.6 (https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes)\n * @ignore\n * @param {array} s - Segments\n * @param {number} startX - X-coordinate for start of arc\n * @param {number} startY - Y-coordinate for start of arc\n */\nfunction arcToPoints(s, startX, startY) {\n  const points = [];\n  const largeArcFlag = !!s[4]; // F.6.3\n  const sweepFlag = !!s[5]; // F.6.3\n  const rotation = s[3];\n  let endX = s[6];\n  let endY = s[7];\n  let rx = s[1];\n  let ry = s[2];\n  let cx;\n  let cy;\n  let sweepAngle;\n  let startAngle;\n\n  if (s[0] === 'a') {\n    endX += startX;\n    endY += startY;\n  }\n\n  // F.6.2\n  if (startX === endY && startY === endY) {\n    return points;\n  }\n\n  // Given no radius, threat as lineTo command\n  if (!rx || !ry) {\n    points.push({ x: endX, y: endY });\n    return points;\n  }\n\n  ({ cx, cy, rx, ry, sweepAngle, startAngle } = arcToCenter(\n    rx,\n    ry,\n    rotation,\n    largeArcFlag,\n    sweepFlag,\n    endX,\n    endY,\n    startX,\n    startY\n  ));\n\n  // Approximation of perimeter\n  const p = Math.abs(sweepAngle * Math.sqrt((Math.pow(rx, 2) + Math.pow(ry, 2)) / 2));\n\n  // Generate a point every 10th pixel. Scaling of the node should probably be included in this calculation\n  const res = Math.ceil(p / 10);\n  const resAngle = sweepAngle / res;\n\n  for (let k = 1; k <= res; k++) {\n    const deltaAngle = resAngle * k;\n    const radians = (startAngle + deltaAngle) % PI_X2;\n    const cos = Math.cos(radians);\n    const sin = Math.sin(radians);\n    // F.6.3 https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n    points.push({\n      x: cx + cos * rx + -sin * cos,\n      y: cy + sin * ry + cos * sin,\n    });\n  }\n\n  // points.push({ x: cx, y: cy });\n\n  return points;\n}\n\n/**\n * Converts a SVG path data string into a set of points.\n * @ignore\n * @param {string} path\n * @returns {Array<point[]>} Array of points\n */\nexport default function pathToPoints(path) {\n  const commands = p2dp.parsePath(path);\n  const segments = [];\n  const points = [];\n  let x = 0; // Current point\n  let y = 0;\n  let cpx = null; // Last control point on a cubic curve\n  let cpy = null;\n  let qcpx = null; // Last control point on a quad curve\n  let qcpy = null;\n\n  for (let i = 0; i < commands.length; ++i) {\n    const cmd = commands[i];\n    const pathType = cmd[0];\n\n    // Reset control point if command is not cubic\n    if (pathType !== 'S' && pathType !== 's' && pathType !== 'C' && pathType !== 'c') {\n      cpx = null;\n      cpy = null;\n    }\n\n    if (pathType !== 'T' && pathType !== 't' && pathType !== 'Q' && pathType !== 'q') {\n      qcpx = null;\n      qcpy = null;\n    }\n\n    switch (pathType) {\n      case 'm':\n        if (points.length) {\n          segments.push(points.splice(0));\n        }\n      // Fall through\n      case 'l': // eslint-disable-line no-fallthrough\n        x += cmd[1];\n        y += cmd[2];\n        points.push({ x, y });\n        break;\n      case 'M':\n        if (points.length) {\n          segments.push(points.splice(0));\n        }\n      // Fall through\n      case 'L': // eslint-disable-line no-fallthrough\n        x = cmd[1];\n        y = cmd[2];\n        points.push({ x, y });\n        break;\n      case 'H':\n        x = cmd[1];\n        points.push({ x, y });\n        break;\n      case 'h':\n        x += cmd[1];\n        points.push({ x, y });\n        break;\n      case 'V':\n        y = cmd[1];\n        points.push({ x, y });\n        break;\n      case 'v':\n        y += cmd[1];\n        points.push({ x, y });\n        break;\n      case 'a':\n        points.push(...arcToPoints(cmd, x, y));\n        x += cmd[6];\n        y += cmd[7];\n        break;\n      case 'A':\n        points.push(...arcToPoints(cmd, x, y));\n        x = cmd[6];\n        y = cmd[7];\n        break;\n      case 'c':\n        points.push(\n          ...cubicCurveToPoints(\n            { x, y },\n            { x: cmd[1] + x, y: cmd[2] + y },\n            { x: cmd[3] + x, y: cmd[4] + y },\n            { x: cmd[5] + x, y: cmd[6] + y }\n          )\n        );\n        cpx = cmd[3] + x; // Last control point\n        cpy = cmd[4] + y;\n        x += cmd[5];\n        y += cmd[6];\n        break;\n      case 'C':\n        points.push(\n          ...cubicCurveToPoints({ x, y }, { x: cmd[1], y: cmd[2] }, { x: cmd[3], y: cmd[4] }, { x: cmd[5], y: cmd[6] })\n        );\n        cpx = cmd[3]; // Last control point\n        cpy = cmd[4];\n        x = cmd[5];\n        y = cmd[6];\n        break;\n      case 's':\n        if (cpx === null || cpx === null) {\n          cpx = x;\n          cpy = y;\n        }\n\n        points.push(\n          ...cubicCurveToPoints(\n            { x, y },\n            { x: 2 * x - cpx, y: 2 * y - cpy },\n            { x: cmd[1] + x, y: cmd[2] + y },\n            { x: cmd[3] + x, y: cmd[4] + y }\n          )\n        );\n        cpx = cmd[1] + x; // last control point\n        cpy = cmd[2] + y;\n        x += cmd[3];\n        y += cmd[4];\n        break;\n      case 'S':\n        if (cpx === null || cpx === null) {\n          cpx = x;\n          cpy = y;\n        }\n\n        points.push(\n          ...cubicCurveToPoints(\n            { x, y },\n            { x: 2 * x - cpx, y: 2 * y - cpy },\n            { x: cmd[1], y: cmd[2] },\n            { x: cmd[3], y: cmd[4] }\n          )\n        );\n        cpx = cmd[1]; // last control point\n        cpy = cmd[2];\n        x = cmd[3];\n        y = cmd[4];\n        break;\n      case 'Q':\n        points.push(...quadCurveToPoints({ x, y }, { x: cmd[1], y: cmd[2] }, { x: cmd[3], y: cmd[4] }));\n\n        qcpx = cmd[1]; // last control point\n        qcpy = cmd[2];\n        x = cmd[3];\n        y = cmd[4];\n        break;\n      case 'q':\n        points.push(...quadCurveToPoints({ x, y }, { x: cmd[1] + x, y: cmd[2] + y }, { x: cmd[3] + x, y: cmd[4] + y }));\n\n        qcpx = cmd[1] + x; // last control point\n        qcpy = cmd[2] + y;\n        x += cmd[3];\n        y += cmd[4];\n        break;\n      case 'T':\n        if (qcpx === null || qcpx === null) {\n          qcpx = x;\n          qcpy = y;\n        }\n\n        qcpx = 2 * x - qcpx; // last control point\n        qcpy = 2 * y - qcpy;\n        points.push(...quadCurveToPoints({ x, y }, { x: qcpx, y: qcpy }, { x: cmd[1], y: cmd[2] }));\n\n        x = cmd[1];\n        y = cmd[2];\n        break;\n      case 't':\n        if (qcpx === null || qcpx === null) {\n          qcpx = x;\n          qcpy = y;\n        }\n\n        qcpx = 2 * x - qcpx; // last control point\n        qcpy = 2 * y - qcpy;\n        points.push(...quadCurveToPoints({ x, y }, { x: qcpx, y: qcpy }, { x: cmd[1] + x, y: cmd[2] + y }));\n        x += cmd[1];\n        y += cmd[2];\n        break;\n      case 'z':\n      case 'Z':\n        if (points.length) {\n          points.push({ x: points[0].x, y: points[0].y });\n        }\n        break;\n      default:\n      // Do nothing\n    }\n  }\n\n  removeDuplicates(points);\n  segments.push(points.splice(0));\n\n  return segments;\n}\n","import pathToSegments from '../../scene-graph/parse-path-d';\n\nconst debugPathToPointsDef = {\n  require: ['renderer', 'chart'],\n  defaultSettings: {\n    settings: {\n      target: '',\n      fill: 'transparent',\n      stroke: 'lime',\n      opacity: 1,\n      radius: 2,\n      useOuterRect: false,\n    },\n  },\n  on: {\n    update() {\n      this.draw();\n    },\n  },\n  draw() {\n    const shapes = this.chart.findShapes('path').filter((s) => s.key === this.props.target); // Find all shapes\n\n    const circles = [];\n    shapes.forEach((s) => {\n      pathToSegments(s.attrs.d).forEach((segment) => {\n        segment.forEach((p) => {\n          circles.push({\n            type: 'circle',\n            cx: p.x,\n            cy: p.y,\n            r: this.props.radius,\n            fill: this.props.fill,\n            stroke: this.props.stroke,\n            opacity: this.props.opacity,\n            collider: { type: null },\n          });\n        });\n      });\n    });\n\n    this.renderer.render(circles);\n  },\n  created() {\n    this.props = this.settings.settings;\n  },\n  resize({ outer, inner }) {\n    if (this.props.useOuterRect) {\n      return outer;\n    }\n    return inner;\n  },\n  render() {},\n  mounted() {\n    this.draw();\n  },\n  updated() {\n    this.props = this.settings.settings;\n    this.draw();\n  },\n};\n\nexport default debugPathToPointsDef;\n","import boxComponent from '../core/chart-components/box';\nimport pointComponent from '../core/chart-components/point';\nimport pieComponent from '../core/chart-components/pie';\nimport gridLineComponent from '../core/chart-components/grid';\nimport refLineComponent from '../core/chart-components/ref-line';\nimport axisComponent from '../core/chart-components/axis';\nimport containerComponent from '../core/chart-components/container';\nimport textComponent from '../core/chart-components/text';\nimport scrollbarComponent from '../core/chart-components/scrollbar';\nimport brushRangeComponent from '../web/components/brush-range';\nimport rangeComponent from '../core/chart-components/range';\nimport brushLassoComponent from '../core/chart-components/brush-lasso';\nimport labelsComponent from '../core/chart-components/labels';\nimport categoricalLegend from '../core/chart-components/legend-cat';\nimport sequentialLegend from '../core/chart-components/legend-seq';\nimport lineComponent from '../core/chart-components/line';\nimport brushAreaComponent from '../web/components/brush-area';\nimport tooltipComponent from '../web/components/tooltip';\nimport { debugCollider, debugPathToPoints } from '../core/chart-components/debug';\n\nexport default [\n  boxComponent,\n  pointComponent,\n  pieComponent,\n  gridLineComponent,\n  refLineComponent,\n  axisComponent,\n  containerComponent,\n  textComponent,\n  scrollbarComponent,\n  brushRangeComponent,\n  rangeComponent,\n  brushLassoComponent,\n  labelsComponent,\n  categoricalLegend,\n  sequentialLegend,\n  lineComponent,\n  brushAreaComponent,\n  tooltipComponent,\n  debugCollider,\n  debugPathToPoints,\n];\n","import component from './box';\n\nexport default function box(picasso) {\n  picasso.component('box', component);\n  picasso.component('box-marker', component); // temporary backwards compatibility - DEPRECATED\n}\n\n/**\n * @typedef {object} ComponentBox\n * @extends ComponentSettings\n * @example\n * {\n *   type: \"box\",\n *   data: {\n *    mapTo: {\n *      min: { source: \"/qHyperCube/qMeasureInfo/0\" },\n *      start: { source: \"/qHyperCube/qMeasureInfo/1\" },\n *      med: { source: \"/qHyperCube/qMeasureInfo/2\" },\n *      end: { source: \"/qHyperCube/qMeasureInfo/3\" },\n *      max: { source: \"/qHyperCube/qMeasureInfo/4\" },\n *    },\n *    groupBy: {\n *      source: \"/qHyperCube/qDimensionInfo/0\"\n *    }\n *  },\n *  settings: {\n *    major: {\n *      scale: { source: \"/qHyperCube/qDimensionInfo/0\" }\n *    },\n *    minor: {\n *      scale: { source: [\"/qHyperCube/qMeasureInfo/0\",\n *               \"/qHyperCube/qMeasureInfo/1\",\n *               \"/qHyperCube/qMeasureInfo/2\",\n *               \"/qHyperCube/qMeasureInfo/3\",\n *               \"/qHyperCube/qMeasureInfo/4\"] }\n *    }\n *  }\n * }\n */\n\n/**\n * @typedef {object} ComponentBox.settings\n * @property {object} major\n * @property {string} major.scale The scale to use along the major (dimension) axis\n * @property {string|ComponentBox~MajorReference} [major.ref='self'] Reference to the data property along the major axis\n * @property {object} minor\n * @property {string} minor.scale The scale to use along the minor (measure) axis\n * @property {string} [orientation='vertical'] Which orientation to use (vertical or horizontal)\n * @property {object} [box] Visual properties for the box shape in the box marker\n * @property {boolean} [box.show=true] Boolean for showing the box shape\n * @property {string} [box.fill='#fff']\n * @property {string} [box.stroke='#000']\n * @property {number} [box.strokeWidth=1]\n * @property {string} [box.strokeLinejoin='miter']\n * @property {number} [box.width=1]\n * @property {number} [box.maxWidthPx=100] Maximum width of the box in pixels (not applicable when using major start and end)\n * @property {number} [box.minWidthPx=1] Minimum width of the box in pixels (not applicable when using major start and end)\n * @property {number} [box.minHeightPx=1] Minimum height of the box shape\n * @property {object} [line] Visual properties for lines between min-start, end-max.\n * @property {boolean} [line.show=true]\n * @property {string} [line.stroke='#000']\n * @property {number} [line.strokeWidth=1]\n * @property {object} [whisker] All the visual properties for whiskers at min and max.\n * @property {boolean} [whisker.show=true]\n * @property {string} [whisker.stroke='#000']\n * @property {number} [whisker.strokeWidth=1]\n * @property {number} [whisker.width=1]\n * @property {object} [median] Visual properties for the median\n * @property {boolean} [median.show=true]\n * @property {string} [median.stroke='#000']\n * @property {number} [median.strokeWidth=1]\n * @property {object} [oob] EXPERIMENTAL: Out of bounds symbol utilizing the symbol API\n * @property {boolean} [oob.show=true]\n * @property {string} [oob.type='n-polygon'] Type of the symbol to be used\n * @property {string} [oob.fill='#999'] Fill color of the symbol\n * @property {string} [oob.stroke='#000'] Stroke color\n * @property {number} [oob.strokeWidth=0] Stroke width\n * @property {number} [oob.size=10] Size/width of the symbol in pixels\n * @property {number} [oob.sides=3] Number of sides for a n-polygon (3 for triangle)\n */\n\n/**\n * @typedef {object} ComponentBox~MajorReference\n * @property {string} start Reference to the data property of the start value along the major axis\n * @property {string} end Reference to the data property of the end value along the major axis\n */\n\n/**\n * @typedef {object} ComponentBox.data\n * @property {number} [min] Min\n * @property {number} [max] Max\n * @property {number} [start] Start of box\n * @property {number} [end] End of box\n * @property {number} [med] Median\n */\n","import pointMarkerComponent from './point';\n\n/**\n * @typedef {object} ComponentPoint\n * @extends ComponentSettings\n * @example\n{\n  type: 'point',\n  data: {\n    extract: {\n      field: 'Month',\n      props: {\n        x: { field: 'Margin' },\n        y: { field: 'Year' }\n      }\n    }\n  },\n  settings: {\n    x: { scale: 'm' },\n    y: { scale: 'y' },\n  }\n}\n */\n\nconst type = 'point';\n\nexport default function pointMarker(picasso) {\n  picasso.component(type, pointMarkerComponent);\n\n  picasso.component('point-marker', pointMarkerComponent); // temporary backwards compatibility - DEPRECATED\n}\n","import pieComponent from './pie';\n\nexport default function pie(picasso) {\n  picasso.component('pie', pieComponent);\n}\n","import gridLineComponent from './line';\n\n/**\n * @typedef {object} ComponentGridLine\n * @extends ComponentSettings\n * @example\n * {\n *  type: 'grid-line',\n *  settings: {\n *    x: {\n *      scale: '<name-of-scale>',\n *    },\n *    y: {\n *      scale: '<name-of-scale>',\n *    },\n *  },\n * }\n */\n\n/**\n * Component settings\n * @typedef {object} ComponentGridLine.settings\n * @property {object} x\n * @property {string} x.scale - The scale to use along x\n * @property {object} y\n * @property {string} y.scale - The scale to use along y\n * @property {object} [ticks]\n * @property {boolean} [ticks.show=true]\n * @property {string} [ticks.stroke='black']\n * @property {number} [ticks.strokeWidth='1']\n * @property {string} [ticks.strokeDasharray]\n * @property {object} [minorTicks]\n * @property {boolean} [minorTicks.show=true]\n * @property {string} [minorTicks.stroke='black']\n * @property {number} [minorTicks.strokeWidth='1']\n * @property {string} [minorTicks.strokeDasharray]\n */\n\nexport default function gridLine(picasso) {\n  picasso.component('grid-line', gridLineComponent);\n}\n","import refLineComponent from './refline';\n\n/**\n * @typedef {object} ComponentRefLine\n * @extends ComponentSettings\n * @example\n * {\n *  type: 'ref-line',\n *  lines: {\n *    y: [{\n *      scale: 'y',\n *      value: 5000,\n *      label: {\n *        text: 'value label'\n *      }\n *    }]\n *  }\n * }\n */\n\nexport default function refLine(picasso) {\n  picasso.component('ref-line', refLineComponent);\n}\n","import axisComponent from './axis';\n\nconst type = 'axis';\n\nexport default function axis(picasso) {\n  picasso.component(type, axisComponent);\n}\n","import containerComponent from './container';\n\nexport default function container(picasso) {\n  picasso.component('container', containerComponent);\n}\n","import textComponent from './text';\n\nexport default function text(picasso) {\n  picasso.component('text', textComponent);\n}\n","import rangeBrushComponent from './brush-range';\nimport brushAreaDirectionalComponent from './brush-area-dir';\n\n/**\n * @typedef {object} ComponentBrushAreaDir\n * @extends ComponentSettings\n */\n\n/**\n * @typedef {object} ComponentBrushRange\n * @extends ComponentSettings\n */\n\nexport default function rangeBrush(picasso) {\n  picasso.component('brush-range', rangeBrushComponent);\n  picasso.component('brush-area-dir', brushAreaDirectionalComponent);\n}\n","import rangeBrushComponent from './range';\n\nexport default function rangeBrush(picasso) {\n  picasso.component('range', rangeBrushComponent);\n}\n","import lassoBrushComponent from './brush-lasso';\n\nexport default function lassoBrush(picasso) {\n  picasso.component('brush-lasso', lassoBrushComponent);\n}\n","import labelsComponent from './labels';\n\nexport default function labels(picasso) {\n  picasso.component('labels', labelsComponent);\n}\n","import component from './legend-cat';\n\n/**\n * @typedef {object} ComponentLegendCat\n * @extends ComponentSettings\n * @property {string} scale Reference to categorical color scale\n * @example\n{\n  type: 'legend-cat',\n  scale: '<categorical-color-scale>',\n}\n */\n\nconst type = 'legend-cat';\n\nexport default function categoricalLegend(picasso) {\n  picasso.component(type, component);\n}\n","import legendSeq from './legend-seq';\n\n/**\n * @typedef {object} ComponentLegendSeq\n * @extends ComponentSettings\n * @example\n{\n  type: 'legend-seq',\n  settings: {\n    fill: '<sequential-color-scale>',\n    major: '<linear-scale>',\n  }\n}\n */\n\nexport default function sequentialLegend(picasso) {\n  picasso.component('legend-seq', legendSeq);\n}\n","import component from './line';\n\n/**\n * @typedef {object} ComponentLine\n * @extends ComponentSettings\n * @example\n{\n  type: \"line\",\n  data: {\n    extract: {\n      field: \"Year\",\n      props: {\n        sales: { field: \"Sales\" },\n      },\n    },\n  },\n  settings: {\n    coordinates: {\n      major: { scale: \"t\" },\n      minor: { scale: \"y\", ref: \"sales\" },\n    },\n  },\n}\n */\n\nconst type = 'line';\n\nexport default function line(picasso) {\n  picasso.component(type, component);\n}\n","import definition from './brush-area';\n\n/**\n * A component that can brush a rectangular area\n * @typedef {object} ComponentBrushArea\n * @extends ComponentSettings\n * @example\n * {\n *  type: 'brush-area',\n *  brush: {\n *    components: [{ key: '<target-component>', contexts: ['highlight'] }]\n *  }\n * }\n */\n\nexport default function areaBrush(picasso) {\n  picasso.component('brush-area', definition);\n}\n","import tooltip from './tooltip';\n\n/**\n * @typedef {object} ComponentTooltip\n * @extends ComponentSettings\n * @example\n * picasso.chart({\n  settings: {\n    interactions: [{\n      type: 'native',\n      events: {\n        mousemove(e) {\n          const tooltip = this.chart.component('<tooltip-key>');\n          tooltip.emit('show', e);\n        },\n        mouseleave(e) {\n          const tooltip = this.chart.component('<tooltip-key>');\n          tooltip.emit('hide');\n        }\n      }\n    }],\n    components: [\n      {\n        key: '<tooltip-key>',\n        type: 'tooltip'\n      }\n    ]\n  },\n  ...\n});\n */\n\n/**\n * @type {string}\n * @memberof ComponentTooltip\n */\nconst type = 'tooltip';\n\nexport default function addTooltip(picasso) {\n  picasso.component(type, tooltip);\n}\n","import createDebugCollider from './debug-collider';\nimport createDebugPathToPoints from './debug-path-to-points';\n\nexport function debugCollider(picasso) {\n  picasso.component('debug-collider', createDebugCollider);\n}\n\nexport function debugPathToPoints(picasso) {\n  picasso.component('debug-path-to-points', createDebugPathToPoints);\n}\n","class Node {\n  /**\n   * @private\n   */\n  constructor(type) {\n    this._parent = null;\n    this._children = [];\n    this._ancestors = null;\n    this.type = type;\n    this.data = null;\n  }\n\n  /**\n   * Detaches this node from its parent, if such exists.\n   * @returns {Node}\n   */\n  detach() {\n    if (this._parent) {\n      this._parent.removeChild(this);\n    }\n    return this;\n  }\n\n  /**\n   * Parent of this node.\n   * @readonly\n   * @type {Node}\n   */\n  get parent() {\n    return this._parent;\n  }\n\n  /**\n   * Checks whether this node is a branch.\n   *\n   * True if this node has children, false otherwise.\n   * @readonly\n   * @type {Boolean}\n   */\n  get isBranch() {\n    return this._children && this._children.length;\n  }\n\n  /**\n   * Children of this node.\n   * @readonly\n   * @type {Node[]}\n   */\n  get children() {\n    return this._children;\n  }\n\n  /**\n   * Ancestors of this node, including parent.\n   * @readonly\n   * @type {Node[]}\n   */\n  get ancestors() {\n    if (!this._ancestors) {\n      this._ancestors = [];\n      if (this.parent) {\n        this._ancestors.push(this.parent, ...this.parent.ancestors);\n      }\n    }\n\n    return this._ancestors;\n  }\n\n  /**\n   * Descendants of this node.\n   * @readonly\n   * @type {Node[]}\n   */\n  get descendants() {\n    const r = [];\n    const len = this.children.length;\n    let i;\n    let c;\n\n    for (i = 0, len; i < len; i++) {\n      c = this.children[i];\n      r.push(c);\n\n      if (c.children.length) {\n        r.push(...c.descendants);\n      }\n    }\n    return r;\n  }\n\n  /**\n   *\n   * @returns {Boolean}\n   */\n  equals(n) {\n    const children = this.children;\n    const nChildren = n.children;\n    if (children.length !== nChildren.length) {\n      return false;\n    }\n    // Requires deterministic child order\n    for (let i = 0; i < children.length; i++) {\n      if (!children[i].equals(nChildren[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  toJSON() {\n    return {\n      type: this.type,\n      children: this.children.map((ch) => ch.toJSON()),\n    };\n  }\n}\n\nexport default Node;\n","import { pointsToLine, pointsToRect } from './util';\nimport {\n  testCircleRect,\n  testPolygonRect,\n  testRectRect,\n  testRectPoint,\n  testRectLine,\n  testGeoPolygonRect,\n} from '../math/narrow-phase-collision';\n\n/**\n * Construct a new GeoRect instance\n * @private\n */\nclass GeoRect {\n  constructor({ x = 0, y = 0, width = 0, height = 0, minWidth = 0, minHeight = 0 } = {}) {\n    this.set({\n      x,\n      y,\n      width,\n      height,\n      minWidth,\n      minHeight,\n    });\n  }\n\n  set({ x = 0, y = 0, width = 0, height = 0, minWidth = 0, minHeight = 0 } = {}) {\n    this.type = 'rect';\n\n    if (width >= 0) {\n      this.x = x;\n      this.width = Math.max(width, minWidth);\n    } else {\n      this.x = x + Math.min(width, -minWidth);\n      this.width = -Math.min(width, -minWidth);\n    }\n\n    if (height >= 0) {\n      this.y = y;\n      this.height = Math.max(height, minHeight);\n    } else {\n      this.y = y + Math.min(height, -minHeight);\n      this.height = -Math.min(height, -minHeight);\n    }\n  }\n\n  /**\n   * @param {Point} p\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(p) {\n    return testRectPoint(this, p);\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    const line = pointsToLine(points);\n    return testRectLine(this, line);\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    const rect = pointsToRect(points);\n    return testRectRect(this, rect);\n  }\n\n  /**\n   * @param {Circle} c\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(c) {\n    return testCircleRect(c, this);\n  }\n\n  /**\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return testPolygonRect(polygon, this);\n  }\n\n  /**\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return testGeoPolygonRect(geopolygon, this);\n  }\n\n  /**\n   * Get the points\n   * @returns {Point[]}\n   */\n  points() {\n    return [\n      { x: this.x, y: this.y },\n      { x: this.x + this.width, y: this.y },\n      { x: this.x + this.width, y: this.y + this.height },\n      { x: this.x, y: this.y + this.height },\n    ];\n  }\n}\n\nfunction create(...args) {\n  return new GeoRect(...args);\n}\n\nexport { GeoRect as default, create };\n","import { pointsToLine, pointsToRect } from './util';\nimport {\n  testCirclePoint,\n  testCircleRect,\n  testCircleLine,\n  testCircleCircle,\n  testCirclePolygon,\n  testCircleGeoPolygon,\n} from '../math/narrow-phase-collision';\n\n/**\n * Construct a new GeoCircle instance\n * @private\n */\nclass GeoCircle {\n  constructor({ cx = 0, cy = 0, r = 0, minRadius = 0 } = {}) {\n    this.set({\n      cx,\n      cy,\n      r,\n      minRadius,\n    });\n  }\n\n  set({ cx = 0, cy = 0, r = 0, minRadius = 0 } = {}) {\n    this.type = 'circle';\n    this.cx = cx;\n    this.cy = cy;\n    this.r = Math.max(r, minRadius);\n    this.vector = { x: this.cx, y: this.cy };\n  }\n\n  /**\n   * @param {Point} p\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(p) {\n    return testCirclePoint(this, p);\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    const line = pointsToLine(points);\n\n    return testCircleLine(this, line);\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    const rect = pointsToRect(points);\n\n    return testCircleRect(this, rect);\n  }\n\n  /**\n   * @param {Circle} c\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(c) {\n    return testCircleCircle(this, c);\n  }\n\n  /**\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return testCirclePolygon(this, polygon);\n  }\n\n  /**\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return testCircleGeoPolygon(this, geopolygon);\n  }\n\n  /**\n   * Get the points\n   * @returns {Point[]}\n   */\n  points() {\n    return [\n      {\n        x: this.cx,\n        y: this.cy,\n      },\n    ];\n  }\n}\n\nfunction create(...args) {\n  return new GeoCircle(...args);\n}\n\nexport { GeoCircle as default, create };\n","import { pointsToLine, pointsToRect } from './util';\nimport {\n  testCircleLine,\n  testPolygonLine,\n  testRectLine,\n  testLinePoint,\n  testLineLine,\n  testGeoPolygonLine,\n} from '../math/narrow-phase-collision';\n\n/**\n * Construct a new GeoLine instance\n * @private\n */\nclass GeoLine {\n  constructor({ x1 = 0, y1 = 0, x2 = 0, y2 = 0, tolerance = 0 } = {}) {\n    this.set({\n      x1,\n      y1,\n      x2,\n      y2,\n      tolerance,\n    });\n  }\n\n  set({ x1 = 0, y1 = 0, x2 = 0, y2 = 0, tolerance = 0 } = {}) {\n    this.type = 'line';\n    this.x1 = x1;\n    this.y1 = y1;\n    this.x2 = x2;\n    this.y2 = y2;\n    this.tolerance = Math.max(0, Math.round(tolerance));\n\n    this.vectors = this.points();\n    this.zeroSize = x1 === x2 && y1 === y2;\n  }\n\n  /**\n   * @param {Point} p\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(p) {\n    if (this.tolerance > 0) {\n      const c = { cx: p.x, cy: p.y, r: this.tolerance };\n      return testCircleLine(c, this);\n    }\n    return testLinePoint(this, p);\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    const line = pointsToLine(points);\n    return testLineLine(this, line);\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    const rect = pointsToRect(points);\n    return testRectLine(rect, this);\n  }\n\n  /**\n   * @param {Circle} c\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(c) {\n    return testCircleLine(c, this);\n  }\n\n  /**\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return testPolygonLine(polygon, this);\n  }\n\n  /**\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return testGeoPolygonLine(geopolygon, this);\n  }\n\n  /**\n   * Get the points\n   * @returns {Point[]}\n   */\n  points() {\n    return [\n      { x: this.x1, y: this.y1 },\n      { x: this.x2, y: this.y2 },\n    ];\n  }\n}\n\nfunction create(...args) {\n  return new GeoLine(...args);\n}\n\nexport { GeoLine as default, create };\n","import { pointsToLine, pointsToRect } from './util';\nimport {\n  testCirclePolygon,\n  testPolygonPoint,\n  testPolygonLine,\n  testPolygonRect,\n  testPolygonPolygon,\n  testGeoPolygonPolygon,\n} from '../math/narrow-phase-collision';\n\nfunction close(vertices) {\n  const first = vertices[0];\n  const last = vertices[vertices.length - 1];\n\n  if (first.x !== last.x || first.y !== last.y) {\n    vertices.push(first);\n  }\n}\n\nfunction removeDuplicates(vertices) {\n  for (let i = 0; i < vertices.length - 1; i++) {\n    const v0 = vertices[i];\n    const v1 = vertices[i + 1];\n    if (v0.x === v1.x && v0.y === v1.y) {\n      vertices.splice(i, 1);\n      i--;\n    }\n  }\n}\n\n/**\n * Construct a new Polygon instance\n * Added ignore flag as the name collide with definition in index.js\n * @ignore\n * @private\n */\nclass Polygon {\n  constructor({ vertices = [] } = {}) {\n    this.set({ vertices });\n  }\n\n  /**\n   * Set the vertices.\n   * If vertices doesn't close the polygon, a closing vertice is appended.\n   * @ignore\n   * @param {object} input An object with a vertices property\n   * @param {Point[]} [input.vertices=[]] Vertices are represented as an array of points.\n   */\n  set({ vertices = [] } = {}) {\n    this.type = 'polygon';\n    this.vertices = vertices.slice();\n    this.edges = [];\n\n    removeDuplicates(this.vertices);\n\n    if (this.vertices.length <= 2) {\n      return;\n    }\n\n    close(this.vertices);\n\n    this.xMin = NaN;\n    this.yMin = NaN;\n    this.xMax = NaN;\n    this.yMax = NaN;\n\n    for (let i = 0; i < this.vertices.length; i++) {\n      if (i < this.vertices.length - 1) {\n        this.edges.push([this.vertices[i], this.vertices[i + 1]]);\n      }\n\n      this.xMin = isNaN(this.xMin) ? this.vertices[i].x : Math.min(this.xMin, this.vertices[i].x);\n      this.xMax = isNaN(this.xMax) ? this.vertices[i].x : Math.max(this.xMax, this.vertices[i].x);\n      this.yMin = isNaN(this.yMin) ? this.vertices[i].y : Math.min(this.yMin, this.vertices[i].y);\n      this.yMax = isNaN(this.yMax) ? this.vertices[i].y : Math.max(this.yMax, this.vertices[i].y);\n    }\n\n    this._bounds = null;\n    this._boundingRect = null;\n  }\n\n  /**\n   * Check if a point is inside the area of the polygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @ignore\n   * @param {Point} point\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(point) {\n    return testPolygonPoint(this, point);\n  }\n\n  /**\n   * Check if circle is inside the area of the polygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @ignore\n   * @param {Circle} circle\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(circle) {\n    return testCirclePolygon(circle, this);\n  }\n\n  /**\n   * @ignore\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    return testPolygonLine(this, pointsToLine(points));\n  }\n\n  /**\n   * @ignore\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    return testPolygonRect(this, pointsToRect(points));\n  }\n\n  /**\n   * Check if polygon intersects another polygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @ignore\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return testPolygonPolygon(this, polygon);\n  }\n\n  /**\n   * Check if polygon intersects a geopolygon.\n   * @ignore\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return testGeoPolygonPolygon(geopolygon, this);\n  }\n\n  /**\n   * Get the points\n   * @ignore\n   * @returns {Point[]}\n   */\n  points() {\n    return this.vertices;\n  }\n\n  /**\n   * Get the bounds of the polygon, as an array of points\n   * @ignore\n   * @returns {Point[]}\n   */\n  bounds() {\n    if (!this._bounds) {\n      this._bounds = [\n        { x: this.xMin, y: this.yMin },\n        { x: this.xMax, y: this.yMin },\n        { x: this.xMax, y: this.yMax },\n        { x: this.xMin, y: this.yMax },\n      ];\n    }\n\n    return this._bounds;\n  }\n\n  /**\n   * Get the bounding rect of the polygon\n   * @ignore\n   * @returns {Rect}\n   */\n  boundingRect() {\n    if (!this._boundingRect) {\n      this._boundingRect = {\n        x: this.xMin,\n        y: this.yMin,\n        width: this.xMax - this.xMin,\n        height: this.yMax - this.yMin,\n      };\n    }\n    return this._boundingRect;\n  }\n}\n\nfunction create(...a) {\n  return new Polygon(...a);\n}\n\nexport { create, Polygon as default };\n","import { create as createPolygon } from './polygon';\nimport { pointsToLine, pointsToRect } from './util';\nimport {\n  testCircleGeoPolygon,\n  testGeoPolygonPoint,\n  testGeoPolygonLine,\n  testGeoPolygonRect,\n  testGeoPolygonPolygon,\n  testGeoPolygonGeoPolygon,\n} from '../math/narrow-phase-collision';\n\nfunction close(vertices) {\n  const first = vertices[0];\n  const last = vertices[vertices.length - 1];\n\n  if (first.x !== last.x || first.y !== last.y) {\n    vertices.push(first);\n  }\n}\n\nfunction removeDuplicates(vertices) {\n  for (let i = 0; i < vertices.length - 1; i++) {\n    const v0 = vertices[i];\n    const v1 = vertices[i + 1];\n    if (v0.x === v1.x && v0.y === v1.y) {\n      vertices.splice(i, 1);\n      i--;\n    }\n  }\n}\n\n/**\n * A geo-polygon is a polygon which is similar to a polygon in GeoJson. A typical geopolygon is an array of polygons where the first polygon is an outer polygon and the rest are inner polygons\n * @private\n */\n\n/**\n * Construct a new GeoPolygon instance\n * @private\n */\nclass GeoPolygon {\n  constructor({ vertices = [[]] } = {}) {\n    this.set({ vertices });\n  }\n\n  /**\n   * Set the vertices.\n   * If vertices doesn't close the polygon, a closing vertice is appended.\n   * @param {object} input An object with a vertices property\n   * @param {Array} [input.vertices=[]] Vertices are represented as an array of arrays of points.\n   */\n  set({ vertices = [] } = {}) {\n    this.type = 'geopolygon';\n    this.vertices = vertices.slice();\n    this.numPolygons = this.vertices.length;\n    this.polygons = [];\n    this.xMin = NaN;\n    this.yMin = NaN;\n    this.xMax = NaN;\n    this.yMax = NaN;\n\n    for (let i = 0; i < this.numPolygons; i++) {\n      removeDuplicates(this.vertices[i]);\n      if (this.vertices[i].length > 2) {\n        close(this.vertices[i]);\n      }\n      this.polygons[i] = createPolygon({ vertices: this.vertices[i] });\n      this.xMin = isNaN(this.xMin) ? this.polygons[i].xMin : Math.min(this.xMin, this.polygons[i].xMin);\n      this.xMax = isNaN(this.xMax) ? this.polygons[i].xMax : Math.max(this.xMax, this.polygons[i].xMax);\n      this.yMin = isNaN(this.yMin) ? this.polygons[i].yMin : Math.min(this.yMin, this.polygons[i].yMin);\n      this.yMax = isNaN(this.yMax) ? this.polygons[i].yMax : Math.max(this.yMax, this.polygons[i].yMax);\n    }\n\n    this._bounds = null;\n    this._boundingRect = null;\n  }\n\n  /**\n   * Check if a point is inside the area of the geopolygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @param {Point} point\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(point) {\n    return testGeoPolygonPoint(this, point);\n  }\n\n  /**\n   * Check if circle is inside the area of the polygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @param {Circle} circle\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(circle) {\n    return testCircleGeoPolygon(circle, this);\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    return testGeoPolygonLine(this, pointsToLine(points));\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    return testGeoPolygonRect(this, pointsToRect(points));\n  }\n\n  /**\n   * Check if geopolygon intersects another polygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return testGeoPolygonPolygon(this, polygon);\n  }\n\n  /**\n   * Check if geopolygon intersects another geopolygon.\n   * Supports convex, concave and self-intersecting polygons (filled area).\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return testGeoPolygonGeoPolygon(this, geopolygon);\n  }\n\n  /**\n   * Get the points\n   * @returns {Point[]}\n   */\n  points() {\n    return this.vertices;\n  }\n\n  /**\n   * Get the bounds of the polygon, as an array of points\n   * @returns {Point[]}\n   */\n  bounds() {\n    if (!this._bounds) {\n      this._bounds = [\n        { x: this.xMin, y: this.yMin },\n        { x: this.xMax, y: this.yMin },\n        { x: this.xMax, y: this.yMax },\n        { x: this.xMin, y: this.yMax },\n      ];\n    }\n\n    return this._bounds;\n  }\n\n  /**\n   * Get the bounding rect of the polygon\n   * @returns {Rect}\n   */\n  boundingRect() {\n    if (!this._boundingRect) {\n      this._boundingRect = {\n        x: this.xMin,\n        y: this.yMin,\n        width: this.xMax - this.xMin,\n        height: this.yMax - this.yMin,\n      };\n    }\n    return this._boundingRect;\n  }\n}\n\nfunction create(...a) {\n  return new GeoPolygon(...a);\n}\n\nexport { create, GeoPolygon as default };\n","import { pointsToLine, pointsToRect } from './util';\nimport {\n  testCircleLine,\n  testPolygonLine,\n  testLinePoint,\n  testLineLine,\n  testRectLine,\n  testGeoPolygonLine,\n} from '../math/narrow-phase-collision';\n\nfunction pointsAreNotEqual(p0, p1) {\n  return p0.x !== p1.x || p0.y !== p1.y;\n}\n\n/**\n * Construct a new GeoPolyline instance\n * @private\n */\nclass GeoPolyline {\n  constructor({ points = [] } = {}) {\n    this.set({ points });\n  }\n\n  set({ points = [] } = {}) {\n    this.type = 'polyline';\n    this.segments = [];\n    this._points = points.slice();\n\n    if (this._points.length > 1) {\n      for (let i = 0, len = this._points.length - 1; i < len; i++) {\n        if (pointsAreNotEqual(this._points[i], this._points[i + 1])) {\n          this.segments.push({\n            x1: this._points[i].x,\n            y1: this._points[i].y,\n            x2: this._points[i + 1].x,\n            y2: this._points[i + 1].y,\n          });\n        }\n      }\n    }\n  }\n\n  /**\n   * @param {Point} point\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(point) {\n    return this.segments.some((line) => testLinePoint(line, point));\n  }\n\n  /**\n   * @param {Circle} circle\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(circle) {\n    return this.segments.some((line) => testCircleLine(circle, line));\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    const testLine = pointsToLine(points);\n    return this.segments.some((line) => testLineLine(line, testLine));\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    const rect = pointsToRect(points);\n    return this.segments.some((line) => testRectLine(rect, line));\n  }\n\n  /**\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    // This is a unoptimized solution and should be replaced by a more efficient algorithm.\n    return this.segments.some((line) => testPolygonLine(polygon, line));\n  }\n\n  /**\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    // This is a unoptimized solution and should be replaced by a more efficient algorithm.\n    return this.segments.some((line) => testGeoPolygonLine(geopolygon, line));\n  }\n\n  /**\n   * Get the points\n   * @returns {Point[]}\n   */\n  points() {\n    return this._points;\n  }\n}\n\nfunction create(...a) {\n  return new GeoPolyline(...a);\n}\n\nexport { create, GeoPolyline as default };\n","import { create as rect } from './rect';\nimport { create as circle } from './circle';\nimport { create as line } from './line';\nimport { create as polygon } from './polygon';\nimport { create as geopolygon } from './geopolygon';\nimport { create as polyline } from './polyline';\nimport registry from '../utils/registry';\n\nconst reg = registry();\n\nreg.add('rect', rect);\nreg.add('circle', circle);\nreg.add('line', line);\nreg.add('polygon', polygon);\nreg.add('geopolygon', geopolygon);\nreg.add('polyline', polyline);\n\n/* eslint-disable import/prefer-default-export */\nexport function create(type, input) {\n  return reg.get(type)(input);\n}\n/* eslint-enable import/prefer-default-export */\n\n/**\n * @typedef {object} Rect\n * @property {number} x - X-coordinate\n * @property {number} y - Y-coordinate\n * @property {number} width - Width\n * @property {number} height - Height\n */\n\n/**\n * @typedef {object} Line\n * @property {number} x1 - Start x-coordinate\n * @property {number} y1 - Start y-coordinate\n * @property {number} x2 - End x-coordinate\n * @property {number} y2 - End y-coordinate\n */\n\n/**\n * @typedef {object} Point\n * @property {number} x - X-coordinate\n * @property {number} y - Y-coordinate\n */\n\n/**\n * @typedef {object} Circle\n * @property {number} cx - Center x-coordinate\n * @property {number} cy - Center y-coordinate\n * @property {number} r - Circle radius\n */\n\n/**\n * @typedef {object} Polygon\n * @property {Array<Point>} points - Array of connected points\n */\n\n/**\n * @typedef {object} Geopolygon\n * @property {Array<Polygon>} polygons - Array of polygons\n */\n\n/**\n * @typedef {object} Polyline\n * @property {Array<Point>} points - Array of connected points\n */\n\n/**\n * @typedef {object} Path\n * @property {string} d - Path definition\n */\n","import { create as factory } from './index';\n\n/**\n * Construct a new GeometryCollection instance\n * @private\n */\nclass GeometryCollection {\n  constructor(collection = []) {\n    this.set(collection);\n  }\n\n  set(collection = []) {\n    this.geometries = [];\n    collection.forEach((geo) => {\n      const geoInstance = factory(geo.type, geo);\n      if (geoInstance) {\n        this.geometries.push(geoInstance);\n      }\n    });\n  }\n\n  /**\n   * @param {Point} p\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  containsPoint(p) {\n    return this.geometries.some((geo) => geo.containsPoint(p));\n  }\n\n  /**\n   * @param {Point[]} points - Line start and end point as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsLine(points) {\n    return this.geometries.some((geo) => geo.intersectsLine(points));\n  }\n\n  /**\n   * @param {Point[]} points - Rect vertices as an array of points\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsRect(points) {\n    return this.geometries.some((geo) => geo.intersectsRect(points));\n  }\n\n  /**\n   * @param {Circle} c\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsCircle(c) {\n    return this.geometries.some((geo) => geo.intersectsCircle(c));\n  }\n\n  /**\n   * @param {Polygon} polygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsPolygon(polygon) {\n    return this.geometries.some((geo) => geo.intersectsPolygon(polygon));\n  }\n\n  /**\n   * @param {Geopolygon} geopolygon\n   * @returns {boolean} True if there is an intersection, false otherwise\n   */\n  intersectsGeoPolygon(geopolygon) {\n    return this.geometries.some((geo) => geo.intersectsGeoPolygon(geopolygon));\n  }\n}\n\nfunction create(...args) {\n  return new GeometryCollection(...args);\n}\n\nexport { GeometryCollection as default, create };\n","class Matrix {\n  /**\n   * Creates a matrix with identity values.\n   * @private\n   */\n  constructor() {\n    this._elements = [\n      [1, 0, 0],\n      [0, 1, 0],\n      [0, 0, 1],\n    ];\n\n    this._stack = [];\n  }\n\n  /**\n   * Creates a new matrix with a copy of the current values.\n   */\n  clone() {\n    const mt = new Matrix();\n    return mt.multiply(this);\n  }\n\n  /**\n   * Sets the matrix values\n   * @param {Number[][]} arr A 3x3 array.\n   */\n  set(arr) {\n    this._elements = arr;\n    return this;\n  }\n\n  /**\n   * Saves the current matrix values to a stack.\n   */\n  save() {\n    this._stack.push(this.elements);\n    return this;\n  }\n\n  /**\n   * Sets the current matrix values to the last ones saved on to the stack.\n   */\n  restore() {\n    if (this._stack.length) {\n      this._elements = this._stack.pop(); // TODO - use a copy instead\n    }\n    return this;\n  }\n\n  /**\n   * Adds a scalar value to each element in the matrix.\n   * @param {Number} value\n   */\n  add(value) {\n    // assume scalar\n    let i, j;\n    for (i = 0; i < this._elements.length; i++) {\n      for (j = 0; j < this._elements[i].length; j++) {\n        this._elements[i][j] += value;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Translates the current matrix along the x and y axis.\n   * @param {Number} x\n   * @param {Number} y\n   */\n  translate(x, y) {\n    this.multiply([\n      [1, 0, x],\n      [0, 1, y],\n      [0, 0, 1],\n    ]);\n    return this;\n  }\n\n  /**\n   * Rotates the current matrix.\n   * @param {Number} radianAngle Angle in radians.\n   */\n  rotate(radianAngle) {\n    let cos = Math.cos(-radianAngle),\n      sin = Math.sin(-radianAngle);\n    this.multiply([\n      [cos, sin, 0],\n      [-sin, cos, 0],\n      [0, 0, 1],\n    ]);\n    return this;\n  }\n\n  /**\n   *\n   * If value is a number; multiplies each element in the matrix by the given value.\n   * If value is a matrix; multiplies the two matrices.\n   * @param {Number|Array|Matrix} value\n   */\n  multiply(value) {\n    let i, j, m, k;\n    if (value instanceof Matrix) {\n      value = value._elements;\n    }\n    if (Array.isArray(value)) {\n      // matrix multiplication\n      m = [\n        [0, 0, 0],\n        [0, 0, 0],\n        [0, 0, 0],\n      ];\n      for (i = 0; i < this._elements.length; i++) {\n        // row\n        for (j = 0; j < this._elements[i].length; j++) {\n          // column\n          for (k = 0; k < 3; k++) {\n            // row\n            m[i][j] += this._elements[i][k] * value[k][j];\n          }\n        }\n      }\n      this._elements = m;\n    } else {\n      // scalar multiplication\n      for (i = 0; i < this._elements.length; i++) {\n        for (j = 0; j < this._elements[i].length; j++) {\n          this._elements[i][j] *= value;\n        }\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Scales the matrix along x and y axis.\n   * @param {Number} x The value to scale the matrix with along the x direction\n   * @param {Number} [y=x] The value to scale the matrix with along the y direction.\n   */\n  scale(x, y = x) {\n    // if ( arguments.length < 2 || typeof y === \"undefined\" ) {\n    //  y = x;\n    // }\n\n    this.multiply([\n      [x, 0, 0],\n      [0, y, 0],\n      [0, 0, 1],\n    ]);\n    return this;\n  }\n\n  /**\n   * Multiples the matrix with the supplied transformation values\n   * @param {Number} a Horizontal scaling\n   * @param {Number} b Horizontal skewing\n   * @param {Number} c Vertical skewing\n   * @param {Number} d Vertical scaling\n   * @param {Number} e Horizontal moving\n   * @param {Number} f Vertical scaling\n   */\n  transform(a, b, c, d, e, f) {\n    this.multiply([\n      [a, c, e],\n      [b, d, f],\n      [0, 0, 1],\n    ]);\n\n    return this;\n  }\n\n  /**\n   * Gets the value of the determinant.\n   * @return {Number}\n   */\n  determinant() {\n    let a = this._elements[0][0],\n      b = this._elements[0][1],\n      c = this._elements[0][2],\n      d = this._elements[1][0],\n      e = this._elements[1][1],\n      f = this._elements[1][2],\n      g = this._elements[2][0],\n      h = this._elements[2][1],\n      i = this._elements[2][2],\n      p = 0;\n\n    p = a * e * i + b * f * g + c * d * h - c * e * g - b * d * i - a * f * h;\n\n    return p;\n  }\n\n  /**\n   * Inverts the matrix.\n   */\n  invert() {\n    let dt = this.determinant(),\n      a = this._elements[0][0],\n      b = this._elements[0][1],\n      c = this._elements[0][2],\n      d = this._elements[1][0],\n      e = this._elements[1][1],\n      f = this._elements[1][2],\n      g = this._elements[2][0],\n      h = this._elements[2][1],\n      k = this._elements[2][2];\n\n    this._elements = [\n      [e * k - f * h, c * h - b * k, b * f - c * e],\n      [f * g - d * k, a * k - c * g, c * d - a * f],\n      [d * h - e * g, g * b - a * h, a * e - b * d],\n    ];\n\n    this.multiply(1 / dt); // TODO - handle when dt === 0 ?\n    return this;\n  }\n\n  /**\n   * Transposes the elements of the matrix.\n   */\n  transpose() {\n    const m = Object.create(this._elements); // ?\n    this._elements = [\n      [m[0][0], m[1][0], m[2][0]],\n      [m[0][1], m[1][1], m[2][1]],\n      [m[0][2], m[1][2], m[2][2]],\n    ];\n    return this;\n  }\n\n  /**\n   * Resets the inner elements of the matrix to identity values.\n   */\n  identity() {\n    this._elements = [\n      [1, 0, 0],\n      [0, 1, 0],\n      [0, 0, 1],\n    ];\n    return this;\n  }\n\n  toString() {\n    return `${this._elements.map((r) => r.join('\\t')).join('\\n')}`;\n  }\n\n  isIdentity() {\n    const m = this._elements;\n    return (\n      m[0][0] === 1 &&\n      m[0][1] === 0 &&\n      m[0][2] === 0 &&\n      m[1][0] === 0 &&\n      m[1][1] === 1 &&\n      m[1][2] === 0 &&\n      m[2][0] === 0 &&\n      m[2][1] === 0 &&\n      m[2][2] === 1\n    );\n  }\n\n  /**\n   * Transforms the given point by this matrix and returns a new point\n   */\n  transformPoint(p) {\n    let vec = [p.x, p.y, 1],\n      i,\n      j,\n      e = this._elements,\n      m = [0, 0, 0];\n    for (i = 0; i < this._elements.length; i++) {\n      // row\n      for (j = 0; j < this._elements[i].length; j++) {\n        // column\n        m[i] += vec[j] * e[i][j];\n      }\n    }\n\n    return { x: m[0], y: m[1] };\n  }\n\n  /**\n   * Transforms the given points by this matrix and returns the new points\n   */\n  transformPoints(array) {\n    let vec,\n      i,\n      j,\n      k,\n      m,\n      e = this._elements,\n      ret = [];\n\n    for (k = 0; k < array.length; k++) {\n      vec = [array[k].x, array[k].y, 1];\n      m = [0, 0, 0];\n\n      for (i = 0; i < this._elements.length; i++) {\n        // row\n        for (j = 0; j < this._elements[i].length; j++) {\n          // column\n          m[i] += vec[j] * e[i][j];\n        }\n      }\n      ret.push({ x: m[0], y: m[1] });\n    }\n    return ret;\n  }\n\n  get elements() {\n    const m = this._elements;\n    return [\n      [m[0][0], m[0][1], m[0][2]],\n      [m[1][0], m[1][1], m[1][2]],\n      [m[2][0], m[2][1], m[2][2]],\n    ];\n  }\n}\n\nexport default Matrix;\n","const transformRegEx = /(translate|scale|rotate|matrix)\\(([0-9,.eE+-\\s]+)(?:,|\\s?)+\\)/g;\n\nfunction parseTransform(transform) {\n  let m,\n    commands = [];\n  /* eslint-disable no-cond-assign */\n  while ((m = transformRegEx.exec(transform)) !== null) {\n    const argsStr = m[2].trim();\n    const args = argsStr.indexOf(',') === -1 ? argsStr.split(' ') : argsStr.split(',');\n\n    commands.push({\n      cmd: m[1],\n      args: args.filter((a) => a.trim().length > 0).map((a) => Number(a)),\n    });\n  }\n  /* eslint-enable no-cond-assign */\n\n  return commands;\n}\n\nfunction resolveRotateCmd(matrix, transform) {\n  const radians = transform.args[0] * (Math.PI / 180);\n\n  if (transform.args.length > 2) {\n    const x = transform.args[1];\n    const y = transform.args[2];\n    matrix.translate(x, y);\n    matrix.rotate(radians);\n    matrix.translate(-x, -y);\n  } else if (transform.args.length === 1) {\n    matrix.rotate(radians);\n  }\n}\n\nfunction resolveScaleCmd(matrix, transform) {\n  const x = transform.args[0];\n  const y = isNaN(transform.args[1]) ? transform.args[0] : transform.args[1];\n  matrix.scale(x, y);\n}\n\nfunction resolveTranslateCmd(matrix, transform) {\n  const x = transform.args[0];\n  const y = isNaN(transform.args[1]) ? 0 : transform.args[1];\n  matrix.translate(x, y);\n}\n\nfunction resolveMatrixCmd(matrix, transform) {\n  if (transform.args.length >= 6) {\n    matrix.transform(...transform.args);\n  }\n}\n\nexport default function resolveTransform(t, matrix) {\n  const transforms = parseTransform(t);\n  let transform;\n\n  for (let i = 0, len = transforms.length; i < len; i++) {\n    transform = transforms[i];\n\n    if (transform.cmd === 'rotate') {\n      resolveRotateCmd(matrix, transform);\n    } else if (transform.cmd === 'scale') {\n      resolveScaleCmd(matrix, transform);\n    } else if (transform.cmd === 'matrix') {\n      resolveMatrixCmd(matrix, transform);\n    } else if (transform.cmd === 'translate') {\n      resolveTranslateCmd(matrix, transform);\n    }\n  }\n}\n","/* eslint-disable no-useless-escape */\n\nconst SELECTOR_MAPS = {\n  type: /^\\w[\\w-]+/,\n  attr: /^\\[\\w(?:[\\w\\._-]+)?(?:[!]?=['\\\"][\\w\\s*#_-]*['\\\"])?\\]/,\n  universal: /^(\\*)/,\n  tag: /^\\.(\\w+)/,\n};\n\nconst FILTERS = {\n  type: (c, objects) => {\n    // eslint-disable-line arrow-body-style\n    return objects.filter((o) => {\n      const type = o.type;\n\n      if (type) {\n        return type.toLowerCase() === c.toLowerCase();\n      }\n      return false;\n    });\n  },\n\n  attr: (attr, operator, value, objects) => {\n    // eslint-disable-line arrow-body-style\n    return objects.filter((o) => {\n      const v = o.attrs[attr];\n\n      if (!operator) {\n        // TODO handle undefined differently for != operator? As display object may very well have a default rendering color\n        return typeof v !== 'undefined';\n      }\n      if (typeof v === 'undefined') {\n        return false;\n      }\n\n      switch (operator) {\n        case '=':\n          return value === String(v);\n        case '!=':\n          return value !== String(v);\n        default:\n          return false;\n      }\n    });\n  },\n\n  universal: (objects) => objects,\n\n  tag: (selector, objects) => {\n    // eslint-disable-line arrow-body-style\n    return objects.filter((o) => {\n      const tag = o.tag;\n      if (tag) {\n        return tag.trim().split(/\\s+/).indexOf(selector.replace('.', '')) !== -1;\n      }\n      return false;\n    });\n  },\n};\n\n/**\n * Filters out objects of given type and value\n * @ignore\n * @example\n * filter(\n *   {type:'type', value:'Circle'},\n *   [new Circle(), new Rectangle()]\n * )\n * // [Circle]\n * @param {Object} token\n * @param {Array} objects\n * @returns {Object[]} Objects that fulfill the type and value\n */\nexport function filter(token, objects) {\n  if (!objects || !objects.length || !token || typeof FILTERS[token.type] !== 'function') {\n    return [];\n  }\n\n  switch (token.type) {\n    case 'type':\n      return FILTERS[token.type](token.value, objects);\n    case 'attr':\n      return FILTERS[token.type](token.attribute, token.operator, token.attributeValue, objects);\n    case 'universal':\n      return FILTERS[token.type](objects);\n    case 'tag':\n      return FILTERS[token.type](token.value, objects);\n    default:\n      return [];\n  }\n}\n\n/**\n * Tokenizes a string into supported selectors\n * @ignore\n *\n * @example\n * tokenize(\"Circle[color='red']\")\n *\n * @param {String} s\n */\nexport function tokenize(s) {\n  const groups = [];\n  let sub;\n  let info;\n  let match;\n  let validSelector;\n\n  s.split(/\\s*,\\s*/).forEach((group) => {\n    group = group.trim();\n    sub = [];\n    const selectorMapsIterator = (key) => {\n      match = group.match(SELECTOR_MAPS[key]);\n      if (match) {\n        validSelector = true;\n        group = group.slice(match[0].length);\n        info = {\n          type: key,\n          value: match[0],\n        };\n\n        if (key === 'attr') {\n          // extract parts of attribute from e.g. [color='red'] => (color, =, red)\n          match = match[0].match(/\\[(\\w[\\w\\._-]+)?(?:([!]?=)['\\\"]([\\w\\s#_-]*)['\\\"])?\\]/);\n          info.attribute = match[1];\n          info.operator = match[2];\n          info.attributeValue = match[3];\n        }\n        sub.push(info);\n      }\n    };\n    while (group) {\n      validSelector = false;\n\n      match = group.match(/^\\s*([>+~]|\\s)\\s*/);\n      if (match) {\n        validSelector = true;\n        sub.push({\n          type: ' ',\n          value: match[0],\n        });\n        group = group.slice(match[0].length);\n      }\n\n      Object.keys(SELECTOR_MAPS).forEach(selectorMapsIterator);\n\n      if (sub && sub.length && groups.indexOf(sub) < 0) {\n        groups.push(sub);\n      }\n\n      if (!validSelector) {\n        break;\n      }\n    }\n  });\n  return groups;\n}\n\nfunction find(s, object) {\n  const result = [];\n  const groupResults = [];\n  let groups;\n  let descendants;\n\n  if (object.isBranch) {\n    groups = tokenize(s);\n    descendants = object.descendants;\n\n    let tokens;\n\n    for (let gi = 0, glen = groups.length; gi < glen; gi++) {\n      tokens = groups[gi];\n\n      const levels = [];\n      let filtered = descendants.slice();\n      let hasRemainder = false;\n      tokens.reverse().forEach((token) => {\n        if (token.type === ' ') {\n          levels.push(filtered);\n          filtered = descendants.slice();\n          hasRemainder = false;\n          return;\n        }\n\n        filtered = filter(token, filtered);\n        hasRemainder = true;\n      });\n\n      if (hasRemainder) {\n        levels.push(filtered);\n      }\n\n      const selected = levels[0].filter((node) => {\n        let ancestor = node.parent;\n        let idx;\n\n        for (let i = 1; i < levels.length; i++) {\n          idx = levels[i].indexOf(ancestor);\n          while (ancestor && idx < 0) {\n            ancestor = ancestor.parent;\n            idx = levels[i].indexOf(ancestor);\n          }\n          if (idx < 0) {\n            return false;\n          }\n        }\n        return true;\n      });\n\n      groupResults.push(selected);\n    }\n\n    for (let i = 0, len = groupResults.length; i < len; i++) {\n      for (let ni = 0, nlen = groupResults[i].length; ni < nlen; ni++) {\n        if (result.indexOf(groupResults[i][ni]) < 0) {\n          result.push(groupResults[i][ni]);\n        }\n      }\n    }\n  }\n\n  return result || [];\n}\n\nexport default {\n  find,\n};\n","import { pointsToRect, pointsToCircle, pointsToLine } from '../geometry/util';\nimport pointsToPath from '../utils/points-to-path';\n\nfunction appendDpi(points, dpi) {\n  for (let i = 0, len = points.length; i < len; i++) {\n    points[i].x /= dpi;\n    points[i].y /= dpi;\n  }\n}\n\nfunction geometryToDef(geometry, dpi, mvm) {\n  const type = geometry.type;\n  let points = geometry.points();\n  if (mvm) {\n    if (points.every((item) => Array.isArray(item))) {\n      points = points.map((item) => mvm.transformPoints(item));\n    } else {\n      points = mvm.transformPoints(points);\n    }\n  }\n  appendDpi(points, dpi);\n  let def = null;\n\n  if (type === 'rect' || type === 'bounds') {\n    def = pointsToRect(points);\n    def.type = type;\n  } else if (type === 'circle') {\n    def = pointsToCircle(points, geometry.r);\n    def.type = type;\n  } else if (type === 'line') {\n    def = pointsToLine(points);\n    def.type = type;\n  } else if (type === 'polygon' || type === 'polyline') {\n    const path = pointsToPath(points, type === 'polygon');\n    def = {\n      type: 'path',\n      d: path,\n    };\n  } else if (type === 'geopolygon') {\n    let path = '';\n    for (let i = 0; i < points.length; i++) {\n      path += pointsToPath(points[i], true);\n    }\n    def = {\n      type: 'path',\n      d: path,\n    };\n  }\n\n  return def;\n}\n\n/**\n * @ignore\n * @returns {object} Returns a node definition of the collider\n */\nfunction colliderToShape(node, dpi) {\n  if (node.collider) {\n    const mvm = node.modelViewMatrix;\n    const isCollection = node.colliderType === 'collection';\n\n    if (isCollection) {\n      const children = node.collider.geometries.map((geometry) => geometryToDef(geometry, dpi, mvm));\n\n      return {\n        type: 'container',\n        children,\n      };\n    }\n\n    return geometryToDef(node.collider, dpi, mvm);\n  }\n\n  return null;\n}\n\n/**\n * Read-only object representing a node on the scene.\n */\nclass SceneNode {\n  constructor(node) {\n    this._bounds = (includeTransform = true) => {\n      const { x, y, width, height } = node.boundingRect\n        ? node.boundingRect(includeTransform)\n        : {\n            x: 0,\n            y: 0,\n            width: 0,\n            height: 0,\n          };\n      return {\n        x,\n        y,\n        width,\n        height,\n      };\n    };\n    this._attrs = node.attrs;\n    this._type = node.type;\n    this._data = node.data;\n    this._dpi = node.stage ? node.stage.dpi : 1;\n    this._collider = () => colliderToShape(node, this._dpi);\n    this._desc = node.desc;\n    this._tag = node.tag;\n    this._children = () => node.children.map((n) => new SceneNode(n));\n    this._parent = () => (node.parent ? new SceneNode(node.parent) : null);\n\n    this._cache = {\n      elementBoundingRect: null,\n    };\n    this._getElementBoundingRect = () => {\n      if (!this._cache.elementBoundingRect && this.element) {\n        this._cache.elementBoundingRect = this.element.getBoundingClientRect();\n      }\n      return this._cache.elementBoundingRect || { left: 0, top: 0 };\n    };\n  }\n\n  /**\n   * Get child nodes\n   * @type {SceneNode[]}\n   */\n  get children() {\n    return this._children();\n  }\n\n  /**\n   * Get parent node\n   * @type {SceneNode}\n   */\n  get parent() {\n    return this._parent();\n  }\n\n  /**\n   * Node type\n   * @type {string}\n   */\n  get type() {\n    return this._type;\n  }\n\n  /**\n   * Get the associated data\n   * @type {any}\n   */\n  get data() {\n    return this._data;\n  }\n\n  /**\n   * Node attributes\n   * @type {object}\n   */\n  get attrs() {\n    return this._attrs;\n  }\n\n  /**\n   * Element the scene is attached to\n   * @type {HTMLElement}\n   * @private\n   */\n  set element(e) {\n    this._cache.elementBoundingRect = null;\n    this._element = e;\n  }\n\n  /**\n   * Element the scene is attached to\n   * @type {HTMLElement}\n   */\n  get element() {\n    return this._element;\n  }\n\n  /**\n   * Key of the component this shape belongs to\n   * @type {string}\n   * @private\n   */\n  set key(k) {\n    this._key = k;\n  }\n\n  /**\n   * Key of the component this shape belongs to\n   * @type {string}\n   */\n  get key() {\n    return this._key;\n  }\n\n  /**\n   * Bounding rectangle of the node. After any transform has been applied, if any, but excluding scaling transform related to devicePixelRatio.\n   * Origin is in the top-left corner of the scene element.\n   * @type {Rect}\n   */\n  get bounds() {\n    const bounds = this._bounds();\n    bounds.x /= this._dpi;\n    bounds.y /= this._dpi;\n    bounds.width /= this._dpi;\n    bounds.height /= this._dpi;\n    return bounds;\n  }\n\n  /**\n   * Bounding rectangle of the node within its local coordinate system.\n   * Origin is in the top-left corner of the scene element.\n   * @type {Rect}\n   */\n  get localBounds() {\n    const bounds = this._bounds(false);\n    return bounds;\n  }\n\n  /**\n   * Bounding rectangle of the node, relative a target.\n   *\n   * If target is an HTMLElement, the bounds are relative to the HTMLElement.\n   * Any other target type will return the bounds relative to the viewport of the browser.\n   *\n   * @param {HTMLElement|any} target\n   * @param {boolean} includeTransform - Whether to include any applied transforms on the node\n   * @returns {Rect}\n   * @example\n   *\n   * node.boundsRelativeTo($('div'));\n   * node.boundsRelativeTo('viewport');\n   */\n  boundsRelativeTo(target, includeTransform = true) {\n    const type = typeof target;\n    const bounds = includeTransform ? this.bounds : this.localBounds;\n    const selfRect = this._getElementBoundingRect();\n    let dx = selfRect.left;\n    let dy = selfRect.top;\n\n    if (type === 'object' && target !== null && typeof target.getBoundingClientRect === 'function') {\n      const { left = 0, top = 0 } = target.getBoundingClientRect();\n      dx -= left;\n      dy -= top;\n    }\n\n    bounds.x += dx;\n    bounds.y += dy;\n\n    return bounds;\n  }\n\n  /**\n   * Collider of the node. Transform on the node has been applied to the collider shape, if any, but excluding scaling transform related to devicePixelRatio.\n   * Origin is in the top-left corner of the scene element.\n   *\n   * If node has no collider, null is returned.\n   * @type {Line|Rect|Circle|Path}\n   */\n  get collider() {\n    return this._collider();\n  }\n\n  /**\n   * Node description\n   * @type {object}\n   */\n  get desc() {\n    return this._desc;\n  }\n\n  /**\n   * Node tag\n   * @type {string}\n   */\n  get tag() {\n    return this._tag;\n  }\n}\n\nfunction create(...a) {\n  return new SceneNode(...a);\n}\n\nexport { create as default, SceneNode };\n","import createSceneNode from './scene-node';\n\nexport class Collision {\n  constructor(node) {\n    this._node = createSceneNode(node);\n    this._parent = null;\n    this._input = null;\n  }\n\n  get node() {\n    return this._node;\n  }\n\n  set parent(p) {\n    this._parent = p;\n  }\n\n  get parent() {\n    return this._parent;\n  }\n\n  set input(i) {\n    this._input = i;\n  }\n\n  get input() {\n    return this._input;\n  }\n}\n\nexport default function create(...a) {\n  return new Collision(...a);\n}\n","import createCollision from './collision';\nimport { scalarMultiply } from '../math/vector';\nimport { create as createPolygon } from '../geometry/polygon';\nimport { create as createGeoPolygon } from '../geometry/geopolygon';\nimport { lineToPoints, rectToPoints, getShapeType } from '../geometry/util';\n\nfunction appendParentNode(node, collision) {\n  const p = node.parent;\n\n  if (p && p.type !== 'stage') {\n    collision.parent = createCollision(p);\n\n    const pp = p.parent;\n    if (pp && pp.type !== 'stage') {\n      appendParentNode(pp, collision.parent);\n    }\n  }\n}\n\nfunction appendInputShape(shape, collisions) {\n  for (let i = 0, len = collisions.length; i < len; i++) {\n    collisions[i].input = shape;\n  }\n}\n\nfunction resolveFrontChildCollision(node, type, input) {\n  const num = node.descendants.length;\n\n  for (let i = num - 1; i >= 0; i--) {\n    const desc = node.descendants[i];\n    if (desc.collider === null) {\n      continue;\n    }\n\n    if (desc.collider[type](input)) {\n      const collision = createCollision(desc);\n\n      appendParentNode(desc, collision);\n\n      return collision;\n    }\n  }\n  return null;\n}\n\nfunction resolveGeometryCollision(node, type, input) {\n  if (node.collider[type](input)) {\n    const c = createCollision(node);\n\n    appendParentNode(node, c);\n\n    return c;\n  }\n\n  return null;\n}\n\nfunction inverseTransform(node, input) {\n  let transformedInput = {};\n  if (node.modelViewMatrix) {\n    if (Array.isArray(input)) {\n      // Rect or Line\n      transformedInput = node.inverseModelViewMatrix.transformPoints(input);\n    } else if (!isNaN(input.r)) {\n      // Circle\n      const p = { x: input.cx, y: input.cy };\n      ({ x: transformedInput.cx, y: transformedInput.cy } = node.inverseModelViewMatrix.transformPoint(p));\n      transformedInput.r = input.r;\n    } else if (Array.isArray(input.vertices)) {\n      // Polygon\n      transformedInput.vertices = node.inverseModelViewMatrix.transformPoints(input.vertices);\n    } else {\n      // Point\n      transformedInput = node.inverseModelViewMatrix.transformPoint(input);\n    }\n  } else {\n    transformedInput = input;\n  }\n\n  if (Array.isArray(transformedInput.vertices)) {\n    if (transformedInput.vertices.every((item) => Array.isArray(item))) {\n      transformedInput = createGeoPolygon(transformedInput);\n    } else {\n      transformedInput = createPolygon(transformedInput); // TODO Shouldn't have to do this here, currently its beacause a collision algorithm optimization, i.e. caching of polygon bounds\n    }\n  }\n\n  return transformedInput;\n}\n\nfunction resolveCollision(node, intersectionType, input) {\n  if (node.colliderType === null) {\n    return null;\n  }\n\n  const transformedInput = inverseTransform(node, input);\n\n  if (node.colliderType === 'frontChild') {\n    return resolveFrontChildCollision(node, intersectionType, transformedInput);\n  }\n\n  return resolveGeometryCollision(node, intersectionType, transformedInput);\n}\n\nfunction findAllCollisions(nodes, intersectionType, ary, input) {\n  const num = nodes.length;\n  for (let i = 0; i < num; i++) {\n    const node = nodes[i];\n\n    const collision = resolveCollision(node, intersectionType, input);\n\n    if (collision) {\n      ary.push(collision);\n    }\n\n    // Only traverse children if no match is found on parent and it doesnt have any custom collider\n    if (node.children && !collision && !node.collider) {\n      findAllCollisions(node.children, intersectionType, ary, input);\n    }\n  }\n}\n\nfunction hasCollision(nodes, intersectionType, input) {\n  const num = nodes.length;\n  for (let i = 0; i < num; i++) {\n    const node = nodes[i];\n\n    const collision = resolveCollision(node, intersectionType, input);\n\n    if (collision !== null) {\n      return true;\n    }\n\n    if (node.children && !node.collider) {\n      return hasCollision(node.children, intersectionType, input);\n    }\n  }\n  return false;\n}\n\nfunction resolveShape(shape, ratio = 1) {\n  const type = getShapeType(shape);\n  let _shape = {};\n\n  switch (type) {\n    case 'circle':\n      _shape.cx = shape.cx * ratio;\n      _shape.cy = shape.cy * ratio;\n      _shape.r = shape.r;\n      return ['intersectsCircle', _shape];\n    case 'rect':\n      _shape = rectToPoints(shape).map((p) => scalarMultiply(p, ratio));\n      return ['intersectsRect', _shape];\n    case 'line':\n      _shape = lineToPoints(shape).map((p) => scalarMultiply(p, ratio));\n      return ['intersectsLine', _shape];\n    case 'point':\n      _shape = scalarMultiply(shape, ratio);\n      return ['containsPoint', _shape];\n    case 'polygon':\n      _shape.vertices = shape.vertices.map((vertex) => scalarMultiply(vertex, ratio));\n      return ['intersectsPolygon', _shape];\n    case 'geopolygon':\n      _shape.vertices = shape.vertices.map((vertices) => vertices.map((vertex) => scalarMultiply(vertex, ratio)));\n      return ['intersectsGeoPolygon', _shape];\n    default:\n      return [];\n  }\n}\n\nexport function resolveCollionsOnNode(node, shape) {\n  const [intersectionType, _shape] = resolveShape(shape, node.dpi);\n  const collisions = [];\n\n  if (intersectionType) {\n    findAllCollisions([node], intersectionType, collisions, _shape);\n    appendInputShape(shape, collisions);\n  }\n  return collisions;\n}\n\nexport function hasCollisionOnNode(node, shape) {\n  const [intersectionType, _shape] = resolveShape(shape, node.dpi);\n\n  return hasCollision([node], intersectionType, _shape);\n}\n","import extend from 'extend';\nimport Node from '../node';\nimport { create as geometry } from '../../geometry';\nimport { create as geometryCollection } from '../../geometry/geometry-collection';\nimport Matrix from '../../math/matrix';\nimport resolveTransform from '../transform-resolver';\nimport nodeSelector from '../node-selector';\nimport createSceneNode from '../scene-node';\nimport { resolveCollionsOnNode, hasCollisionOnNode } from '../collision-resolver';\nimport { assignMappedAttribute } from '../attributes';\n\n/**\n * @private\n * @typedef {object} DisplayObject\n * @property {string} type\n * @property {string|GradientNode|PatternNode} [fill] - {@link https://www.w3.org/TR/fill-stroke-3/#fill-shorthand}\n * @property {string|GradientNode|PatternNode} [stroke] - {@link https://www.w3.org/TR/fill-stroke-3/#propdef-stroke}\n * @property {number} [strokeWidth] - {@link https://www.w3.org/TR/fill-stroke-3/#propdef-stroke-width}\n * @property {string|number[]} [strokeDasharray] - {@link https://www.w3.org/TR/fill-stroke-3/#propdef-stroke-dasharray}\n * @property {number} [opacity] - {@link https://www.w3.org/TR/css-color-4/#propdef-opacity}\n * @property {string} [transform] - {@link https://www.w3.org/TR/SVG/coords.html#TransformAttribute}\n * @property {object} [data] - Data object, may contain any properties\n * @property {object} [desc] - Meta-data object, may contain any properties\n * @property {string} [tag] - White-space seperated list of tags\n * @property {string} [id] - Unique identifier of the node\n * @property {object} [collider]\n */\n\nclass DisplayObject extends Node {\n  constructor(type) {\n    super(type);\n    this._stage = null;\n    this._collider = {\n      type: null,\n      definition: null,\n      fn: null,\n    };\n    this._attrs = {};\n    this._node = null;\n  }\n\n  set(v = {}) {\n    this.node = v;\n\n    const { data, desc, tag, strokeReference, fillReference } = v;\n\n    assignMappedAttribute(this.attrs, v);\n\n    if (typeof data !== 'undefined') {\n      this.data = data;\n    }\n\n    if (typeof desc === 'object') {\n      this.desc = extend(true, {}, desc);\n    }\n\n    if (typeof tag === 'string') {\n      this.tag = tag;\n    }\n\n    if (typeof strokeReference === 'string') {\n      this.strokeReference = strokeReference;\n    }\n\n    if (typeof fillReference === 'string') {\n      this.fillReference = fillReference;\n    }\n  }\n\n  findShapes(selector) {\n    return nodeSelector.find(selector, this).map((node) => createSceneNode(node));\n  }\n\n  getItemsFrom(shape) {\n    return resolveCollionsOnNode(this, shape);\n  }\n\n  containsPoint(p) {\n    return hasCollisionOnNode(this, p);\n  }\n\n  intersectsLine(line) {\n    return hasCollisionOnNode(this, line);\n  }\n\n  intersectsRect(rect) {\n    return hasCollisionOnNode(this, rect);\n  }\n\n  intersectsCircle(circle) {\n    return hasCollisionOnNode(this, circle);\n  }\n\n  intersectsPolygon(polygon) {\n    return hasCollisionOnNode(this, polygon);\n  }\n\n  intersectsGeoPolygon(geopolygon) {\n    return hasCollisionOnNode(this, geopolygon);\n  }\n\n  resolveLocalTransform(m = new Matrix()) {\n    if (typeof this.attrs.transform !== 'undefined') {\n      resolveTransform(this.attrs.transform, m);\n    }\n    this.modelViewMatrix = m.clone();\n  }\n\n  resolveGlobalTransform(m = new Matrix()) {\n    const a = this.ancestors;\n\n    if (a.length > 0) {\n      for (let i = a.length - 1; i >= 0; i--) {\n        a[i].resolveLocalTransform(m);\n        m = a[i].modelViewMatrix;\n      }\n    }\n\n    this.resolveLocalTransform(m);\n  }\n\n  /**\n   * Returns the value of attribute a.\n   * @private\n   * @param a\n   * @returns {*} The value of attribute a.\n   */\n  attr(a) {\n    return this.attrs[a];\n  }\n\n  equals(d) {\n    const attrs = this.attrs;\n    const attrKeys = Object.keys(attrs);\n    const dAttrs = d.attrs;\n    const dAttrKeys = Object.keys(dAttrs);\n    if (attrKeys.length !== dAttrKeys.length) {\n      return false;\n    }\n    for (let i = 0; i < attrKeys.length; i++) {\n      const key = attrKeys[i];\n      if (!Object.hasOwnProperty.call(dAttrs, key)) {\n        return false;\n      }\n      if (attrs[key] !== dAttrs[key]) {\n        return false;\n      }\n    }\n\n    return super.equals(d);\n  }\n\n  toJSON() {\n    const json = super.toJSON();\n    json.attrs = this.attrs;\n    return json;\n  }\n\n  get attrs() {\n    return this._attrs;\n  }\n\n  get stage() {\n    if (this._parent && !this._stage) {\n      // lazy evaluation\n      this._stage = this._parent.stage;\n    } else if (!this._parent && this._stage !== this) {\n      this._stage = null;\n    }\n    return this._stage;\n  }\n\n  set modelViewMatrix(m) {\n    this._mvm = m;\n    this._imvm = null;\n  }\n\n  get modelViewMatrix() {\n    return this._mvm;\n  }\n\n  get inverseModelViewMatrix() {\n    this._imvm = this._imvm ? this._imvm : this._mvm.clone().invert();\n    return this._imvm;\n  }\n\n  set node(n) {\n    this._node = n;\n  }\n\n  get node() {\n    return this._node;\n  }\n\n  set collider(definition) {\n    const type = Array.isArray(definition) ? 'collection' : definition && definition.type;\n    if (typeof type !== 'string') {\n      // Non string type definition resets the collider\n      this._collider.type = null;\n      this._collider.definition = null;\n      this._collider.fn = null;\n      return;\n    }\n\n    // Check if a collider of the same type is already defined, if so, do an update\n    if (this._collider !== null && this._collider.type === type && this._collider.fn !== null) {\n      this._collider.fn.set(definition);\n      this._collider.definition = definition;\n      return;\n    }\n\n    // Store the definition so that it can be lazy evaluated\n    this._collider.type = type;\n    this._collider.definition = definition;\n  }\n\n  get collider() {\n    // Resolve geometry function from cache\n    if (this._collider.fn !== null) {\n      return this._collider.fn;\n    }\n\n    // Resolve geometry function and store it in cache\n    switch (this._collider.type) {\n      case 'collection':\n        this._collider.fn = geometryCollection(this._collider.definition);\n        break;\n      case 'frontChild': // TODO Deprecate\n        // Front child is not resolved by a function on this node, but instead on one of its child nodes\n        return true;\n      case 'bounds':\n        this._collider.fn = geometry('rect', this.boundingRect());\n        break;\n      case 'line':\n      case 'rect':\n      case 'circle':\n      case 'polygon':\n      case 'geopolygon':\n      case 'polyline':\n        this._collider.fn = geometry(this._collider.type, this._collider.definition);\n        break;\n      default:\n        return null;\n    }\n\n    return this._collider.fn;\n  }\n\n  get colliderType() {\n    return this._collider.type;\n  }\n}\n\nexport default DisplayObject;\n","import Node from './node';\n\nclass NodeContainer extends Node {\n  addChild(c) {\n    if (!c || !(c instanceof Node)) {\n      throw new TypeError(`Expecting a Node as argument, but got ${c}`);\n    }\n\n    if (c === this) {\n      throw new Error('Can not add itself as child!');\n    }\n\n    if (c._children && c._children.length && this.ancestors.indexOf(c) >= 0) {\n      throw new Error('Can not add an ancestor as child!');\n    }\n\n    if (c._parent && c._parent !== this) {\n      c._parent.removeChild(c);\n    }\n\n    this._children.push(c);\n    c._parent = this;\n    c._ancestors = null;\n\n    return this;\n  }\n\n  addChildren(children) {\n    let i,\n      num = children ? children.length : 0;\n    for (i = 0; i < num; i++) {\n      this.addChild(children[i]);\n    }\n    return this;\n  }\n\n  /**\n   * Removes given child node from this node.\n   * @private\n   * @param {Node} c\n   * @returns {Node} This object, for chaining purposes.\n   */\n  removeChild(c) {\n    const indx = this._children.indexOf(c);\n    if (indx >= 0) {\n      this._children.splice(indx, 1);\n      c._parent = null;\n      c._ancestors = null;\n    }\n    return this;\n  }\n\n  removeChildren(children) {\n    let i, num;\n    if (!this._children) {\n      return this;\n    }\n    if (children) {\n      num = children.length;\n      for (i = 0; i < num; i++) {\n        this.removeChild(children[i]);\n      }\n    } else {\n      while (this._children.length) {\n        this.removeChild(this._children[0]);\n      }\n    }\n    return this;\n  }\n}\n\nexport default NodeContainer;\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport NodeContainer from '../node-container';\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} ContainerNode\n * @property {DisplayObject[]} children - Array of child nodes\n */\n\nconst NC = NodeContainer.prototype;\n\nexport default class Container extends DisplayObject {\n  constructor(s = {}) {\n    const { type = 'container' } = s;\n    super(type);\n    this.set(s);\n  }\n\n  set(v = {}) {\n    super.set(v);\n\n    const { collider } = v;\n    const opts = extend(\n      {\n        type: null,\n      },\n      collider\n    );\n\n    this.collider = opts;\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n  }\n\n  appendChildRect(child, includeTransform) {\n    if (typeof child.bounds !== 'undefined') {\n      const rect = this.__boundingRect[includeTransform] || {};\n      const [p0, , p2] = child.bounds(includeTransform);\n      const { x: xMin, y: yMin } = p0;\n      const { x: xMax, y: yMax } = p2;\n\n      const _xMax = isNaN(rect.width) ? xMax : Math.max(xMax, rect.width + rect.x);\n      const _yMax = isNaN(rect.height) ? yMax : Math.max(yMax, rect.height + rect.y);\n\n      rect.x = isNaN(rect.x) ? xMin : Math.min(xMin, rect.x);\n      rect.y = isNaN(rect.y) ? yMin : Math.min(yMin, rect.y);\n      rect.width = _xMax - rect.x;\n      rect.height = _yMax - rect.y;\n\n      this.__boundingRect[includeTransform] = rect;\n    }\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n\n    const num = this.children.length;\n\n    for (let i = 0; i < num; i++) {\n      this.appendChildRect(this.children[i], includeTransform);\n    }\n\n    this.__boundingRect[includeTransform] = extend(\n      {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n      },\n      this.__boundingRect[includeTransform]\n    );\n\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    const rect = this.boundingRect(includeTransform);\n\n    this.__bounds[includeTransform] = [\n      { x: rect.x, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y + rect.height },\n      { x: rect.x, y: rect.y + rect.height },\n    ];\n    return this.__bounds[includeTransform];\n  }\n\n  addChild(c) {\n    const r = NC.addChild.call(this, c);\n\n    if (this._collider && this._collider.type === 'bounds') {\n      this.appendChildRect(c, true);\n      const opts = extend(\n        {\n          type: 'bounds',\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0,\n        },\n        this.__boundingRect.true\n      );\n      this.collider = opts;\n    }\n\n    return r;\n  }\n\n  addChildren(children) {\n    const r = NC.addChildren.call(this, children);\n    const num = children.length;\n\n    if (this._collider && this._collider.type === 'bounds' && num > 0) {\n      for (let i = 0; i < num; i++) {\n        this.appendChildRect(children[i], true);\n      }\n      const opts = extend(\n        {\n          type: 'bounds',\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0,\n        },\n        this.__boundingRect.true\n      );\n      this.collider = opts;\n    }\n\n    return r;\n  }\n\n  removeChild(c) {\n    c._stage = null;\n    let desc = c.descendants,\n      num = desc ? desc.length : 0,\n      i;\n    // remove reference to stage from all descendants\n    for (i = 0; i < num; i++) {\n      desc[i]._stage = null;\n    }\n\n    NC.removeChild.call(this, c);\n\n    if (this._collider && this._collider.type === 'bounds') {\n      this.__boundingRect = { true: null, false: null };\n      this.__bounds = { true: null, false: null };\n      const opts = extend(this.boundingRect(true), { type: 'bounds' });\n      this.collider = opts;\n    }\n\n    return this;\n  }\n\n  removeChildren(children) {\n    NC.removeChildren.call(this, children);\n\n    if (this._collider && this._collider.type === 'bounds') {\n      this.__boundingRect = { true: null, false: null };\n      this.__bounds = { true: null, false: null };\n      const opts = extend(this.boundingRect(true), { type: 'bounds' });\n      this.collider = opts;\n    }\n\n    return this;\n  }\n}\n\nexport function create(...s) {\n  return new Container(...s);\n}\n","import Container from './container';\n\nexport default class Stage extends Container {\n  constructor(dpi) {\n    super('stage');\n    this._stage = this;\n    this._dpiRatio = dpi || 1;\n  }\n\n  get dpi() {\n    return this._dpiRatio;\n  }\n}\n\nexport function create(...a) {\n  return new Stage(...a);\n}\n","import DisplayObject from './display-object';\nimport NodeContainer from '../node-container';\n\n/**\n * @private\n * @typedef {object} GradientNode\n * @property {string} type\n * @property {object[]} stops\n * @property {string} [stops[].type=linearGradient] - radialGradient|linearGradient\n * @property {string} stops[].color - {@link https://www.w3.org/TR/SVG/types.html#DataTypeColor}\n * @property {string} [stops[].opacity=1] - {@link https://www.w3.org/TR/css-color-4/#propdef-opacity}\n * @property {number} stops[].offset - {@link https://www.w3.org/TR/SVG/pservers.html#StopElementOffsetAttribute}\n * @property {number} [degree] - Gradient rotation angle\n */\n\n/**\n * @private\n * @typedef {object} GradientItemNode\n * @property {string} id - Gradient identifier\n * @property {number} x1 - {@link https://www.w3.org/TR/SVG/pservers.html#LinearGradientElementX1Attribute}\n * @property {number} y1 - {@link https://www.w3.org/TR/SVG/pservers.html#LinearGradientElementY1Attribute}\n * @property {number} x2 - {@link https://www.w3.org/TR/SVG/pservers.html#LinearGradientElementX2Attribute}\n * @property {number} y2 - {@link https://www.w3.org/TR/SVG/pservers.html#LinearGradientElementY2Attribute}\n * @property {number} offset - {@link https://www.w3.org/TR/SVG/pservers.html#StopElementOffsetAttribute}\n * @property {object} style - {@link https://www.w3.org/TR/SVG/styling.html#StyleAttribute}\n */\n\nconst NC = NodeContainer.prototype;\n\nconst allowedAttrs = ['x1', 'x2', 'y1', 'y2', 'id', 'offset', 'style'];\n\nexport default class GradientItem extends DisplayObject {\n  constructor(s = {}) {\n    const { type = 'container' } = s;\n    super(type);\n    this.set(s);\n    this._boundingRect = {};\n  }\n\n  set(v = {}) {\n    super.set(v);\n\n    const attrs = this.attrs;\n\n    let attrKey = '';\n\n    for (let i = 0, len = allowedAttrs.length; i !== len; i++) {\n      attrKey = allowedAttrs[i];\n\n      if (typeof v[attrKey] !== 'undefined') {\n        attrs[attrKey] = v[attrKey];\n      }\n    }\n  }\n\n  addChild(c) {\n    const r = NC.addChild.call(this, c);\n\n    return r;\n  }\n\n  addChildren(children) {\n    const r = NC.addChildren.call(this, children);\n\n    return r;\n  }\n\n  removeChild(c) {\n    c._stage = null;\n    let desc = c.descendants,\n      num = desc ? desc.length : 0,\n      i;\n    // remove reference to stage from all descendants\n    for (i = 0; i < num; i++) {\n      desc[i]._stage = null;\n    }\n\n    NC.removeChild.call(this, c);\n\n    return this;\n  }\n\n  removeChildren(children) {\n    NC.removeChildren.call(this, children);\n\n    return this;\n  }\n}\n\nexport function create(...s) {\n  return new GradientItem(...s);\n}\n","import DisplayObject from './display-object';\nimport NodeContainer from '../node-container';\n\n/**\n * @private\n * @experimental\n * @typedef {object} PatternNode\n * @property {string} [type='pattern']\n * @property {string} fill\n * @property {number} width\n * @property {number} height\n * @property {object[]} shapes\n * @example\n * // Stripe pattern\n * {\n *   type: 'pattern',\n *   fill: 'red',\n *   width: 4,\n *   height: 4,\n *   shapes: [\n *     { type: 'rect', x: 3, y: 0, width: 1, height: 1 },\n *     { type: 'rect', x: 2, y: 1, width: 1, height: 1 },\n *     { type: 'rect', x: 1, y: 2, width: 1, height: 1 },\n *     { type: 'rect', x: 0, y: 3, width: 1, height: 1 },\n *   ]\n * }\n */\n\nconst NC = NodeContainer.prototype;\n\nconst allowedAttrs = ['patternUnits', 'x', 'y', 'width', 'height', 'id'];\n\nexport default class PatternItem extends DisplayObject {\n  constructor(s = {}) {\n    const { type = 'container' } = s;\n    super(type);\n    this.set(s);\n    this._boundingRect = {};\n  }\n\n  set(v = {}) {\n    super.set(v);\n\n    const attrs = this.attrs;\n\n    let attrKey = '';\n\n    for (let i = 0, len = allowedAttrs.length; i !== len; i++) {\n      attrKey = allowedAttrs[i];\n\n      if (typeof v[attrKey] !== 'undefined') {\n        attrs[attrKey] = v[attrKey];\n      }\n    }\n  }\n\n  addChild(c) {\n    const r = NC.addChild.call(this, c);\n\n    return r;\n  }\n\n  addChildren(children) {\n    const r = NC.addChildren.call(this, children);\n\n    return r;\n  }\n\n  removeChild(c) {\n    c._stage = null;\n    let desc = c.descendants,\n      num = desc ? desc.length : 0,\n      i;\n    // remove reference to stage from all descendants\n    for (i = 0; i < num; i++) {\n      desc[i]._stage = null;\n    }\n\n    NC.removeChild.call(this, c);\n\n    return this;\n  }\n\n  removeChildren(children) {\n    NC.removeChildren.call(this, children);\n\n    return this;\n  }\n}\n\nexport function create(...s) {\n  return new PatternItem(...s);\n}\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport { rectToPoints, getMinMax } from '../../geometry/util';\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} RectNode\n * @property {number} x - X coordinate\n * @property {number} y - Y coordinate\n * @property {number} width - Width\n * @property {number} height- Height\n */\n\nexport default class Rect extends DisplayObject {\n  constructor(...s) {\n    super('rect');\n    this.set(...s);\n  }\n\n  set(v = {}) {\n    const { x = 0, y = 0, width = 0, height = 0, rx = 0, ry = 0, collider } = v;\n    const opts = extend(\n      {\n        type: 'rect',\n        x,\n        y,\n        width,\n        height,\n      },\n      collider\n    );\n\n    super.set(v);\n\n    if (width >= 0) {\n      this.attrs.x = x;\n      this.attrs.width = width;\n    } else {\n      this.attrs.x = x + width;\n      this.attrs.width = -width;\n    }\n\n    if (height >= 0) {\n      this.attrs.y = y;\n      this.attrs.height = height;\n    } else {\n      this.attrs.y = y + height;\n      this.attrs.height = -height;\n    }\n\n    if (rx > 0) {\n      this.attrs.rx = rx;\n    }\n    if (ry > 0) {\n      this.attrs.ry = ry;\n    }\n\n    this.collider = opts;\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n    const p = rectToPoints(this.attrs);\n    const pt = includeTransform && this.modelViewMatrix ? this.modelViewMatrix.transformPoints(p) : p;\n    const [xMin, yMin, xMax, yMax] = getMinMax(pt);\n\n    this.__boundingRect[includeTransform] = {\n      x: xMin,\n      y: yMin,\n      width: xMax - xMin,\n      height: yMax - yMin,\n    };\n\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    const rect = this.boundingRect(includeTransform);\n\n    this.__bounds[includeTransform] = [\n      { x: rect.x, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y + rect.height },\n      { x: rect.x, y: rect.y + rect.height },\n    ];\n\n    return this.__bounds[includeTransform];\n  }\n}\n\nexport function create(...s) {\n  return new Rect(...s);\n}\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport { getMinMax } from '../../geometry/util';\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} CircleNode\n * @property {number} cx - {@link https://www.w3.org/TR/SVG/shapes.html#CircleElementCXAttribute}\n * @property {number} cy - {@link https://www.w3.org/TR/SVG/shapes.html#CircleElementCYAttribute}\n * @property {number} r - {@link https://www.w3.org/TR/SVG/shapes.html#CircleElementRAttribute}\n */\n\nexport default class Circle extends DisplayObject {\n  constructor(...s) {\n    super('circle');\n    this.set(...s);\n  }\n\n  set(v = {}) {\n    const { cx = 0, cy = 0, r = 0, collider } = v;\n    const opts = extend(\n      {\n        type: 'circle',\n        cx,\n        cy,\n        r,\n      },\n      collider\n    );\n\n    super.set(v);\n\n    this.attrs.cx = cx;\n    this.attrs.cy = cy;\n    this.attrs.r = r;\n\n    this.collider = opts;\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n    // TODO Handle Circle bounds correctly for a circle transformed to an non axis aligned ellipse/circle\n    // Current solution only rotate the bounds, giving a larger boundingRect if rotated\n    const p = this.bounds(includeTransform);\n\n    this.__boundingRect[includeTransform] = {\n      x: p[0].x,\n      y: p[0].y,\n      width: p[2].x - p[0].x,\n      height: p[2].y - p[0].y,\n    };\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    // TODO Handle Circle bounds correctly for a circle transformed to an non axis aligned ellipse/circle\n    const { cx, cy, r: rX, r: rY } = this.attrs;\n    const x = cx - rX;\n    const y = cy - rY;\n    let w = rX * 2;\n    let h = rY * 2;\n    let p = [\n      { x, y },\n      { x: x + w, y },\n      { x: x + w, y: y + h },\n      { x, y: y + h },\n    ];\n\n    if (includeTransform && this.modelViewMatrix) {\n      p = this.modelViewMatrix.transformPoints(p);\n      const [xMin, yMin, xMax, yMax] = getMinMax(p);\n      w = xMax - xMin;\n      h = yMax - yMin;\n\n      this.__bounds[includeTransform] = [\n        { x: xMin, y: yMin },\n        { x: xMin + w, y: yMin },\n        { x: xMin + w, y: yMin + h },\n        { x: xMin, y: yMin + h },\n      ];\n    } else {\n      this.__bounds[includeTransform] = p;\n    }\n\n    return this.__bounds[includeTransform];\n  }\n}\n\nexport function create(...s) {\n  return new Circle(...s);\n}\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport { lineToPoints, getMinMax } from '../../geometry/util';\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} LineNode\n * @property {number} x1 - {@link https://www.w3.org/TR/SVG/shapes.html#LineElementX1Attribute}\n * @property {number} y1 - {@link https://www.w3.org/TR/SVG/shapes.html#LineElementY1Attribute}\n * @property {number} x2 - {@link https://www.w3.org/TR/SVG/shapes.html#LineElementX2Attribute}\n * @property {number} y2 - {@link https://www.w3.org/TR/SVG/shapes.html#LineElementY2Attribute}\n */\n\nexport default class Line extends DisplayObject {\n  constructor(...s) {\n    super('line');\n    this.set(...s);\n  }\n\n  set(v = {}) {\n    const { x1 = 0, y1 = 0, x2 = 0, y2 = 0, collider } = v;\n    super.set(v);\n    this.attrs.x1 = x1;\n    this.attrs.y1 = y1;\n    this.attrs.x2 = x2;\n    this.attrs.y2 = y2;\n\n    const defaultCollider = {\n      type: 'line',\n      x1,\n      y1,\n      x2,\n      y2,\n    };\n    this.collider = extend(defaultCollider, collider);\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n    let p = lineToPoints(this.attrs);\n\n    if (includeTransform && this.modelViewMatrix) {\n      p = this.modelViewMatrix.transformPoints(p);\n    }\n\n    const [xMin, yMin, xMax, yMax] = getMinMax(p);\n    const hasSize = xMin !== xMax || yMin !== yMax;\n\n    this.__boundingRect[includeTransform] = {\n      x: xMin,\n      y: yMin,\n      width: hasSize ? Math.max(1, xMax - xMin) : 0,\n      height: hasSize ? Math.max(1, yMax - yMin) : 0,\n    };\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    const rect = this.boundingRect(includeTransform);\n    this.__bounds[includeTransform] = [\n      { x: rect.x, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y + rect.height },\n      { x: rect.x, y: rect.y + rect.height },\n    ];\n    return this.__bounds[includeTransform];\n  }\n}\n\nexport function create(...s) {\n  return new Line(...s);\n}\n","const PI_2 = Math.PI / 2;\n\nfunction lineAngle(p0, p1) {\n  const t = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n  return t < 0 ? t + Math.PI * 2 : t;\n}\n\n// TODO Find a more accurate method to find the open and closed points\nfunction rotatePoint(p, angle, radius) {\n  return {\n    x: p.x + Math.cos(angle) * radius,\n    y: p.y + Math.sin(angle) * radius,\n  };\n}\n\nexport default function polylineToPolygonCollider(points, radius, opts = {}) {\n  const open = [];\n  const close = [];\n\n  // TODO handle case if points.length === 2\n\n  if (opts.forceOrientation === 'h') {\n    const start = points[0].x < points[1].x ? -1 : 1;\n    const end = points[points.length - 1].x > points[points.length - 2].x ? 1 : -1;\n\n    points.unshift({ x: points[0].x + start, y: points[0].y });\n    points.push({ x: points[points.length - 1].x + end, y: points[points.length - 1].y });\n  } else if (opts.forceOrientation === 'v') {\n    const start = points[0].y < points[1].y ? -1 : 1;\n    const end = points[points.length - 1].y > points[points.length - 2].y ? 1 : -1;\n\n    points.unshift({ x: points[0].x, y: points[0].y + start });\n    points.push({ x: points[points.length - 1].x, y: points[points.length - 1].y + end });\n  }\n\n  const len = points.length - 1;\n  for (let i = 1; i < len; i++) {\n    const prev = points[i - 1];\n    const curr = points[i];\n    const next = points[i + 1];\n    const currToPrev = lineAngle(curr, prev);\n    const currToNext = lineAngle(curr, next);\n    const openAngle = (currToPrev + currToNext) / 2;\n    const closeAngle = openAngle + Math.PI;\n    const maxAngle = Math.max(openAngle, closeAngle);\n    const minAngle = Math.min(openAngle, closeAngle);\n    const openClose = currToPrev > currToNext;\n\n    if (i === 1) {\n      const prevToCurr = lineAngle(prev, curr);\n      open.push(rotatePoint(prev, prevToCurr - PI_2, radius));\n      close.unshift(rotatePoint(prev, prevToCurr + PI_2, radius));\n    }\n\n    const opened = openClose ? maxAngle : minAngle;\n    const closed = openClose ? minAngle : maxAngle;\n\n    open.push(rotatePoint(curr, opened, radius));\n    close.unshift(rotatePoint(curr, closed, radius));\n\n    if (i === len - 1) {\n      const nextToCurr = lineAngle(next, curr);\n      open.push(rotatePoint(next, nextToCurr + PI_2, radius));\n      close.unshift(rotatePoint(next, nextToCurr - PI_2, radius));\n    }\n  }\n\n  return {\n    type: 'polygon',\n    vertices: [...open, ...close],\n  };\n}\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport { getMinMax } from '../../geometry/util';\nimport pathToSegments from '../parse-path-d';\nimport polylineToPolygonCollider from '../polyline-to-polygon-collider';\nimport flatten from '../../utils/flatten-array';\n\nconst EPSILON = 1e-12;\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} PathNode\n * @property {string} d - {@link https://www.w3.org/TR/SVG/paths.html#DAttribute}\n */\n\nfunction isClosed(points) {\n  if (points.length < 2) {\n    return false;\n  }\n  const p0 = points[0];\n  const p1 = points[points.length - 1];\n\n  return Math.abs(p0.x - p1.x) < EPSILON && Math.abs(p0.y - p1.y) < EPSILON;\n}\n\nexport default class Path extends DisplayObject {\n  constructor(...s) {\n    super('path');\n    this.set(...s);\n  }\n\n  set(v = {}) {\n    super.set(v);\n    this.segments = [];\n    this.points = [];\n    this.attrs.d = v.d;\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n\n    if (Array.isArray(v.collider) || (typeof v.collider === 'object' && typeof v.collider.type !== 'undefined')) {\n      this.collider = v.collider;\n    } else if (v.d) {\n      this.segments = pathToSegments(v.d);\n      if (this.segments.length > 1 && this.segments.every((segment) => isClosed(segment))) {\n        this.collider = extend(\n          {\n            type: 'geopolygon',\n            vertices: this.segments,\n          },\n          v.collider\n        );\n        return;\n      }\n      this.segments.forEach((segment) => {\n        if (segment.length <= 1) {\n          // Omit empty and single point segments\n        } else if (isClosed(segment)) {\n          this.collider = extend(\n            {\n              type: 'polygon',\n              vertices: segment,\n            },\n            v.collider\n          );\n        } else if (typeof v.collider === 'object' && v.collider.visual) {\n          const size = this.attrs['stroke-width'] / 2;\n          this.collider = polylineToPolygonCollider(segment, size, v.collider);\n        } else {\n          this.collider = extend(\n            {\n              type: 'polyline',\n              points: segment,\n            },\n            v.collider\n          );\n        }\n      });\n    }\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n\n    if (!this.points.length) {\n      this.segments = this.segments.length ? this.segments : pathToSegments(this.attrs.d);\n      this.points = flatten(this.segments);\n    }\n\n    const pt =\n      includeTransform && this.modelViewMatrix ? this.modelViewMatrix.transformPoints(this.points) : this.points;\n    const [xMin, yMin, xMax, yMax] = getMinMax(pt);\n\n    this.__boundingRect[includeTransform] = {\n      x: xMin || 0,\n      y: yMin || 0,\n      width: xMax - xMin || 0,\n      height: yMax - yMin || 0,\n    };\n\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    const rect = this.boundingRect(includeTransform);\n\n    this.__bounds[includeTransform] = [\n      { x: rect.x, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y + rect.height },\n      { x: rect.x, y: rect.y + rect.height },\n    ];\n    return this.__bounds[includeTransform];\n  }\n}\n\nexport function create(...s) {\n  return new Path(...s);\n}\n","export default function flatten2d(ary) {\n  const newAry = [];\n  let a;\n  let len = ary.length;\n  for (let i = 0; i < len; i++) {\n    a = ary[i];\n    for (let k = 0; k < a.length; k++) {\n      newAry.push(a[k]);\n    }\n  }\n\n  return newAry;\n}\n","import extend from 'extend';\nimport DisplayObject from './display-object';\nimport { rectToPoints, getMinMax } from '../../geometry/util';\n\nfunction hasData({ data, _boundingRect, _textBoundsFn }) {\n  return typeof data !== 'undefined' && data !== null && (_boundingRect || _textBoundsFn);\n}\n\n/**\n * @private\n * @extends DisplayObject\n * @typedef {object} TextNode\n * @property {string} text\n * @property {number} x - {@link https://www.w3.org/TR/SVG/text.html#TextElementXAttribute}\n * @property {number} y - {@link https://www.w3.org/TR/SVG/text.html#TextElementYAttribute}\n * @property {number} [dx] - {@link https://www.w3.org/TR/SVG/text.html#TextElementDXAttribute}\n * @property {number} [dy] - {@link https://www.w3.org/TR/SVG/text.html#TextElementDYAttribute}\n * @property {string} [fontSize] - {@link https://www.w3.org/TR/SVG/text.html#FontPropertiesUsedBySVG}\n * @property {string} [fontFamily] - {@link https://www.w3.org/TR/SVG/text.html#FontPropertiesUsedBySVG}\n * @property {Rect} [boundingRect] - Explicitly set the bounding rectangle of the node. Has predence over textBoundsFn\n * @property {function} [textBoundsFn] - Implicitly set the bounding rectangle of the node, the function must return an object with x, y, width and height attributes\n * @property {string} [baseline] - Alias for dominantBaseline\n * @property {string} [dominantBaseline] - {@link https://www.w3.org/TR/SVG/text.html#BaselineAlignmentProperties}\n * @property {string} [anchor] - Alias for textAnchor\n * @property {string} [textAnchor] - {@link https://www.w3.org/TR/SVG/text.html#TextAnchorProperty}\n * @property {string} [wordBreak] - Word-break option\n * @property {number} [maxWidth] - Maximum allowed text width\n * @property {number} [maxHeight] - Maximum allowed text height. If both maxLines and maxHeight are set, the property that results in the fewest number of lines is used\n * @property {number} [maxLines] - Maximum number of lines allowed\n * @property {number} [lineHeight=1.2] - Line height\n */\n\nexport default class Text extends DisplayObject {\n  constructor(...s) {\n    super('text');\n    this.set(...s);\n  }\n\n  set(v = {}) {\n    const { x = 0, y = 0, dx = 0, dy = 0, textBoundsFn, text, title, collider, boundingRect, ellipsed } = v;\n\n    super.set(v);\n    this.attrs.x = x;\n    this.attrs.y = y;\n    this.attrs.dx = dx;\n    this.attrs.dy = dy;\n    this.attrs.text = text;\n    if (typeof title !== 'undefined') {\n      this.attrs.title = String(title);\n    }\n    if (typeof boundingRect === 'object') {\n      this._textBoundsFn = () => boundingRect;\n    } else if (typeof textBoundsFn === 'function') {\n      this._textBoundsFn = textBoundsFn;\n    }\n\n    if (typeof ellipsed === 'string') {\n      this.ellipsed = ellipsed;\n    }\n\n    this.collider = extend({ type: hasData(this) ? 'bounds' : null }, collider);\n\n    this.__boundingRect = { true: null, false: null };\n    this.__bounds = { true: null, false: null };\n  }\n\n  boundingRect(includeTransform = false) {\n    if (this.__boundingRect[includeTransform] !== null) {\n      return this.__boundingRect[includeTransform];\n    }\n\n    let rect;\n    if (typeof this._textBoundsFn === 'function') {\n      rect = this._textBoundsFn(this.attrs);\n    } else {\n      return {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n      };\n    }\n\n    const p = rectToPoints(rect);\n    const pt = includeTransform && this.modelViewMatrix ? this.modelViewMatrix.transformPoints(p) : p;\n    const [xMin, yMin, xMax, yMax] = getMinMax(pt);\n\n    this.__boundingRect[includeTransform] = {\n      x: xMin,\n      y: yMin,\n      width: xMax - xMin,\n      height: yMax - yMin,\n    };\n\n    return this.__boundingRect[includeTransform];\n  }\n\n  bounds(includeTransform = false) {\n    if (this.__bounds[includeTransform] !== null) {\n      return this.__bounds[includeTransform];\n    }\n    const rect = this.boundingRect(includeTransform);\n\n    this.__bounds[includeTransform] = [\n      { x: rect.x, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y },\n      { x: rect.x + rect.width, y: rect.y + rect.height },\n      { x: rect.x, y: rect.y + rect.height },\n    ];\n    return this.__bounds[includeTransform];\n  }\n}\n\nexport function create(...s) {\n  return new Text(...s);\n}\n","import { create as stage } from './stage';\nimport { create as container } from './container';\nimport { create as gradientItem } from './gradient-item';\nimport { create as patternItem } from './pattern-item';\nimport { create as rect } from './rect';\nimport { create as circle } from './circle';\nimport { create as line } from './line';\nimport { create as path } from './path';\nimport { create as text } from './text';\nimport registry from '../../utils/registry';\n\nconst reg = registry();\n\nreg.add('rect', rect);\nreg.add('circle', circle);\nreg.add('text', text);\nreg.add('line', line);\nreg.add('path', path);\nreg.add('stage', stage);\nreg.add('container', container);\nreg.add('defs', container);\nreg.add('linearGradient', gradientItem);\nreg.add('radialGradient', gradientItem);\nreg.add('stop', gradientItem);\nreg.add('pattern', patternItem);\n\n/* eslint-disable import/prefer-default-export */\nexport function create(type, input) {\n  return reg.get(type)(input);\n}\n/* eslint-enable import/prefer-default-export */\n","import { create } from './display-objects';\nimport Matrix from '../math/matrix';\nimport resolveTransform from './transform-resolver';\nimport contextFactory from './context';\n\nconst styleContext = contextFactory(['stroke', 'fill', 'strokeWidth', 'opacity', 'fontFamily', 'fontSize', 'baseline']);\n\nfunction doEvent(state, listeners) {\n  if (!Array.isArray(listeners)) {\n    return;\n  }\n\n  for (let i = 0, len = listeners.length; i < len; i++) {\n    listeners[i](state);\n  }\n}\n\nfunction updateState(state, index, nodes) {\n  state.node = nodes[index];\n  state.index = index;\n}\n\nfunction traverse(items, parent, matrix, on) {\n  let disabled = false;\n  const state = {\n    siblings: items,\n    node: null,\n    index: 0,\n  };\n  for (let i = 0, len = items.length; i < len; i++) {\n    updateState(state, i, items);\n    doEvent(state, on.create);\n\n    disabled = typeof state.node.disabled === 'function' ? state.node.disabled() : state.node.disabled;\n    if (disabled) {\n      continue;\n    }\n\n    // Save the current style context to be able to inherit styles\n    state.node = styleContext.save(state.node);\n\n    const displayNode = create(state.node.type, state.node);\n    if (displayNode) {\n      if (state.node.transform) {\n        matrix.save();\n        resolveTransform(state.node.transform, matrix);\n      }\n\n      if (!matrix.isIdentity()) {\n        displayNode.modelViewMatrix = matrix.clone();\n      }\n\n      parent.addChild(displayNode);\n      if (state.node.children) {\n        traverse(state.node.children, displayNode, matrix, on);\n      }\n\n      if (state.node.transform) {\n        matrix.restore();\n      }\n    }\n\n    // Revert to previous style context\n    styleContext.restore();\n  }\n}\n\nexport default function scene({ items, stage, dpi, on = {} }) {\n  if (!stage) {\n    stage = create('stage', dpi);\n  }\n\n  traverse(items, stage, new Matrix(), on);\n\n  return stage;\n}\n","import extend from 'extend';\n\n/**\n * Creates a context. Input an array of strings that should be inherited by the context.\n * @private\n *\n * @param  {Array}  [whitelist=[]]  An array of whitelisted string keys to inherit\n * @return {Function}               A context function\n */\nfunction contextFactory(whitelist = []) {\n  const states = [{}];\n\n  /**\n   * Returns the current context as an object. The object is mutable.\n   * @private\n   *\n   * @return {Object}   Current context\n   */\n  function context() {\n    // Returns the current context, the last in the stack.\n    const item = states[states.length - 1];\n    return item;\n  }\n\n  /**\n   * Call context.save() to save the current context and move down the stack.\n   *\n   * @param  {Object} [item={}]   Optional item to save.\n   * @return {Object}             The current context, just as context()\n   */\n  context.save = function save(item = {}) {\n    const current = context();\n    const obj = {};\n    let key = '';\n\n    // Only inherit whitelisted properties\n    for (let i = 0; i < whitelist.length; i++) {\n      key = whitelist[i];\n      if (typeof current[key] !== 'undefined') {\n        obj[key] = current[key];\n      }\n    }\n\n    // Extend the new object with the saved item\n    extend(obj, item);\n\n    // Push it to the stack\n    states.push(obj);\n\n    // Return the new current context\n    return context();\n  };\n\n  /**\n   * Restore the previous context. Returns the context.\n   *\n   * @return {Undefined}   Returns nothing\n   */\n  context.restore = function restore() {\n    // Remove the last element from the stack\n    states.splice(states.length - 1, 1);\n  };\n\n  return context;\n}\n\nexport { contextFactory as default };\n","import { degreesToPoints } from '../../../core/math/angles';\n\n/**\n * Get or create a gradient\n * @ignore\n * @param  {Object} g        Canvas 2d context\n * @param  {Object} node    Current node (for width/height properties)\n * @param  {Object} gradient The gradient properties\n * @return {Object}          A canvas compatible radial or linear gradient object\n */\nexport default function createCanvasGradient(g, node, gradient) {\n  const { orientation, degree, stops = [] } = gradient;\n\n  let newGradient = null;\n\n  if (orientation === 'radial') {\n    const bounds = node.boundingRect();\n\n    newGradient = g.createRadialGradient(\n      bounds.x + bounds.width / 2,\n      bounds.y + bounds.height / 2,\n      1e-5,\n      bounds.x + bounds.width / 2,\n      bounds.y + bounds.height / 2,\n      Math.max(bounds.width, bounds.height) / 2\n    );\n  } else {\n    const points = degreesToPoints(degree);\n    ['x1', 'x2', 'y1', 'y2'].forEach((c) => {\n      if (c in gradient) {\n        points[c] = gradient[c];\n      }\n    });\n\n    const bounds = node.boundingRect();\n\n    newGradient = g.createLinearGradient(\n      bounds.x + points.x1 * bounds.width,\n      bounds.y + points.y1 * bounds.height,\n      bounds.x + points.x2 * bounds.width,\n      bounds.y + points.y2 * bounds.height\n    );\n  }\n\n  for (let i = 0, len = stops.length; i < len; i++) {\n    let stop = stops[i];\n    newGradient.addColorStop(stop.offset, stop.color);\n  }\n\n  return newGradient;\n}\n","function getPattern(pattern, dummyCanvas, ctx) {\n  dummyCanvas.width = pattern.width;\n  dummyCanvas.height = pattern.height;\n  ctx.save();\n  ctx.fillStyle = pattern.fill;\n\n  pattern.shapes.forEach((s) => {\n    switch (s.type) {\n      case 'rect':\n        ctx.rect(s.x, s.y, s.width, s.height);\n        break;\n      default:\n        break;\n    }\n  });\n  ctx.fill();\n  ctx.restore();\n  return ctx.createPattern(dummyCanvas, 'repeat');\n}\n\nexport default function patternizer(document) {\n  const dummyCanvas = document.createElement('canvas');\n  const ctx = dummyCanvas.getContext('2d');\n\n  let cache = {};\n\n  return {\n    create(pattern) {\n      const key = pattern.key;\n      if (key) {\n        cache[key] = cache[key] || getPattern(pattern, dummyCanvas, ctx);\n        return cache[key];\n      }\n      return getPattern(pattern, dummyCanvas, ctx);\n    },\n    clear() {\n      cache = {};\n    },\n  };\n}\n","/**\n * @typedef {object} Renderer~SizeDefinition\n * @property {number} [x] - x-coordinate\n * @property {number} [y] - y-coordinate\n * @property {number} [width] - Width\n * @property {number} [height] - Height\n * @property {object} [scaleRatio]\n * @property {number} [scaleRatio.x] - Scale ratio on x-axis\n * @property {number} [scaleRatio.y] - Scale ratio on y-axis\n * @property {object} [margin]\n * @property {number} [margin.left] - Left margin\n * @property {number} [margin.top] - Top margin\n */\n\n/**\n * Create the renderer box\n * @private\n * @param {Renderer~SizeDefinition} [opts]\n * @returns {Renderer~SizeDefinition} A svg renderer instance\n */\nexport default function createRendererBox({ x, y, width, height, scaleRatio, margin, edgeBleed } = {}) {\n  const box = {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n    scaleRatio: {\n      x: 1,\n      y: 1,\n    },\n    margin: {\n      left: 0,\n      top: 0,\n    },\n    edgeBleed: {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      bool: false,\n    },\n  };\n\n  box.x = isNaN(x) ? box.x : x;\n  box.y = isNaN(y) ? box.y : y;\n  box.width = isNaN(width) ? box.width : width;\n  box.height = isNaN(height) ? box.height : height;\n  if (typeof scaleRatio !== 'undefined') {\n    box.scaleRatio.x = isNaN(scaleRatio.x) ? box.scaleRatio.x : scaleRatio.x;\n    box.scaleRatio.y = isNaN(scaleRatio.y) ? box.scaleRatio.y : scaleRatio.y;\n  }\n\n  if (typeof margin !== 'undefined') {\n    box.margin.left = isNaN(margin.left) ? 0 : margin.left;\n    box.margin.top = isNaN(margin.top) ? 0 : margin.top;\n  }\n\n  if (typeof edgeBleed === 'object') {\n    ['left', 'right', 'top', 'bottom'].forEach((prop) => {\n      if (!isNaN(edgeBleed[prop]) && edgeBleed[prop] > 0) {\n        box.edgeBleed[prop] = edgeBleed[prop];\n        box.edgeBleed.bool = true;\n      }\n    });\n  }\n\n  box.computedPhysical = {\n    x: Math.round(box.margin.left + (box.x - box.edgeBleed.left) * box.scaleRatio.x),\n    y: Math.round(box.margin.top + (box.y - box.edgeBleed.top) * box.scaleRatio.y),\n    width: Math.round((box.width + box.edgeBleed.left + box.edgeBleed.right) * box.scaleRatio.x),\n    height: Math.round((box.height + box.edgeBleed.top + box.edgeBleed.bottom) * box.scaleRatio.y),\n  };\n\n  return box;\n}\n","import { measureText, textBounds } from '../text-manipulation';\n\n/**\n * Base renderer factory\n * @private\n */\nfunction create() {\n  /**\n   * @interface\n   * @alias Renderer\n   */\n  const renderer = {\n    /**\n     * Get the element this renderer is attached to\n     * @returns {HTMLElement}\n     */\n    element: () => {},\n\n    /**\n     * Get the root element of the renderer\n     * @returns {HTMLElement}\n     */\n    root: () => {},\n\n    /**\n     * @param {HTMLElement} element - Element to attach renderer to\n     * @returns {HTMLElement} Root element of the renderer\n     */\n    appendTo: () => {},\n\n    /**\n     * @param {object[]} nodes - Nodes to render\n     * @returns {boolean} True if the nodes were rendered, otherwise false\n     */\n    render: () => false,\n\n    /**\n     * Get nodes renderer at area\n     * @param {Point|Circle|Rect|Line|Polygon|Geopolygon} geometry - Get nodes that intersects with geometry\n     * @returns {SceneNode[]}\n     */\n    itemsAt: () => [],\n\n    /**\n     * Get all nodes matching the provided selector\n     * @param {string} selector CSS selector [type, attribute, universal, class]\n     * @returns {SceneNode[]} Array of objects containing matching nodes\n     */\n    findShapes: () => [],\n\n    /**\n     * Clear all child elements from the renderer root element\n     * @returns {Renderer} The renderer instance\n     */\n    clear: () => {},\n\n    /**\n     * Remove the renderer root element from its parent element\n     */\n    destory: () => {},\n\n    /**\n     * Set or Get the size definition of the renderer container.\n     * @param {Renderer~SizeDefinition} [opts] - Size definition\n     * @returns {Renderer~SizeDefinition} The current size definition\n     */\n    size: () => {},\n\n    /**\n     * @function\n     * @param {object} opts\n     * @param {string} opts.text - Text to measure\n     * @param {string} opts.fontSize - Font size\n     * @param {string} opts.fontFamily - Font family\n     * @returns {object} Width and height of text\n     * @example\n     * measureText({\n     *  text: 'my text',\n     *  fontSize: '12px',\n     *  fontFamily: 'Arial'\n     * }); // returns { width: 20, height: 12 }\n     */\n    measureText,\n\n    /**\n     * Calculates the bounding rectangle of a text node. Including any potential line breaks.\n     * @function\n     * @private\n     * @param {TextNode} node\n     * @return {Rect} The bounding rectangle\n     */\n    textBounds,\n\n    setKey: (key) => {\n      renderer.element().setAttribute('data-key', key);\n    },\n  };\n\n  return renderer;\n}\n\nexport { create as default };\n","function hasData(data) {\n  return typeof data !== 'undefined' && data !== null;\n}\n\nexport default function injectTextBoundsFn(renderer) {\n  return ({ node }) => {\n    if (node.type === 'text' && hasData(node.data) && !node.textBoundsFn) {\n      node.textBoundsFn = renderer.textBounds;\n    }\n  };\n}\n","import sceneFactory from '../../../core/scene-graph/scene';\nimport registry from '../../../core/utils/registry';\nimport { onLineBreak } from '../../text-manipulation';\nimport createCanvasGradient from './canvas-gradient';\nimport patternizer from './canvas-pattern';\nimport createRendererBox from '../renderer-box';\nimport create from '../index';\nimport injectTextBoundsFn from '../../text-manipulation/inject-textbounds';\n\nconst reg = registry();\n\nfunction toLineDash(p) {\n  if (Array.isArray(p)) {\n    return p;\n  }\n  if (typeof p === 'string') {\n    if (p.indexOf(',') !== -1) {\n      return p.split(',');\n    }\n    return p.split(' ');\n  }\n  return [];\n}\n\nfunction dpiScale(g) {\n  const dpr = typeof window === 'undefined' ? 1 : window.devicePixelRatio || 1;\n  const backingStorePixelRatio =\n    g.webkitBackingStorePixelRatio ||\n    g.mozBackingStorePixelRatio ||\n    g.msBackingStorePixelRatio ||\n    g.oBackingStorePixelRatio ||\n    g.backingStorePixelRatio ||\n    1;\n  return dpr / backingStorePixelRatio;\n}\n\nfunction resolveMatrix(p, g) {\n  g.setTransform(p[0][0], p[1][0], p[0][1], p[1][1], p[0][2], p[1][2]);\n}\n\nfunction applyContext(g, s, shapeToCanvasMap, computed = {}) {\n  const computedKeys = Object.keys(computed);\n\n  for (let i = 0, len = shapeToCanvasMap.length; i < len; i++) {\n    let cmd = shapeToCanvasMap[i];\n\n    const shapeCmd = cmd[0];\n    const canvasCmd = cmd[1];\n    const convertCmd = cmd[2];\n\n    if (shapeCmd in s.attrs && !(canvasCmd in computed) && g[canvasCmd] !== s.attrs[shapeCmd]) {\n      const val = convertCmd ? convertCmd(s.attrs[shapeCmd]) : s.attrs[shapeCmd];\n      if (typeof g[canvasCmd] === 'function') {\n        g[canvasCmd](val);\n      } else {\n        g[canvasCmd] = val;\n      }\n    }\n  }\n\n  for (let i = 0, len = computedKeys.length; i < len; i++) {\n    const key = computedKeys[i];\n    g[key] = computed[key];\n  }\n}\n\nfunction renderShapes(shapes, g, shapeToCanvasMap, deps) {\n  for (let i = 0, len = shapes.length; i < len; i++) {\n    let shape = shapes[i];\n    let computed = {};\n    g.save();\n\n    if (shape.attrs && (shape.attrs.fill || shape.attrs.stroke)) {\n      if (shape.attrs.fill && typeof shape.attrs.fill === 'object' && shape.attrs.fill.type === 'gradient') {\n        computed.fillStyle = createCanvasGradient(g, shape, shape.attrs.fill);\n      } else if (shape.attrs.fill && typeof shape.attrs.fill === 'object' && shape.attrs.fill.type === 'pattern') {\n        computed.fillStyle = deps.patterns.create(shape.attrs.fill);\n      }\n\n      if (shape.attrs.stroke && typeof shape.attrs.stroke === 'object' && shape.attrs.stroke.type === 'gradient') {\n        computed.strokeStyle = createCanvasGradient(g, shape, shape.attrs.stroke);\n      } else if (\n        shape.attrs.stroke &&\n        typeof shape.attrs.stroke === 'object' &&\n        shape.attrs.stroke.type === 'pattern'\n      ) {\n        computed.strokeStyle = deps.patterns.create(shape.attrs.stroke);\n      }\n    }\n\n    applyContext(g, shape, shapeToCanvasMap, computed);\n\n    if (shape.modelViewMatrix) {\n      resolveMatrix(shape.modelViewMatrix.elements, g);\n    }\n\n    if (reg.has(shape.type)) {\n      reg.get(shape.type)(shape.attrs, {\n        g,\n        doFill: 'fill' in shape.attrs && shape.attrs.fill !== 'none',\n        doStroke: 'stroke' in shape.attrs && shape.attrs['stroke-width'] !== 0,\n        ellipsed: shape.ellipsed,\n      });\n    }\n    if (shape.children) {\n      renderShapes(shape.children, g, shapeToCanvasMap, deps);\n    }\n    g.restore();\n  }\n}\n\n/**\n * Create a new canvas renderer\n * @typedef {function} canvasRendererFactory\n * @param {function} [sceneFn] - Scene factory\n * @returns {Renderer} A canvas renderer instance\n */\nexport function renderer(sceneFn = sceneFactory) {\n  let el;\n  let scene;\n  let hasChangedRect = false;\n  let rect = createRendererBox();\n  const shapeToCanvasMap = [\n    ['fill', 'fillStyle'],\n    ['stroke', 'strokeStyle'],\n    ['opacity', 'globalAlpha'],\n    ['globalAlpha', 'globalAlpha'],\n    ['stroke-width', 'lineWidth'],\n    ['stroke-linejoin', 'lineJoin'],\n    ['stroke-dasharray', 'setLineDash', toLineDash],\n  ];\n\n  let patterns;\n\n  const canvasRenderer = create();\n\n  canvasRenderer.element = () => el;\n\n  canvasRenderer.root = () => el;\n\n  canvasRenderer.appendTo = (element) => {\n    if (!el) {\n      el = element.ownerDocument.createElement('canvas');\n      el.style.position = 'absolute';\n      el.style['-webkit-font-smoothing'] = 'antialiased';\n      el.style['-moz-osx-font-smoothing'] = 'antialiased';\n      el.style.pointerEvents = 'none';\n    }\n\n    element.appendChild(el);\n\n    return el;\n  };\n\n  canvasRenderer.render = (shapes) => {\n    if (!el) {\n      return false;\n    }\n    if (!patterns) {\n      patterns = patternizer(el.ownerDocument);\n    }\n\n    const g = el.getContext('2d');\n    const dpiRatio = dpiScale(g);\n    const scaleX = rect.scaleRatio.x;\n    const scaleY = rect.scaleRatio.y;\n\n    if (hasChangedRect) {\n      el.style.left = `${rect.computedPhysical.x}px`;\n      el.style.top = `${rect.computedPhysical.y}px`;\n      el.style.width = `${rect.computedPhysical.width}px`;\n      el.style.height = `${rect.computedPhysical.height}px`;\n      el.width = Math.round(rect.computedPhysical.width * dpiRatio);\n      el.height = Math.round(rect.computedPhysical.height * dpiRatio);\n    }\n\n    const sceneContainer = {\n      type: 'container',\n      children: shapes,\n      transform: rect.edgeBleed.bool\n        ? `translate(${rect.edgeBleed.left * dpiRatio * scaleX}, ${rect.edgeBleed.top * dpiRatio * scaleY})`\n        : '',\n    };\n\n    if (dpiRatio !== 1 || scaleX !== 1 || scaleY !== 1) {\n      sceneContainer.transform += `scale(${dpiRatio * scaleX}, ${dpiRatio * scaleY})`;\n    }\n\n    const newScene = sceneFn({\n      items: [sceneContainer],\n      dpi: dpiRatio,\n      on: {\n        create: [onLineBreak(canvasRenderer.measureText), injectTextBoundsFn(canvasRenderer)],\n      },\n    });\n    const hasChangedScene = scene ? !newScene.equals(scene) : true;\n\n    patterns.clear();\n\n    const doRender = hasChangedRect || hasChangedScene;\n    if (doRender) {\n      canvasRenderer.clear();\n      renderShapes(newScene.children, g, shapeToCanvasMap, {\n        patterns,\n      });\n    }\n\n    hasChangedRect = false;\n    scene = newScene;\n    return doRender;\n  };\n\n  canvasRenderer.itemsAt = (input) => (scene ? scene.getItemsFrom(input) : []);\n\n  canvasRenderer.findShapes = (selector) => (scene ? scene.findShapes(selector) : []);\n\n  canvasRenderer.clear = () => {\n    if (el) {\n      el.width = el.width; // eslint-disable-line\n    }\n    scene = null;\n\n    return canvasRenderer;\n  };\n\n  canvasRenderer.size = (opts) => {\n    if (opts) {\n      const newRect = createRendererBox(opts);\n\n      if (JSON.stringify(rect) !== JSON.stringify(newRect)) {\n        hasChangedRect = true;\n        rect = newRect;\n      }\n    }\n\n    return rect;\n  };\n\n  canvasRenderer.destroy = () => {\n    if (el) {\n      if (el.parentElement) {\n        el.parentElement.removeChild(el);\n      }\n      el = null;\n    }\n    scene = null;\n  };\n\n  return canvasRenderer;\n}\n\nexport function register(type, renderFn) {\n  reg.add(type, renderFn);\n}\n","function clampRadius(max, value) {\n  return Math.max(0, Math.min(max, value));\n}\n\n/**\n * Implementation details follow rx/ry restrictions from https://svgwg.org/svg2-draft/geometry.html#RX\n *\n * Using Quadratic Bézier curve it's not possible accurately represent a circle or ellipse but should for the case of a rounded rectangle be sufficent.\n * @private\n */\nfunction quadraticRoundedRect(g, x, y, width, height, rx, ry) {\n  rx = clampRadius(width / 2, rx > 0 ? rx : ry);\n  ry = clampRadius(height / 2, ry > 0 ? ry : rx);\n\n  g.moveTo(x, y + ry);\n  g.lineTo(x, y + height - ry);\n  g.quadraticCurveTo(x, y + height, x + rx, y + height);\n  g.lineTo(x + width - rx, y + height);\n  g.quadraticCurveTo(x + width, y + height, x + width, y + height - ry);\n  g.lineTo(x + width, y + ry);\n  g.quadraticCurveTo(x + width, y, x + width - rx, y);\n  g.lineTo(x + rx, y);\n  g.quadraticCurveTo(x, y, x, y + ry);\n}\n\nexport default function render(rect, { g, doFill, doStroke }) {\n  g.beginPath();\n\n  if (rect.rx > 0 || rect.ry > 0) {\n    quadraticRoundedRect(g, rect.x, rect.y, rect.width, rect.height, rect.rx, rect.ry);\n  } else {\n    g.rect(rect.x, rect.y, rect.width, rect.height);\n  }\n\n  if (doFill) {\n    g.fill();\n  }\n  if (doStroke) {\n    g.stroke();\n  }\n}\n","/* eslint no-misleading-character-class: 0 */\n// Source: https://en.wikipedia.org/wiki/Bi-directional_text and http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt\n// 3 types of strong direction characters: L (strong left-to-right), R(strong right-to-left, Hebrew) and AL(strong right-to-left, Arabic language)\nconst rangesOfLChars =\n  '[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u02BB-\\u02C1\\u02D0-\\u02D1\\u02E0-\\u02E4\\u02EE\\u0370-\\u0373\\u0376-\\u037D\\u0386\\u0388-\\u03F5\\u03F7-\\u0482\\u048A-\\u0589\\u0903-\\u0939\\u093B\\u093D-\\u0940\\u0949-\\u094C\\u094E-\\u0950\\u0958-\\u0961\\u0964-\\u097F\\u0982-\\u09B9\\u09BD-\\u09C0\\u09C7-\\u09CC\\u09CE-\\u09E1\\u09E6-\\u09F1\\u09F4-\\u09FA\\u0A03-\\u0A39\\u0A3E-\\u0A40\\u0A59-\\u0A6F\\u0A72-\\u0A74\\u0A83-\\u0AB9\\u0ABD-\\u0AC0\\u0AC9-\\u0ACC\\u0AD0-\\u0AE1\\u0AE6-\\u0AEF\\u0B02-\\u0B39\\u0B3D-\\u0B3E\\u0B40\\u0B47-\\u0B4C\\u0B57-\\u0B61\\u0B66-\\u0B77\\u0B83-\\u0BBF\\u0BC1-\\u0BCC\\u0BD0-\\u0BF2\\u0C01-\\u0C3D\\u0C41-\\u0C44\\u0C58-\\u0C61\\u0C66-\\u0C6F\\u0C7F-\\u0CB9\\u0CBD-\\u0CCB\\u0CD5-\\u0CE1\\u0CE6-\\u0D40\\u0D46-\\u0D4C\\u0D4E-\\u0D61\\u0D66-\\u0DC6\\u0DCF-\\u0DD1\\u0DD8-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E46\\u0E4F-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD-\\u0EC6\\u0ED0-\\u0F17\\u0F1A-\\u0F34\\u0F36\\u0F38\\u0F3E-\\u0F6C\\u0F7F\\u0F85\\u0F88-\\u0F8C\\u0FBE-\\u0FC5\\u0FC7-\\u102C\\u1031\\u1038\\u103B-\\u103C\\u103F-\\u1057\\u105A-\\u105D\\u1061-\\u1070\\u1075-\\u1081\\u1083-\\u1084\\u1087-\\u108C\\u108E-\\u109C\\u109E-\\u135A\\u1360-\\u138F\\u13A0-\\u13F4\\u1401-\\u167F\\u1681-\\u169A\\u16A0-\\u1711\\u1720-\\u1731\\u1735-\\u1751\\u1760-\\u1770\\u1780-\\u17B6\\u17BE-\\u17C5\\u17C7-\\u17C8\\u17D4-\\u17DA\\u17DC\\u17E0-\\u17E9\\u1810-\\u18A8\\u18AA-\\u191C\\u1923-\\u1926\\u1929-\\u1931\\u1933-\\u1938\\u1946-\\u19DA\\u1A00-\\u1A16\\u1A19-\\u1A55\\u1A57\\u1A61\\u1A63-\\u1A64\\u1A6D-\\u1A72\\u1A80-\\u1AAD\\u1B04-\\u1B33\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43-\\u1B6A\\u1B74-\\u1B7C\\u1B82-\\u1BA1\\u1BA6-\\u1BA7\\u1BAA-\\u1BE5\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2-\\u1C2B\\u1C34-\\u1C35\\u1C3B-\\u1C7F\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1DBF\\u1E00-\\u1FBC\\u1FBE\\u1FC2-\\u1FCC\\u1FD0-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FFC\\u200E\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E-\\u214F\\u2160-\\u2188\\u2336-\\u237A\\u2395\\u249C-\\u24E9\\u26AC\\u2800-\\u28FF\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2D00-\\u2D70\\u2D80-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u31BA\\u31F0-\\u321C\\u3220-\\u324F\\u3260-\\u327B\\u327F-\\u32B0\\u32C0-\\u32CB\\u32D0-\\u3376\\u337B-\\u33DD\\u33E0-\\u33FE\\u3400-\\u4DB5\\u4E00-\\uA48C\\uA4D0-\\uA60C\\uA610-\\uA66E\\uA680-\\uA6EF\\uA6F2-\\uA6F7\\uA722-\\uA787\\uA789-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA824\\uA827\\uA830-\\uA837\\uA840-\\uA873\\uA880-\\uA8C3\\uA8CE-\\uA8D9\\uA8F2-\\uA925\\uA92E-\\uA946\\uA952-\\uA97C\\uA983-\\uA9B2\\uA9B4-\\uA9B5\\uA9BA-\\uA9BB\\uA9BD-\\uAA28\\uAA2F-\\uAA30\\uAA33-\\uAA34\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA4D-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2-\\uABE4\\uABE6-\\uABE7\\uABE9-\\uABEC\\uABF0-\\uFB17\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFDC]';\nconst rangesOfRChars =\n  '[\\u05BE\\u05C0\\u05C3\\u05C6\\u05D0-\\u05F4\\u07C0-\\u07EA\\u07F4-\\u07F5\\u07FA-\\u0815\\u081A\\u0824\\u0828\\u0830-\\u0858\\u085E\\u200F\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB4F]';\nconst rangesOfALChars =\n  '[\\u0608\\u060B\\u060D\\u061B-\\u064A\\u066D-\\u066F\\u0671-\\u06D5\\u06E5-\\u06E6\\u06EE-\\u06EF\\u06FA-\\u070D\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\uFB50-\\uFD3D\\uFD50-\\uFDFC\\uFE70-\\uFEFC]';\n// let rangesOfNChars = '[\\u0009-\\u000D\\u001C-\\u0022\\u0026-\\u002A\\u003B-\\u0040\\u005B-\\u0060\\u007B-\\u007E\\u0085\\u00A1\\u00A6-\\u00A9\\u00AB-\\u00AC\\u00AE-\\u00AF\\u00B4\\u00B6-\\u00B8\\u00BB-\\u00BF\\u00D7\\u00F7\\u02B9-\\u02BA\\u02C2-\\u02CF\\u02D2-\\u02DF\\u02E5-\\u02ED\\u02EF-\\u02FF\\u0374-\\u0375\\u037E-\\u0385\\u0387\\u03F6\\u058A\\u0606-\\u0607\\u060E-\\u060F\\u06DE\\u06E9\\u07F6-\\u07F9\\u0BF3-\\u0BF8\\u0BFA\\u0C78-\\u0C7E\\u0F3A-\\u0F3D\\u1390-\\u1399\\u1400\\u1680\\u169B-\\u169C\\u17F0-\\u180A\\u180E\\u1940-\\u1945\\u19DE-\\u19FF\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD-\\u200A\\u2010-\\u2029\\u2035-\\u2043\\u2045-\\u205F\\u207C-\\u207E\\u208C-\\u208E\\u2100-\\u2101\\u2103-\\u2106\\u2108-\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u213A-\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u2150-\\u215F\\u2189-\\u2211\\u2214-\\u2335\\u237B-\\u2394\\u2396-\\u2487\\u24EA-\\u26AB\\u26AD-\\u27FF\\u2900-\\u2B59\\u2CE5-\\u2CEA\\u2CF9-\\u2CFF\\u2E00-\\u3004\\u3008-\\u3020\\u3030\\u3036-\\u3037\\u303D-\\u303F\\u309B-\\u309C\\u30A0\\u30FB\\u31C0-\\u31E3\\u321D-\\u321E\\u3250-\\u325F\\u327C-\\u327E\\u32B1-\\u32BF\\u32CC-\\u32CF\\u3377-\\u337A\\u33DE-\\u33DF\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA60D-\\uA60F\\uA673\\uA67E-\\uA67F\\uA700-\\uA721\\uA788\\uA828-\\uA82B\\uA874-\\uA877\\uFD3E-\\uFD3F\\uFDFD\\uFE10-\\uFE19\\uFE30-\\uFE4F\\uFE51\\uFE54\\uFE56-\\uFE5E\\uFE60-\\uFE61\\uFE64-\\uFE68\\uFE6B\\uFF01-\\uFF02\\uFF06-\\uFF0A\\uFF1B-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFFE2-\\uFFE4\\uFFE8-\\uFFFD]';\nconst rangesOfLRgExp = new RegExp(rangesOfLChars);\nconst rangesOfRRgExp = new RegExp(rangesOfRChars);\nconst rangesOfALRgExp = new RegExp(rangesOfALChars);\n// let rangesOfNRgExp = new RegExp(rangesOfNChars);\n// let lrm = String.fromCharCode(8206); // left-to-right marker\n// let rlm = String.fromCharCode(8207); // right-to-left marker\n\nfunction isLtrChar(c) {\n  return rangesOfLRgExp.test(c);\n}\n\nfunction isRtlChar(c) {\n  return rangesOfRRgExp.test(c) || rangesOfALRgExp.test(c);\n}\n\nexport function detectTextDirection(s) {\n  let n = s ? s.length : 0,\n    i,\n    c;\n  for (i = 0; i < n; i++) {\n    c = s[i];\n    if (isLtrChar(c)) {\n      return 'ltr';\n    }\n    if (isRtlChar(c)) {\n      return 'rtl';\n    }\n  }\n  return 'ltr';\n}\n\nconst textAnchorRTLMap = {\n  start: 'end',\n  end: 'start',\n  center: 'center',\n  middle: 'middle',\n};\n\n/* let flippedTextAnchor = true;\nlet detected = false;\nexport function detectRtlSvgSupport(ns, ownerDoc) {\n  if (!detected) {\n    const body = ownerDoc.body;\n    if (body) {\n      const rtlTestSVG = ownerDoc.createElementNS(ns, 'svg');\n      const textNode = ownerDoc.createElementNS(ns, 'text');\n      const group = ownerDoc.createElementNS(ns, 'g');\n\n      rtlTestSVG.setAttribute('xmlns', ns);\n      rtlTestSVG.setAttribute('style', 'position: absolute; width: 100px; height: 100px; top: -100px; left: 0px');\n\n      textNode.setAttribute('text-anchor', 'start');\n      textNode.setAttribute('direction', 'rtl');\n      textNode.setAttribute('font-size', '14px');\n      textNode.setAttribute('x', 50);\n      textNode.setAttribute('y', 50);\n      textNode.textContent = 'ثعبان';\n\n      group.appendChild(textNode);\n      rtlTestSVG.appendChild(group);\n      body.appendChild(rtlTestSVG);\n\n      flippedTextAnchor = textNode.getBoundingClientRect().left < 50;\n      body.removeChild(rtlTestSVG);\n    }\n  }\n  detected = true;\n} */\n\nexport function flipTextAnchor(value, dir) {\n  if (dir === 'rtl') {\n    return textAnchorRTLMap[value];\n  }\n  return value;\n}\n","function diff(from, to) {\n  const added = [];\n  let items;\n  const removed = [];\n  const updatedNew = [];\n  const updatedOld = [];\n  let fromIds;\n  let toIds;\n  const idMapper = (a) => a.id;\n  const nodeMapper = (node, i) => {\n    let id;\n    if (typeof node === 'object') {\n      if ('id' in node) {\n        id = node.id;\n      } else {\n        id = i;\n      }\n    } else {\n      id = node;\n    }\n    return {\n      content: node,\n      id: `${id}__${node.type || ''}`,\n    };\n  };\n\n  if (!from.isTree) {\n    from = from.map(nodeMapper);\n  }\n\n  to = to.map(nodeMapper);\n\n  fromIds = from.map(idMapper);\n  toIds = to.map(idMapper);\n  // TODO - handle duplicate values\n\n  // added = to.filter( v => fromIds.indexOf( v.id ) < 0 );\n  // updatedNew = to.filter( v => fromIds.indexOf( v.id ) >= 0 );\n  // removed = from.filter( v => toIds.indexOf( v.id ) < 0 );\n  // updatedOld = from.filter( v => toIds.indexOf( v.id ) >= 0 );\n\n  for (let i = 0, len = to.length; i < len; i++) {\n    const idx = fromIds.indexOf(to[i].id);\n    if (idx === -1) {\n      added.push(to[i]);\n    } else {\n      updatedNew.push(to[i]);\n    }\n  }\n\n  for (let i = 0, len = from.length; i < len; i++) {\n    const idx = toIds.indexOf(from[i].id);\n    if (idx === -1) {\n      removed.push(from[i]);\n    } else {\n      updatedOld.push(from[i]);\n    }\n  }\n\n  for (let i = 0, len = added.length; i < len; i++) {\n    if (added[i].content.children) {\n      added[i].diff = diff([], added[i].content.children);\n      added[i].children = added[i].diff.updatedNew.concat(added[i].diff.added);\n      added[i].children.isTree = true;\n    }\n  }\n\n  for (let i = 0, len = updatedNew.length; i < len; i++) {\n    updatedNew[i].diff = diff(updatedOld[i].children || [], updatedNew[i].content.children || []);\n    updatedNew[i].object = updatedOld[i].object;\n    updatedNew[i].children = updatedNew[i].diff.items;\n  }\n\n  items = updatedNew.concat(added);\n\n  added.isTree = true;\n  removed.isTree = true;\n  updatedNew.isTree = true;\n  updatedOld.isTree = true;\n  items.isTree = true;\n\n  return {\n    added,\n    updatedNew,\n    updatedOld,\n    removed,\n    items,\n  };\n}\n\nfunction createNodes(nodes, parent, create) {\n  for (let i = 0, len = nodes.length; i < len; i++) {\n    nodes[i].object = create(nodes[i].content.type, parent);\n  }\n}\n\nfunction destroyNodes(nodes, destroy) {\n  for (let i = 0, len = nodes.length; i < len; i++) {\n    if (nodes[i].object !== null && typeof nodes[i].object !== 'undefined') {\n      destroy(nodes[i].object);\n      nodes[i].object = null;\n    }\n  }\n}\n\nfunction updateNodes(nodes, creator, maintainer, destroyer) {\n  let item;\n  for (let i = 0, len = nodes.length; i < len; i++) {\n    item = nodes[i];\n    if (item.object !== null && typeof item.object !== 'undefined') {\n      maintainer(item.object, item.content);\n      if (item.diff) {\n        createNodes(item.diff.added, item.object, creator);\n        destroyNodes(item.diff.removed, destroyer);\n        updateNodes(item.diff.items, creator, maintainer, destroyer);\n      }\n    }\n  }\n}\n\nfunction createTree(oldItems, newItems, root, creator, maintainer, destroyer) {\n  const d = diff(oldItems, newItems);\n\n  createNodes(d.added, root, creator);\n  destroyNodes(d.removed, destroyer);\n  updateNodes(d.items, creator, maintainer, destroyer);\n\n  return d.items;\n}\n\nexport { diff, createTree, destroyNodes, createNodes, updateNodes };\n","import { renderer, register } from './canvas-renderer';\nimport rect from './shapes/rect';\nimport circle from './shapes/circle';\nimport line from './shapes/line';\nimport text from './shapes/text';\nimport path from './shapes/path';\n\nregister('rect', rect);\nregister('circle', circle);\nregister('line', line);\nregister('path', path);\nregister('text', text);\n\nexport default renderer;\n\nexport function rendererComponent(picasso) {\n  picasso.renderer('canvas', renderer);\n}\n","export default function render(circle, { g, doFill, doStroke }) {\n  g.beginPath();\n  g.moveTo(circle.cx + circle.r, circle.cy);\n  g.arc(circle.cx, circle.cy, circle.r, 0, Math.PI * 2, false);\n  if (doFill) {\n    g.fill();\n  }\n  if (doStroke) {\n    g.stroke();\n  }\n}\n","export default function render(line, { g, doStroke }) {\n  g.beginPath();\n  g.moveTo(line.x1, line.y1);\n  g.lineTo(line.x2, line.y2);\n  if (doStroke) {\n    g.stroke();\n  }\n}\n","export default function render(path, { g, doStroke, doFill }) {\n  const p = new Path2D(path.d);\n  if (doFill) {\n    g.fill(p);\n  }\n  if (doStroke) {\n    g.stroke(p);\n  }\n}\n","import { ellipsText, measureText } from '../../../text-manipulation';\nimport baselineHeuristic from '../../../text-manipulation/baseline-heuristic';\nimport { detectTextDirection, flipTextAnchor } from '../../../../core/utils/rtl-util';\n\nexport default function render(t, { g, ellipsed }) {\n  const text = ellipsed || ellipsText(t, measureText);\n  g.font = `${t['font-size']} ${t['font-family']}`;\n\n  const dir = detectTextDirection(t.text);\n  if (g.canvas.dir !== dir) {\n    g.canvas.dir = dir;\n  }\n  const textAnchor = t['text-anchor'] === 'middle' ? 'center' : t['text-anchor'];\n  const textAlign = flipTextAnchor(textAnchor, g.canvas.dir);\n  if (textAlign && g.textAlign !== textAlign) {\n    g.textAlign = textAlign;\n  }\n\n  const bdy = baselineHeuristic(t);\n\n  g.fillText(text, t.x + t.dx, t.y + t.dy + bdy);\n}\n","import { ellipsText, measureText } from '../../text-manipulation';\nimport baselineHeuristic from '../../text-manipulation/baseline-heuristic';\nimport { detectTextDirection, flipTextAnchor } from '../../../core/utils/rtl-util';\n\nconst svgNs = 'http://www.w3.org/2000/svg';\n// const badValues = ['', NaN, 'NaN', undefined, null, false, true];\n\nconst creator = (type, parent) => {\n  if (!type || typeof type !== 'string') {\n    throw new Error(`Invalid type: ${type}`);\n  }\n\n  const el = parent.ownerDocument.createElementNS(svgNs, type === 'container' ? 'g' : type);\n\n  parent.appendChild(el);\n  return el;\n};\n\nconst destroyer = (el) => {\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n};\n\n// isValid - is a way to bring a more consistent rendering behaviour between SVG and canvas.\n// Where SVG would treat NaN values as 0, canvas would simple not render anything.\nconst isValid = (item) => {\n  switch (item.type) {\n    case 'circle':\n      return !isNaN(item.attrs.cx) && !isNaN(item.attrs.cy) && !isNaN(item.attrs.r);\n    case 'line':\n      return !isNaN(item.attrs.x1) && !isNaN(item.attrs.y1) && !isNaN(item.attrs.x2) && !isNaN(item.attrs.y2);\n    case 'rect':\n      return !isNaN(item.attrs.x) && !isNaN(item.attrs.y) && !isNaN(item.attrs.width) && !isNaN(item.attrs.height);\n    case 'text':\n      return !isNaN(item.attrs.x) && !isNaN(item.attrs.y);\n    default:\n      return true;\n  }\n};\n\nconst maintainer = (element, item) => {\n  if (isValid(item)) {\n    for (const attr in item.attrs) {\n      if (attr === 'stroke' && item.strokeReference) {\n        element.setAttribute('stroke', item.strokeReference);\n      } else if (attr === 'fill' && item.fillReference) {\n        element.setAttribute('fill', item.fillReference);\n      } else if (attr === 'text') {\n        element.setAttribute('style', 'white-space: pre');\n        element.textContent = item.ellipsed || ellipsText(item.attrs, measureText);\n        const dir = detectTextDirection(item.attrs.text);\n        if (dir === 'rtl') {\n          element.setAttribute('direction', 'rtl');\n          element.setAttribute('dir', 'rtl');\n          element.setAttribute('text-anchor', flipTextAnchor(element.getAttribute('text-anchor'), dir));\n        }\n      } else if (item.type === 'text' && (attr === 'dy' || attr === 'dominant-baseline')) {\n        const dy = +element.getAttribute(attr) || 0;\n        let val = 0;\n        if (attr === 'dominant-baseline') {\n          val = baselineHeuristic(item.attrs);\n        } else {\n          val = item.attrs[attr];\n        }\n        element.setAttribute('dy', val + dy);\n      } else if (item.type === 'text' && attr === 'title' && item.attrs.title) {\n        const t = element.ownerDocument.createElementNS(svgNs, 'title');\n        t.textContent = item.attrs.title;\n        element.appendChild(t);\n      } else {\n        element.setAttribute(attr, item.attrs[attr]);\n      }\n    }\n\n    if (typeof item.data === 'string' || typeof item.data === 'number' || typeof item.data === 'boolean') {\n      element.setAttribute('data', item.data);\n    } else if (typeof item.data === 'object' && item.data !== null) {\n      for (const d in item.data) {\n        if (typeof item.data[d] === 'string' || typeof item.data[d] === 'number' || typeof item.data[d] === 'boolean') {\n          element.setAttribute(`data-${d}`, item.data[d]);\n        }\n      }\n    }\n  }\n};\n\nexport { svgNs, creator, maintainer, destroyer };\n","import { createTree } from '../node-tree';\nimport { creator, maintainer, destroyer } from './svg-nodes';\n\nclass TreeItemRenderer {\n  /**\n   * Constructor\n   * @private\n   * @param  {TreeCreator} treeCreator - Function used to create the DOM tree..\n   * @param  {SVGCreator} nodeCreator - Function used to create nodes.\n   * @param  {SVGMaintainer} nodeMaintainer - Function used to update nodes.\n   * @param  {SVGDestroyer} nodeDestroyer - Function used to destroy nodes.\n   */\n  constructor(treeCreator, nodeCreator, nodeMaintainer, nodeDestroyer) {\n    this.create = treeCreator;\n    this.nodeCreator = nodeCreator;\n    this.nodeMaintainer = nodeMaintainer;\n    this.nodeDestroyer = nodeDestroyer;\n  }\n\n  render(newItems, root) {\n    return this.create([], newItems, root, this.nodeCreator, this.nodeMaintainer, this.nodeDestroyer);\n  }\n}\n\nfunction tree() {\n  return new TreeItemRenderer(createTree, creator, maintainer, destroyer);\n}\n\nexport { TreeItemRenderer as default, tree };\n\n/**\n * Create an SVGElement and attach to parent.\n * @private\n * @callback SVGCreator\n * @param {String} type - The type of element to create.\n * @param {SVGElement} parent - The parent element to append the new element to.\n * @return {SVGElement} The created element\n */\n\n/**\n * Update the element with content from item.\n * @private\n * @callback SVGMaintainer\n * @param {SVGElement} el - The element to update\n * @param {Object} item - The object to use as input for the update\n */\n\n/**\n * Detach element from its parent.\n * @private\n * @callback SVGDestroyer\n * @param {SVGElement} el - Element to destroy.\n */\n\n/**\n * Create, update and destroy nodes.\n * @private\n * @callback TreeCreator\n * @param {Object[]} existing - The existing items in the tree.\n * @param {Object[]} active - The new items to create the tree from.\n * @param {SVGCreator} creator - Function used to create nodes.\n * @param {SVGMaintainer} maintainer - Function used to update nodes.\n * @param {SVGDestroyer} destroyer - Function used to destroy nodes.\n */\n","/* eslint import/prefer-default-export: 0 */\n\n/**\n * Hash an object\n * Modified version of Java's HashCode function\n * Source: {@link http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/}\n * @ignore\n *\n * @param  {Object} item Item to hash\n * @return {String}      Unique hash id\n */\nexport function hashObject(item) {\n  let hash = 0;\n  let i;\n  let chr;\n  let len;\n\n  item = JSON.stringify(item);\n\n  if (item.length === 0) {\n    return hash;\n  }\n\n  for (i = 0, len = item.length; i < len; i++) {\n    chr = item.charCodeAt(i);\n    hash = (hash << 5) - hash + chr;\n    hash &= hash; // Convert to 32bit integer\n  }\n\n  return hash;\n}\n","import { tree as treeFactory } from './svg-tree';\nimport { svgNs } from './svg-nodes';\nimport sceneFactory from '../../../core/scene-graph/scene';\nimport { onLineBreak } from '../../text-manipulation';\n// import {\n//   resetGradients,\n//   onGradient,\n//   createDefsNode\n// } from './svg-gradient';\n\nimport gradienter from './svg-gradient';\nimport patternizer from './svg-pattern';\n\nimport createRendererBox from '../renderer-box';\nimport create from '../index';\nimport injectTextBoundsFn from '../../text-manipulation/inject-textbounds';\n\n/**\n * Create a new svg renderer\n * @typedef {function} svgRendererFactory\n * @param {function} [treeFactory] - Node tree factory\n * @param {string} [ns] - Namespace definition\n * @param {function} [sceneFn] - Scene factory\n * @returns {Renderer} A svg renderer instance\n */\nexport default function renderer(treeFn = treeFactory, ns = svgNs, sceneFn = sceneFactory) {\n  const tree = treeFn();\n  let el;\n  let group;\n  let hasChangedRect = false;\n  let rect = createRendererBox();\n  let scene;\n\n  const svg = create();\n\n  const defs = {\n    type: 'defs',\n    children: [],\n  };\n  const patterns = patternizer(defs.children);\n  const gradients = gradienter(defs.children);\n\n  svg.element = () => el;\n\n  svg.root = () => group;\n\n  svg.appendTo = (element) => {\n    if (!el) {\n      el = element.ownerDocument.createElementNS(ns, 'svg');\n      el.style.position = 'absolute';\n      el.style['-webkit-font-smoothing'] = 'antialiased';\n      el.style['-moz-osx-font-smoothing'] = 'antialiased';\n      el.style.pointerEvents = 'none';\n      el.setAttribute('xmlns', ns);\n      group = element.ownerDocument.createElementNS(ns, 'g');\n      group.style.pointerEvents = 'auto';\n      el.appendChild(group);\n    }\n\n    element.appendChild(el);\n\n    return el;\n  };\n\n  svg.render = (nodes) => {\n    if (!el) {\n      return false;\n    }\n\n    const scaleX = rect.scaleRatio.x;\n    const scaleY = rect.scaleRatio.y;\n\n    if (hasChangedRect) {\n      el.style.left = `${rect.computedPhysical.x}px`;\n      el.style.top = `${rect.computedPhysical.y}px`;\n      el.setAttribute('width', rect.computedPhysical.width);\n      el.setAttribute('height', rect.computedPhysical.height);\n    }\n\n    gradients.clear();\n    patterns.clear();\n    defs.children.length = 0;\n\n    const sceneContainer = {\n      type: 'container',\n      children: Array.isArray(nodes) ? [...nodes, defs] : nodes,\n      transform: rect.edgeBleed.bool\n        ? `translate(${rect.edgeBleed.left * scaleX}, ${rect.edgeBleed.top * scaleY})`\n        : '',\n    };\n\n    if (scaleX !== 1 || scaleY !== 1) {\n      sceneContainer.transform += `scale(${scaleX}, ${scaleY})`;\n    }\n\n    const newScene = sceneFn({\n      items: [sceneContainer],\n      on: {\n        create: [\n          (state) => {\n            state.node.fillReference = undefined;\n            state.node.strokeReference = undefined;\n          },\n          gradients.onCreate,\n          patterns.onCreate,\n          onLineBreak(svg.measureText),\n          injectTextBoundsFn(svg),\n        ],\n      },\n    });\n    const hasChangedScene = scene ? !newScene.equals(scene) : true;\n\n    const doRender = hasChangedRect || hasChangedScene;\n    if (doRender) {\n      svg.clear();\n      tree.render(newScene.children, group);\n    }\n\n    hasChangedRect = false;\n    scene = newScene;\n    return doRender;\n  };\n\n  svg.itemsAt = (input) => (scene ? scene.getItemsFrom(input) : []);\n\n  svg.findShapes = (selector) => (scene ? scene.findShapes(selector) : []);\n\n  svg.clear = () => {\n    if (!group) {\n      return svg;\n    }\n    scene = null;\n    const g = group.cloneNode(false);\n    el.replaceChild(g, group);\n    group = g;\n    return svg;\n  };\n\n  svg.destroy = () => {\n    // parentElement is not supported in IE11 for SVGElement.\n    if (el && el.parentNode) {\n      el.parentNode.removeChild(el);\n    }\n    el = null;\n    group = null;\n  };\n\n  svg.size = (opts) => {\n    if (opts) {\n      const newRect = createRendererBox(opts);\n\n      if (JSON.stringify(rect) !== JSON.stringify(newRect)) {\n        hasChangedRect = true;\n        rect = newRect;\n      }\n    }\n\n    return rect;\n  };\n\n  return svg;\n}\n\nexport function rendererComponent(picasso) {\n  picasso.renderer('svg', renderer);\n}\n","import { hashObject } from '../../../core/utils/crypto';\n\nexport default function patternizer(bucket, hasher = hashObject) {\n  let cache = {};\n  let uid = Date.now();\n  const p = {\n    onCreate(state) {\n      let inputs = {};\n\n      if (\n        state.node &&\n        typeof state.node.fill === 'object' &&\n        state.node.fill.type === 'pattern' &&\n        state.node.fill.shapes\n      ) {\n        inputs.fill = state.node.fill;\n      }\n      if (\n        state.node &&\n        typeof state.node.stroke === 'object' &&\n        state.node.stroke.type === 'pattern' &&\n        state.node.stroke.shapes\n      ) {\n        inputs.stroke = state.node.stroke;\n      }\n\n      Object.keys(inputs).forEach((key) => {\n        let url = '';\n        const input = inputs[key];\n        const patternHash = hasher(input);\n        const pnid = `picasso-pattern-${uid}-${patternHash}`;\n\n        if (typeof window !== 'undefined') {\n          url = window.location.href.split('#')[0];\n        }\n\n        if (!cache[patternHash]) {\n          const pn = {\n            patternUnits: 'userSpaceOnUse',\n            x: 0,\n            y: 0,\n            width: input.width,\n            height: input.height,\n            type: 'pattern',\n            id: pnid,\n            children: [],\n            fill: input.fill,\n          };\n\n          input.shapes.forEach((s) => {\n            pn.children.push(s);\n          });\n\n          bucket.push(pn);\n          cache[patternHash] = true;\n        }\n\n        state.node[`${key}Reference`] = `url('${url}#${pnid}')`;\n      });\n    },\n    clear() {\n      cache = {};\n    },\n  };\n\n  return p;\n}\n","import { degreesToPoints } from '../../../core/math/angles';\nimport { hashObject } from '../../../core/utils/crypto';\n\nexport default function gradienter(bucket, hasher = hashObject) {\n  let cache = {};\n  let uid = Date.now();\n\n  const p = {\n    getOrCreateGradient(item = {}, attr = 'fill', url = '') {\n      let gradientHash = hasher(item[attr]);\n      let gradientId = `picasso-gradient-${uid}-${gradientHash}`;\n\n      if (!cache[gradientHash]) {\n        let { orientation, degree, stops = [] } = item[attr];\n        let gradient = {};\n\n        if (degree === undefined) {\n          degree = 90;\n        }\n\n        // Default to linear\n        if (orientation === 'radial') {\n          gradient.type = 'radialGradient';\n        } else {\n          gradient = degreesToPoints(degree);\n          ['x1', 'x2', 'y1', 'y2'].forEach((c) => {\n            if (c in item[attr]) {\n              gradient[c] = item[attr][c];\n            }\n          });\n          gradient.type = 'linearGradient';\n        }\n\n        gradient.id = gradientId;\n        gradient.children = stops.map(({ offset, color, opacity }) => ({\n          type: 'stop',\n          offset: `${offset * 100}%`,\n          style: `stop-color:${color};stop-opacity:${typeof opacity !== 'undefined' ? opacity : 1}`,\n        }));\n\n        bucket.push(gradient);\n        cache[gradientHash] = gradientId;\n      }\n\n      return `url('${url}#${gradientId}')`;\n    },\n    onCreate(state) {\n      let url = '';\n      if (typeof window !== 'undefined') {\n        url = window.location.href.split('#')[0];\n      }\n\n      const item = state.node;\n      if (item.fill && typeof item.fill === 'object' && item.fill.type === 'gradient') {\n        item.fillReference = p.getOrCreateGradient(item, 'fill', url);\n      }\n\n      if (item.stroke && typeof item.stroke === 'object' && item.stroke.type === 'gradient') {\n        item.strokeReference = p.getOrCreateGradient(item, 'stroke', url);\n      }\n    },\n    clear() {\n      cache = {};\n    },\n  };\n\n  return p;\n}\n","var n,l,u,i,t,o,r={},f=[],e=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function c(n,l){for(var u in l)n[u]=l[u];return n}function s(n){var l=n.parentNode;l&&l.removeChild(n)}function a(n,l,u){var i,t,o,r=arguments,f={};for(o in l)\"key\"==o?i=l[o]:\"ref\"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o<arguments.length;o++)u.push(r[o]);if(null!=u&&(f.children=u),\"function\"==typeof n&&null!=n.defaultProps)for(o in n.defaultProps)void 0===f[o]&&(f[o]=n.defaultProps[o]);return v(n,f,i,t,null)}function v(l,u,i,t,o){var r={type:l,props:u,key:i,ref:t,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++n.__v:o};return null!=n.vnode&&n.vnode(r),r}function h(){return{current:null}}function y(n){return n.children}function p(n,l){this.props=n,this.context=l}function d(n,l){if(null==l)return n.__?d(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?d(n):null}function _(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return _(n)}}function k(l){(!l.__d&&(l.__d=!0)&&u.push(l)&&!b.__r++||t!==n.debounceRendering)&&((t=n.debounceRendering)||i)(b)}function b(){for(var n;b.__r=u.length;)n=u.sort(function(n,l){return n.__v.__b-l.__v.__b}),u=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=c({},t)).__v=t.__v+1,I(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?d(t):o,t.__h),T(u,t),t.__e!=o&&_(t)))})}function m(n,l,u,i,t,o,e,c,s,a){var h,p,_,k,b,m,w,A=i&&i.__k||f,P=A.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v(null,k,null,null,k):Array.isArray(k)?v(y,{children:k},null,null,null):k.__b>0?v(k.type,k.props,k.key,null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(_=A[h])||_&&k.key==_.key&&k.type===_.type)A[h]=void 0;else for(p=0;p<P;p++){if((_=A[p])&&k.key==_.key&&k.type===_.type){A[p]=void 0;break}_=null}I(n,k,_=_||r,t,o,e,c,s,a),b=k.__e,(p=k.ref)&&_.ref!=p&&(w||(w=[]),_.ref&&w.push(_.ref,null,k),w.push(p,k.__c||b,k)),null!=b?(null==m&&(m=b),\"function\"==typeof k.type&&null!=k.__k&&k.__k===_.__k?k.__d=s=g(k,s,n):s=x(n,k,_,A,b,s),a||\"option\"!==u.type?\"function\"==typeof u.type&&(u.__d=s):n.value=\"\"):s&&_.__e==s&&s.parentNode!=n&&(s=d(_))}for(u.__e=m,h=P;h--;)null!=A[h]&&(\"function\"==typeof u.type&&null!=A[h].__e&&A[h].__e==u.__d&&(u.__d=d(i,h+1)),L(A[h],A[h]));if(w)for(h=0;h<w.length;h++)z(w[h],w[++h],w[++h])}function g(n,l,u){var i,t;for(i=0;i<n.__k.length;i++)(t=n.__k[i])&&(t.__=n,l=\"function\"==typeof t.type?g(t,l,u):x(u,t,t,n.__k,t.__e,l));return l}function w(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){w(n,l)}):l.push(n)),l}function x(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function A(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||C(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||C(n,o,l[o],u[o],i)}function P(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||e.test(l)?u:u+\"px\"}function C(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||P(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||P(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?H:$,o):n.removeEventListener(l,o?H:$,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink[H:h]/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function $(l){this.l[l.type+!1](n.event?n.event(l):l)}function H(l){this.l[l.type+!0](n.event?n.event(l):l)}function I(l,u,i,t,o,r,f,e,s){var a,v,h,d,_,k,b,g,w,x,A,P=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(s=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=n.__b)&&a(u);try{n:if(\"function\"==typeof P){if(g=u.props,w=(a=P.contextType)&&t[a.__c],x=a?w?w.props.value:a.__:t,i.__c?b=(v=u.__c=i.__c).__=v.__E:(\"prototype\"in P&&P.prototype.render?u.__c=v=new P(g,x):(u.__c=v=new p(g,x),v.constructor=P,v.render=M),w&&w.sub(v),v.props=g,v.state||(v.state={}),v.context=x,v.__n=t,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=P.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=c({},v.__s)),c(v.__s,P.getDerivedStateFromProps(g,v.__s))),d=v.props,_=v.state,h)null==P.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else{if(null==P.getDerivedStateFromProps&&g!==d&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(g,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(g,v.__s,x)||u.__v===i.__v){v.props=g,v.state=v.__s,u.__v!==i.__v&&(v.__d=!1),v.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),v.__h.length&&f.push(v);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(g,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(d,_,k)})}v.context=x,v.props=g,v.state=v.__s,(a=n.__r)&&a(u),v.__d=!1,v.__v=u,v.__P=l,a=v.render(v.props,v.state,v.context),v.state=v.__s,null!=v.getChildContext&&(t=c(c({},t),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(k=v.getSnapshotBeforeUpdate(d,_)),A=null!=a&&a.type===y&&null==a.key?a.props.children:a,m(l,Array.isArray(A)?A:[A],u,i,t,o,r,f,e,s),v.base=u.__e,u.__h=null,v.__h.length&&f.push(v),b&&(v.__E=v.__=null),v.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=j(i.__e,u,i,t,o,r,f,s);(a=n.diffed)&&a(u)}catch(l){u.__v=null,(s||null!=r)&&(u.__e=e,u.__h=!!s,r[r.indexOf(e)]=null),n.__e(l,u,i)}}function T(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u)})}catch(l){n.__e(l,u.__v)}})}function j(n,l,u,i,t,o,e,c){var a,v,h,y,p=u.props,d=l.props,_=l.type,k=0;if(\"svg\"===_&&(t=!0),null!=o)for(;k<o.length;k++)if((a=o[k])&&(a===n||(_?a.localName==_:3==a.nodeType))){n=a,o[k]=null;break}if(null==n){if(null===_)return document.createTextNode(d);n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",_):document.createElement(_,d.is&&d),o=null,c=!1}if(null===_)p===d||c&&n.data===d||(n.data=d);else{if(o=o&&f.slice.call(n.childNodes),v=(p=u.props||r).dangerouslySetInnerHTML,h=d.dangerouslySetInnerHTML,!c){if(null!=o)for(p={},y=0;y<n.attributes.length;y++)p[n.attributes[y].name]=n.attributes[y].value;(h||v)&&(h&&(v&&h.__html==v.__html||h.__html===n.innerHTML)||(n.innerHTML=h&&h.__html||\"\"))}if(A(n,d,p,t,c),h)l.__k=[];else if(k=l.props.children,m(n,Array.isArray(k)?k:[k],l,u,i,t&&\"foreignObject\"!==_,o,e,n.firstChild,c),null!=o)for(k=o.length;k--;)null!=o[k]&&s(o[k]);c||(\"value\"in d&&void 0!==(k=d.value)&&(k!==n.value||\"progress\"===_&&!k)&&C(n,\"value\",k,p.value,!1),\"checked\"in d&&void 0!==(k=d.checked)&&k!==n.checked&&C(n,\"checked\",k,p.checked,!1))}return n}function z(l,u,i){try{\"function\"==typeof l?l(u):l.current=u}catch(l){n.__e(l,i)}}function L(l,u,i){var t,o,r;if(n.unmount&&n.unmount(l),(t=l.ref)&&(t.current&&t.current!==l.__e||z(t,null,u)),i||\"function\"==typeof l.type||(i=null!=(o=l.__e)),l.__e=l.__d=void 0,null!=(t=l.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(l){n.__e(l,u)}t.base=t.__P=null}if(t=l.__k)for(r=0;r<t.length;r++)t[r]&&L(t[r],u,i);null!=o&&s(o)}function M(n,l,u){return this.constructor(n,u)}function N(l,u,i){var t,o,e;n.__&&n.__(l,u),o=(t=\"function\"==typeof i)?null:i&&i.__k||u.__k,e=[],I(u,l=(!t&&i||u).__k=a(y,null,[l]),o||r,r,void 0!==u.ownerSVGElement,!t&&i?[i]:o?null:u.firstChild?f.slice.call(u.childNodes):null,e,!t&&i?i:o?o.__e:u.firstChild,t),T(e,l)}function O(n,l){N(n,l,O)}function S(n,l,u){var i,t,o,r=arguments,f=c({},n.props);for(o in l)\"key\"==o?i=l[o]:\"ref\"==o?t=l[o]:f[o]=l[o];if(arguments.length>3)for(u=[u],o=3;o<arguments.length;o++)u.push(r[o]);return null!=u&&(f.children=u),v(n.type,f,i||n.key,t||n.ref,null)}function q(n,l){var u={__c:l=\"__cC\"+o++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(k)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n},__v:0},l=function(n){return null!=n&&void 0===n.constructor},p.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=c({},this.state),\"function\"==typeof n&&(n=n(c({},u),this.props)),n&&c(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),k(this))},p.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),k(this))},p.prototype.render=y,u=[],i=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,b.__r=0,o=0;export{N as render,O as hydrate,a as createElement,a as h,y as Fragment,h as createRef,l as isValidElement,p as Component,S as cloneElement,q as createContext,w as toChildArray,n as options};\n//# sourceMappingURL=preact.module.js.map\n","import { h, render } from 'preact';\nimport createRendererBox from '../renderer-box';\nimport create from '../index';\n\nexport default function renderer(opts = {}) {\n  const { createElement = document.createElement.bind(document) } = opts;\n\n  let el;\n  let rect = createRendererBox();\n  let dNode;\n\n  const dom = create();\n\n  dom.element = () => el;\n\n  dom.root = () => el;\n\n  dom.appendTo = (element) => {\n    if (!el) {\n      el = createElement('div');\n      el.style.position = 'absolute';\n      el.style['-webkit-font-smoothing'] = 'antialiased';\n      el.style['-moz-osx-font-smoothing'] = 'antialiased';\n      el.style.pointerEvents = 'none';\n    }\n\n    element.appendChild(el);\n\n    return el;\n  };\n\n  dom.render = (nodes) => {\n    if (!el) {\n      return false;\n    }\n\n    el.style.left = `${rect.computedPhysical.x}px`;\n    el.style.top = `${rect.computedPhysical.y}px`;\n    el.style.width = `${rect.computedPhysical.width}px`;\n    el.style.height = `${rect.computedPhysical.height}px`;\n\n    let vNode;\n    if (Array.isArray(nodes)) {\n      vNode = <div>{nodes}</div>;\n    } else {\n      vNode = nodes;\n    }\n\n    dNode = render(vNode, el, dNode);\n\n    return true;\n  };\n\n  dom.renderArgs = [h]; // Arguments to render functions using the DOM renderer\n\n  dom.clear = () => {\n    if (el) {\n      let first = el.firstChild;\n\n      while (first) {\n        el.removeChild(first);\n        first = el.firstChild;\n      }\n      dNode = null;\n    }\n\n    return dom;\n  };\n\n  dom.destroy = () => {\n    if (el && el.parentElement) {\n      el.parentElement.removeChild(el);\n    }\n    el = null;\n    dNode = null;\n  };\n\n  dom.size = (inner) => {\n    if (inner) {\n      rect = createRendererBox(inner);\n    }\n    return rect;\n  };\n\n  return dom;\n}\n","import { rendererComponent as canvas } from '../web/renderer/canvas-renderer';\nimport { rendererComponent as svg } from '../web/renderer/svg-renderer/svg-renderer';\nimport { rendererComponent as dom } from '../web/renderer/dom-renderer';\n\nexport default [svg, canvas, dom];\n","import renderer from './dom-renderer';\n\nexport default renderer;\n\nexport function rendererComponent(picasso) {\n  picasso.renderer('dom', renderer);\n}\n","const LOG_LEVEL = {\n  OFF: 0,\n  ERROR: 1,\n  WARN: 2,\n  INFO: 3,\n  DEBUG: 4,\n};\n\nconst loggerFn = ({ level = LOG_LEVEL.OFF, pipe = console } = {}) => {\n  let currentlevel = level;\n\n  const LOG_FN = {\n    [LOG_LEVEL.OFF]: () => {},\n    [LOG_LEVEL.ERROR]: (...args) => pipe.error(...args),\n    [LOG_LEVEL.WARN]: (...args) => pipe.warn(...args),\n    [LOG_LEVEL.INFO]: (...args) => pipe.info(...args),\n    [LOG_LEVEL.DEBUG]: (...args) => pipe.log(...args),\n  };\n\n  const log = (lev, ...args) => {\n    if (!lev || currentlevel < lev) {\n      return;\n    }\n\n    (LOG_FN[lev] || LOG_FN[LOG_LEVEL.DEBUG])(...args);\n  };\n\n  /**\n   * @typedef {object} logger\n   * @private\n   */\n\n  return /** @lends logger */ {\n    /**\n     * Log a message\n     * @param {number} lev - The log level\n     * @param {...any} args\n     * @kind function\n     */\n    log,\n\n    /**\n     * Log an error message\n     * @param {...any} args\n     */\n    error: (...args) => log(LOG_LEVEL.ERROR, ...args),\n\n    /**\n     * Log a warning message\n     * @param {...any} args\n     */\n    warn: (...args) => log(LOG_LEVEL.WARN, ...args),\n\n    /**\n     * Log an info message\n     * @param {...any} args\n     */\n    info: (...args) => log(LOG_LEVEL.INFO, ...args),\n\n    /**\n     * Log a debug message\n     * @param {...any} args\n     */\n    debug: (...args) => log(LOG_LEVEL.DEBUG, ...args),\n\n    /**\n     * Set the current log level\n     * @param {number} lev - The log level\n     */\n    level: (lev) => {\n      if (typeof lev === 'number') {\n        currentlevel = lev;\n      }\n      return currentlevel;\n    },\n\n    LOG_LEVEL,\n  };\n};\n\nexport { loggerFn as default };\n","import 'path2d-polyfill';\nimport extend from 'extend';\nimport about from './about';\n\nimport { chart, renderer } from './core';\n\nimport { components, scales, renderers } from './api';\n\nimport componentRegistry from './core/component';\nimport dataRegistry from './core/data';\nimport formatterRegistry from './core/formatter';\nimport interactionRegistry from './core/interaction';\nimport scaleRegistry from './core/chart/scales';\nimport { symbolRegistry } from './core/symbols';\n\nimport loggerFn from './core/utils/logger';\nimport registry from './core/utils/registry';\n\nimport { style, palettes } from './core/theme/light';\n\nfunction usePlugin(plugin, options = {}, api) {\n  plugin(api, options);\n}\n\nfunction pic(config = {}, registries = {}) {\n  const logger = loggerFn(config.logger);\n\n  /**\n   * @lends picassojs\n   */\n  const regis = {\n    // -- registries --\n    /**\n     * Component registry\n     * @type {registry}\n     */\n    component: registry(registries.component, 'component', logger),\n    /**\n     * Data registry\n     * @type {registry}\n     */\n    data: registry(registries.data, 'data', logger),\n    /**\n     * Formatter registry\n     * @type {registry}\n     */\n    formatter: registry(registries.formatter, 'formatter', logger),\n    /**\n     * Interaction registry\n     * @type {registry}\n     */\n    interaction: registry(registries.interaction, 'interaction', logger),\n    /**\n     * Renderer registry\n     * @type {registry}\n     * @example\n     * const svgFactory = picassojs.renderer('svg');\n     * const svgRenderer = svgFactory();\n     */\n    renderer: renderer(registries.renderer, 'renderer', logger),\n    /**\n     * Scale registry\n     * @type {registry}\n     */\n    scale: registry(registries.scale, 'scale', logger),\n    /**\n     * Symbol registry\n     * @type {registry}\n     * @private\n     */\n    symbol: registry(registries.symbol, 'symbol', logger),\n    // -- misc --\n    /**\n     * log some some stuff\n     * @type {logger}\n     * @private\n     */\n    logger,\n  };\n\n  if (config.renderer && config.renderer.prio) {\n    regis.renderer.default(config.renderer.prio[0]);\n  }\n\n  /**\n   * picasso.js entry point\n   * @entry\n   * @alias picassojs\n   * @param {object} cfg\n   * @param {object} cfg.renderer\n   * @param {Array<string>} cfg.renderer.prio\n   * @param {object} cfg.logger\n   * @param {number} cfg.logger.level\n   * @param {object} cfg.style\n   * @param {Array<object>} cfg.palettes\n   * @returns {picassojs}\n   * @example\n   * import picasso from 'picasso.js';\n   *\n   * const configuredPicasso = picasso({ renderer: { prio: ['canvas'] } }) // All components will render using the canvas renderer\n   */\n  function picassojs(cfg = {}) {\n    let cc = {\n      palettes: config.palettes.concat(cfg.palettes || []),\n      style: extend({}, config.style, cfg.style),\n      logger: cfg.logger || config.logger,\n      renderer: cfg.renderer || config.renderer,\n    };\n    return pic(cc, regis);\n  }\n\n  /**\n   * @typedef {object} Registries\n   * @property {registry} component Component registry\n   * @property {registry} data Data registry\n   * @property {registry} formatter Formatter registry\n   * @property {registry} interaction Interaction registry\n   * @property {registry} renderer Renderer registry\n   * @property {registry} scale Scale registry\n   */\n\n  /**\n   * Callback function to register a plugin\n   * @callback plugin\n   * @param {Registries} registries\n   * @param {object} options\n   */\n\n  /**\n   * Plugin registry\n   * @param {plugin} plugin\n   * @param {object} [options]\n   */\n  picassojs.use = (plugin, options = {}) => usePlugin(plugin, options, regis);\n\n  /**\n   * @param {ChartDefinition} definition\n   * @returns {Chart}\n   * @example\n   * picasso.chart({\n    element: document.querySelector('#container'), // This is the element to render the chart in\n    data: [\n      {\n        type: 'matrix',\n        data: [\n          ['Month', 'Sales', 'Margin'],\n          ['Jan', 1106, 7],\n          ['Feb', 5444, 53],\n          ['Mar', 147, 64],\n          ['Apr', 7499, 47],\n          ['May', 430, 62],\n          ['June', 9735, 13],\n          ['July', 5832, 13],\n          ['Aug', 7435, 15],\n          ['Sep', 3467, 35],\n          ['Oct', 3554, 78],\n          ['Nov', 5633, 23],\n          ['Dec', 6354, 63],\n        ],\n      },\n    ],\n    settings: {\n      scales: {\n        x: { data: { field: 'Margin' } },\n        y: { data: { field: 'Sales' } },\n      },\n      components: [\n        {\n          // specify how to render the chart\n          type: 'axis',\n          scale: 'y',\n          layout: {\n            dock: 'left',\n          },\n        },\n        {\n          type: 'axis',\n          scale: 'x',\n          layout: {\n            dock: 'bottom',\n          },\n        },\n        {\n          type: 'point',\n          data: {\n            extract: {\n              field: 'Month',\n              props: {\n                x: { field: 'Margin' },\n                y: { field: 'Sales' },\n              },\n            },\n          },\n          settings: {\n            x: { scale: 'x' },\n            y: { scale: 'y' },\n            size: function () {\n              return Math.random();\n            },\n          },\n        },\n      ],\n    },\n  });\n   */\n  picassojs.chart = (definition) =>\n    chart(definition, {\n      registries: regis,\n      logger,\n      style: config.style,\n      palettes: config.palettes,\n    });\n  picassojs.config = () => config;\n\n  Object.keys(regis).forEach((key) => {\n    picassojs[key] = regis[key];\n  });\n\n  /**\n   * picasso.js version\n   * @type {string}\n   */\n  picassojs.version = about.version;\n\n  return picassojs;\n}\n\nconst p = pic(\n  {\n    renderer: {\n      prio: ['svg', 'canvas'],\n    },\n    logger: {\n      level: 0,\n    },\n    style,\n    palettes,\n  },\n  {\n    component: componentRegistry,\n    data: dataRegistry,\n    formatter: formatterRegistry,\n    interaction: interactionRegistry,\n    renderer: renderer(),\n    scale: scaleRegistry,\n    symbol: symbolRegistry,\n  }\n);\n\ncomponents.forEach(p.use);\nrenderers.forEach(p.use);\nscales.forEach(p.use);\n\nexport { p as default };\n","const palettes = [\n  {\n    key: 'categorical',\n    colors: [\n      [\n        '#a54343',\n        '#d76c6c',\n        '#ec983d',\n        '#ecc43d',\n        '#f9ec86',\n        '#cbe989',\n        '#70ba6e',\n        '#578b60',\n        '#79d69f',\n        '#26a0a7',\n        '#138185',\n        '#65d3da',\n      ], // breeze colors\n    ],\n  },\n  {\n    key: 'diverging',\n    colors: [\n      ['#3d52a1', '#3a89c9', '#77b7e5', '#b4ddf7', '#e6f5fe', '#ffe3aa', '#f9bd7e', '#ed875e', '#d24d3e', '#ae1c3e'],\n    ],\n  },\n  {\n    key: 'sequential',\n    colors: [['rgb(180,221,212)', 'rgb(34, 83, 90)']],\n  },\n];\n\n/* eslint quote-props: 0 */\nconst style = {\n  // -- FOUNDATION --\n  // fonts\n  '$font-family': \"'Source Sans Pro', Arial, sans-serif\",\n  '$font-size': '12px',\n  '$line-height': '16px',\n  '$font-size--l': '16px',\n\n  // base grays\n  '$gray-100': '#ffffff',\n  '$gray-98': '#f9f9f9',\n  '$gray-95': '#f2f2f2',\n  '$gray-90': '#e6e6e6',\n  '$gray-35': '#595959',\n  '$gray-30': '#4d4d4d',\n  '$gray-25': '#404040',\n  '$gray-20': '#333333',\n\n  // borders\n  '$border-95': 'rgba(255, 255, 255, 0.05)',\n  '$border-90': 'rgba(255, 255, 255, 0.1)',\n  '$border-80': 'rgba(255, 255, 255, 0.2)',\n  '$border-20': 'rgba(0, 0, 0, 0.2)',\n  '$border-10': 'rgba(0, 0, 0, 0.1)',\n  '$border-5': 'rgba(0, 0, 0, 0.05)',\n\n  // primary colors\n  '$primary-blue': '#3F8AB3',\n  '$primary-green': '#6CB33F',\n  '$primary-red': '#DC423F',\n  '$primary-orange': '#EF960F',\n\n  // spacing\n  '$spacing--s': 4,\n  $spacing: 8,\n  '$spacing--l': 12,\n  // -------------------------\n\n  // -- ALIASES --\n  '$font-color': '$gray-35',\n  '$font-color--inverted': '$gray-90',\n  '$guide-color': '$gray-90',\n  '$guide-color--inverted': '$gray-35',\n  $border: '$border-80',\n  '$border--inverted': '$border-10',\n  // -------------------------\n\n  // -- MIXINS --\n  // data points\n  $shape: {\n    // data shape\n    fill: '$primary-blue',\n    strokeWidth: 1,\n    stroke: '$border',\n  },\n\n  '$shape-outline': {\n    // data shape which usually does not have a fill, e.g. the line in a linechart\n    stroke: '$primary-blue',\n    strokeWidth: 2,\n  },\n\n  '$shape-guide': {\n    // lines that somehow belongs to a data shape, e.g. whiskers in a boxplot\n    stroke: '$guide-color',\n    strokeWidth: 1,\n  },\n\n  '$shape-guide--inverted': {\n    '@extend': '$shape-guide',\n    stroke: '$guide-color--inverted',\n  },\n\n  $label: {\n    fontSize: '$font-size',\n    fontFamily: '$font-family',\n    fill: '$font-color',\n  },\n\n  '$label--inverted': {\n    $extend: '$label',\n    fill: '$font-color--inverted',\n  },\n\n  // user interface\n  '$label-overlay': {\n    // e.g. selection range bubble\n    fontSize: '$font-size--l',\n    fontFamily: '$font-family',\n    fill: '$gray-100', // background fill\n    color: '$font-color',\n    stroke: '$guide-color--inverted',\n    strokeWidth: 1,\n    borderRadius: 4,\n  },\n\n  $title: {\n    '@extend': '$label',\n    fontSize: '$font-size--l',\n  },\n\n  '$guide-line': {\n    strokeWidth: 1,\n    stroke: '$guide-color',\n  },\n\n  '$guide-line--minor': {\n    strokeWidth: 1,\n    stroke: '$gray-95', // needs alias\n  },\n\n  '$padding--s': {\n    left: '$spacing--s',\n    right: '$spacing--s',\n    top: '$spacing--s',\n    bottom: '$spacing--s',\n  },\n\n  $padding: {\n    left: '$spacing',\n    right: '$spacing',\n    top: '$spacing',\n    bottom: '$spacing',\n  },\n\n  '$selection-area-target': {\n    fill: '$primary-green',\n    strokeWidth: 0,\n    opacity: 0.2,\n  },\n};\n\nexport { style, palettes };\n","export default [];\n"]}