diff --git a/hatchet/external/roundtrip/roundtrip/manager.py b/hatchet/external/roundtrip/roundtrip/manager.py
index 1b379732..59b6e681 100644
--- a/hatchet/external/roundtrip/roundtrip/manager.py
+++ b/hatchet/external/roundtrip/roundtrip/manager.py
@@ -482,7 +482,8 @@ def pass_to_js(
pass
# Patch: Ensure all ' and " are escaped
- data = data.replace('"', '\\"').replace("'", "\\'")
+ if data is not None:
+ data = data.replace('"', '\\"').replace("'", "\\'")
conv_spec = None
diff --git a/hatchet/vis/loader.py b/hatchet/vis/loader.py
index 7867b0af..ae795c74 100644
--- a/hatchet/vis/loader.py
+++ b/hatchet/vis/loader.py
@@ -32,13 +32,28 @@ def serialize(obj):
except ValueError:
raise "Input data is not of type graphframe or json serializable."
+def _pass_through(json_query):
+ return json_query
def _query_to_dict(json_query):
import json
+ return json.loads(json_query)
- return json_query
+def _to_js(data):
+ if data is None:
+ return "{}"
+ return data.to_json()
- return json.loads(json_query)
+def _selection_to_js(data):
+ if data is None:
+ return "{}"
+ return data['selection']
+
+def _from_js(data):
+ import json
+ import pandas as pd
+ data = json.loads(data)
+ return pd.DataFrame(data)
@magics_class
@@ -53,7 +68,53 @@ def cct(self, line):
RT.load_webpack(path.join(self.vis_dist, "cct_bundle.html"), cache=False)
RT.var_to_js(
- args[0], "hatchet_tree_def", watch=False, to_js_converter=_gf_to_json
+ args[0], "hatchet_tree_def", watch=True, to_js_converter=_gf_to_json
+ )
+
+ if(len(args) > 1):
+ RT.var_to_js(
+ args[1], "node_query", watch=True, from_js_converter=_query_to_dict
+ )
+
+ #secret configuration var
+ RT.var_to_js(
+ "?vis_state", "visualization_state", watch=True, from_js_converter=_query_to_dict
+ )
+
+ RT.initialize()
+
+ @line_magic
+ def table(self, line):
+ args = line.split(" ")
+
+ RT.load_webpack(path.join(self.vis_dist, "table_bundle.html"), cache=False)
+
+ self.shell.user_ns[args[0][1:]].drop_index_levels()
+ if(len(args) > 1 and self.shell.user_ns[args[1][1:]]):
+ self.shell.user_ns['df'] = self.shell.user_ns[args[0][1:]].filter(self.shell.user_ns[args[1][1:]]['selection']).dataframe
+ elif(len(args) == 1):
+ self.shell.user_ns['df'] = self.shell.user_ns[args[0][1:]].dataframe
+
+
+ RT.var_to_js(
+ 'df',
+ "table_src",
+ watch=True,
+ to_js_converter=_to_js
+ )
+
+ RT.var_to_js(
+ args[0],
+ "reload_watcher",
+ watch=True,
+ to_js_converter=_gf_to_json
+ )
+
+ RT.var_to_js(
+ args[1],
+ "query_watcher",
+ watch=True,
+ to_js_converter=_selection_to_js
)
RT.initialize()
@@ -62,7 +123,7 @@ def cct(self, line):
def cct_fetch_query(self, line):
args = line.split(" ")
- RT.fetch_data("jsNodeSelected", args[0], converter=_query_to_dict)
+ RT.fetch_data("jsNodeSelected", args[0], converter=_pass_through)
def load_ipython_extension(ipython):
diff --git a/hatchet/vis/scripts/cct/cct_controller.js b/hatchet/vis/scripts/cct/cct_controller.js
index 4ae47494..c5376ab6 100644
--- a/hatchet/vis/scripts/cct/cct_controller.js
+++ b/hatchet/vis/scripts/cct/cct_controller.js
@@ -23,9 +23,11 @@ class Controller{
break;
case (globals.signals.COLLAPSESUBTREE):
this.model.handleDoubleClick(evt.node);
+ this.model.storeSnapshotQuery();
break;
case(globals.signals.COMPOSEINTERNAL):
this.model.handleNodeComposition(evt.node);
+ this.model.storeSnapshotQuery();
break;
case(globals.signals.DECOMPOSENODE):
// this.model.handleNodeDecomposition(evt.node);
@@ -54,12 +56,15 @@ class Controller{
break;
case(globals.signals.REQUESTMASSPRUNE):
this.model.pruneTree(evt.threshold);
+ this.model.storeSnapshotQuery();
break;
case(globals.signals.RESETVIEW):
this.model.resetView();
break;
case(globals.signals.PRUNERANGEUPDATE):
this.model.updatePruneRange(evt.low, evt.high);
+ this.model.storeSnapshotQuery();
+
break;
case(globals.signals.SNAPSHOT):
this.model.storeSnapshotQuery();
diff --git a/hatchet/vis/scripts/cct/cct_model.js b/hatchet/vis/scripts/cct/cct_model.js
index 51518b39..de3b0f13 100644
--- a/hatchet/vis/scripts/cct/cct_model.js
+++ b/hatchet/vis/scripts/cct/cct_model.js
@@ -39,7 +39,16 @@ class Model{
};
//setup model
+ //secret vis state loading >:D
+
+
RT['jsNodeSelected'] = 'MATCH (\\"*\\")->(a) WHERE a.\\"name\\" IS NOT NONE';
+ if('node_query' in RT){
+ RT['node_query'] = JSON.stringify({'tree_state':'MATCH (\\"*\\")->(a) WHERE a.\\"name\\" IS NOT NONE', 'selection':''});
+ }
+ if("json_def" in RT){
+ let jsonTree = RT["json_def"]
+ }
let cleanTree = RT["hatchet_tree_def"];
let _forestData = JSON.parse(cleanTree);
this.forest = new Forest(_forestData);
@@ -53,6 +62,23 @@ class Model{
this.state.prune_range = {"low": Number.MAX_SAFE_INTEGER, "high": Number.MIN_SAFE_INTEGER};
//prunes away non-internal zero nodes
this.forest.initializePrunedTrees(this.state.primaryMetric);
+
+ console.log(RT['visualization_state'])
+ if(RT['visualization_state'] == '{}'){
+ RT['visualization_state'] = JSON.stringify({"primaryMetric": this.state.primaryMetric, "secondaryMetric": this.state.secondaryMetric});
+ } else {
+ let cached_state = JSON.parse(RT['visualization_state']);
+
+ console.log(cached_state.primaryMetric, this.forest.metricColumns);
+ //got to make sure the cached metric is present, otherwise default
+ if(this.forest.metricColumns.includes(cached_state.primaryMetric)){
+ this.state.primaryMetric = cached_state.primaryMetric;
+ }
+ if( this.forest.metricColumns.includes(cached_state.primaryMetric)){
+ this.state.secondaryMetric = cached_state.secondaryMetric;
+ }
+ }
+
}
// --------------------------------------------
@@ -144,8 +170,6 @@ class Model{
// let conditions = ''
-
-
// let queryStr = `MATCH (n)
// WHERE ${conditions}`;
@@ -352,12 +376,7 @@ class Model{
*/
this.state['selectedNodes'] = nodes;
this.updateTooltip(nodes);
-
- // if(nodes.length > 0 && nodes[0]){
- // RT['jsNodeSelected'] = JSON.stringify(this._printQuery(nodes));
- // } else {
- // RT['jsNodeSelected'] = JSON.stringify(["*"]);
- // }
+ this.storeSelectionQuery(nodes);
this._observers.notify();
}
@@ -557,7 +576,9 @@ class Model{
else if(source.includes("secondary")){
this.state.secondaryMetric = newMetric;
}
-
+
+ RT['visualization_state'] = JSON.stringify({"primaryMetric": this.state.primaryMetric, "secondaryMetric": this.state.secondaryMetric});
+
if(source.includes("primary")){
if(this.state.pruneEnabled){
this.forest.resetMutable();
@@ -571,6 +592,8 @@ class Model{
}
+
+
this._observers.notify();
}
@@ -668,8 +691,6 @@ class Model{
norms = norms.concat(aggs);
- console.log(norms);
-
let full_query = '';
//inclusive query
@@ -690,10 +711,8 @@ class Model{
}
}
-
full_query=`${path_query}`
-
if(this.data.removedNodes.length > 0){
//exclusive query
initial_flag = true;
@@ -712,9 +731,38 @@ class Model{
}
RT['jsNodeSelected'] = full_query;
+ if('node_query' in RT){
+ let existing = JSON.parse(RT['node_query']);
+ RT['node_query'] = JSON.stringify({'tree_state':full_query, 'selection':existing['selection']});
+ }
}
+ storeSelectionQuery(selectedNodes){
+ //query all nodes matching this nid
+ let path_query = `MATCH (n)`;
+ let initial_flag = true;
+ for(const node of selectedNodes){
+ if(initial_flag){
+ if(node.data.aggregate){
+ path_query += `WHERE n.\\"node_id\\" = ${node.data.prototype.data.metrics._hatchet_nid}`;
+ }
+ else{
+ path_query += `WHERE n.\\"node_id\\" = ${node.data.metrics._hatchet_nid}`;
+ }
+ initial_flag = false;
+ }
+ else{
+ path_query += ` OR n.\\"node_id\\" = ${node.data.metrics._hatchet_nid}`;
+ }
+ }
+
+ if('node_query' in RT){
+ let existing = JSON.parse(RT['node_query']);
+ RT['node_query'] = JSON.stringify({'tree_state':existing['tree_state'], 'selection':path_query});
+ }
+ }
+
}
diff --git a/hatchet/vis/scripts/cct/cct_scented_slider_popup.js b/hatchet/vis/scripts/cct/cct_scented_slider_popup.js
index 06d346a6..fbaadb14 100644
--- a/hatchet/vis/scripts/cct/cct_scented_slider_popup.js
+++ b/hatchet/vis/scripts/cct/cct_scented_slider_popup.js
@@ -378,6 +378,7 @@ class ScentedSliderPopup extends View{
this._svg.style('visibility', ()=>{
if(this.model.state.pruneEnabled) return 'visible';
+ self.options_dropdown.style('visibility', 'hidden');
return 'hidden';
});
@@ -522,6 +523,10 @@ class ScentedSliderPopup extends View{
*
*/
+
+ this.current_selection_text.text(this.model.state.primaryMetric);
+
+
this._svg.select('.selection-button')
.select('rect')
.attr('fill', ()=>{
@@ -531,7 +536,10 @@ class ScentedSliderPopup extends View{
else{
return 'rgba(100,100,200,1)';
}
- });
+ })
+ .attr('height', ()=>{return this.current_selection_text.node().getBBox().height+4})
+ .attr('width', ()=>{return this.current_selection_text.node().getBBox().width+10});
+
this._svg.select('.selection-button')
.select('text')
@@ -546,10 +554,7 @@ class ScentedSliderPopup extends View{
option_rects
.attr('width', max_option_width + 10);
-
-
- this.current_selection_text.text(this.model.state.primaryMetric);
-
+
this.hist_grp.select('.left-axis')
.transition()
.duration(globals.duration)
diff --git a/hatchet/vis/scripts/table.js b/hatchet/vis/scripts/table.js
new file mode 100644
index 00000000..14d6aa2d
--- /dev/null
+++ b/hatchet/vis/scripts/table.js
@@ -0,0 +1,58 @@
+import * as d3 from 'd3';
+import '../styles/table.css';
+
+let json = window.Roundtrip['table_src']
+let data = JSON.parse(json)
+
+console.log(data);
+
+var pivot = []
+for(let i of Object.keys(data[Object.keys(data)[0]])){
+ let row = {}
+ for(let key of Object.keys(data)){
+ row[key] = data[key][i];
+ }
+
+ pivot.push(row);
+}
+
+
+console.log(pivot);
+
+let table = d3.select(element)
+ .select('#table-area')
+ .append('table')
+ .attr('border', '1');
+
+
+table.append('tr')
+ .selectAll('.header')
+ .data(Object.keys(data))
+ .enter()
+ .append('th')
+ .attr('class', 'header')
+ .html(d=>d);
+
+
+let newrows = table.selectAll('.tbrow')
+ .data(pivot)
+ .enter()
+ .append('tr')
+ .attr('class', (d, i) => {
+ if(i % 2 == 0){
+ return 'tbrow';
+ }
+ else{
+ return 'tbrow alt';
+ }
+ });
+
+newrows.selectAll('.tbcells')
+ .data(d=>{return Object.values(d);})
+ .enter()
+ .append('td')
+ .attr('class', 'tbcells')
+ .html(d=>{return d;});
+
+
+
diff --git a/hatchet/vis/static/cct_bundle.html b/hatchet/vis/static/cct_bundle.html
index 426c626b..71eb157a 100644
--- a/hatchet/vis/static/cct_bundle.html
+++ b/hatchet/vis/static/cct_bundle.html
@@ -1 +1 @@
-
Webpack App
\ No newline at end of file
+Webpack App
\ No newline at end of file
diff --git a/hatchet/vis/static/cct_bundle.js b/hatchet/vis/static/cct_bundle.js
index 912ac507..b8bc0c9a 100644
--- a/hatchet/vis/static/cct_bundle.js
+++ b/hatchet/vis/static/cct_bundle.js
@@ -16369,7 +16369,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -16406,11 +16406,15 @@ var Controller = /*#__PURE__*/function () {
case globals.signals.COLLAPSESUBTREE:
_this.model.handleDoubleClick(evt.node);
+ _this.model.storeSnapshotQuery();
+
break;
case globals.signals.COMPOSEINTERNAL:
_this.model.handleNodeComposition(evt.node);
+ _this.model.storeSnapshotQuery();
+
break;
case globals.signals.DECOMPOSENODE:
@@ -16456,6 +16460,8 @@ var Controller = /*#__PURE__*/function () {
case globals.signals.REQUESTMASSPRUNE:
_this.model.pruneTree(evt.threshold);
+ _this.model.storeSnapshotQuery();
+
break;
case globals.signals.RESETVIEW:
@@ -16466,6 +16472,8 @@ var Controller = /*#__PURE__*/function () {
case globals.signals.PRUNERANGEUPDATE:
_this.model.updatePruneRange(evt.low, evt.high);
+ _this.model.storeSnapshotQuery();
+
break;
case globals.signals.SNAPSHOT:
@@ -16500,18 +16508,35 @@ function ascending(a, b) {
return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
+;// CONCATENATED MODULE: ./node_modules/d3-array/src/descending.js
+function descending(a, b) {
+ return a == null || b == null ? NaN
+ : b < a ? -1
+ : b > a ? 1
+ : b >= a ? 0
+ : NaN;
+}
+
;// CONCATENATED MODULE: ./node_modules/d3-array/src/bisector.js
+
function bisector(f) {
- let delta = f;
- let compare1 = f;
- let compare2 = f;
+ let compare1, compare2, delta;
+ // If an accessor is specified, promote it to a comparator. In this case we
+ // can test whether the search value is (self-) comparable. We can’t do this
+ // for a comparator (except for specific, known comparators) because we can’t
+ // tell if the comparator is symmetric, and an asymmetric comparator can’t be
+ // used to test whether a single value is comparable.
if (f.length !== 2) {
- delta = (d, x) => f(d) - x;
compare1 = ascending;
compare2 = (d, x) => ascending(f(d), x);
+ delta = (d, x) => f(d) - x;
+ } else {
+ compare1 = f === ascending || f === descending ? f : zero;
+ compare2 = f;
+ delta = f;
}
function left(a, x, lo = 0, hi = a.length) {
@@ -16546,6 +16571,10 @@ function bisector(f) {
return {left, center, right};
}
+function zero() {
+ return 0;
+}
+
;// CONCATENATED MODULE: ./node_modules/d3-array/src/number.js
function number(x) {
return x === null ? NaN : +x;
@@ -16744,6 +16773,7 @@ function bin() {
var i,
n = data.length,
x,
+ step,
values = new Array(n);
for (i = 0; i < n; ++i) {
@@ -16762,6 +16792,11 @@ function bin() {
if (domain === extent) [x0, x1] = nice(x0, x1, tn);
tz = ticks(x0, x1, tn);
+ // If the domain is aligned with the first tick (which it will by
+ // default), then we can use quantization rather than bisection to bin
+ // values, which is substantially faster.
+ if (tz[0] <= x0) step = tickIncrement(x0, x1, tn);
+
// If the last threshold is coincident with the domain’s upper bound, the
// last bin will be zero-width. If the default domain is used, and this
// last threshold is coincident with the maximum input value, we can
@@ -16801,10 +16836,26 @@ function bin() {
}
// Assign data to bins by value, ignoring any outside the domain.
- for (i = 0; i < n; ++i) {
- x = values[i];
- if (x != null && x0 <= x && x <= x1) {
- bins[bisect(tz, x, 0, m)].push(data[i]);
+ if (isFinite(step)) {
+ if (step > 0) {
+ for (i = 0; i < n; ++i) {
+ if ((x = values[i]) != null && x0 <= x && x <= x1) {
+ bins[Math.min(m, Math.floor((x - x0) / step))].push(data[i]);
+ }
+ }
+ } else if (step < 0) {
+ for (i = 0; i < n; ++i) {
+ if ((x = values[i]) != null && x0 <= x && x <= x1) {
+ const j = Math.floor((x0 - x) * step);
+ bins[Math.min(m, j + (tz[j] <= x))].push(data[i]); // handle off-by-one due to rounding
+ }
+ }
+ }
+ } else {
+ for (i = 0; i < n; ++i) {
+ if ((x = values[i]) != null && x0 <= x && x <= x1) {
+ bins[bisect(tz, x, 0, m)].push(data[i]);
+ }
}
}
@@ -16831,7 +16882,7 @@ function cct_stats_classCallCheck(instance, Constructor) { if (!(instance instan
function cct_stats_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_stats_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_stats_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_stats_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_stats_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_stats_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_stats_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
var Stats = /*#__PURE__*/function () {
function Stats() {
@@ -17154,7 +17205,7 @@ Node.prototype = hierarchy_hierarchy.prototype = {
};
;// CONCATENATED MODULE: ./scripts/cct/cct_repr.js
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
@@ -17166,7 +17217,7 @@ function cct_repr_classCallCheck(instance, Constructor) { if (!(instance instanc
function cct_repr_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_repr_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_repr_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_repr_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_repr_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_repr_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_repr_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
/**
* Description: Contains the core forest data stucture.
@@ -19542,15 +19593,15 @@ var darker = 0.7;
var brighter = 1 / darker;
var reI = "\\s*([+-]?\\d+)\\s*",
- reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
- reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
+ reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",
+ reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
reHex = /^#([0-9a-f]{3,8})$/,
- reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
- reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
- reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
- reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
- reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
- reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
+ reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`),
+ reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`),
+ reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`),
+ reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`),
+ reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`),
+ reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
var named = {
aliceblue: 0xf0f8ff,
@@ -19704,14 +19755,15 @@ var named = {
};
src_define(Color, color, {
- copy: function(channels) {
+ copy(channels) {
return Object.assign(new this.constructor, this, channels);
},
- displayable: function() {
+ displayable() {
return this.rgb().displayable();
},
hex: color_formatHex, // Deprecated! Use color.formatHex.
formatHex: color_formatHex,
+ formatHex8: color_formatHex8,
formatHsl: color_formatHsl,
formatRgb: color_formatRgb,
toString: color_formatRgb
@@ -19721,6 +19773,10 @@ function color_formatHex() {
return this.rgb().formatHex();
}
+function color_formatHex8() {
+ return this.rgb().formatHex8();
+}
+
function color_formatHsl() {
return hslConvert(this).formatHsl();
}
@@ -19776,18 +19832,21 @@ function Rgb(r, g, b, opacity) {
}
src_define(Rgb, color_rgb, extend(Color, {
- brighter: function(k) {
+ brighter(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
- darker: function(k) {
+ darker(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
- rgb: function() {
+ rgb() {
return this;
},
- displayable: function() {
+ clamp() {
+ return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
+ },
+ displayable() {
return (-0.5 <= this.r && this.r < 255.5)
&& (-0.5 <= this.g && this.g < 255.5)
&& (-0.5 <= this.b && this.b < 255.5)
@@ -19795,25 +19854,34 @@ src_define(Rgb, color_rgb, extend(Color, {
},
hex: rgb_formatHex, // Deprecated! Use color.formatHex.
formatHex: rgb_formatHex,
+ formatHex8: rgb_formatHex8,
formatRgb: rgb_formatRgb,
toString: rgb_formatRgb
}));
function rgb_formatHex() {
- return "#" + hex(this.r) + hex(this.g) + hex(this.b);
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
+}
+
+function rgb_formatHex8() {
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
}
function rgb_formatRgb() {
- var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
- return (a === 1 ? "rgb(" : "rgba(")
- + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
- + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
- + Math.max(0, Math.min(255, Math.round(this.b) || 0))
- + (a === 1 ? ")" : ", " + a + ")");
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
+}
+
+function clampa(opacity) {
+ return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
+}
+
+function clampi(value) {
+ return Math.max(0, Math.min(255, Math.round(value) || 0));
}
function hex(value) {
- value = Math.max(0, Math.min(255, Math.round(value) || 0));
+ value = clampi(value);
return (value < 16 ? "0" : "") + value.toString(16);
}
@@ -19862,15 +19930,15 @@ function Hsl(h, s, l, opacity) {
}
src_define(Hsl, hsl, extend(Color, {
- brighter: function(k) {
+ brighter(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
- darker: function(k) {
+ darker(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
- rgb: function() {
+ rgb() {
var h = this.h % 360 + (this.h < 0) * 360,
s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
l = this.l,
@@ -19883,21 +19951,29 @@ src_define(Hsl, hsl, extend(Color, {
this.opacity
);
},
- displayable: function() {
+ clamp() {
+ return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
+ },
+ displayable() {
return (0 <= this.s && this.s <= 1 || isNaN(this.s))
&& (0 <= this.l && this.l <= 1)
&& (0 <= this.opacity && this.opacity <= 1);
},
- formatHsl: function() {
- var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
- return (a === 1 ? "hsl(" : "hsla(")
- + (this.h || 0) + ", "
- + (this.s || 0) * 100 + "%, "
- + (this.l || 0) * 100 + "%"
- + (a === 1 ? ")" : ", " + a + ")");
+ formatHsl() {
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
}
}));
+function clamph(value) {
+ value = (value || 0) % 360;
+ return value < 0 ? value + 360 : value;
+}
+
+function clampt(value) {
+ return Math.max(0, Math.min(1, value || 0));
+}
+
/* From FvD 13.37, CSS Color Module Level 3 */
function hsl2rgb(h, m1, m2) {
return (h < 60 ? m1 + (m2 - m1) * h / 60
@@ -20039,7 +20115,7 @@ var rgbBasisClosed = rgbSpline(basisClosed);
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
reB = new RegExp(reA.source, "g");
-function zero(b) {
+function string_zero(b) {
return function() {
return b;
};
@@ -20092,7 +20168,7 @@ function one(b) {
// Otherwise, interpolate each of the numbers and rejoin the string.
return s.length < 2 ? (q[0]
? one(q[0].x)
- : zero(b))
+ : string_zero(b))
: (b = q.length, function(t) {
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
return s.join("");
@@ -22002,7 +22078,7 @@ function cct_model_classCallCheck(instance, Constructor) { if (!(instance instan
function cct_model_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_model_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_model_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_model_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_model_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_model_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_model_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -22043,8 +22119,21 @@ var Model = /*#__PURE__*/function () {
"pruneEnabled": false,
"metricUpdated": true
}; //setup model
+ //secret vis state loading >:D
RT.jsNodeSelected = 'MATCH (\\"*\\")->(a) WHERE a.\\"name\\" IS NOT NONE';
+
+ if ("node_query" in RT) {
+ RT.node_query = JSON.stringify({
+ 'tree_state': 'MATCH (\\"*\\")->(a) WHERE a.\\"name\\" IS NOT NONE',
+ 'selection': ''
+ });
+ }
+
+ if ("json_def" in RT) {
+ var jsonTree = RT.json_def;
+ }
+
var cleanTree = RT.hatchet_tree_def;
var _forestData = JSON.parse(cleanTree);
@@ -22062,6 +22151,25 @@ var Model = /*#__PURE__*/function () {
}; //prunes away non-internal zero nodes
this.forest.initializePrunedTrees(this.state.primaryMetric);
+ console.log(RT.visualization_state);
+
+ if (RT.visualization_state == '{}') {
+ RT.visualization_state = JSON.stringify({
+ "primaryMetric": this.state.primaryMetric,
+ "secondaryMetric": this.state.secondaryMetric
+ });
+ } else {
+ var cached_state = JSON.parse(RT.visualization_state);
+ console.log(cached_state.primaryMetric, this.forest.metricColumns); //got to make sure the cached metric is present, otherwise default
+
+ if (this.forest.metricColumns.includes(cached_state.primaryMetric)) {
+ this.state.primaryMetric = cached_state.primaryMetric;
+ }
+
+ if (this.forest.metricColumns.includes(cached_state.primaryMetric)) {
+ this.state.secondaryMetric = cached_state.secondaryMetric;
+ }
+ }
} // --------------------------------------------
// Node selection helper functions
// --------------------------------------------
@@ -22413,11 +22521,8 @@ var Model = /*#__PURE__*/function () {
* @param {Array} nodes - A list of selected nodes
*/
this.state['selectedNodes'] = nodes;
- this.updateTooltip(nodes); // if(nodes.length > 0 && nodes[0]){
- // RT['jsNodeSelected'] = JSON.stringify(this._printQuery(nodes));
- // } else {
- // RT['jsNodeSelected'] = JSON.stringify(["*"]);
- // }
+ this.updateTooltip(nodes);
+ this.storeSelectionQuery(nodes);
this._observers.notify();
}
@@ -22665,6 +22770,11 @@ var Model = /*#__PURE__*/function () {
this.state.secondaryMetric = newMetric;
}
+ RT.visualization_state = JSON.stringify({
+ "primaryMetric": this.state.primaryMetric,
+ "secondaryMetric": this.state.secondaryMetric
+ });
+
if (source.includes("primary")) {
if (this.state.pruneEnabled) {
this.forest.resetMutable();
@@ -22794,7 +22904,6 @@ var Model = /*#__PURE__*/function () {
return n.data.aggregate;
});
norms = norms.concat(aggs);
- console.log(norms);
var full_query = ''; //inclusive query
var path_query = "MATCH (\\\"*\\\")->(n) ";
@@ -22856,6 +22965,54 @@ var Model = /*#__PURE__*/function () {
}
RT.jsNodeSelected = full_query;
+
+ if ("node_query" in RT) {
+ var existing = JSON.parse(RT.node_query);
+ RT.node_query = JSON.stringify({
+ 'tree_state': full_query,
+ 'selection': existing['selection']
+ });
+ }
+ }
+ }, {
+ key: "storeSelectionQuery",
+ value: function storeSelectionQuery(selectedNodes) {
+ //query all nodes matching this nid
+ var path_query = "MATCH (n)";
+ var initial_flag = true;
+
+ var _iterator10 = cct_model_createForOfIteratorHelper(selectedNodes),
+ _step10;
+
+ try {
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
+ var node = _step10.value;
+
+ if (initial_flag) {
+ if (node.data.aggregate) {
+ path_query += "WHERE n.\\\"node_id\\\" = ".concat(node.data.prototype.data.metrics._hatchet_nid);
+ } else {
+ path_query += "WHERE n.\\\"node_id\\\" = ".concat(node.data.metrics._hatchet_nid);
+ }
+
+ initial_flag = false;
+ } else {
+ path_query += " OR n.\\\"node_id\\\" = ".concat(node.data.metrics._hatchet_nid);
+ }
+ }
+ } catch (err) {
+ _iterator10.e(err);
+ } finally {
+ _iterator10.f();
+ }
+
+ if ("node_query" in RT) {
+ var existing = JSON.parse(RT.node_query);
+ RT.node_query = JSON.stringify({
+ 'tree_state': existing['tree_state'],
+ 'selection': path_query
+ });
+ }
}
}]);
@@ -22868,7 +23025,7 @@ function view_classCallCheck(instance, Constructor) { if (!(instance instanceof
function view_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function view_createClass(Constructor, protoProps, staticProps) { if (protoProps) view_defineProperties(Constructor.prototype, protoProps); if (staticProps) view_defineProperties(Constructor, staticProps); return Constructor; }
+function view_createClass(Constructor, protoProps, staticProps) { if (protoProps) view_defineProperties(Constructor.prototype, protoProps); if (staticProps) view_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -22906,7 +23063,7 @@ var View = /*#__PURE__*/function () {
/* harmony default export */ const view = (View);
;// CONCATENATED MODULE: ./scripts/cct/cct_menu_view.js
-function cct_menu_view_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { cct_menu_view_typeof = function _typeof(obj) { return typeof obj; }; } else { cct_menu_view_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return cct_menu_view_typeof(obj); }
+function cct_menu_view_typeof(obj) { "@babel/helpers - typeof"; return cct_menu_view_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, cct_menu_view_typeof(obj); }
function cct_menu_view_createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = cct_menu_view_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
@@ -22918,11 +23075,11 @@ function cct_menu_view_classCallCheck(instance, Constructor) { if (!(instance in
function cct_menu_view_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_menu_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_menu_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_menu_view_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_menu_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_menu_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_menu_view_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
@@ -22932,7 +23089,7 @@ function _assertThisInitialized(self) { if (self === void 0) { throw new Referen
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
@@ -23368,7 +23525,7 @@ function cct_color_manager_classCallCheck(instance, Constructor) { if (!(instanc
function cct_color_manager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_color_manager_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_color_manager_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_color_manager_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_color_manager_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_color_manager_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_color_manager_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -23643,17 +23800,17 @@ var makeColorManager = function makeColorManager(model) {
/* harmony default export */ const cct_color_manager = (ColorManager);
;// CONCATENATED MODULE: ./scripts/cct/cct_chart_view.js
-function cct_chart_view_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { cct_chart_view_typeof = function _typeof(obj) { return typeof obj; }; } else { cct_chart_view_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return cct_chart_view_typeof(obj); }
+function cct_chart_view_typeof(obj) { "@babel/helpers - typeof"; return cct_chart_view_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, cct_chart_view_typeof(obj); }
function cct_chart_view_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function cct_chart_view_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_chart_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_chart_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_chart_view_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_chart_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_chart_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_chart_view_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-function cct_chart_view_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) cct_chart_view_setPrototypeOf(subClass, superClass); }
+function cct_chart_view_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) cct_chart_view_setPrototypeOf(subClass, superClass); }
-function cct_chart_view_setPrototypeOf(o, p) { cct_chart_view_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_chart_view_setPrototypeOf(o, p); }
+function cct_chart_view_setPrototypeOf(o, p) { cct_chart_view_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_chart_view_setPrototypeOf(o, p); }
function cct_chart_view_createSuper(Derived) { var hasNativeReflectConstruct = cct_chart_view_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = cct_chart_view_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = cct_chart_view_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return cct_chart_view_possibleConstructorReturn(this, result); }; }
@@ -23663,7 +23820,7 @@ function cct_chart_view_assertThisInitialized(self) { if (self === void 0) { thr
function cct_chart_view_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-function cct_chart_view_getPrototypeOf(o) { cct_chart_view_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_chart_view_getPrototypeOf(o); }
+function cct_chart_view_getPrototypeOf(o) { cct_chart_view_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_chart_view_getPrototypeOf(o); }
@@ -24570,17 +24727,17 @@ var ChartView = /*#__PURE__*/function (_View2) {
/* harmony default export */ const cct_chart_view = (ChartView);
;// CONCATENATED MODULE: ./scripts/cct/cct_tooltip_view.js
-function cct_tooltip_view_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { cct_tooltip_view_typeof = function _typeof(obj) { return typeof obj; }; } else { cct_tooltip_view_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return cct_tooltip_view_typeof(obj); }
+function cct_tooltip_view_typeof(obj) { "@babel/helpers - typeof"; return cct_tooltip_view_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, cct_tooltip_view_typeof(obj); }
function cct_tooltip_view_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function cct_tooltip_view_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_tooltip_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_tooltip_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_tooltip_view_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_tooltip_view_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_tooltip_view_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_tooltip_view_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-function cct_tooltip_view_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) cct_tooltip_view_setPrototypeOf(subClass, superClass); }
+function cct_tooltip_view_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) cct_tooltip_view_setPrototypeOf(subClass, superClass); }
-function cct_tooltip_view_setPrototypeOf(o, p) { cct_tooltip_view_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_tooltip_view_setPrototypeOf(o, p); }
+function cct_tooltip_view_setPrototypeOf(o, p) { cct_tooltip_view_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_tooltip_view_setPrototypeOf(o, p); }
function cct_tooltip_view_createSuper(Derived) { var hasNativeReflectConstruct = cct_tooltip_view_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = cct_tooltip_view_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = cct_tooltip_view_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return cct_tooltip_view_possibleConstructorReturn(this, result); }; }
@@ -24590,7 +24747,7 @@ function cct_tooltip_view_assertThisInitialized(self) { if (self === void 0) { t
function cct_tooltip_view_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-function cct_tooltip_view_getPrototypeOf(o) { cct_tooltip_view_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_tooltip_view_getPrototypeOf(o); }
+function cct_tooltip_view_getPrototypeOf(o) { cct_tooltip_view_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_tooltip_view_getPrototypeOf(o); }
@@ -24636,17 +24793,17 @@ var TooltipView = /*#__PURE__*/function (_View) {
/* harmony default export */ const cct_tooltip_view = (TooltipView);
;// CONCATENATED MODULE: ./scripts/cct/cct_scented_slider_popup.js
-function cct_scented_slider_popup_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { cct_scented_slider_popup_typeof = function _typeof(obj) { return typeof obj; }; } else { cct_scented_slider_popup_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return cct_scented_slider_popup_typeof(obj); }
+function cct_scented_slider_popup_typeof(obj) { "@babel/helpers - typeof"; return cct_scented_slider_popup_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, cct_scented_slider_popup_typeof(obj); }
function cct_scented_slider_popup_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function cct_scented_slider_popup_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-function cct_scented_slider_popup_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_scented_slider_popup_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_scented_slider_popup_defineProperties(Constructor, staticProps); return Constructor; }
+function cct_scented_slider_popup_createClass(Constructor, protoProps, staticProps) { if (protoProps) cct_scented_slider_popup_defineProperties(Constructor.prototype, protoProps); if (staticProps) cct_scented_slider_popup_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-function cct_scented_slider_popup_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) cct_scented_slider_popup_setPrototypeOf(subClass, superClass); }
+function cct_scented_slider_popup_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) cct_scented_slider_popup_setPrototypeOf(subClass, superClass); }
-function cct_scented_slider_popup_setPrototypeOf(o, p) { cct_scented_slider_popup_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_scented_slider_popup_setPrototypeOf(o, p); }
+function cct_scented_slider_popup_setPrototypeOf(o, p) { cct_scented_slider_popup_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return cct_scented_slider_popup_setPrototypeOf(o, p); }
function cct_scented_slider_popup_createSuper(Derived) { var hasNativeReflectConstruct = cct_scented_slider_popup_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = cct_scented_slider_popup_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = cct_scented_slider_popup_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return cct_scented_slider_popup_possibleConstructorReturn(this, result); }; }
@@ -24656,7 +24813,7 @@ function cct_scented_slider_popup_assertThisInitialized(self) { if (self === voi
function cct_scented_slider_popup_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-function cct_scented_slider_popup_getPrototypeOf(o) { cct_scented_slider_popup_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_scented_slider_popup_getPrototypeOf(o); }
+function cct_scented_slider_popup_getPrototypeOf(o) { cct_scented_slider_popup_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return cct_scented_slider_popup_getPrototypeOf(o); }
@@ -24932,6 +25089,7 @@ var ScentedSliderPopup = /*#__PURE__*/function (_View) {
this._svg.style('visibility', function () {
if (_this4.model.state.pruneEnabled) return 'visible';
+ self.options_dropdown.style('visibility', 'hidden');
return 'hidden';
});
@@ -25030,12 +25188,18 @@ var ScentedSliderPopup = /*#__PURE__*/function (_View) {
*
*/
+ this.current_selection_text.text(this.model.state.primaryMetric);
+
this._svg.select('.selection-button').select('rect').attr('fill', function () {
if (!self.dropdown_clicked) {
return 'rgba(255,255,255,1)';
} else {
return 'rgba(100,100,200,1)';
}
+ }).attr('height', function () {
+ return _this4.current_selection_text.node().getBBox().height + 4;
+ }).attr('width', function () {
+ return _this4.current_selection_text.node().getBBox().width + 10;
});
this._svg.select('.selection-button').select('text').attr('fill', function () {
@@ -25047,7 +25211,6 @@ var ScentedSliderPopup = /*#__PURE__*/function (_View) {
});
option_rects.attr('width', max_option_width + 10);
- this.current_selection_text.text(this.model.state.primaryMetric);
this.hist_grp.select('.left-axis').transition().duration(globals.duration).call(build_d3.axisLeft(this.invert_y_scale).ticks(4));
this.hist_grp.select('.left-ice-axis').transition().duration(globals.duration).call(build_d3.axisLeft(this.i_y_scale).ticks(4));
bars.attr('fill', function (_, i) {
diff --git a/hatchet/vis/static/table_bundle.html b/hatchet/vis/static/table_bundle.html
new file mode 100644
index 00000000..11586ac6
--- /dev/null
+++ b/hatchet/vis/static/table_bundle.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/hatchet/vis/static/table_bundle.js b/hatchet/vis/static/table_bundle.js
new file mode 100644
index 00000000..dfa9f5f9
--- /dev/null
+++ b/hatchet/vis/static/table_bundle.js
@@ -0,0 +1,4759 @@
+/******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ({
+
+/***/ 727:
+/***/ ((module, __webpack_exports__, __webpack_require__) => {
+
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
+/* harmony export */ });
+/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81);
+/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(645);
+/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
+// Imports
+
+
+var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
+// Module
+___CSS_LOADER_EXPORT___.push([module.id, ".alt{\n background-color: rgba(0,0,0,0.1);\n}", ""]);
+// Exports
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
+
+
+/***/ }),
+
+/***/ 645:
+/***/ ((module) => {
+
+
+
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+module.exports = function (cssWithMappingToString) {
+ var list = []; // return the list of modules as css string
+
+ list.toString = function toString() {
+ return this.map(function (item) {
+ var content = "";
+ var needLayer = typeof item[5] !== "undefined";
+
+ if (item[4]) {
+ content += "@supports (".concat(item[4], ") {");
+ }
+
+ if (item[2]) {
+ content += "@media ".concat(item[2], " {");
+ }
+
+ if (needLayer) {
+ content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
+ }
+
+ content += cssWithMappingToString(item);
+
+ if (needLayer) {
+ content += "}";
+ }
+
+ if (item[2]) {
+ content += "}";
+ }
+
+ if (item[4]) {
+ content += "}";
+ }
+
+ return content;
+ }).join("");
+ }; // import a list of modules into the list
+
+
+ list.i = function i(modules, media, dedupe, supports, layer) {
+ if (typeof modules === "string") {
+ modules = [[null, modules, undefined]];
+ }
+
+ var alreadyImportedModules = {};
+
+ if (dedupe) {
+ for (var k = 0; k < this.length; k++) {
+ var id = this[k][0];
+
+ if (id != null) {
+ alreadyImportedModules[id] = true;
+ }
+ }
+ }
+
+ for (var _k = 0; _k < modules.length; _k++) {
+ var item = [].concat(modules[_k]);
+
+ if (dedupe && alreadyImportedModules[item[0]]) {
+ continue;
+ }
+
+ if (typeof layer !== "undefined") {
+ if (typeof item[5] === "undefined") {
+ item[5] = layer;
+ } else {
+ item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
+ item[5] = layer;
+ }
+ }
+
+ if (media) {
+ if (!item[2]) {
+ item[2] = media;
+ } else {
+ item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
+ item[2] = media;
+ }
+ }
+
+ if (supports) {
+ if (!item[4]) {
+ item[4] = "".concat(supports);
+ } else {
+ item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
+ item[4] = supports;
+ }
+ }
+
+ list.push(item);
+ }
+ };
+
+ return list;
+};
+
+/***/ }),
+
+/***/ 81:
+/***/ ((module) => {
+
+
+
+module.exports = function (i) {
+ return i[1];
+};
+
+/***/ }),
+
+/***/ 379:
+/***/ ((module) => {
+
+
+
+var stylesInDOM = [];
+
+function getIndexByIdentifier(identifier) {
+ var result = -1;
+
+ for (var i = 0; i < stylesInDOM.length; i++) {
+ if (stylesInDOM[i].identifier === identifier) {
+ result = i;
+ break;
+ }
+ }
+
+ return result;
+}
+
+function modulesToDom(list, options) {
+ var idCountMap = {};
+ var identifiers = [];
+
+ for (var i = 0; i < list.length; i++) {
+ var item = list[i];
+ var id = options.base ? item[0] + options.base : item[0];
+ var count = idCountMap[id] || 0;
+ var identifier = "".concat(id, " ").concat(count);
+ idCountMap[id] = count + 1;
+ var indexByIdentifier = getIndexByIdentifier(identifier);
+ var obj = {
+ css: item[1],
+ media: item[2],
+ sourceMap: item[3],
+ supports: item[4],
+ layer: item[5]
+ };
+
+ if (indexByIdentifier !== -1) {
+ stylesInDOM[indexByIdentifier].references++;
+ stylesInDOM[indexByIdentifier].updater(obj);
+ } else {
+ var updater = addElementStyle(obj, options);
+ options.byIndex = i;
+ stylesInDOM.splice(i, 0, {
+ identifier: identifier,
+ updater: updater,
+ references: 1
+ });
+ }
+
+ identifiers.push(identifier);
+ }
+
+ return identifiers;
+}
+
+function addElementStyle(obj, options) {
+ var api = options.domAPI(options);
+ api.update(obj);
+
+ var updater = function updater(newObj) {
+ if (newObj) {
+ if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
+ return;
+ }
+
+ api.update(obj = newObj);
+ } else {
+ api.remove();
+ }
+ };
+
+ return updater;
+}
+
+module.exports = function (list, options) {
+ options = options || {};
+ list = list || [];
+ var lastIdentifiers = modulesToDom(list, options);
+ return function update(newList) {
+ newList = newList || [];
+
+ for (var i = 0; i < lastIdentifiers.length; i++) {
+ var identifier = lastIdentifiers[i];
+ var index = getIndexByIdentifier(identifier);
+ stylesInDOM[index].references--;
+ }
+
+ var newLastIdentifiers = modulesToDom(newList, options);
+
+ for (var _i = 0; _i < lastIdentifiers.length; _i++) {
+ var _identifier = lastIdentifiers[_i];
+
+ var _index = getIndexByIdentifier(_identifier);
+
+ if (stylesInDOM[_index].references === 0) {
+ stylesInDOM[_index].updater();
+
+ stylesInDOM.splice(_index, 1);
+ }
+ }
+
+ lastIdentifiers = newLastIdentifiers;
+ };
+};
+
+/***/ }),
+
+/***/ 569:
+/***/ ((module) => {
+
+
+
+var memo = {};
+/* istanbul ignore next */
+
+function getTarget(target) {
+ if (typeof memo[target] === "undefined") {
+ var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
+
+ if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
+ try {
+ // This will throw an exception if access to iframe is blocked
+ // due to cross-origin restrictions
+ styleTarget = styleTarget.contentDocument.head;
+ } catch (e) {
+ // istanbul ignore next
+ styleTarget = null;
+ }
+ }
+
+ memo[target] = styleTarget;
+ }
+
+ return memo[target];
+}
+/* istanbul ignore next */
+
+
+function insertBySelector(insert, style) {
+ var target = getTarget(insert);
+
+ if (!target) {
+ throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
+ }
+
+ target.appendChild(style);
+}
+
+module.exports = insertBySelector;
+
+/***/ }),
+
+/***/ 216:
+/***/ ((module) => {
+
+
+
+/* istanbul ignore next */
+function insertStyleElement(options) {
+ var element = document.createElement("style");
+ options.setAttributes(element, options.attributes);
+ options.insert(element, options.options);
+ return element;
+}
+
+module.exports = insertStyleElement;
+
+/***/ }),
+
+/***/ 565:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+
+
+/* istanbul ignore next */
+function setAttributesWithoutAttributes(styleElement) {
+ var nonce = true ? __webpack_require__.nc : 0;
+
+ if (nonce) {
+ styleElement.setAttribute("nonce", nonce);
+ }
+}
+
+module.exports = setAttributesWithoutAttributes;
+
+/***/ }),
+
+/***/ 795:
+/***/ ((module) => {
+
+
+
+/* istanbul ignore next */
+function apply(styleElement, options, obj) {
+ var css = "";
+
+ if (obj.supports) {
+ css += "@supports (".concat(obj.supports, ") {");
+ }
+
+ if (obj.media) {
+ css += "@media ".concat(obj.media, " {");
+ }
+
+ var needLayer = typeof obj.layer !== "undefined";
+
+ if (needLayer) {
+ css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
+ }
+
+ css += obj.css;
+
+ if (needLayer) {
+ css += "}";
+ }
+
+ if (obj.media) {
+ css += "}";
+ }
+
+ if (obj.supports) {
+ css += "}";
+ }
+
+ var sourceMap = obj.sourceMap;
+
+ if (sourceMap && typeof btoa !== "undefined") {
+ css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
+ } // For old IE
+
+ /* istanbul ignore if */
+
+
+ options.styleTagTransform(css, styleElement, options.options);
+}
+
+function removeStyleElement(styleElement) {
+ // istanbul ignore if
+ if (styleElement.parentNode === null) {
+ return false;
+ }
+
+ styleElement.parentNode.removeChild(styleElement);
+}
+/* istanbul ignore next */
+
+
+function domAPI(options) {
+ var styleElement = options.insertStyleElement(options);
+ return {
+ update: function update(obj) {
+ apply(styleElement, options, obj);
+ },
+ remove: function remove() {
+ removeStyleElement(styleElement);
+ }
+ };
+}
+
+module.exports = domAPI;
+
+/***/ }),
+
+/***/ 589:
+/***/ ((module) => {
+
+
+
+/* istanbul ignore next */
+function styleTagTransform(css, styleElement) {
+ if (styleElement.styleSheet) {
+ styleElement.styleSheet.cssText = css;
+ } else {
+ while (styleElement.firstChild) {
+ styleElement.removeChild(styleElement.firstChild);
+ }
+
+ styleElement.appendChild(document.createTextNode(css));
+ }
+}
+
+module.exports = styleTagTransform;
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ id: moduleId,
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/******/ /* webpack/runtime/nonce */
+/******/ (() => {
+/******/ __webpack_require__.nc = undefined;
+/******/ })();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selector.js
+function none() {}
+
+/* harmony default export */ function selector(selector) {
+ return selector == null ? none : function() {
+ return this.querySelector(selector);
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/select.js
+
+
+
+/* harmony default export */ function selection_select(select) {
+ if (typeof select !== "function") select = selector(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+ if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ subgroup[i] = subnode;
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/array.js
+// Given something array like (or null), returns something that is strictly an
+// array. This is used to ensure that array-like objects passed to d3.selectAll
+// or selection.selectAll are converted into proper arrays when creating a
+// selection; we don’t ever want to create a selection backed by a live
+// HTMLCollection or NodeList. However, note that selection.selectAll will use a
+// static NodeList as a group, since it safely derived from querySelectorAll.
+function array(x) {
+ return x == null ? [] : Array.isArray(x) ? x : Array.from(x);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selectorAll.js
+function empty() {
+ return [];
+}
+
+/* harmony default export */ function selectorAll(selector) {
+ return selector == null ? empty : function() {
+ return this.querySelectorAll(selector);
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/selectAll.js
+
+
+
+
+function arrayAll(select) {
+ return function() {
+ return array(select.apply(this, arguments));
+ };
+}
+
+/* harmony default export */ function selectAll(select) {
+ if (typeof select === "function") select = arrayAll(select);
+ else select = selectorAll(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ subgroups.push(select.call(node, node.__data__, i, group));
+ parents.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/matcher.js
+/* harmony default export */ function matcher(selector) {
+ return function() {
+ return this.matches(selector);
+ };
+}
+
+function childMatcher(selector) {
+ return function(node) {
+ return node.matches(selector);
+ };
+}
+
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/selectChild.js
+
+
+var find = Array.prototype.find;
+
+function childFind(match) {
+ return function() {
+ return find.call(this.children, match);
+ };
+}
+
+function childFirst() {
+ return this.firstElementChild;
+}
+
+/* harmony default export */ function selectChild(match) {
+ return this.select(match == null ? childFirst
+ : childFind(typeof match === "function" ? match : childMatcher(match)));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/selectChildren.js
+
+
+var filter = Array.prototype.filter;
+
+function children() {
+ return Array.from(this.children);
+}
+
+function childrenFilter(match) {
+ return function() {
+ return filter.call(this.children, match);
+ };
+}
+
+/* harmony default export */ function selectChildren(match) {
+ return this.selectAll(match == null ? children
+ : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/filter.js
+
+
+
+/* harmony default export */ function selection_filter(match) {
+ if (typeof match !== "function") match = matcher(match);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+ if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/sparse.js
+/* harmony default export */ function sparse(update) {
+ return new Array(update.length);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/enter.js
+
+
+
+/* harmony default export */ function enter() {
+ return new Selection(this._enter || this._groups.map(sparse), this._parents);
+}
+
+function EnterNode(parent, datum) {
+ this.ownerDocument = parent.ownerDocument;
+ this.namespaceURI = parent.namespaceURI;
+ this._next = null;
+ this._parent = parent;
+ this.__data__ = datum;
+}
+
+EnterNode.prototype = {
+ constructor: EnterNode,
+ appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
+ insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
+ querySelector: function(selector) { return this._parent.querySelector(selector); },
+ querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
+};
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/constant.js
+/* harmony default export */ function src_constant(x) {
+ return function() {
+ return x;
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/data.js
+
+
+
+
+function bindIndex(parent, group, enter, update, exit, data) {
+ var i = 0,
+ node,
+ groupLength = group.length,
+ dataLength = data.length;
+
+ // Put any non-null nodes that fit into update.
+ // Put any null nodes into enter.
+ // Put any remaining data into enter.
+ for (; i < dataLength; ++i) {
+ if (node = group[i]) {
+ node.__data__ = data[i];
+ update[i] = node;
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Put any non-null nodes that don’t fit into exit.
+ for (; i < groupLength; ++i) {
+ if (node = group[i]) {
+ exit[i] = node;
+ }
+ }
+}
+
+function bindKey(parent, group, enter, update, exit, data, key) {
+ var i,
+ node,
+ nodeByKeyValue = new Map,
+ groupLength = group.length,
+ dataLength = data.length,
+ keyValues = new Array(groupLength),
+ keyValue;
+
+ // Compute the key for each node.
+ // If multiple nodes have the same key, the duplicates are added to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if (node = group[i]) {
+ keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + "";
+ if (nodeByKeyValue.has(keyValue)) {
+ exit[i] = node;
+ } else {
+ nodeByKeyValue.set(keyValue, node);
+ }
+ }
+ }
+
+ // Compute the key for each datum.
+ // If there a node associated with this key, join and add it to update.
+ // If there is not (or the key is a duplicate), add it to enter.
+ for (i = 0; i < dataLength; ++i) {
+ keyValue = key.call(parent, data[i], i, data) + "";
+ if (node = nodeByKeyValue.get(keyValue)) {
+ update[i] = node;
+ node.__data__ = data[i];
+ nodeByKeyValue.delete(keyValue);
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Add any remaining nodes that were not bound to data to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {
+ exit[i] = node;
+ }
+ }
+}
+
+function datum(node) {
+ return node.__data__;
+}
+
+/* harmony default export */ function data(value, key) {
+ if (!arguments.length) return Array.from(this, datum);
+
+ var bind = key ? bindKey : bindIndex,
+ parents = this._parents,
+ groups = this._groups;
+
+ if (typeof value !== "function") value = src_constant(value);
+
+ for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
+ var parent = parents[j],
+ group = groups[j],
+ groupLength = group.length,
+ data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),
+ dataLength = data.length,
+ enterGroup = enter[j] = new Array(dataLength),
+ updateGroup = update[j] = new Array(dataLength),
+ exitGroup = exit[j] = new Array(groupLength);
+
+ bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
+
+ // Now connect the enter nodes to their following update node, such that
+ // appendChild can insert the materialized enter node before this node,
+ // rather than at the end of the parent node.
+ for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+ if (previous = enterGroup[i0]) {
+ if (i0 >= i1) i1 = i0 + 1;
+ while (!(next = updateGroup[i1]) && ++i1 < dataLength);
+ previous._next = next || null;
+ }
+ }
+ }
+
+ update = new Selection(update, parents);
+ update._enter = enter;
+ update._exit = exit;
+ return update;
+}
+
+// Given some data, this returns an array-like view of it: an object that
+// exposes a length property and allows numeric indexing. Note that unlike
+// selectAll, this isn’t worried about “live” collections because the resulting
+// array will only be used briefly while data is being bound. (It is possible to
+// cause the data to change while iterating by using a key function, but please
+// don’t; we’d rather avoid a gratuitous copy.)
+function arraylike(data) {
+ return typeof data === "object" && "length" in data
+ ? data // Array, TypedArray, NodeList, array-like
+ : Array.from(data); // Map, Set, iterable, string, or anything else
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/exit.js
+
+
+
+/* harmony default export */ function exit() {
+ return new Selection(this._exit || this._groups.map(sparse), this._parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/join.js
+/* harmony default export */ function join(onenter, onupdate, onexit) {
+ var enter = this.enter(), update = this, exit = this.exit();
+ if (typeof onenter === "function") {
+ enter = onenter(enter);
+ if (enter) enter = enter.selection();
+ } else {
+ enter = enter.append(onenter + "");
+ }
+ if (onupdate != null) {
+ update = onupdate(update);
+ if (update) update = update.selection();
+ }
+ if (onexit == null) exit.remove(); else onexit(exit);
+ return enter && update ? enter.merge(update).order() : update;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/merge.js
+
+
+/* harmony default export */ function merge(context) {
+ var selection = context.selection ? context.selection() : context;
+
+ for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+ for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group0[i] || group1[i]) {
+ merge[i] = node;
+ }
+ }
+ }
+
+ for (; j < m0; ++j) {
+ merges[j] = groups0[j];
+ }
+
+ return new Selection(merges, this._parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/order.js
+/* harmony default export */ function order() {
+
+ for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
+ for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+ if (node = group[i]) {
+ if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+
+ return this;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/sort.js
+
+
+/* harmony default export */ function sort(compare) {
+ if (!compare) compare = ascending;
+
+ function compareNode(a, b) {
+ return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+ }
+
+ for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ sortgroup[i] = node;
+ }
+ }
+ sortgroup.sort(compareNode);
+ }
+
+ return new Selection(sortgroups, this._parents).order();
+}
+
+function ascending(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/call.js
+/* harmony default export */ function call() {
+ var callback = arguments[0];
+ arguments[0] = this;
+ callback.apply(null, arguments);
+ return this;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/nodes.js
+/* harmony default export */ function nodes() {
+ return Array.from(this);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/node.js
+/* harmony default export */ function node() {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+
+ return null;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/size.js
+/* harmony default export */ function size() {
+ let size = 0;
+ for (const node of this) ++size; // eslint-disable-line no-unused-vars
+ return size;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/empty.js
+/* harmony default export */ function selection_empty() {
+ return !this.node();
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/each.js
+/* harmony default export */ function each(callback) {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+ if (node = group[i]) callback.call(node, node.__data__, i, group);
+ }
+ }
+
+ return this;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/namespaces.js
+var xhtml = "http://www.w3.org/1999/xhtml";
+
+/* harmony default export */ const namespaces = ({
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: xhtml,
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+});
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/namespace.js
+
+
+/* harmony default export */ function namespace(name) {
+ var prefix = name += "", i = prefix.indexOf(":");
+ if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+ return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/attr.js
+
+
+function attrRemove(name) {
+ return function() {
+ this.removeAttribute(name);
+ };
+}
+
+function attrRemoveNS(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+}
+
+function attrConstant(name, value) {
+ return function() {
+ this.setAttribute(name, value);
+ };
+}
+
+function attrConstantNS(fullname, value) {
+ return function() {
+ this.setAttributeNS(fullname.space, fullname.local, value);
+ };
+}
+
+function attrFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttribute(name);
+ else this.setAttribute(name, v);
+ };
+}
+
+function attrFunctionNS(fullname, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
+ else this.setAttributeNS(fullname.space, fullname.local, v);
+ };
+}
+
+/* harmony default export */ function attr(name, value) {
+ var fullname = namespace(name);
+
+ if (arguments.length < 2) {
+ var node = this.node();
+ return fullname.local
+ ? node.getAttributeNS(fullname.space, fullname.local)
+ : node.getAttribute(fullname);
+ }
+
+ return this.each((value == null
+ ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
+ ? (fullname.local ? attrFunctionNS : attrFunction)
+ : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/window.js
+/* harmony default export */ function src_window(node) {
+ return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
+ || (node.document && node) // node is a Window
+ || node.defaultView; // node is a Document
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/style.js
+
+
+function styleRemove(name) {
+ return function() {
+ this.style.removeProperty(name);
+ };
+}
+
+function styleConstant(name, value, priority) {
+ return function() {
+ this.style.setProperty(name, value, priority);
+ };
+}
+
+function styleFunction(name, value, priority) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.style.removeProperty(name);
+ else this.style.setProperty(name, v, priority);
+ };
+}
+
+/* harmony default export */ function style(name, value, priority) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? styleRemove : typeof value === "function"
+ ? styleFunction
+ : styleConstant)(name, value, priority == null ? "" : priority))
+ : styleValue(this.node(), name);
+}
+
+function styleValue(node, name) {
+ return node.style.getPropertyValue(name)
+ || src_window(node).getComputedStyle(node, null).getPropertyValue(name);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/property.js
+function propertyRemove(name) {
+ return function() {
+ delete this[name];
+ };
+}
+
+function propertyConstant(name, value) {
+ return function() {
+ this[name] = value;
+ };
+}
+
+function propertyFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) delete this[name];
+ else this[name] = v;
+ };
+}
+
+/* harmony default export */ function property(name, value) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? propertyRemove : typeof value === "function"
+ ? propertyFunction
+ : propertyConstant)(name, value))
+ : this.node()[name];
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/classed.js
+function classArray(string) {
+ return string.trim().split(/^|\s+/);
+}
+
+function classList(node) {
+ return node.classList || new ClassList(node);
+}
+
+function ClassList(node) {
+ this._node = node;
+ this._names = classArray(node.getAttribute("class") || "");
+}
+
+ClassList.prototype = {
+ add: function(name) {
+ var i = this._names.indexOf(name);
+ if (i < 0) {
+ this._names.push(name);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ remove: function(name) {
+ var i = this._names.indexOf(name);
+ if (i >= 0) {
+ this._names.splice(i, 1);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ contains: function(name) {
+ return this._names.indexOf(name) >= 0;
+ }
+};
+
+function classedAdd(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.add(names[i]);
+}
+
+function classedRemove(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.remove(names[i]);
+}
+
+function classedTrue(names) {
+ return function() {
+ classedAdd(this, names);
+ };
+}
+
+function classedFalse(names) {
+ return function() {
+ classedRemove(this, names);
+ };
+}
+
+function classedFunction(names, value) {
+ return function() {
+ (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+ };
+}
+
+/* harmony default export */ function classed(name, value) {
+ var names = classArray(name + "");
+
+ if (arguments.length < 2) {
+ var list = classList(this.node()), i = -1, n = names.length;
+ while (++i < n) if (!list.contains(names[i])) return false;
+ return true;
+ }
+
+ return this.each((typeof value === "function"
+ ? classedFunction : value
+ ? classedTrue
+ : classedFalse)(names, value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/text.js
+function textRemove() {
+ this.textContent = "";
+}
+
+function textConstant(value) {
+ return function() {
+ this.textContent = value;
+ };
+}
+
+function textFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ };
+}
+
+/* harmony default export */ function selection_text(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? textRemove : (typeof value === "function"
+ ? textFunction
+ : textConstant)(value))
+ : this.node().textContent;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/html.js
+function htmlRemove() {
+ this.innerHTML = "";
+}
+
+function htmlConstant(value) {
+ return function() {
+ this.innerHTML = value;
+ };
+}
+
+function htmlFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ };
+}
+
+/* harmony default export */ function html(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? htmlRemove : (typeof value === "function"
+ ? htmlFunction
+ : htmlConstant)(value))
+ : this.node().innerHTML;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/raise.js
+function raise() {
+ if (this.nextSibling) this.parentNode.appendChild(this);
+}
+
+/* harmony default export */ function selection_raise() {
+ return this.each(raise);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/lower.js
+function lower() {
+ if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+}
+
+/* harmony default export */ function selection_lower() {
+ return this.each(lower);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/creator.js
+
+
+
+function creatorInherit(name) {
+ return function() {
+ var document = this.ownerDocument,
+ uri = this.namespaceURI;
+ return uri === xhtml && document.documentElement.namespaceURI === xhtml
+ ? document.createElement(name)
+ : document.createElementNS(uri, name);
+ };
+}
+
+function creatorFixed(fullname) {
+ return function() {
+ return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+ };
+}
+
+/* harmony default export */ function creator(name) {
+ var fullname = namespace(name);
+ return (fullname.local
+ ? creatorFixed
+ : creatorInherit)(fullname);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/append.js
+
+
+/* harmony default export */ function append(name) {
+ var create = typeof name === "function" ? name : creator(name);
+ return this.select(function() {
+ return this.appendChild(create.apply(this, arguments));
+ });
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/insert.js
+
+
+
+function constantNull() {
+ return null;
+}
+
+/* harmony default export */ function insert(name, before) {
+ var create = typeof name === "function" ? name : creator(name),
+ select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
+ return this.select(function() {
+ return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
+ });
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/remove.js
+function remove() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+}
+
+/* harmony default export */ function selection_remove() {
+ return this.each(remove);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/clone.js
+function selection_cloneShallow() {
+ var clone = this.cloneNode(false), parent = this.parentNode;
+ return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+}
+
+function selection_cloneDeep() {
+ var clone = this.cloneNode(true), parent = this.parentNode;
+ return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+}
+
+/* harmony default export */ function clone(deep) {
+ return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/datum.js
+/* harmony default export */ function selection_datum(value) {
+ return arguments.length
+ ? this.property("__data__", value)
+ : this.node().__data__;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/on.js
+function contextListener(listener) {
+ return function(event) {
+ listener.call(this, event, this.__data__);
+ };
+}
+
+function parseTypenames(typenames) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name = "", i = t.indexOf(".");
+ if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+ return {type: t, name: name};
+ });
+}
+
+function onRemove(typename) {
+ return function() {
+ var on = this.__on;
+ if (!on) return;
+ for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+ if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.options);
+ } else {
+ on[++i] = o;
+ }
+ }
+ if (++i) on.length = i;
+ else delete this.__on;
+ };
+}
+
+function onAdd(typename, value, options) {
+ return function() {
+ var on = this.__on, o, listener = contextListener(value);
+ if (on) for (var j = 0, m = on.length; j < m; ++j) {
+ if ((o = on[j]).type === typename.type && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.options);
+ this.addEventListener(o.type, o.listener = listener, o.options = options);
+ o.value = value;
+ return;
+ }
+ }
+ this.addEventListener(typename.type, listener, options);
+ o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};
+ if (!on) this.__on = [o];
+ else on.push(o);
+ };
+}
+
+/* harmony default export */ function on(typename, value, options) {
+ var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;
+
+ if (arguments.length < 2) {
+ var on = this.node().__on;
+ if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+ for (i = 0, o = on[j]; i < n; ++i) {
+ if ((t = typenames[i]).type === o.type && t.name === o.name) {
+ return o.value;
+ }
+ }
+ }
+ return;
+ }
+
+ on = value ? onAdd : onRemove;
+ for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));
+ return this;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/dispatch.js
+
+
+function dispatchEvent(node, type, params) {
+ var window = src_window(node),
+ event = window.CustomEvent;
+
+ if (typeof event === "function") {
+ event = new event(type, params);
+ } else {
+ event = window.document.createEvent("Event");
+ if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
+ else event.initEvent(type, false, false);
+ }
+
+ node.dispatchEvent(event);
+}
+
+function dispatchConstant(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params);
+ };
+}
+
+function dispatchFunction(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params.apply(this, arguments));
+ };
+}
+
+/* harmony default export */ function selection_dispatch(type, params) {
+ return this.each((typeof params === "function"
+ ? dispatchFunction
+ : dispatchConstant)(type, params));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/iterator.js
+/* harmony default export */ function* iterator() {
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+ if (node = group[i]) yield node;
+ }
+ }
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var root = [null];
+
+function Selection(groups, parents) {
+ this._groups = groups;
+ this._parents = parents;
+}
+
+function selection() {
+ return new Selection([[document.documentElement]], root);
+}
+
+function selection_selection() {
+ return this;
+}
+
+Selection.prototype = selection.prototype = {
+ constructor: Selection,
+ select: selection_select,
+ selectAll: selectAll,
+ selectChild: selectChild,
+ selectChildren: selectChildren,
+ filter: selection_filter,
+ data: data,
+ enter: enter,
+ exit: exit,
+ join: join,
+ merge: merge,
+ selection: selection_selection,
+ order: order,
+ sort: sort,
+ call: call,
+ nodes: nodes,
+ node: node,
+ size: size,
+ empty: selection_empty,
+ each: each,
+ attr: attr,
+ style: style,
+ property: property,
+ classed: classed,
+ text: selection_text,
+ html: html,
+ raise: selection_raise,
+ lower: selection_lower,
+ append: append,
+ insert: insert,
+ remove: selection_remove,
+ clone: clone,
+ datum: selection_datum,
+ on: on,
+ dispatch: selection_dispatch,
+ [Symbol.iterator]: iterator
+};
+
+/* harmony default export */ const src_selection = (selection);
+
+;// CONCATENATED MODULE: ./node_modules/d3-dispatch/src/dispatch.js
+var noop = {value: () => {}};
+
+function dispatch_dispatch() {
+ for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
+ if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t);
+ _[t] = [];
+ }
+ return new Dispatch(_);
+}
+
+function Dispatch(_) {
+ this._ = _;
+}
+
+function dispatch_parseTypenames(typenames, types) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name = "", i = t.indexOf(".");
+ if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+ if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
+ return {type: t, name: name};
+ });
+}
+
+Dispatch.prototype = dispatch_dispatch.prototype = {
+ constructor: Dispatch,
+ on: function(typename, callback) {
+ var _ = this._,
+ T = dispatch_parseTypenames(typename + "", _),
+ t,
+ i = -1,
+ n = T.length;
+
+ // If no callback was specified, return the callback of the given type and name.
+ if (arguments.length < 2) {
+ while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
+ return;
+ }
+
+ // If a type was specified, set the callback for the given type and name.
+ // Otherwise, if a null callback was specified, remove callbacks of the given name.
+ if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
+ while (++i < n) {
+ if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
+ else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
+ }
+
+ return this;
+ },
+ copy: function() {
+ var copy = {}, _ = this._;
+ for (var t in _) copy[t] = _[t].slice();
+ return new Dispatch(copy);
+ },
+ call: function(type, that) {
+ if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
+ if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+ for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+ },
+ apply: function(type, that, args) {
+ if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+ for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+ }
+};
+
+function get(type, name) {
+ for (var i = 0, n = type.length, c; i < n; ++i) {
+ if ((c = type[i]).name === name) {
+ return c.value;
+ }
+ }
+}
+
+function set(type, name, callback) {
+ for (var i = 0, n = type.length; i < n; ++i) {
+ if (type[i].name === name) {
+ type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
+ break;
+ }
+ }
+ if (callback != null) type.push({name: name, value: callback});
+ return type;
+}
+
+/* harmony default export */ const src_dispatch = (dispatch_dispatch);
+
+;// CONCATENATED MODULE: ./node_modules/d3-timer/src/timer.js
+var timer_frame = 0, // is an animation frame pending?
+ timeout = 0, // is a timeout pending?
+ interval = 0, // are any timers active?
+ pokeDelay = 1000, // how frequently we check for clock skew
+ taskHead,
+ taskTail,
+ clockLast = 0,
+ clockNow = 0,
+ clockSkew = 0,
+ clock = typeof performance === "object" && performance.now ? performance : Date,
+ setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
+
+function now() {
+ return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
+}
+
+function clearNow() {
+ clockNow = 0;
+}
+
+function Timer() {
+ this._call =
+ this._time =
+ this._next = null;
+}
+
+Timer.prototype = timer.prototype = {
+ constructor: Timer,
+ restart: function(callback, delay, time) {
+ if (typeof callback !== "function") throw new TypeError("callback is not a function");
+ time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
+ if (!this._next && taskTail !== this) {
+ if (taskTail) taskTail._next = this;
+ else taskHead = this;
+ taskTail = this;
+ }
+ this._call = callback;
+ this._time = time;
+ sleep();
+ },
+ stop: function() {
+ if (this._call) {
+ this._call = null;
+ this._time = Infinity;
+ sleep();
+ }
+ }
+};
+
+function timer(callback, delay, time) {
+ var t = new Timer;
+ t.restart(callback, delay, time);
+ return t;
+}
+
+function timerFlush() {
+ now(); // Get the current time, if not already set.
+ ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already.
+ var t = taskHead, e;
+ while (t) {
+ if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);
+ t = t._next;
+ }
+ --timer_frame;
+}
+
+function wake() {
+ clockNow = (clockLast = clock.now()) + clockSkew;
+ timer_frame = timeout = 0;
+ try {
+ timerFlush();
+ } finally {
+ timer_frame = 0;
+ nap();
+ clockNow = 0;
+ }
+}
+
+function poke() {
+ var now = clock.now(), delay = now - clockLast;
+ if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
+}
+
+function nap() {
+ var t0, t1 = taskHead, t2, time = Infinity;
+ while (t1) {
+ if (t1._call) {
+ if (time > t1._time) time = t1._time;
+ t0 = t1, t1 = t1._next;
+ } else {
+ t2 = t1._next, t1._next = null;
+ t1 = t0 ? t0._next = t2 : taskHead = t2;
+ }
+ }
+ taskTail = t0;
+ sleep(time);
+}
+
+function sleep(time) {
+ if (timer_frame) return; // Soonest alarm already set, or will be.
+ if (timeout) timeout = clearTimeout(timeout);
+ var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
+ if (delay > 24) {
+ if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
+ if (interval) interval = clearInterval(interval);
+ } else {
+ if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
+ timer_frame = 1, setFrame(wake);
+ }
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-timer/src/timeout.js
+
+
+/* harmony default export */ function src_timeout(callback, delay, time) {
+ var t = new Timer;
+ delay = delay == null ? 0 : +delay;
+ t.restart(elapsed => {
+ t.stop();
+ callback(elapsed + delay);
+ }, delay, time);
+ return t;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/schedule.js
+
+
+
+var emptyOn = src_dispatch("start", "end", "cancel", "interrupt");
+var emptyTween = [];
+
+var CREATED = 0;
+var SCHEDULED = 1;
+var STARTING = 2;
+var STARTED = 3;
+var RUNNING = 4;
+var ENDING = 5;
+var ENDED = 6;
+
+/* harmony default export */ function schedule(node, name, id, index, group, timing) {
+ var schedules = node.__transition;
+ if (!schedules) node.__transition = {};
+ else if (id in schedules) return;
+ create(node, id, {
+ name: name,
+ index: index, // For context during callback.
+ group: group, // For context during callback.
+ on: emptyOn,
+ tween: emptyTween,
+ time: timing.time,
+ delay: timing.delay,
+ duration: timing.duration,
+ ease: timing.ease,
+ timer: null,
+ state: CREATED
+ });
+}
+
+function init(node, id) {
+ var schedule = schedule_get(node, id);
+ if (schedule.state > CREATED) throw new Error("too late; already scheduled");
+ return schedule;
+}
+
+function schedule_set(node, id) {
+ var schedule = schedule_get(node, id);
+ if (schedule.state > STARTED) throw new Error("too late; already running");
+ return schedule;
+}
+
+function schedule_get(node, id) {
+ var schedule = node.__transition;
+ if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
+ return schedule;
+}
+
+function create(node, id, self) {
+ var schedules = node.__transition,
+ tween;
+
+ // Initialize the self timer when the transition is created.
+ // Note the actual delay is not known until the first callback!
+ schedules[id] = self;
+ self.timer = timer(schedule, 0, self.time);
+
+ function schedule(elapsed) {
+ self.state = SCHEDULED;
+ self.timer.restart(start, self.delay, self.time);
+
+ // If the elapsed delay is less than our first sleep, start immediately.
+ if (self.delay <= elapsed) start(elapsed - self.delay);
+ }
+
+ function start(elapsed) {
+ var i, j, n, o;
+
+ // If the state is not SCHEDULED, then we previously errored on start.
+ if (self.state !== SCHEDULED) return stop();
+
+ for (i in schedules) {
+ o = schedules[i];
+ if (o.name !== self.name) continue;
+
+ // While this element already has a starting transition during this frame,
+ // defer starting an interrupting transition until that transition has a
+ // chance to tick (and possibly end); see d3/d3-transition#54!
+ if (o.state === STARTED) return src_timeout(start);
+
+ // Interrupt the active transition, if any.
+ if (o.state === RUNNING) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("interrupt", node, node.__data__, o.index, o.group);
+ delete schedules[i];
+ }
+
+ // Cancel any pre-empted transitions.
+ else if (+i < id) {
+ o.state = ENDED;
+ o.timer.stop();
+ o.on.call("cancel", node, node.__data__, o.index, o.group);
+ delete schedules[i];
+ }
+ }
+
+ // Defer the first tick to end of the current frame; see d3/d3#1576.
+ // Note the transition may be canceled after start and before the first tick!
+ // Note this must be scheduled before the start event; see d3/d3-transition#16!
+ // Assuming this is successful, subsequent callbacks go straight to tick.
+ src_timeout(function() {
+ if (self.state === STARTED) {
+ self.state = RUNNING;
+ self.timer.restart(tick, self.delay, self.time);
+ tick(elapsed);
+ }
+ });
+
+ // Dispatch the start event.
+ // Note this must be done before the tween are initialized.
+ self.state = STARTING;
+ self.on.call("start", node, node.__data__, self.index, self.group);
+ if (self.state !== STARTING) return; // interrupted
+ self.state = STARTED;
+
+ // Initialize the tween, deleting null tween.
+ tween = new Array(n = self.tween.length);
+ for (i = 0, j = -1; i < n; ++i) {
+ if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
+ tween[++j] = o;
+ }
+ }
+ tween.length = j + 1;
+ }
+
+ function tick(elapsed) {
+ var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
+ i = -1,
+ n = tween.length;
+
+ while (++i < n) {
+ tween[i].call(node, t);
+ }
+
+ // Dispatch the end event.
+ if (self.state === ENDING) {
+ self.on.call("end", node, node.__data__, self.index, self.group);
+ stop();
+ }
+ }
+
+ function stop() {
+ self.state = ENDED;
+ self.timer.stop();
+ delete schedules[id];
+ for (var i in schedules) return; // eslint-disable-line no-unused-vars
+ delete node.__transition;
+ }
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/interrupt.js
+
+
+/* harmony default export */ function src_interrupt(node, name) {
+ var schedules = node.__transition,
+ schedule,
+ active,
+ empty = true,
+ i;
+
+ if (!schedules) return;
+
+ name = name == null ? null : name + "";
+
+ for (i in schedules) {
+ if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
+ active = schedule.state > STARTING && schedule.state < ENDING;
+ schedule.state = ENDED;
+ schedule.timer.stop();
+ schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
+ delete schedules[i];
+ }
+
+ if (empty) delete node.__transition;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/interrupt.js
+
+
+/* harmony default export */ function selection_interrupt(name) {
+ return this.each(function() {
+ src_interrupt(this, name);
+ });
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/number.js
+/* harmony default export */ function number(a, b) {
+ return a = +a, b = +b, function(t) {
+ return a * (1 - t) + b * t;
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/decompose.js
+var degrees = 180 / Math.PI;
+
+var decompose_identity = {
+ translateX: 0,
+ translateY: 0,
+ rotate: 0,
+ skewX: 0,
+ scaleX: 1,
+ scaleY: 1
+};
+
+/* harmony default export */ function decompose(a, b, c, d, e, f) {
+ var scaleX, scaleY, skewX;
+ if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
+ if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
+ if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
+ if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
+ return {
+ translateX: e,
+ translateY: f,
+ rotate: Math.atan2(b, a) * degrees,
+ skewX: Math.atan(skewX) * degrees,
+ scaleX: scaleX,
+ scaleY: scaleY
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/parse.js
+
+
+var svgNode;
+
+/* eslint-disable no-undef */
+function parseCss(value) {
+ const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
+ return m.isIdentity ? decompose_identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);
+}
+
+function parseSvg(value) {
+ if (value == null) return decompose_identity;
+ if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+ svgNode.setAttribute("transform", value);
+ if (!(value = svgNode.transform.baseVal.consolidate())) return decompose_identity;
+ value = value.matrix;
+ return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/index.js
+
+
+
+function interpolateTransform(parse, pxComma, pxParen, degParen) {
+
+ function pop(s) {
+ return s.length ? s.pop() + " " : "";
+ }
+
+ function translate(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push("translate(", null, pxComma, null, pxParen);
+ q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});
+ } else if (xb || yb) {
+ s.push("translate(" + xb + pxComma + yb + pxParen);
+ }
+ }
+
+ function rotate(a, b, s, q) {
+ if (a !== b) {
+ if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
+ q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)});
+ } else if (b) {
+ s.push(pop(s) + "rotate(" + b + degParen);
+ }
+ }
+
+ function skewX(a, b, s, q) {
+ if (a !== b) {
+ q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)});
+ } else if (b) {
+ s.push(pop(s) + "skewX(" + b + degParen);
+ }
+ }
+
+ function scale(xa, ya, xb, yb, s, q) {
+ if (xa !== xb || ya !== yb) {
+ var i = s.push(pop(s) + "scale(", null, ",", null, ")");
+ q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});
+ } else if (xb !== 1 || yb !== 1) {
+ s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+ }
+ }
+
+ return function(a, b) {
+ var s = [], // string constants and placeholders
+ q = []; // number interpolators
+ a = parse(a), b = parse(b);
+ translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
+ rotate(a.rotate, b.rotate, s, q);
+ skewX(a.skewX, b.skewX, s, q);
+ scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
+ a = b = null; // gc
+ return function(t) {
+ var i = -1, n = q.length, o;
+ while (++i < n) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+ };
+}
+
+var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
+var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/tween.js
+
+
+function tweenRemove(id, name) {
+ var tween0, tween1;
+ return function() {
+ var schedule = schedule_set(this, id),
+ tween = schedule.tween;
+
+ // If this node shared tween with the previous node,
+ // just assign the updated shared tween and we’re done!
+ // Otherwise, copy-on-write.
+ if (tween !== tween0) {
+ tween1 = tween0 = tween;
+ for (var i = 0, n = tween1.length; i < n; ++i) {
+ if (tween1[i].name === name) {
+ tween1 = tween1.slice();
+ tween1.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ schedule.tween = tween1;
+ };
+}
+
+function tweenFunction(id, name, value) {
+ var tween0, tween1;
+ if (typeof value !== "function") throw new Error;
+ return function() {
+ var schedule = schedule_set(this, id),
+ tween = schedule.tween;
+
+ // If this node shared tween with the previous node,
+ // just assign the updated shared tween and we’re done!
+ // Otherwise, copy-on-write.
+ if (tween !== tween0) {
+ tween1 = (tween0 = tween).slice();
+ for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
+ if (tween1[i].name === name) {
+ tween1[i] = t;
+ break;
+ }
+ }
+ if (i === n) tween1.push(t);
+ }
+
+ schedule.tween = tween1;
+ };
+}
+
+/* harmony default export */ function tween(name, value) {
+ var id = this._id;
+
+ name += "";
+
+ if (arguments.length < 2) {
+ var tween = schedule_get(this.node(), id).tween;
+ for (var i = 0, n = tween.length, t; i < n; ++i) {
+ if ((t = tween[i]).name === name) {
+ return t.value;
+ }
+ }
+ return null;
+ }
+
+ return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
+}
+
+function tweenValue(transition, name, value) {
+ var id = transition._id;
+
+ transition.each(function() {
+ var schedule = schedule_set(this, id);
+ (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
+ });
+
+ return function(node) {
+ return schedule_get(node, id).value[name];
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-color/src/define.js
+/* harmony default export */ function src_define(constructor, factory, prototype) {
+ constructor.prototype = factory.prototype = prototype;
+ prototype.constructor = constructor;
+}
+
+function extend(parent, definition) {
+ var prototype = Object.create(parent.prototype);
+ for (var key in definition) prototype[key] = definition[key];
+ return prototype;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-color/src/color.js
+
+
+function Color() {}
+
+var darker = 0.7;
+var brighter = 1 / darker;
+
+var reI = "\\s*([+-]?\\d+)\\s*",
+ reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",
+ reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
+ reHex = /^#([0-9a-f]{3,8})$/,
+ reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`),
+ reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`),
+ reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`),
+ reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`),
+ reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`),
+ reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
+
+var named = {
+ aliceblue: 0xf0f8ff,
+ antiquewhite: 0xfaebd7,
+ aqua: 0x00ffff,
+ aquamarine: 0x7fffd4,
+ azure: 0xf0ffff,
+ beige: 0xf5f5dc,
+ bisque: 0xffe4c4,
+ black: 0x000000,
+ blanchedalmond: 0xffebcd,
+ blue: 0x0000ff,
+ blueviolet: 0x8a2be2,
+ brown: 0xa52a2a,
+ burlywood: 0xdeb887,
+ cadetblue: 0x5f9ea0,
+ chartreuse: 0x7fff00,
+ chocolate: 0xd2691e,
+ coral: 0xff7f50,
+ cornflowerblue: 0x6495ed,
+ cornsilk: 0xfff8dc,
+ crimson: 0xdc143c,
+ cyan: 0x00ffff,
+ darkblue: 0x00008b,
+ darkcyan: 0x008b8b,
+ darkgoldenrod: 0xb8860b,
+ darkgray: 0xa9a9a9,
+ darkgreen: 0x006400,
+ darkgrey: 0xa9a9a9,
+ darkkhaki: 0xbdb76b,
+ darkmagenta: 0x8b008b,
+ darkolivegreen: 0x556b2f,
+ darkorange: 0xff8c00,
+ darkorchid: 0x9932cc,
+ darkred: 0x8b0000,
+ darksalmon: 0xe9967a,
+ darkseagreen: 0x8fbc8f,
+ darkslateblue: 0x483d8b,
+ darkslategray: 0x2f4f4f,
+ darkslategrey: 0x2f4f4f,
+ darkturquoise: 0x00ced1,
+ darkviolet: 0x9400d3,
+ deeppink: 0xff1493,
+ deepskyblue: 0x00bfff,
+ dimgray: 0x696969,
+ dimgrey: 0x696969,
+ dodgerblue: 0x1e90ff,
+ firebrick: 0xb22222,
+ floralwhite: 0xfffaf0,
+ forestgreen: 0x228b22,
+ fuchsia: 0xff00ff,
+ gainsboro: 0xdcdcdc,
+ ghostwhite: 0xf8f8ff,
+ gold: 0xffd700,
+ goldenrod: 0xdaa520,
+ gray: 0x808080,
+ green: 0x008000,
+ greenyellow: 0xadff2f,
+ grey: 0x808080,
+ honeydew: 0xf0fff0,
+ hotpink: 0xff69b4,
+ indianred: 0xcd5c5c,
+ indigo: 0x4b0082,
+ ivory: 0xfffff0,
+ khaki: 0xf0e68c,
+ lavender: 0xe6e6fa,
+ lavenderblush: 0xfff0f5,
+ lawngreen: 0x7cfc00,
+ lemonchiffon: 0xfffacd,
+ lightblue: 0xadd8e6,
+ lightcoral: 0xf08080,
+ lightcyan: 0xe0ffff,
+ lightgoldenrodyellow: 0xfafad2,
+ lightgray: 0xd3d3d3,
+ lightgreen: 0x90ee90,
+ lightgrey: 0xd3d3d3,
+ lightpink: 0xffb6c1,
+ lightsalmon: 0xffa07a,
+ lightseagreen: 0x20b2aa,
+ lightskyblue: 0x87cefa,
+ lightslategray: 0x778899,
+ lightslategrey: 0x778899,
+ lightsteelblue: 0xb0c4de,
+ lightyellow: 0xffffe0,
+ lime: 0x00ff00,
+ limegreen: 0x32cd32,
+ linen: 0xfaf0e6,
+ magenta: 0xff00ff,
+ maroon: 0x800000,
+ mediumaquamarine: 0x66cdaa,
+ mediumblue: 0x0000cd,
+ mediumorchid: 0xba55d3,
+ mediumpurple: 0x9370db,
+ mediumseagreen: 0x3cb371,
+ mediumslateblue: 0x7b68ee,
+ mediumspringgreen: 0x00fa9a,
+ mediumturquoise: 0x48d1cc,
+ mediumvioletred: 0xc71585,
+ midnightblue: 0x191970,
+ mintcream: 0xf5fffa,
+ mistyrose: 0xffe4e1,
+ moccasin: 0xffe4b5,
+ navajowhite: 0xffdead,
+ navy: 0x000080,
+ oldlace: 0xfdf5e6,
+ olive: 0x808000,
+ olivedrab: 0x6b8e23,
+ orange: 0xffa500,
+ orangered: 0xff4500,
+ orchid: 0xda70d6,
+ palegoldenrod: 0xeee8aa,
+ palegreen: 0x98fb98,
+ paleturquoise: 0xafeeee,
+ palevioletred: 0xdb7093,
+ papayawhip: 0xffefd5,
+ peachpuff: 0xffdab9,
+ peru: 0xcd853f,
+ pink: 0xffc0cb,
+ plum: 0xdda0dd,
+ powderblue: 0xb0e0e6,
+ purple: 0x800080,
+ rebeccapurple: 0x663399,
+ red: 0xff0000,
+ rosybrown: 0xbc8f8f,
+ royalblue: 0x4169e1,
+ saddlebrown: 0x8b4513,
+ salmon: 0xfa8072,
+ sandybrown: 0xf4a460,
+ seagreen: 0x2e8b57,
+ seashell: 0xfff5ee,
+ sienna: 0xa0522d,
+ silver: 0xc0c0c0,
+ skyblue: 0x87ceeb,
+ slateblue: 0x6a5acd,
+ slategray: 0x708090,
+ slategrey: 0x708090,
+ snow: 0xfffafa,
+ springgreen: 0x00ff7f,
+ steelblue: 0x4682b4,
+ tan: 0xd2b48c,
+ teal: 0x008080,
+ thistle: 0xd8bfd8,
+ tomato: 0xff6347,
+ turquoise: 0x40e0d0,
+ violet: 0xee82ee,
+ wheat: 0xf5deb3,
+ white: 0xffffff,
+ whitesmoke: 0xf5f5f5,
+ yellow: 0xffff00,
+ yellowgreen: 0x9acd32
+};
+
+src_define(Color, color, {
+ copy(channels) {
+ return Object.assign(new this.constructor, this, channels);
+ },
+ displayable() {
+ return this.rgb().displayable();
+ },
+ hex: color_formatHex, // Deprecated! Use color.formatHex.
+ formatHex: color_formatHex,
+ formatHex8: color_formatHex8,
+ formatHsl: color_formatHsl,
+ formatRgb: color_formatRgb,
+ toString: color_formatRgb
+});
+
+function color_formatHex() {
+ return this.rgb().formatHex();
+}
+
+function color_formatHex8() {
+ return this.rgb().formatHex8();
+}
+
+function color_formatHsl() {
+ return hslConvert(this).formatHsl();
+}
+
+function color_formatRgb() {
+ return this.rgb().formatRgb();
+}
+
+function color(format) {
+ var m, l;
+ format = (format + "").trim().toLowerCase();
+ return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000
+ : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00
+ : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000
+ : 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
+ : null) // invalid hex
+ : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
+ : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
+ : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
+ : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
+ : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
+ : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
+ : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins
+ : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
+ : null;
+}
+
+function rgbn(n) {
+ return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
+}
+
+function rgba(r, g, b, a) {
+ if (a <= 0) r = g = b = NaN;
+ return new Rgb(r, g, b, a);
+}
+
+function rgbConvert(o) {
+ if (!(o instanceof Color)) o = color(o);
+ if (!o) return new Rgb;
+ o = o.rgb();
+ return new Rgb(o.r, o.g, o.b, o.opacity);
+}
+
+function color_rgb(r, g, b, opacity) {
+ return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
+}
+
+function Rgb(r, g, b, opacity) {
+ this.r = +r;
+ this.g = +g;
+ this.b = +b;
+ this.opacity = +opacity;
+}
+
+src_define(Rgb, color_rgb, extend(Color, {
+ brighter(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ darker(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+ },
+ rgb() {
+ return this;
+ },
+ clamp() {
+ return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
+ },
+ displayable() {
+ return (-0.5 <= this.r && this.r < 255.5)
+ && (-0.5 <= this.g && this.g < 255.5)
+ && (-0.5 <= this.b && this.b < 255.5)
+ && (0 <= this.opacity && this.opacity <= 1);
+ },
+ hex: rgb_formatHex, // Deprecated! Use color.formatHex.
+ formatHex: rgb_formatHex,
+ formatHex8: rgb_formatHex8,
+ formatRgb: rgb_formatRgb,
+ toString: rgb_formatRgb
+}));
+
+function rgb_formatHex() {
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
+}
+
+function rgb_formatHex8() {
+ return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
+}
+
+function rgb_formatRgb() {
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
+}
+
+function clampa(opacity) {
+ return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
+}
+
+function clampi(value) {
+ return Math.max(0, Math.min(255, Math.round(value) || 0));
+}
+
+function hex(value) {
+ value = clampi(value);
+ return (value < 16 ? "0" : "") + value.toString(16);
+}
+
+function hsla(h, s, l, a) {
+ if (a <= 0) h = s = l = NaN;
+ else if (l <= 0 || l >= 1) h = s = NaN;
+ else if (s <= 0) h = NaN;
+ return new Hsl(h, s, l, a);
+}
+
+function hslConvert(o) {
+ if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
+ if (!(o instanceof Color)) o = color(o);
+ if (!o) return new Hsl;
+ if (o instanceof Hsl) return o;
+ o = o.rgb();
+ var r = o.r / 255,
+ g = o.g / 255,
+ b = o.b / 255,
+ min = Math.min(r, g, b),
+ max = Math.max(r, g, b),
+ h = NaN,
+ s = max - min,
+ l = (max + min) / 2;
+ if (s) {
+ if (r === max) h = (g - b) / s + (g < b) * 6;
+ else if (g === max) h = (b - r) / s + 2;
+ else h = (r - g) / s + 4;
+ s /= l < 0.5 ? max + min : 2 - max - min;
+ h *= 60;
+ } else {
+ s = l > 0 && l < 1 ? 0 : h;
+ }
+ return new Hsl(h, s, l, o.opacity);
+}
+
+function hsl(h, s, l, opacity) {
+ return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
+}
+
+function Hsl(h, s, l, opacity) {
+ this.h = +h;
+ this.s = +s;
+ this.l = +l;
+ this.opacity = +opacity;
+}
+
+src_define(Hsl, hsl, extend(Color, {
+ brighter(k) {
+ k = k == null ? brighter : Math.pow(brighter, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ darker(k) {
+ k = k == null ? darker : Math.pow(darker, k);
+ return new Hsl(this.h, this.s, this.l * k, this.opacity);
+ },
+ rgb() {
+ var h = this.h % 360 + (this.h < 0) * 360,
+ s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
+ l = this.l,
+ m2 = l + (l < 0.5 ? l : 1 - l) * s,
+ m1 = 2 * l - m2;
+ return new Rgb(
+ hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
+ hsl2rgb(h, m1, m2),
+ hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
+ this.opacity
+ );
+ },
+ clamp() {
+ return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
+ },
+ displayable() {
+ return (0 <= this.s && this.s <= 1 || isNaN(this.s))
+ && (0 <= this.l && this.l <= 1)
+ && (0 <= this.opacity && this.opacity <= 1);
+ },
+ formatHsl() {
+ const a = clampa(this.opacity);
+ return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
+ }
+}));
+
+function clamph(value) {
+ value = (value || 0) % 360;
+ return value < 0 ? value + 360 : value;
+}
+
+function clampt(value) {
+ return Math.max(0, Math.min(1, value || 0));
+}
+
+/* From FvD 13.37, CSS Color Module Level 3 */
+function hsl2rgb(h, m1, m2) {
+ return (h < 60 ? m1 + (m2 - m1) * h / 60
+ : h < 180 ? m2
+ : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
+ : m1) * 255;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basis.js
+function basis(t1, v0, v1, v2, v3) {
+ var t2 = t1 * t1, t3 = t2 * t1;
+ return ((1 - 3 * t1 + 3 * t2 - t3) * v0
+ + (4 - 6 * t2 + 3 * t3) * v1
+ + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
+ + t3 * v3) / 6;
+}
+
+/* harmony default export */ function src_basis(values) {
+ var n = values.length - 1;
+ return function(t) {
+ var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
+ v1 = values[i],
+ v2 = values[i + 1],
+ v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
+ v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
+ return basis((t - i / n) * n, v0, v1, v2, v3);
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basisClosed.js
+
+
+/* harmony default export */ function basisClosed(values) {
+ var n = values.length;
+ return function(t) {
+ var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
+ v0 = values[(i + n - 1) % n],
+ v1 = values[i % n],
+ v2 = values[(i + 1) % n],
+ v3 = values[(i + 2) % n];
+ return basis((t - i / n) * n, v0, v1, v2, v3);
+ };
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/constant.js
+/* harmony default export */ const d3_interpolate_src_constant = (x => () => x);
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/color.js
+
+
+function linear(a, d) {
+ return function(t) {
+ return a + t * d;
+ };
+}
+
+function exponential(a, b, y) {
+ return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
+ return Math.pow(a + t * b, y);
+ };
+}
+
+function hue(a, b) {
+ var d = b - a;
+ return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);
+}
+
+function gamma(y) {
+ return (y = +y) === 1 ? nogamma : function(a, b) {
+ return b - a ? exponential(a, b, y) : d3_interpolate_src_constant(isNaN(a) ? b : a);
+ };
+}
+
+function nogamma(a, b) {
+ var d = b - a;
+ return d ? linear(a, d) : d3_interpolate_src_constant(isNaN(a) ? b : a);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/rgb.js
+
+
+
+
+
+/* harmony default export */ const rgb = ((function rgbGamma(y) {
+ var color = gamma(y);
+
+ function rgb(start, end) {
+ var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r),
+ g = color(start.g, end.g),
+ b = color(start.b, end.b),
+ opacity = nogamma(start.opacity, end.opacity);
+ return function(t) {
+ start.r = r(t);
+ start.g = g(t);
+ start.b = b(t);
+ start.opacity = opacity(t);
+ return start + "";
+ };
+ }
+
+ rgb.gamma = rgbGamma;
+
+ return rgb;
+})(1));
+
+function rgbSpline(spline) {
+ return function(colors) {
+ var n = colors.length,
+ r = new Array(n),
+ g = new Array(n),
+ b = new Array(n),
+ i, color;
+ for (i = 0; i < n; ++i) {
+ color = color_rgb(colors[i]);
+ r[i] = color.r || 0;
+ g[i] = color.g || 0;
+ b[i] = color.b || 0;
+ }
+ r = spline(r);
+ g = spline(g);
+ b = spline(b);
+ color.opacity = 1;
+ return function(t) {
+ color.r = r(t);
+ color.g = g(t);
+ color.b = b(t);
+ return color + "";
+ };
+ };
+}
+
+var rgbBasis = rgbSpline(src_basis);
+var rgbBasisClosed = rgbSpline(basisClosed);
+
+;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/string.js
+
+
+var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
+ reB = new RegExp(reA.source, "g");
+
+function zero(b) {
+ return function() {
+ return b;
+ };
+}
+
+function one(b) {
+ return function(t) {
+ return b(t) + "";
+ };
+}
+
+/* harmony default export */ function string(a, b) {
+ var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
+ am, // current match in a
+ bm, // current match in b
+ bs, // string preceding current number in b, if any
+ i = -1, // index in s
+ s = [], // string constants and placeholders
+ q = []; // number interpolators
+
+ // Coerce inputs to strings.
+ a = a + "", b = b + "";
+
+ // Interpolate pairs of numbers in a & b.
+ while ((am = reA.exec(a))
+ && (bm = reB.exec(b))) {
+ if ((bs = bm.index) > bi) { // a string precedes the next number in b
+ bs = b.slice(bi, bs);
+ if (s[i]) s[i] += bs; // coalesce with previous string
+ else s[++i] = bs;
+ }
+ if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
+ if (s[i]) s[i] += bm; // coalesce with previous string
+ else s[++i] = bm;
+ } else { // interpolate non-matching numbers
+ s[++i] = null;
+ q.push({i: i, x: number(am, bm)});
+ }
+ bi = reB.lastIndex;
+ }
+
+ // Add remains of b.
+ if (bi < b.length) {
+ bs = b.slice(bi);
+ if (s[i]) s[i] += bs; // coalesce with previous string
+ else s[++i] = bs;
+ }
+
+ // Special optimization for only a single match.
+ // Otherwise, interpolate each of the numbers and rejoin the string.
+ return s.length < 2 ? (q[0]
+ ? one(q[0].x)
+ : zero(b))
+ : (b = q.length, function(t) {
+ for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ });
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/interpolate.js
+
+
+
+/* harmony default export */ function transition_interpolate(a, b) {
+ var c;
+ return (typeof b === "number" ? number
+ : b instanceof color ? rgb
+ : (c = color(b)) ? (b = c, rgb)
+ : string)(a, b);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/attr.js
+
+
+
+
+
+function attr_attrRemove(name) {
+ return function() {
+ this.removeAttribute(name);
+ };
+}
+
+function attr_attrRemoveNS(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+}
+
+function attr_attrConstant(name, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = this.getAttribute(name);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+}
+
+function attr_attrConstantNS(fullname, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = this.getAttributeNS(fullname.space, fullname.local);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+}
+
+function attr_attrFunction(name, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null) return void this.removeAttribute(name);
+ string0 = this.getAttribute(name);
+ string1 = value1 + "";
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+}
+
+function attr_attrFunctionNS(fullname, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0, value1 = value(this), string1;
+ if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
+ string0 = this.getAttributeNS(fullname.space, fullname.local);
+ string1 = value1 + "";
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+}
+
+/* harmony default export */ function transition_attr(name, value) {
+ var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : transition_interpolate;
+ return this.attrTween(name, typeof value === "function"
+ ? (fullname.local ? attr_attrFunctionNS : attr_attrFunction)(fullname, i, tweenValue(this, "attr." + name, value))
+ : value == null ? (fullname.local ? attr_attrRemoveNS : attr_attrRemove)(fullname)
+ : (fullname.local ? attr_attrConstantNS : attr_attrConstant)(fullname, i, value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/attrTween.js
+
+
+function attrInterpolate(name, i) {
+ return function(t) {
+ this.setAttribute(name, i.call(this, t));
+ };
+}
+
+function attrInterpolateNS(fullname, i) {
+ return function(t) {
+ this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
+ };
+}
+
+function attrTweenNS(fullname, value) {
+ var t0, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+}
+
+function attrTween(name, value) {
+ var t0, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+}
+
+/* harmony default export */ function transition_attrTween(name, value) {
+ var key = "attr." + name;
+ if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+ if (value == null) return this.tween(key, null);
+ if (typeof value !== "function") throw new Error;
+ var fullname = namespace(name);
+ return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/delay.js
+
+
+function delayFunction(id, value) {
+ return function() {
+ init(this, id).delay = +value.apply(this, arguments);
+ };
+}
+
+function delayConstant(id, value) {
+ return value = +value, function() {
+ init(this, id).delay = value;
+ };
+}
+
+/* harmony default export */ function delay(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each((typeof value === "function"
+ ? delayFunction
+ : delayConstant)(id, value))
+ : schedule_get(this.node(), id).delay;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/duration.js
+
+
+function durationFunction(id, value) {
+ return function() {
+ schedule_set(this, id).duration = +value.apply(this, arguments);
+ };
+}
+
+function durationConstant(id, value) {
+ return value = +value, function() {
+ schedule_set(this, id).duration = value;
+ };
+}
+
+/* harmony default export */ function duration(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each((typeof value === "function"
+ ? durationFunction
+ : durationConstant)(id, value))
+ : schedule_get(this.node(), id).duration;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/ease.js
+
+
+function easeConstant(id, value) {
+ if (typeof value !== "function") throw new Error;
+ return function() {
+ schedule_set(this, id).ease = value;
+ };
+}
+
+/* harmony default export */ function ease(value) {
+ var id = this._id;
+
+ return arguments.length
+ ? this.each(easeConstant(id, value))
+ : schedule_get(this.node(), id).ease;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/easeVarying.js
+
+
+function easeVarying(id, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (typeof v !== "function") throw new Error;
+ schedule_set(this, id).ease = v;
+ };
+}
+
+/* harmony default export */ function transition_easeVarying(value) {
+ if (typeof value !== "function") throw new Error;
+ return this.each(easeVarying(this._id, value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/filter.js
+
+
+
+/* harmony default export */ function transition_filter(match) {
+ if (typeof match !== "function") match = matcher(match);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+ if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return new Transition(subgroups, this._parents, this._name, this._id);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/merge.js
+
+
+/* harmony default export */ function transition_merge(transition) {
+ if (transition._id !== this._id) throw new Error;
+
+ for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+ for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group0[i] || group1[i]) {
+ merge[i] = node;
+ }
+ }
+ }
+
+ for (; j < m0; ++j) {
+ merges[j] = groups0[j];
+ }
+
+ return new Transition(merges, this._parents, this._name, this._id);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/on.js
+
+
+function start(name) {
+ return (name + "").trim().split(/^|\s+/).every(function(t) {
+ var i = t.indexOf(".");
+ if (i >= 0) t = t.slice(0, i);
+ return !t || t === "start";
+ });
+}
+
+function onFunction(id, name, listener) {
+ var on0, on1, sit = start(name) ? init : schedule_set;
+ return function() {
+ var schedule = sit(this, id),
+ on = schedule.on;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
+
+ schedule.on = on1;
+ };
+}
+
+/* harmony default export */ function transition_on(name, listener) {
+ var id = this._id;
+
+ return arguments.length < 2
+ ? schedule_get(this.node(), id).on.on(name)
+ : this.each(onFunction(id, name, listener));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/remove.js
+function removeFunction(id) {
+ return function() {
+ var parent = this.parentNode;
+ for (var i in this.__transition) if (+i !== id) return;
+ if (parent) parent.removeChild(this);
+ };
+}
+
+/* harmony default export */ function transition_remove() {
+ return this.on("end.remove", removeFunction(this._id));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/select.js
+
+
+
+
+/* harmony default export */ function transition_select(select) {
+ var name = this._name,
+ id = this._id;
+
+ if (typeof select !== "function") select = selector(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+ if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ subgroup[i] = subnode;
+ schedule(subgroup[i], name, id, i, subgroup, schedule_get(node, id));
+ }
+ }
+ }
+
+ return new Transition(subgroups, this._parents, name, id);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/selectAll.js
+
+
+
+
+/* harmony default export */ function transition_selectAll(select) {
+ var name = this._name,
+ id = this._id;
+
+ if (typeof select !== "function") select = selectorAll(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ for (var children = select.call(node, node.__data__, i, group), child, inherit = schedule_get(node, id), k = 0, l = children.length; k < l; ++k) {
+ if (child = children[k]) {
+ schedule(child, name, id, k, children, inherit);
+ }
+ }
+ subgroups.push(children);
+ parents.push(node);
+ }
+ }
+ }
+
+ return new Transition(subgroups, parents, name, id);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/selection.js
+
+
+var selection_Selection = src_selection.prototype.constructor;
+
+/* harmony default export */ function transition_selection() {
+ return new selection_Selection(this._groups, this._parents);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/style.js
+
+
+
+
+
+
+function styleNull(name, interpolate) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name),
+ string1 = (this.style.removeProperty(name), styleValue(this, name));
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, string10 = string1);
+ };
+}
+
+function style_styleRemove(name) {
+ return function() {
+ this.style.removeProperty(name);
+ };
+}
+
+function style_styleConstant(name, interpolate, value1) {
+ var string00,
+ string1 = value1 + "",
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name);
+ return string0 === string1 ? null
+ : string0 === string00 ? interpolate0
+ : interpolate0 = interpolate(string00 = string0, value1);
+ };
+}
+
+function style_styleFunction(name, interpolate, value) {
+ var string00,
+ string10,
+ interpolate0;
+ return function() {
+ var string0 = styleValue(this, name),
+ value1 = value(this),
+ string1 = value1 + "";
+ if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
+ return string0 === string1 ? null
+ : string0 === string00 && string1 === string10 ? interpolate0
+ : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+ };
+}
+
+function styleMaybeRemove(id, name) {
+ var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
+ return function() {
+ var schedule = schedule_set(this, id),
+ on = schedule.on,
+ listener = schedule.value[key] == null ? remove || (remove = style_styleRemove(name)) : undefined;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
+
+ schedule.on = on1;
+ };
+}
+
+/* harmony default export */ function transition_style(name, value, priority) {
+ var i = (name += "") === "transform" ? interpolateTransformCss : transition_interpolate;
+ return value == null ? this
+ .styleTween(name, styleNull(name, i))
+ .on("end.style." + name, style_styleRemove(name))
+ : typeof value === "function" ? this
+ .styleTween(name, style_styleFunction(name, i, tweenValue(this, "style." + name, value)))
+ .each(styleMaybeRemove(this._id, name))
+ : this
+ .styleTween(name, style_styleConstant(name, i, value), priority)
+ .on("end.style." + name, null);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/styleTween.js
+function styleInterpolate(name, i, priority) {
+ return function(t) {
+ this.style.setProperty(name, i.call(this, t), priority);
+ };
+}
+
+function styleTween(name, value, priority) {
+ var t, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
+ return t;
+ }
+ tween._value = value;
+ return tween;
+}
+
+/* harmony default export */ function transition_styleTween(name, value, priority) {
+ var key = "style." + (name += "");
+ if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+ if (value == null) return this.tween(key, null);
+ if (typeof value !== "function") throw new Error;
+ return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/text.js
+
+
+function text_textConstant(value) {
+ return function() {
+ this.textContent = value;
+ };
+}
+
+function text_textFunction(value) {
+ return function() {
+ var value1 = value(this);
+ this.textContent = value1 == null ? "" : value1;
+ };
+}
+
+/* harmony default export */ function transition_text(value) {
+ return this.tween("text", typeof value === "function"
+ ? text_textFunction(tweenValue(this, "text", value))
+ : text_textConstant(value == null ? "" : value + ""));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/textTween.js
+function textInterpolate(i) {
+ return function(t) {
+ this.textContent = i.call(this, t);
+ };
+}
+
+function textTween(value) {
+ var t0, i0;
+ function tween() {
+ var i = value.apply(this, arguments);
+ if (i !== i0) t0 = (i0 = i) && textInterpolate(i);
+ return t0;
+ }
+ tween._value = value;
+ return tween;
+}
+
+/* harmony default export */ function transition_textTween(value) {
+ var key = "text";
+ if (arguments.length < 1) return (key = this.tween(key)) && key._value;
+ if (value == null) return this.tween(key, null);
+ if (typeof value !== "function") throw new Error;
+ return this.tween(key, textTween(value));
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/transition.js
+
+
+
+/* harmony default export */ function transition() {
+ var name = this._name,
+ id0 = this._id,
+ id1 = newId();
+
+ for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ var inherit = schedule_get(node, id0);
+ schedule(node, name, id1, i, group, {
+ time: inherit.time + inherit.delay + inherit.duration,
+ delay: 0,
+ duration: inherit.duration,
+ ease: inherit.ease
+ });
+ }
+ }
+ }
+
+ return new Transition(groups, this._parents, name, id1);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/end.js
+
+
+/* harmony default export */ function end() {
+ var on0, on1, that = this, id = that._id, size = that.size();
+ return new Promise(function(resolve, reject) {
+ var cancel = {value: reject},
+ end = {value: function() { if (--size === 0) resolve(); }};
+
+ that.each(function() {
+ var schedule = schedule_set(this, id),
+ on = schedule.on;
+
+ // If this node shared a dispatch with the previous node,
+ // just assign the updated shared dispatch and we’re done!
+ // Otherwise, copy-on-write.
+ if (on !== on0) {
+ on1 = (on0 = on).copy();
+ on1._.cancel.push(cancel);
+ on1._.interrupt.push(cancel);
+ on1._.end.push(end);
+ }
+
+ schedule.on = on1;
+ });
+
+ // The selection was empty, resolve end immediately
+ if (size === 0) resolve();
+ });
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var id = 0;
+
+function Transition(groups, parents, name, id) {
+ this._groups = groups;
+ this._parents = parents;
+ this._name = name;
+ this._id = id;
+}
+
+function transition_transition(name) {
+ return src_selection().transition(name);
+}
+
+function newId() {
+ return ++id;
+}
+
+var selection_prototype = src_selection.prototype;
+
+Transition.prototype = transition_transition.prototype = {
+ constructor: Transition,
+ select: transition_select,
+ selectAll: transition_selectAll,
+ selectChild: selection_prototype.selectChild,
+ selectChildren: selection_prototype.selectChildren,
+ filter: transition_filter,
+ merge: transition_merge,
+ selection: transition_selection,
+ transition: transition,
+ call: selection_prototype.call,
+ nodes: selection_prototype.nodes,
+ node: selection_prototype.node,
+ size: selection_prototype.size,
+ empty: selection_prototype.empty,
+ each: selection_prototype.each,
+ on: transition_on,
+ attr: transition_attr,
+ attrTween: transition_attrTween,
+ style: transition_style,
+ styleTween: transition_styleTween,
+ text: transition_text,
+ textTween: transition_textTween,
+ remove: transition_remove,
+ tween: tween,
+ delay: delay,
+ duration: duration,
+ ease: ease,
+ easeVarying: transition_easeVarying,
+ end: end,
+ [Symbol.iterator]: selection_prototype[Symbol.iterator]
+};
+
+;// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js
+function cubicIn(t) {
+ return t * t * t;
+}
+
+function cubicOut(t) {
+ return --t * t * t + 1;
+}
+
+function cubicInOut(t) {
+ return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/transition.js
+
+
+
+
+
+var defaultTiming = {
+ time: null, // Set on use.
+ delay: 0,
+ duration: 250,
+ ease: cubicInOut
+};
+
+function inherit(node, id) {
+ var timing;
+ while (!(timing = node.__transition) || !(timing = timing[id])) {
+ if (!(node = node.parentNode)) {
+ throw new Error(`transition ${id} not found`);
+ }
+ }
+ return timing;
+}
+
+/* harmony default export */ function selection_transition(name) {
+ var id,
+ timing;
+
+ if (name instanceof Transition) {
+ id = name._id, name = name._name;
+ } else {
+ id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
+ }
+
+ for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ schedule(node, name, id, i, group, timing || inherit(node, id));
+ }
+ }
+ }
+
+ return new Transition(groups, this._parents, name, id);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/index.js
+
+
+
+
+src_selection.prototype.interrupt = selection_interrupt;
+src_selection.prototype.transition = selection_transition;
+
+;// CONCATENATED MODULE: ./node_modules/d3-transition/src/index.js
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/d3-brush/src/brush.js
+
+
+
+
+
+
+
+
+
+var MODE_DRAG = {name: "drag"},
+ MODE_SPACE = {name: "space"},
+ MODE_HANDLE = {name: "handle"},
+ MODE_CENTER = {name: "center"};
+
+const {abs, max, min} = Math;
+
+function number1(e) {
+ return [+e[0], +e[1]];
+}
+
+function number2(e) {
+ return [number1(e[0]), number1(e[1])];
+}
+
+var X = {
+ name: "x",
+ handles: ["w", "e"].map(type),
+ input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },
+ output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
+};
+
+var Y = {
+ name: "y",
+ handles: ["n", "s"].map(type),
+ input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },
+ output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
+};
+
+var XY = {
+ name: "xy",
+ handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
+ input: function(xy) { return xy == null ? null : number2(xy); },
+ output: function(xy) { return xy; }
+};
+
+var cursors = {
+ overlay: "crosshair",
+ selection: "move",
+ n: "ns-resize",
+ e: "ew-resize",
+ s: "ns-resize",
+ w: "ew-resize",
+ nw: "nwse-resize",
+ ne: "nesw-resize",
+ se: "nwse-resize",
+ sw: "nesw-resize"
+};
+
+var flipX = {
+ e: "w",
+ w: "e",
+ nw: "ne",
+ ne: "nw",
+ se: "sw",
+ sw: "se"
+};
+
+var flipY = {
+ n: "s",
+ s: "n",
+ nw: "sw",
+ ne: "se",
+ se: "ne",
+ sw: "nw"
+};
+
+var signsX = {
+ overlay: +1,
+ selection: +1,
+ n: null,
+ e: +1,
+ s: null,
+ w: -1,
+ nw: -1,
+ ne: +1,
+ se: +1,
+ sw: -1
+};
+
+var signsY = {
+ overlay: +1,
+ selection: +1,
+ n: -1,
+ e: null,
+ s: +1,
+ w: null,
+ nw: -1,
+ ne: -1,
+ se: +1,
+ sw: +1
+};
+
+function type(t) {
+ return {type: t};
+}
+
+// Ignore right-click, since that should open the context menu.
+function defaultFilter(event) {
+ return !event.ctrlKey && !event.button;
+}
+
+function defaultExtent() {
+ var svg = this.ownerSVGElement || this;
+ if (svg.hasAttribute("viewBox")) {
+ svg = svg.viewBox.baseVal;
+ return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];
+ }
+ return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
+}
+
+function defaultTouchable() {
+ return navigator.maxTouchPoints || ("ontouchstart" in this);
+}
+
+// Like d3.local, but with the name “__brush” rather than auto-generated.
+function local(node) {
+ while (!node.__brush) if (!(node = node.parentNode)) return;
+ return node.__brush;
+}
+
+function brush_empty(extent) {
+ return extent[0][0] === extent[1][0]
+ || extent[0][1] === extent[1][1];
+}
+
+function brushSelection(node) {
+ var state = node.__brush;
+ return state ? state.dim.output(state.selection) : null;
+}
+
+function brushX() {
+ return brush_brush(X);
+}
+
+function brushY() {
+ return brush_brush(Y);
+}
+
+/* harmony default export */ function brush() {
+ return brush_brush(XY);
+}
+
+function brush_brush(dim) {
+ var extent = defaultExtent,
+ filter = defaultFilter,
+ touchable = defaultTouchable,
+ keys = true,
+ listeners = dispatch("start", "brush", "end"),
+ handleSize = 6,
+ touchending;
+
+ function brush(group) {
+ var overlay = group
+ .property("__brush", initialize)
+ .selectAll(".overlay")
+ .data([type("overlay")]);
+
+ overlay.enter().append("rect")
+ .attr("class", "overlay")
+ .attr("pointer-events", "all")
+ .attr("cursor", cursors.overlay)
+ .merge(overlay)
+ .each(function() {
+ var extent = local(this).extent;
+ select(this)
+ .attr("x", extent[0][0])
+ .attr("y", extent[0][1])
+ .attr("width", extent[1][0] - extent[0][0])
+ .attr("height", extent[1][1] - extent[0][1]);
+ });
+
+ group.selectAll(".selection")
+ .data([type("selection")])
+ .enter().append("rect")
+ .attr("class", "selection")
+ .attr("cursor", cursors.selection)
+ .attr("fill", "#777")
+ .attr("fill-opacity", 0.3)
+ .attr("stroke", "#fff")
+ .attr("shape-rendering", "crispEdges");
+
+ var handle = group.selectAll(".handle")
+ .data(dim.handles, function(d) { return d.type; });
+
+ handle.exit().remove();
+
+ handle.enter().append("rect")
+ .attr("class", function(d) { return "handle handle--" + d.type; })
+ .attr("cursor", function(d) { return cursors[d.type]; });
+
+ group
+ .each(redraw)
+ .attr("fill", "none")
+ .attr("pointer-events", "all")
+ .on("mousedown.brush", started)
+ .filter(touchable)
+ .on("touchstart.brush", started)
+ .on("touchmove.brush", touchmoved)
+ .on("touchend.brush touchcancel.brush", touchended)
+ .style("touch-action", "none")
+ .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ }
+
+ brush.move = function(group, selection, event) {
+ if (group.tween) {
+ group
+ .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); })
+ .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); })
+ .tween("brush", function() {
+ var that = this,
+ state = that.__brush,
+ emit = emitter(that, arguments),
+ selection0 = state.selection,
+ selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
+ i = interpolate(selection0, selection1);
+
+ function tween(t) {
+ state.selection = t === 1 && selection1 === null ? null : i(t);
+ redraw.call(that);
+ emit.brush();
+ }
+
+ return selection0 !== null && selection1 !== null ? tween : tween(1);
+ });
+ } else {
+ group
+ .each(function() {
+ var that = this,
+ args = arguments,
+ state = that.__brush,
+ selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
+ emit = emitter(that, args).beforestart();
+
+ interrupt(that);
+ state.selection = selection1 === null ? null : selection1;
+ redraw.call(that);
+ emit.start(event).brush(event).end(event);
+ });
+ }
+ };
+
+ brush.clear = function(group, event) {
+ brush.move(group, null, event);
+ };
+
+ function redraw() {
+ var group = select(this),
+ selection = local(this).selection;
+
+ if (selection) {
+ group.selectAll(".selection")
+ .style("display", null)
+ .attr("x", selection[0][0])
+ .attr("y", selection[0][1])
+ .attr("width", selection[1][0] - selection[0][0])
+ .attr("height", selection[1][1] - selection[0][1]);
+
+ group.selectAll(".handle")
+ .style("display", null)
+ .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
+ .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
+ .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
+ .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
+ }
+
+ else {
+ group.selectAll(".selection,.handle")
+ .style("display", "none")
+ .attr("x", null)
+ .attr("y", null)
+ .attr("width", null)
+ .attr("height", null);
+ }
+ }
+
+ function emitter(that, args, clean) {
+ var emit = that.__brush.emitter;
+ return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);
+ }
+
+ function Emitter(that, args, clean) {
+ this.that = that;
+ this.args = args;
+ this.state = that.__brush;
+ this.active = 0;
+ this.clean = clean;
+ }
+
+ Emitter.prototype = {
+ beforestart: function() {
+ if (++this.active === 1) this.state.emitter = this, this.starting = true;
+ return this;
+ },
+ start: function(event, mode) {
+ if (this.starting) this.starting = false, this.emit("start", event, mode);
+ else this.emit("brush", event);
+ return this;
+ },
+ brush: function(event, mode) {
+ this.emit("brush", event, mode);
+ return this;
+ },
+ end: function(event, mode) {
+ if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode);
+ return this;
+ },
+ emit: function(type, event, mode) {
+ var d = select(this.that).datum();
+ listeners.call(
+ type,
+ this.that,
+ new BrushEvent(type, {
+ sourceEvent: event,
+ target: brush,
+ selection: dim.output(this.state.selection),
+ mode,
+ dispatch: listeners
+ }),
+ d
+ );
+ }
+ };
+
+ function started(event) {
+ if (touchending && !event.touches) return;
+ if (!filter.apply(this, arguments)) return;
+
+ var that = this,
+ type = event.target.__data__.type,
+ mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),
+ signX = dim === Y ? null : signsX[type],
+ signY = dim === X ? null : signsY[type],
+ state = local(that),
+ extent = state.extent,
+ selection = state.selection,
+ W = extent[0][0], w0, w1,
+ N = extent[0][1], n0, n1,
+ E = extent[1][0], e0, e1,
+ S = extent[1][1], s0, s1,
+ dx = 0,
+ dy = 0,
+ moving,
+ shifting = signX && signY && keys && event.shiftKey,
+ lockX,
+ lockY,
+ points = Array.from(event.touches || [event], t => {
+ const i = t.identifier;
+ t = pointer(t, that);
+ t.point0 = t.slice();
+ t.identifier = i;
+ return t;
+ });
+
+ interrupt(that);
+ var emit = emitter(that, arguments, true).beforestart();
+
+ if (type === "overlay") {
+ if (selection) moving = true;
+ const pts = [points[0], points[1] || points[0]];
+ state.selection = selection = [[
+ w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),
+ n0 = dim === X ? N : min(pts[0][1], pts[1][1])
+ ], [
+ e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),
+ s0 = dim === X ? S : max(pts[0][1], pts[1][1])
+ ]];
+ if (points.length > 1) move(event);
+ } else {
+ w0 = selection[0][0];
+ n0 = selection[0][1];
+ e0 = selection[1][0];
+ s0 = selection[1][1];
+ }
+
+ w1 = w0;
+ n1 = n0;
+ e1 = e0;
+ s1 = s0;
+
+ var group = select(that)
+ .attr("pointer-events", "none");
+
+ var overlay = group.selectAll(".overlay")
+ .attr("cursor", cursors[type]);
+
+ if (event.touches) {
+ emit.moved = moved;
+ emit.ended = ended;
+ } else {
+ var view = select(event.view)
+ .on("mousemove.brush", moved, true)
+ .on("mouseup.brush", ended, true);
+ if (keys) view
+ .on("keydown.brush", keydowned, true)
+ .on("keyup.brush", keyupped, true)
+
+ dragDisable(event.view);
+ }
+
+ redraw.call(that);
+ emit.start(event, mode.name);
+
+ function moved(event) {
+ for (const p of event.changedTouches || [event]) {
+ for (const d of points)
+ if (d.identifier === p.identifier) d.cur = pointer(p, that);
+ }
+ if (shifting && !lockX && !lockY && points.length === 1) {
+ const point = points[0];
+ if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))
+ lockY = true;
+ else
+ lockX = true;
+ }
+ for (const point of points)
+ if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];
+ moving = true;
+ noevent(event);
+ move(event);
+ }
+
+ function move(event) {
+ const point = points[0], point0 = point.point0;
+ var t;
+
+ dx = point[0] - point0[0];
+ dy = point[1] - point0[1];
+
+ switch (mode) {
+ case MODE_SPACE:
+ case MODE_DRAG: {
+ if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
+ if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
+ break;
+ }
+ case MODE_HANDLE: {
+ if (points[1]) {
+ if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;
+ if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;
+ } else {
+ if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
+ else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
+ if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
+ else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
+ }
+ break;
+ }
+ case MODE_CENTER: {
+ if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));
+ if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));
+ break;
+ }
+ }
+
+ if (e1 < w1) {
+ signX *= -1;
+ t = w0, w0 = e0, e0 = t;
+ t = w1, w1 = e1, e1 = t;
+ if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
+ }
+
+ if (s1 < n1) {
+ signY *= -1;
+ t = n0, n0 = s0, s0 = t;
+ t = n1, n1 = s1, s1 = t;
+ if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
+ }
+
+ if (state.selection) selection = state.selection; // May be set by brush.move!
+ if (lockX) w1 = selection[0][0], e1 = selection[1][0];
+ if (lockY) n1 = selection[0][1], s1 = selection[1][1];
+
+ if (selection[0][0] !== w1
+ || selection[0][1] !== n1
+ || selection[1][0] !== e1
+ || selection[1][1] !== s1) {
+ state.selection = [[w1, n1], [e1, s1]];
+ redraw.call(that);
+ emit.brush(event, mode.name);
+ }
+ }
+
+ function ended(event) {
+ nopropagation(event);
+ if (event.touches) {
+ if (event.touches.length) return;
+ if (touchending) clearTimeout(touchending);
+ touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
+ } else {
+ dragEnable(event.view, moving);
+ view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
+ }
+ group.attr("pointer-events", "all");
+ overlay.attr("cursor", cursors.overlay);
+ if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
+ if (brush_empty(selection)) state.selection = null, redraw.call(that);
+ emit.end(event, mode.name);
+ }
+
+ function keydowned(event) {
+ switch (event.keyCode) {
+ case 16: { // SHIFT
+ shifting = signX && signY;
+ break;
+ }
+ case 18: { // ALT
+ if (mode === MODE_HANDLE) {
+ if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
+ if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
+ mode = MODE_CENTER;
+ move(event);
+ }
+ break;
+ }
+ case 32: { // SPACE; takes priority over ALT
+ if (mode === MODE_HANDLE || mode === MODE_CENTER) {
+ if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
+ if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
+ mode = MODE_SPACE;
+ overlay.attr("cursor", cursors.selection);
+ move(event);
+ }
+ break;
+ }
+ default: return;
+ }
+ noevent(event);
+ }
+
+ function keyupped(event) {
+ switch (event.keyCode) {
+ case 16: { // SHIFT
+ if (shifting) {
+ lockX = lockY = shifting = false;
+ move(event);
+ }
+ break;
+ }
+ case 18: { // ALT
+ if (mode === MODE_CENTER) {
+ if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
+ if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
+ mode = MODE_HANDLE;
+ move(event);
+ }
+ break;
+ }
+ case 32: { // SPACE
+ if (mode === MODE_SPACE) {
+ if (event.altKey) {
+ if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
+ if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
+ mode = MODE_CENTER;
+ } else {
+ if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
+ if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
+ mode = MODE_HANDLE;
+ }
+ overlay.attr("cursor", cursors[type]);
+ move(event);
+ }
+ break;
+ }
+ default: return;
+ }
+ noevent(event);
+ }
+ }
+
+ function touchmoved(event) {
+ emitter(this, arguments).moved(event);
+ }
+
+ function touchended(event) {
+ emitter(this, arguments).ended(event);
+ }
+
+ function initialize() {
+ var state = this.__brush || {selection: null};
+ state.extent = number2(extent.apply(this, arguments));
+ state.dim = dim;
+ return state;
+ }
+
+ brush.extent = function(_) {
+ return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent;
+ };
+
+ brush.filter = function(_) {
+ return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter;
+ };
+
+ brush.touchable = function(_) {
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable;
+ };
+
+ brush.handleSize = function(_) {
+ return arguments.length ? (handleSize = +_, brush) : handleSize;
+ };
+
+ brush.keyModifiers = function(_) {
+ return arguments.length ? (keys = !!_, brush) : keys;
+ };
+
+ brush.on = function() {
+ var value = listeners.on.apply(listeners, arguments);
+ return value === listeners ? brush : value;
+ };
+
+ return brush;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-brush/src/index.js
+
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/select.js
+
+
+/* harmony default export */ function src_select(selector) {
+ return typeof selector === "string"
+ ? new Selection([[document.querySelector(selector)]], [document.documentElement])
+ : new Selection([[selector]], root);
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-selection/src/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./node_modules/d3-zoom/src/transform.js
+function transform_Transform(k, x, y) {
+ this.k = k;
+ this.x = x;
+ this.y = y;
+}
+
+transform_Transform.prototype = {
+ constructor: transform_Transform,
+ scale: function(k) {
+ return k === 1 ? this : new transform_Transform(this.k * k, this.x, this.y);
+ },
+ translate: function(x, y) {
+ return x === 0 & y === 0 ? this : new transform_Transform(this.k, this.x + this.k * x, this.y + this.k * y);
+ },
+ apply: function(point) {
+ return [point[0] * this.k + this.x, point[1] * this.k + this.y];
+ },
+ applyX: function(x) {
+ return x * this.k + this.x;
+ },
+ applyY: function(y) {
+ return y * this.k + this.y;
+ },
+ invert: function(location) {
+ return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
+ },
+ invertX: function(x) {
+ return (x - this.x) / this.k;
+ },
+ invertY: function(y) {
+ return (y - this.y) / this.k;
+ },
+ rescaleX: function(x) {
+ return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
+ },
+ rescaleY: function(y) {
+ return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
+ },
+ toString: function() {
+ return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
+ }
+};
+
+var transform_identity = new transform_Transform(1, 0, 0);
+
+transform.prototype = transform_Transform.prototype;
+
+function transform(node) {
+ while (!node.__zoom) if (!(node = node.parentNode)) return transform_identity;
+ return node.__zoom;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-zoom/src/zoom.js
+
+
+
+
+
+
+
+
+
+
+// Ignore right-click, since that should open the context menu.
+// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event
+function zoom_defaultFilter(event) {
+ return (!event.ctrlKey || event.type === 'wheel') && !event.button;
+}
+
+function zoom_defaultExtent() {
+ var e = this;
+ if (e instanceof SVGElement) {
+ e = e.ownerSVGElement || e;
+ if (e.hasAttribute("viewBox")) {
+ e = e.viewBox.baseVal;
+ return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+ }
+ return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+ }
+ return [[0, 0], [e.clientWidth, e.clientHeight]];
+}
+
+function defaultTransform() {
+ return this.__zoom || identity;
+}
+
+function defaultWheelDelta(event) {
+ return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);
+}
+
+function zoom_defaultTouchable() {
+ return navigator.maxTouchPoints || ("ontouchstart" in this);
+}
+
+function defaultConstrain(transform, extent, translateExtent) {
+ var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
+ dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
+ dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
+ dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
+ return transform.translate(
+ dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
+ dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
+ );
+}
+
+/* harmony default export */ function zoom() {
+ var filter = zoom_defaultFilter,
+ extent = zoom_defaultExtent,
+ constrain = defaultConstrain,
+ wheelDelta = defaultWheelDelta,
+ touchable = zoom_defaultTouchable,
+ scaleExtent = [0, Infinity],
+ translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
+ duration = 250,
+ interpolate = interpolateZoom,
+ listeners = dispatch("start", "zoom", "end"),
+ touchstarting,
+ touchfirst,
+ touchending,
+ touchDelay = 500,
+ wheelDelay = 150,
+ clickDistance2 = 0,
+ tapDistance = 10;
+
+ function zoom(selection) {
+ selection
+ .property("__zoom", defaultTransform)
+ .on("wheel.zoom", wheeled, {passive: false})
+ .on("mousedown.zoom", mousedowned)
+ .on("dblclick.zoom", dblclicked)
+ .filter(touchable)
+ .on("touchstart.zoom", touchstarted)
+ .on("touchmove.zoom", touchmoved)
+ .on("touchend.zoom touchcancel.zoom", touchended)
+ .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+ }
+
+ zoom.transform = function(collection, transform, point, event) {
+ var selection = collection.selection ? collection.selection() : collection;
+ selection.property("__zoom", defaultTransform);
+ if (collection !== selection) {
+ schedule(collection, transform, point, event);
+ } else {
+ selection.interrupt().each(function() {
+ gesture(this, arguments)
+ .event(event)
+ .start()
+ .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
+ .end();
+ });
+ }
+ };
+
+ zoom.scaleBy = function(selection, k, p, event) {
+ zoom.scaleTo(selection, function() {
+ var k0 = this.__zoom.k,
+ k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return k0 * k1;
+ }, p, event);
+ };
+
+ zoom.scaleTo = function(selection, k, p, event) {
+ zoom.transform(selection, function() {
+ var e = extent.apply(this, arguments),
+ t0 = this.__zoom,
+ p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p,
+ p1 = t0.invert(p0),
+ k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+ return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
+ }, p, event);
+ };
+
+ zoom.translateBy = function(selection, x, y, event) {
+ zoom.transform(selection, function() {
+ return constrain(this.__zoom.translate(
+ typeof x === "function" ? x.apply(this, arguments) : x,
+ typeof y === "function" ? y.apply(this, arguments) : y
+ ), extent.apply(this, arguments), translateExtent);
+ }, null, event);
+ };
+
+ zoom.translateTo = function(selection, x, y, p, event) {
+ zoom.transform(selection, function() {
+ var e = extent.apply(this, arguments),
+ t = this.__zoom,
+ p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
+ return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(
+ typeof x === "function" ? -x.apply(this, arguments) : -x,
+ typeof y === "function" ? -y.apply(this, arguments) : -y
+ ), e, translateExtent);
+ }, p, event);
+ };
+
+ function scale(transform, k) {
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+ return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
+ }
+
+ function translate(transform, p0, p1) {
+ var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
+ return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
+ }
+
+ function centroid(extent) {
+ return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
+ }
+
+ function schedule(transition, transform, point, event) {
+ transition
+ .on("start.zoom", function() { gesture(this, arguments).event(event).start(); })
+ .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); })
+ .tween("zoom", function() {
+ var that = this,
+ args = arguments,
+ g = gesture(that, args).event(event),
+ e = extent.apply(that, args),
+ p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point,
+ w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
+ a = that.__zoom,
+ b = typeof transform === "function" ? transform.apply(that, args) : transform,
+ i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+ return function(t) {
+ if (t === 1) t = b; // Avoid rounding error on end.
+ else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
+ g.zoom(null, t);
+ };
+ });
+ }
+
+ function gesture(that, args, clean) {
+ return (!clean && that.__zooming) || new Gesture(that, args);
+ }
+
+ function Gesture(that, args) {
+ this.that = that;
+ this.args = args;
+ this.active = 0;
+ this.sourceEvent = null;
+ this.extent = extent.apply(that, args);
+ this.taps = 0;
+ }
+
+ Gesture.prototype = {
+ event: function(event) {
+ if (event) this.sourceEvent = event;
+ return this;
+ },
+ start: function() {
+ if (++this.active === 1) {
+ this.that.__zooming = this;
+ this.emit("start");
+ }
+ return this;
+ },
+ zoom: function(key, transform) {
+ if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
+ if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
+ if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
+ this.that.__zoom = transform;
+ this.emit("zoom");
+ return this;
+ },
+ end: function() {
+ if (--this.active === 0) {
+ delete this.that.__zooming;
+ this.emit("end");
+ }
+ return this;
+ },
+ emit: function(type) {
+ var d = select(this.that).datum();
+ listeners.call(
+ type,
+ this.that,
+ new ZoomEvent(type, {
+ sourceEvent: this.sourceEvent,
+ target: zoom,
+ type,
+ transform: this.that.__zoom,
+ dispatch: listeners
+ }),
+ d
+ );
+ }
+ };
+
+ function wheeled(event, ...args) {
+ if (!filter.apply(this, arguments)) return;
+ var g = gesture(this, args).event(event),
+ t = this.__zoom,
+ k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+ p = pointer(event);
+
+ // If the mouse is in the same location as before, reuse it.
+ // If there were recent wheel events, reset the wheel idle timeout.
+ if (g.wheel) {
+ if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+ g.mouse[1] = t.invert(g.mouse[0] = p);
+ }
+ clearTimeout(g.wheel);
+ }
+
+ // If this wheel event won’t trigger a transform change, ignore it.
+ else if (t.k === k) return;
+
+ // Otherwise, capture the mouse point and location at the start.
+ else {
+ g.mouse = [p, t.invert(p)];
+ interrupt(this);
+ g.start();
+ }
+
+ noevent(event);
+ g.wheel = setTimeout(wheelidled, wheelDelay);
+ g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+
+ function wheelidled() {
+ g.wheel = null;
+ g.end();
+ }
+ }
+
+ function mousedowned(event, ...args) {
+ if (touchending || !filter.apply(this, arguments)) return;
+ var currentTarget = event.currentTarget,
+ g = gesture(this, args, true).event(event),
+ v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
+ p = pointer(event, currentTarget),
+ x0 = event.clientX,
+ y0 = event.clientY;
+
+ dragDisable(event.view);
+ nopropagation(event);
+ g.mouse = [p, this.__zoom.invert(p)];
+ interrupt(this);
+ g.start();
+
+ function mousemoved(event) {
+ noevent(event);
+ if (!g.moved) {
+ var dx = event.clientX - x0, dy = event.clientY - y0;
+ g.moved = dx * dx + dy * dy > clickDistance2;
+ }
+ g.event(event)
+ .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));
+ }
+
+ function mouseupped(event) {
+ v.on("mousemove.zoom mouseup.zoom", null);
+ dragEnable(event.view, g.moved);
+ noevent(event);
+ g.event(event).end();
+ }
+ }
+
+ function dblclicked(event, ...args) {
+ if (!filter.apply(this, arguments)) return;
+ var t0 = this.__zoom,
+ p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),
+ p1 = t0.invert(p0),
+ k1 = t0.k * (event.shiftKey ? 0.5 : 2),
+ t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);
+
+ noevent(event);
+ if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);
+ else select(this).call(zoom.transform, t1, p0, event);
+ }
+
+ function touchstarted(event, ...args) {
+ if (!filter.apply(this, arguments)) return;
+ var touches = event.touches,
+ n = touches.length,
+ g = gesture(this, args, event.changedTouches.length === n).event(event),
+ started, i, t, p;
+
+ nopropagation(event);
+ for (i = 0; i < n; ++i) {
+ t = touches[i], p = pointer(t, this);
+ p = [p, this.__zoom.invert(p), t.identifier];
+ if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
+ else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;
+ }
+
+ if (touchstarting) touchstarting = clearTimeout(touchstarting);
+
+ if (started) {
+ if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
+ interrupt(this);
+ g.start();
+ }
+ }
+
+ function touchmoved(event, ...args) {
+ if (!this.__zooming) return;
+ var g = gesture(this, args).event(event),
+ touches = event.changedTouches,
+ n = touches.length, i, t, p, l;
+
+ noevent(event);
+ for (i = 0; i < n; ++i) {
+ t = touches[i], p = pointer(t, this);
+ if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
+ else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
+ }
+ t = g.that.__zoom;
+ if (g.touch1) {
+ var p0 = g.touch0[0], l0 = g.touch0[1],
+ p1 = g.touch1[0], l1 = g.touch1[1],
+ dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
+ dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+ t = scale(t, Math.sqrt(dp / dl));
+ p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+ l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+ }
+ else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
+ else return;
+
+ g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
+ }
+
+ function touchended(event, ...args) {
+ if (!this.__zooming) return;
+ var g = gesture(this, args).event(event),
+ touches = event.changedTouches,
+ n = touches.length, i, t;
+
+ nopropagation(event);
+ if (touchending) clearTimeout(touchending);
+ touchending = setTimeout(function() { touchending = null; }, touchDelay);
+ for (i = 0; i < n; ++i) {
+ t = touches[i];
+ if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
+ else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
+ }
+ if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
+ if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
+ else {
+ g.end();
+ // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.
+ if (g.taps === 2) {
+ t = pointer(t, this);
+ if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
+ var p = select(this).on("dblclick.zoom");
+ if (p) p.apply(this, arguments);
+ }
+ }
+ }
+ }
+
+ zoom.wheelDelta = function(_) {
+ return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta;
+ };
+
+ zoom.filter = function(_) {
+ return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter;
+ };
+
+ zoom.touchable = function(_) {
+ return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable;
+ };
+
+ zoom.extent = function(_) {
+ return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+ };
+
+ zoom.scaleExtent = function(_) {
+ return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+ };
+
+ zoom.translateExtent = function(_) {
+ return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
+ };
+
+ zoom.constrain = function(_) {
+ return arguments.length ? (constrain = _, zoom) : constrain;
+ };
+
+ zoom.duration = function(_) {
+ return arguments.length ? (duration = +_, zoom) : duration;
+ };
+
+ zoom.interpolate = function(_) {
+ return arguments.length ? (interpolate = _, zoom) : interpolate;
+ };
+
+ zoom.on = function() {
+ var value = listeners.on.apply(listeners, arguments);
+ return value === listeners ? zoom : value;
+ };
+
+ zoom.clickDistance = function(_) {
+ return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
+ };
+
+ zoom.tapDistance = function(_) {
+ return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
+ };
+
+ return zoom;
+}
+
+;// CONCATENATED MODULE: ./node_modules/d3-zoom/src/index.js
+
+
+
+;// CONCATENATED MODULE: ./node_modules/d3/src/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
+var injectStylesIntoStyleTag = __webpack_require__(379);
+var injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js
+var styleDomAPI = __webpack_require__(795);
+var styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js
+var insertBySelector = __webpack_require__(569);
+var insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js
+var setAttributesWithoutAttributes = __webpack_require__(565);
+var setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js
+var insertStyleElement = __webpack_require__(216);
+var insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);
+// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js
+var styleTagTransform = __webpack_require__(589);
+var styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);
+// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./styles/table.css
+var table = __webpack_require__(727);
+;// CONCATENATED MODULE: ./styles/table.css
+
+
+
+
+
+
+
+
+
+
+
+var options = {};
+
+options.styleTagTransform = (styleTagTransform_default());
+options.setAttributes = (setAttributesWithoutAttributes_default());
+
+ options.insert = insertBySelector_default().bind(null, "head");
+
+options.domAPI = (styleDomAPI_default());
+options.insertStyleElement = (insertStyleElement_default());
+
+var update = injectStylesIntoStyleTag_default()(table/* default */.Z, options);
+
+
+
+
+ /* harmony default export */ const styles_table = (table/* default */.Z && table/* default.locals */.Z.locals ? table/* default.locals */.Z.locals : undefined);
+
+;// CONCATENATED MODULE: ./scripts/table.js
+
+
+var json = window.Roundtrip['table_src'];
+var table_data = JSON.parse(json);
+console.log(table_data);
+var pivot = [];
+
+for (var _i = 0, _Object$keys = Object.keys(table_data[Object.keys(table_data)[0]]); _i < _Object$keys.length; _i++) {
+ var i = _Object$keys[_i];
+ var row = {};
+
+ for (var _i2 = 0, _Object$keys2 = Object.keys(table_data); _i2 < _Object$keys2.length; _i2++) {
+ var key = _Object$keys2[_i2];
+ row[key] = table_data[key][i];
+ }
+
+ pivot.push(row);
+}
+
+console.log(pivot);
+var table_table = src_select(element).select('#table-area').append('table').attr('border', '1');
+table_table.append('tr').selectAll('.header').data(Object.keys(table_data)).enter().append('th').attr('class', 'header').html(function (d) {
+ return d;
+});
+var newrows = table_table.selectAll('.tbrow').data(pivot).enter().append('tr').attr('class', function (d, i) {
+ if (i % 2 == 0) {
+ return 'tbrow';
+ } else {
+ return 'tbrow alt';
+ }
+});
+newrows.selectAll('.tbcells').data(function (d) {
+ return Object.values(d);
+}).enter().append('td').attr('class', 'tbcells').html(function (d) {
+ return d;
+});
+})();
+
+/******/ })()
+;
\ No newline at end of file
diff --git a/hatchet/vis/styles/table.css b/hatchet/vis/styles/table.css
new file mode 100644
index 00000000..07da528a
--- /dev/null
+++ b/hatchet/vis/styles/table.css
@@ -0,0 +1,3 @@
+.alt{
+ background-color: rgba(0,0,0,0.1);
+}
\ No newline at end of file
diff --git a/hatchet/vis/templates/table.html b/hatchet/vis/templates/table.html
new file mode 100644
index 00000000..1543c65d
--- /dev/null
+++ b/hatchet/vis/templates/table.html
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/hatchet/vis/webpack.config.js b/hatchet/vis/webpack.config.js
index 15de7573..a02da2fb 100644
--- a/hatchet/vis/webpack.config.js
+++ b/hatchet/vis/webpack.config.js
@@ -20,6 +20,7 @@ module.exports = {
]
},
entry: {
+ table: [path.resolve(__dirname,'scripts/table.js')],
cct: [path.resolve(__dirname,'scripts/cct.js')],
},
output: {
@@ -31,6 +32,11 @@ module.exports = {
minimize: false
},
plugins:[
+ new HtmlWebpackPlugin({
+ template: path.resolve(__dirname, 'templates/table.html'),
+ chunks: ['table'],
+ filename: 'table_bundle.html'
+ }),
new HtmlWebpackPlugin({
chunks: ['cct'],
filename: 'cct_bundle.html'