2024-01-10 08:17:44 -06:00
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" / >
< title > plotly< / title >
< script > ( f u n c t i o n ( ) {
// If window.HTMLWidgets is already defined, then use it; otherwise create a
// new object. This allows preceding code to set options that affect the
// initialization process (though none currently exist).
window.HTMLWidgets = window.HTMLWidgets || {};
// See if we're running in a viewer pane. If not, we're in a web browser.
var viewerMode = window.HTMLWidgets.viewerMode =
/\bviewer_pane=1\b/.test(window.location);
// See if we're running in Shiny mode. If not, it's a static document.
// Note that static widgets can appear in both Shiny and static modes, but
// obviously, Shiny widgets can only appear in Shiny apps/documents.
var shinyMode = window.HTMLWidgets.shinyMode =
typeof(window.Shiny) !== "undefined" & & !!window.Shiny.outputBindings;
// We can't count on jQuery being available, so we implement our own
// version if necessary.
function querySelectorAll(scope, selector) {
if (typeof(jQuery) !== "undefined" & & scope instanceof jQuery) {
return scope.find(selector);
}
if (scope.querySelectorAll) {
return scope.querySelectorAll(selector);
}
}
function asArray(value) {
if (value === null)
return [];
if ($.isArray(value))
return value;
return [value];
}
// Implement jQuery's extend
function extend(target /*, ... */) {
if (arguments.length == 1) {
return target;
}
for (var i = 1; i < arguments.length ; i + + ) {
var source = arguments[i];
for (var prop in source) {
if (source.hasOwnProperty(prop)) {
target[prop] = source[prop];
}
}
}
return target;
}
// IE8 doesn't support Array.forEach.
function forEach(values, callback, thisArg) {
if (values.forEach) {
values.forEach(callback, thisArg);
} else {
for (var i = 0; i < values.length ; i + + ) {
callback.call(thisArg, values[i], i, values);
}
}
}
// Replaces the specified method with the return value of funcSource.
//
// Note that funcSource should not BE the new method, it should be a function
// that RETURNS the new method. funcSource receives a single argument that is
// the overridden method, it can be called from the new method. The overridden
// method can be called like a regular function, it has the target permanently
// bound to it so "this" will work correctly.
function overrideMethod(target, methodName, funcSource) {
var superFunc = target[methodName] || function() {};
var superFuncBound = function() {
return superFunc.apply(target, arguments);
};
target[methodName] = funcSource(superFuncBound);
}
// Add a method to delegator that, when invoked, calls
// delegatee.methodName. If there is no such method on
// the delegatee, but there was one on delegator before
// delegateMethod was called, then the original version
// is invoked instead.
// For example:
//
// var a = {
// method1: function() { console.log('a1'); }
// method2: function() { console.log('a2'); }
// };
// var b = {
// method1: function() { console.log('b1'); }
// };
// delegateMethod(a, b, "method1");
// delegateMethod(a, b, "method2");
// a.method1();
// a.method2();
//
// The output would be "b1", "a2".
function delegateMethod(delegator, delegatee, methodName) {
var inherited = delegator[methodName];
delegator[methodName] = function() {
var target = delegatee;
var method = delegatee[methodName];
// The method doesn't exist on the delegatee. Instead,
// call the method on the delegator, if it exists.
if (!method) {
target = delegator;
method = inherited;
}
if (method) {
return method.apply(target, arguments);
}
};
}
// Implement a vague facsimilie of jQuery's data method
function elementData(el, name, value) {
if (arguments.length == 2) {
return el["htmlwidget_data_" + name];
} else if (arguments.length == 3) {
el["htmlwidget_data_" + name] = value;
return el;
} else {
throw new Error("Wrong number of arguments for elementData: " +
arguments.length);
}
}
// http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function hasClass(el, className) {
var re = new RegExp("\\b" + escapeRegExp(className) + "\\b");
return re.test(el.className);
}
// elements - array (or array-like object) of HTML elements
// className - class name to test for
// include - if true, only return elements with given className;
// if false, only return elements *without* given className
function filterByClass(elements, className, include) {
var results = [];
for (var i = 0; i < elements.length ; i + + ) {
if (hasClass(elements[i], className) == include)
results.push(elements[i]);
}
return results;
}
function on(obj, eventName, func) {
if (obj.addEventListener) {
obj.addEventListener(eventName, func, false);
} else if (obj.attachEvent) {
obj.attachEvent(eventName, func);
}
}
function off(obj, eventName, func) {
if (obj.removeEventListener)
obj.removeEventListener(eventName, func, false);
else if (obj.detachEvent) {
obj.detachEvent(eventName, func);
}
}
// Translate array of values to top/right/bottom/left, as usual with
// the "padding" CSS property
// https://developer.mozilla.org/en-US/docs/Web/CSS/padding
function unpackPadding(value) {
if (typeof(value) === "number")
value = [value];
if (value.length === 1) {
return {top: value[0], right: value[0], bottom: value[0], left: value[0]};
}
if (value.length === 2) {
return {top: value[0], right: value[1], bottom: value[0], left: value[1]};
}
if (value.length === 3) {
return {top: value[0], right: value[1], bottom: value[2], left: value[1]};
}
if (value.length === 4) {
return {top: value[0], right: value[1], bottom: value[2], left: value[3]};
}
}
// Convert an unpacked padding object to a CSS value
function paddingToCss(paddingObj) {
return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px";
}
// Makes a number suitable for CSS
function px(x) {
if (typeof(x) === "number")
return x + "px";
else
return x;
}
// Retrieves runtime widget sizing information for an element.
// The return value is either null, or an object with fill, padding,
// defaultWidth, defaultHeight fields.
function sizingPolicy(el) {
var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']");
if (!sizingEl)
return null;
var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}");
if (viewerMode) {
return sp.viewer;
} else {
return sp.browser;
}
}
// @param tasks Array of strings (or falsy value, in which case no-op).
// Each element must be a valid JavaScript expression that yields a
// function. Or, can be an array of objects with "code" and "data"
// properties; in this case, the "code" property should be a string
// of JS that's an expr that yields a function, and "data" should be
// an object that will be added as an additional argument when that
// function is called.
// @param target The object that will be "this" for each function
// execution.
// @param args Array of arguments to be passed to the functions. (The
// same arguments will be passed to all functions.)
function evalAndRun(tasks, target, args) {
if (tasks) {
forEach(tasks, function(task) {
var theseArgs = args;
if (typeof(task) === "object") {
theseArgs = theseArgs.concat([task.data]);
task = task.code;
}
var taskFunc = tryEval(task);
if (typeof(taskFunc) !== "function") {
throw new Error("Task must be a function! Source:\n" + task);
}
taskFunc.apply(target, theseArgs);
});
}
}
// Attempt eval() both with and without enclosing in parentheses.
// Note that enclosing coerces a function declaration into
// an expression that eval() can parse
// (otherwise, a SyntaxError is thrown)
function tryEval(code) {
var result = null;
try {
result = eval("(" + code + ")");
} catch(error) {
if (!error instanceof SyntaxError) {
throw error;
}
try {
result = eval(code);
} catch(e) {
if (e instanceof SyntaxError) {
throw error;
} else {
throw e;
}
}
}
return result;
}
function initSizing(el) {
var sizing = sizingPolicy(el);
if (!sizing)
return;
var cel = document.getElementById("htmlwidget_container");
if (!cel)
return;
if (typeof(sizing.padding) !== "undefined") {
document.body.style.margin = "0";
document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));
}
if (sizing.fill) {
document.body.style.overflow = "hidden";
document.body.style.width = "100%";
document.body.style.height = "100%";
document.documentElement.style.width = "100%";
document.documentElement.style.height = "100%";
if (cel) {
cel.style.position = "absolute";
var pad = unpackPadding(sizing.padding);
cel.style.top = pad.top + "px";
cel.style.right = pad.right + "px";
cel.style.bottom = pad.bottom + "px";
cel.style.left = pad.left + "px";
el.style.width = "100%";
el.style.height = "100%";
}
return {
getWidth: function() { return cel.offsetWidth; },
getHeight: function() { return cel.offsetHeight; }
};
} else {
el.style.width = px(sizing.width);
el.style.height = px(sizing.height);
return {
getWidth: function() { return el.offsetWidth; },
getHeight: function() { return el.offsetHeight; }
};
}
}
// Default implementations for methods
var defaults = {
find: function(scope) {
return querySelectorAll(scope, "." + this.name);
},
renderError: function(el, err) {
var $el = $(el);
this.clearError(el);
// Add all these error classes, as Shiny does
var errClass = "shiny-output-error";
if (err.type !== null) {
// use the classes of the error condition as CSS class names
errClass = errClass + " " + $.map(asArray(err.type), function(type) {
return errClass + "-" + type;
}).join(" ");
}
errClass = errClass + " htmlwidgets-error";
// Is el inline or block? If inline or inline-block, just display:none it
// and add an inline error.
var display = $el.css("display");
$el.data("restore-display-mode", display);
if (display === "inline" || display === "inline-block") {
$el.hide();
if (err.message !== "") {
var errorSpan = $("< span > ").addClass(errClass);
errorSpan.text(err.message);
$el.after(errorSpan);
}
} else if (display === "block") {
// If block, add an error just after the el, set visibility:none on the
// el, and position the error to be on top of the el.
// Mark it with a unique ID and CSS class so we can remove it later.
$el.css("visibility", "hidden");
if (err.message !== "") {
var errorDiv = $("< div > ").addClass(errClass).css("position", "absolute")
.css("top", el.offsetTop)
.css("left", el.offsetLeft)
// setting width can push out the page size, forcing otherwise
// unnecessary scrollbars to appear and making it impossible for
// the element to shrink; so use max-width instead
.css("maxWidth", el.offsetWidth)
.css("height", el.offsetHeight);
errorDiv.text(err.message);
$el.after(errorDiv);
// Really dumb way to keep the size/position of the error in sync with
// the parent element as the window is resized or whatever.
var intId = setInterval(function() {
if (!errorDiv[0].parentElement) {
clearInterval(intId);
return;
}
errorDiv
.css("top", el.offsetTop)
.css("left", el.offsetLeft)
.css("maxWidth", el.offsetWidth)
.css("height", el.offsetHeight);
}, 500);
}
}
},
clearError: function(el) {
var $el = $(el);
var display = $el.data("restore-display-mode");
$el.data("restore-display-mode", null);
if (display === "inline" || display === "inline-block") {
if (display)
$el.css("display", display);
$(el.nextSibling).filter(".htmlwidgets-error").remove();
} else if (display === "block"){
$el.css("visibility", "inherit");
$(el.nextSibling).filter(".htmlwidgets-error").remove();
}
},
sizing: {}
};
// Called by widget bindings to register a new type of widget. The definition
// object can contain the following properties:
// - name (required) - A string indicating the binding name, which will be
// used by default as the CSS classname to look for.
// - initialize (optional) - A function(el) that will be called once per
// widget element; if a value is returned, it will be passed as the third
// value to renderValue.
// - renderValue (required) - A function(el, data, initValue) that will be
// called with data. Static contexts will cause this to be called once per
// element; Shiny apps will cause this to be called multiple times per
// element, as the data changes.
window.HTMLWidgets.widget = function(definition) {
if (!definition.name) {
throw new Error("Widget must have a name");
}
if (!definition.type) {
throw new Error("Widget must have a type");
}
// Currently we only support output widgets
if (definition.type !== "output") {
throw new Error("Unrecognized widget type '" + definition.type + "'");
}
// TODO: Verify that .name is a valid CSS classname
// Support new-style instance-bound definitions. Old-style class-bound
// definitions have one widget "object" per widget per type/class of
// widget; the renderValue and resize methods on such widget objects
// take el and instance arguments, because the widget object can't
// store them. New-style instance-bound definitions have one widget
// object per widget instance; the definition that's passed in doesn't
// provide renderValue or resize methods at all, just the single method
// factory(el, width, height)
// which returns an object that has renderValue(x) and resize(w, h).
// This enables a far more natural programming style for the widget
// author, who can store per-instance state using either OO-style
// instance fields or functional-style closure variables (I guess this
// is in contrast to what can only be called C-style pseudo-OO which is
// what we required before).
if (definition.factory) {
definition = createLegacyDefinitionAdapter(definition);
}
if (!definition.renderValue) {
throw new Error("Widget must have a renderValue function");
}
// For static rendering (non-Shiny), use a simple widget registration
// scheme. We also use this scheme for Shiny apps/documents that also
// contain static widgets.
window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];
// Merge defaults into the definition; don't mutate the original definition.
var staticBinding = extend({}, defaults, definition);
overrideMethod(staticBinding, "find", function(superfunc) {
return function(scope) {
var results = superfunc(scope);
// Filter out Shiny outputs, we only want the static kind
return filterByClass(results, "html-widget-output", false);
};
});
window.HTMLWidgets.widgets.push(staticBinding);
if (shinyMode) {
// Shiny is running. Register the definition with an output binding.
// The definition itself will not be the output binding, instead
// we will make an output binding object that delegates to the
// definition. This is because we foolishly used the same method
// name (renderValue) for htmlwidgets definition and Shiny bindings
// but they actually have quite different semantics (the Shiny
// bindings receive data that includes lots of metadata that it
// strips off before calling htmlwidgets renderValue). We can't
// just ignore the difference because in some widgets it's helpful
// to call this.renderValue() from inside of resize(), and if
// we're not delegating, then that call will go to the Shiny
// version instead of the htmlwidgets version.
// Merge defaults with definition, without mutating either.
var bindingDef = extend({}, defaults, definition);
// This object will be our actual Shiny binding.
var shinyBinding = new Shiny.OutputBinding();
// With a few exceptions, we'll want to simply use the bindingDef's
// version of methods if they are available, otherwise fall back to
// Shiny's defaults. NOTE: If Shiny's output bindings gain additional
// methods in the future, and we want them to be overrideable by
// HTMLWidget binding definitions, then we'll need to add them to this
// list.
delegateMethod(shinyBinding, bindingDef, "getId");
delegateMethod(shinyBinding, bindingDef, "onValueChange");
delegateMethod(shinyBinding, bindingDef, "onValueError");
delegateMethod(shinyBinding, bindingDef, "renderError");
delegateMethod(shinyBinding, bindingDef, "clearError");
delegateMethod(shinyBinding, bindingDef, "showProgress");
// The find, renderValue, and resize are handled differently, because we
// want to actually decorate the behavior of the bindingDef methods.
shinyBinding.find = function(scope) {
var results = bindingDef.find(scope);
// Only return elements that are Shiny outputs, not static ones
var dynamicResults = results.filter(".html-widget-output");
// It's possible that whatever caused Shiny to think there might be
// new dynamic outputs, also caused there to be new static outputs.
// Since there might be lots of different htmlwidgets bindings, we
// schedule execution for later--no need to staticRender multiple
// times.
if (results.length !== dynamicResults.length)
scheduleStaticRender();
return dynamicResults;
};
// Wrap renderValue to handle initialization, which unfortunately isn't
// supported natively by Shiny at the time of this writing.
shinyBinding.renderValue = function(el, data) {
Shiny.renderDependencies(data.deps);
// Resolve strings marked as javascript literals to objects
if (!(data.evals instanceof Array)) data.evals = [data.evals];
for (var i = 0; data.evals & & i < data.evals.length ; i + + ) {
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);
}
if (!bindingDef.renderOnNullValue) {
if (data.x === null) {
el.style.visibility = "hidden";
return;
} else {
el.style.visibility = "inherit";
}
}
if (!elementData(el, "initialized")) {
initSizing(el);
elementData(el, "initialized", true);
if (bindingDef.initialize) {
var result = bindingDef.initialize(el, el.offsetWidth,
el.offsetHeight);
elementData(el, "init_result", result);
}
}
bindingDef.renderValue(el, data.x, elementData(el, "init_result"));
evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]);
};
// Only override resize if bindingDef implements it
if (bindingDef.resize) {
shinyBinding.resize = function(el, width, height) {
// Shiny can call resize before initialize/renderValue have been
// called, which doesn't make sense for widgets.
if (elementData(el, "initialized")) {
bindingDef.resize(el, width, height, elementData(el, "init_result"));
}
};
}
Shiny.outputBindings.register(shinyBinding, bindingDef.name);
}
};
var scheduleStaticRenderTimerId = null;
function scheduleStaticRender() {
if (!scheduleStaticRenderTimerId) {
scheduleStaticRenderTimerId = setTimeout(function() {
scheduleStaticRenderTimerId = null;
window.HTMLWidgets.staticRender();
}, 1);
}
}
// Render static widgets after the document finishes loading
// Statically render all elements that are of this widget's class
window.HTMLWidgets.staticRender = function() {
var bindings = window.HTMLWidgets.widgets || [];
forEach(bindings, function(binding) {
var matches = binding.find(document.documentElement);
forEach(matches, function(el) {
var sizeObj = initSizing(el, binding);
if (hasClass(el, "html-widget-static-bound"))
return;
el.className = el.className + " html-widget-static-bound";
var initResult;
if (binding.initialize) {
initResult = binding.initialize(el,
sizeObj ? sizeObj.getWidth() : el.offsetWidth,
sizeObj ? sizeObj.getHeight() : el.offsetHeight
);
elementData(el, "init_result", initResult);
}
if (binding.resize) {
var lastSize = {
w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
};
var resizeHandler = function(e) {
var size = {
w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,
h: sizeObj ? sizeObj.getHeight() : el.offsetHeight
};
if (size.w === 0 & & size.h === 0)
return;
if (size.w === lastSize.w & & size.h === lastSize.h)
return;
lastSize = size;
binding.resize(el, size.w, size.h, initResult);
};
on(window, "resize", resizeHandler);
// This is needed for cases where we're running in a Shiny
// app, but the widget itself is not a Shiny output, but
// rather a simple static widget. One example of this is
// an rmarkdown document that has runtime:shiny and widget
// that isn't in a render function. Shiny only knows to
// call resize handlers for Shiny outputs, not for static
// widgets, so we do it ourselves.
if (window.jQuery) {
window.jQuery(document).on(
"shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets",
resizeHandler
);
window.jQuery(document).on(
"hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets",
resizeHandler
);
}
// This is needed for the specific case of ioslides, which
// flips slides between display:none and display:block.
// Ideally we would not have to have ioslide-specific code
// here, but rather have ioslides raise a generic event,
// but the rmarkdown package just went to CRAN so the
// window to getting that fixed may be long.
if (window.addEventListener) {
// It's OK to limit this to window.addEventListener
// browsers because ioslides itself only supports
// such browsers.
on(document, "slideenter", resizeHandler);
on(document, "slideleave", resizeHandler);
}
}
var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']");
if (scriptData) {
var data = JSON.parse(scriptData.textContent || scriptData.text);
// Resolve strings marked as javascript literals to objects
if (!(data.evals instanceof Array)) data.evals = [data.evals];
for (var k = 0; data.evals & & k < data.evals.length ; k + + ) {
window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);
}
binding.renderValue(el, data.x, initResult);
evalAndRun(data.jsHooks.render, initResult, [el, data.x]);
}
});
});
invokePostRenderHandlers();
}
function has_jQuery3() {
if (!window.jQuery) {
return false;
}
var $version = window.jQuery.fn.jquery;
var $major_version = parseInt($version.split(".")[0]);
return $major_version >= 3;
}
/*
/ Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's
/ on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now
/ really means $(setTimeout(fn)).
/ https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous
/
/ Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny
/ one tick later than it did before, which means staticRender() is
/ called renderValue() earlier than (advanced) widget authors might be expecting.
/ https://github.com/rstudio/shiny/issues/2630
/
/ For a concrete example, leaflet has some methods (e.g., updateBounds)
/ which reference Shiny methods registered in initShiny (e.g., setInputValue).
/ Since leaflet is privy to this life-cycle, it knows to use setTimeout() to
/ delay execution of those methods (until Shiny methods are ready)
/ https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268
/
/ Ideally widget authors wouldn't need to use this setTimeout() hack that
/ leaflet uses to call Shiny methods on a staticRender(). In the long run,
/ the logic initShiny should be broken up so that method registration happens
/ right away, but binding happens later.
*/
function maybeStaticRenderLater() {
if (shinyMode & & has_jQuery3()) {
window.jQuery(window.HTMLWidgets.staticRender);
} else {
window.HTMLWidgets.staticRender();
}
}
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", function() {
document.removeEventListener("DOMContentLoaded", arguments.callee, false);
maybeStaticRenderLater();
}, false);
} else if (document.attachEvent) {
document.attachEvent("onreadystatechange", function() {
if (document.readyState === "complete") {
document.detachEvent("onreadystatechange", arguments.callee);
maybeStaticRenderLater();
}
});
}
window.HTMLWidgets.getAttachmentUrl = function(depname, key) {
// If no key, default to the first item
if (typeof(key) === "undefined")
key = 1;
var link = document.getElementById(depname + "-" + key + "-attachment");
if (!link) {
throw new Error("Attachment " + depname + "/" + key + " not found in document");
}
return link.getAttribute("href");
};
window.HTMLWidgets.dataframeToD3 = function(df) {
var names = [];
var length;
for (var name in df) {
if (df.hasOwnProperty(name))
names.push(name);
if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") {
throw new Error("All fields must be arrays");
} else if (typeof(length) !== "undefined" & & length !== df[name].length) {
throw new Error("All fields must be arrays of the same length");
}
length = df[name].length;
}
var results = [];
var item;
for (var row = 0; row < length ; row + + ) {
item = {};
for (var col = 0; col < names.length ; col + + ) {
item[names[col]] = df[names[col]][row];
}
results.push(item);
}
return results;
};
window.HTMLWidgets.transposeArray2D = function(array) {
if (array.length === 0) return array;
var newArray = array[0].map(function(col, i) {
return array.map(function(row) {
return row[i]
})
});
return newArray;
};
// Split value at splitChar, but allow splitChar to be escaped
// using escapeChar. Any other characters escaped by escapeChar
// will be included as usual (including escapeChar itself).
function splitWithEscape(value, splitChar, escapeChar) {
var results = [];
var escapeMode = false;
var currentResult = "";
for (var pos = 0; pos < value.length ; pos + + ) {
if (!escapeMode) {
if (value[pos] === splitChar) {
results.push(currentResult);
currentResult = "";
} else if (value[pos] === escapeChar) {
escapeMode = true;
} else {
currentResult += value[pos];
}
} else {
currentResult += value[pos];
escapeMode = false;
}
}
if (currentResult !== "") {
results.push(currentResult);
}
return results;
}
// Function authored by Yihui/JJ Allaire
window.HTMLWidgets.evaluateStringMember = function(o, member) {
var parts = splitWithEscape(member, '.', '\\');
for (var i = 0, l = parts.length; i < l ; i + + ) {
var part = parts[i];
// part may be a character or 'numeric' member name
if (o !== null & & typeof o === "object" & & part in o) {
if (i == (l - 1)) { // if we are at the end of the line then evalulate
if (typeof o[part] === "string")
o[part] = tryEval(o[part]);
} else { // otherwise continue to next embedded object
o = o[part];
}
}
}
};
// Retrieve the HTMLWidget instance (i.e. the return value of an
// HTMLWidget binding's initialize() or factory() function)
// associated with an element, or null if none.
window.HTMLWidgets.getInstance = function(el) {
return elementData(el, "init_result");
};
// Finds the first element in the scope that matches the selector,
// and returns the HTMLWidget instance (i.e. the return value of
// an HTMLWidget binding's initialize() or factory() function)
// associated with that element, if any. If no element matches the
// selector, or the first matching element has no HTMLWidget
// instance associated with it, then null is returned.
//
// The scope argument is optional, and defaults to window.document.
window.HTMLWidgets.find = function(scope, selector) {
if (arguments.length == 1) {
selector = scope;
scope = document;
}
var el = scope.querySelector(selector);
if (el === null) {
return null;
} else {
return window.HTMLWidgets.getInstance(el);
}
};
// Finds all elements in the scope that match the selector, and
// returns the HTMLWidget instances (i.e. the return values of
// an HTMLWidget binding's initialize() or factory() function)
// associated with the elements, in an array. If elements that
// match the selector don't have an associated HTMLWidget
// instance, the returned array will contain nulls.
//
// The scope argument is optional, and defaults to window.document.
window.HTMLWidgets.findAll = function(scope, selector) {
if (arguments.length == 1) {
selector = scope;
scope = document;
}
var nodes = scope.querySelectorAll(selector);
var results = [];
for (var i = 0; i < nodes.length ; i + + ) {
results.push(window.HTMLWidgets.getInstance(nodes[i]));
}
return results;
};
var postRenderHandlers = [];
function invokePostRenderHandlers() {
while (postRenderHandlers.length) {
var handler = postRenderHandlers.shift();
if (handler) {
handler();
}
}
}
// Register the given callback function to be invoked after the
// next time static widgets are rendered.
window.HTMLWidgets.addPostRenderHandler = function(callback) {
postRenderHandlers.push(callback);
};
// Takes a new-style instance-bound definition, and returns an
// old-style class-bound definition. This saves us from having
// to rewrite all the logic in this file to accomodate both
// types of definitions.
function createLegacyDefinitionAdapter(defn) {
var result = {
name: defn.name,
type: defn.type,
initialize: function(el, width, height) {
return defn.factory(el, width, height);
},
renderValue: function(el, x, instance) {
return instance.renderValue(x);
},
resize: function(el, width, height, instance) {
return instance.resize(width, height);
}
};
if (defn.find)
result.find = defn.find;
if (defn.renderError)
result.renderError = defn.renderError;
if (defn.clearError)
result.clearError = defn.clearError;
return result;
}
})();
< / script > < br / >
< script >
HTMLWidgets.widget({
name: "plotly",
type: "output",
initialize: function(el, width, height) {
return {};
},
resize: function(el, width, height, instance) {
if (instance.autosize) {
var width = instance.width || width;
var height = instance.height || height;
Plotly.relayout(el.id, {width: width, height: height});
}
},
renderValue: function(el, x, instance) {
// Plotly.relayout() mutates the plot input object, so make sure to
// keep a reference to the user-supplied width/height *before*
// we call Plotly.plot();
var lay = x.layout || {};
instance.width = lay.width;
instance.height = lay.height;
instance.autosize = lay.autosize || true;
/*
/ 'inform the world' about highlighting options this is so other
/ crosstalk libraries have a chance to respond to special settings
/ such as persistent selection.
/ AFAIK, leaflet is the only library with such intergration
/ https://github.com/rstudio/leaflet/pull/346/files#diff-ad0c2d51ce5fdf8c90c7395b102f4265R154
*/
var ctConfig = crosstalk.var('plotlyCrosstalkOpts').set(x.highlight);
if (typeof(window) !== "undefined") {
// make sure plots don't get created outside the network (for on-prem)
window.PLOTLYENV = window.PLOTLYENV || {};
window.PLOTLYENV.BASE_URL = x.base_url;
// Enable persistent selection when shift key is down
// https://stackoverflow.com/questions/1828613/check-if-a-key-is-down
var persistOnShift = function(e) {
if (!e) window.event;
if (e.shiftKey) {
x.highlight.persistent = true;
x.highlight.persistentShift = true;
} else {
x.highlight.persistent = false;
x.highlight.persistentShift = false;
}
};
// Only relevant if we haven't forced persistent mode at command line
if (!x.highlight.persistent) {
window.onmousemove = persistOnShift;
}
}
var graphDiv = document.getElementById(el.id);
// TODO: move the control panel injection strategy inside here...
HTMLWidgets.addPostRenderHandler(function() {
// lower the z-index of the modebar to prevent it from highjacking hover
// (TODO: do this via CSS?)
// https://github.com/ropensci/plotly/issues/956
// https://www.w3schools.com/jsref/prop_style_zindex.asp
var modebars = document.querySelectorAll(".js-plotly-plot .plotly .modebar");
for (var i = 0; i < modebars.length ; i + + ) {
modebars[i].style.zIndex = 1;
}
});
// inject a "control panel" holding selectize/dynamic color widget(s)
if ((x.selectize || x.highlight.dynamic) & & !instance.plotly) {
var flex = document.createElement("div");
flex.class = "plotly-crosstalk-control-panel";
flex.style = "display: flex; flex-wrap: wrap";
// inject the colourpicker HTML container into the flexbox
if (x.highlight.dynamic) {
var pickerDiv = document.createElement("div");
var pickerInput = document.createElement("input");
pickerInput.id = el.id + "-colourpicker";
pickerInput.placeholder = "asdasd";
var pickerLabel = document.createElement("label");
pickerLabel.for = pickerInput.id;
pickerLabel.innerHTML = "Brush color ";
pickerDiv.appendChild(pickerLabel);
pickerDiv.appendChild(pickerInput);
flex.appendChild(pickerDiv);
}
// inject selectize HTML containers (one for every crosstalk group)
if (x.selectize) {
var ids = Object.keys(x.selectize);
for (var i = 0; i < ids.length ; i + + ) {
var container = document.createElement("div");
container.id = ids[i];
container.style = "width: 80%; height: 10%";
container.class = "form-group crosstalk-input-plotly-highlight";
var label = document.createElement("label");
label.for = ids[i];
label.innerHTML = x.selectize[ids[i]].group;
label.class = "control-label";
var selectDiv = document.createElement("div");
var select = document.createElement("select");
select.multiple = true;
selectDiv.appendChild(select);
container.appendChild(label);
container.appendChild(selectDiv);
flex.appendChild(container);
}
}
// finally, insert the flexbox inside the htmlwidget container,
// but before the plotly graph div
graphDiv.parentElement.insertBefore(flex, graphDiv);
if (x.highlight.dynamic) {
var picker = $("#" + pickerInput.id);
var colors = x.highlight.color || [];
// TODO: let users specify options?
var opts = {
value: colors[0],
showColour: "both",
palette: "limited",
allowedCols: colors.join(" "),
width: "20%",
height: "10%"
};
picker.colourpicker({changeDelay: 0});
picker.colourpicker("settings", opts);
picker.colourpicker("value", opts.value);
// inform crosstalk about a change in the current selection colour
var grps = x.highlight.ctGroups || [];
for (var i = 0; i < grps.length ; i + + ) {
crosstalk.group(grps[i]).var('plotlySelectionColour')
.set(picker.colourpicker('value'));
}
picker.on("change", function() {
for (var i = 0; i < grps.length ; i + + ) {
crosstalk.group(grps[i]).var('plotlySelectionColour')
.set(picker.colourpicker('value'));
}
});
}
}
// if no plot exists yet, create one with a particular configuration
if (!instance.plotly) {
var plot = Plotly.plot(graphDiv, x);
instance.plotly = true;
} else {
// this is essentially equivalent to Plotly.newPlot(), but avoids creating
// a new webgl context
// https://github.com/plotly/plotly.js/blob/2b24f9def901831e61282076cf3f835598d56f0e/src/plot_api/plot_api.js#L531-L532
// TODO: restore crosstalk selections?
Plotly.purge(graphDiv);
// TODO: why is this necessary to get crosstalk working?
graphDiv.data = undefined;
graphDiv.layout = undefined;
var plot = Plotly.plot(graphDiv, x);
}
// Trigger plotly.js calls defined via `plotlyProxy()`
plot.then(function() {
if (HTMLWidgets.shinyMode) {
Shiny.addCustomMessageHandler("plotly-calls", function(msg) {
var gd = document.getElementById(msg.id);
if (!gd) {
throw new Error("Couldn't find plotly graph with id: " + msg.id);
}
// This isn't an official plotly.js method, but it's the only current way to
// change just the configuration of a plot
// https://community.plot.ly/t/update-config-function/9057
if (msg.method == "reconfig") {
Plotly.react(gd, gd.data, gd.layout, msg.args);
return;
}
if (!Plotly[msg.method]) {
throw new Error("Unknown method " + msg.method);
}
var args = [gd].concat(msg.args);
Plotly[msg.method].apply(null, args);
});
}
// plotly's mapbox API doesn't currently support setting bounding boxes
// https://www.mapbox.com/mapbox-gl-js/example/fitbounds/
// so we do this manually...
// TODO: make sure this triggers on a redraw and relayout as well as on initial draw
var mapboxIDs = graphDiv._fullLayout._subplots.mapbox || [];
for (var i = 0; i < mapboxIDs.length ; i + + ) {
var id = mapboxIDs[i];
var mapOpts = x.layout[id] || {};
var args = mapOpts._fitBounds || {};
if (!args) {
continue;
}
var mapObj = graphDiv._fullLayout[id]._subplot.map;
mapObj.fitBounds(args.bounds, args.options);
}
});
// Attach attributes (e.g., "key", "z") to plotly event data
function eventDataWithKey(eventData) {
if (eventData === undefined || !eventData.hasOwnProperty("points")) {
return null;
}
return eventData.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
// If 'z' is reported with the event data, then use it!
if (pt.hasOwnProperty("z")) {
obj.z = pt.z;
}
if (pt.hasOwnProperty("customdata")) {
obj.customdata = pt.customdata;
}
/*
TL;DR: (I think) we have to select the graph div (again) to attach keys...
Why? Remember that crosstalk will dynamically add/delete traces
(see traceManager.prototype.updateSelection() below)
For this reason, we can't simply grab keys from x.data (like we did previously)
Moreover, we can't use _fullData, since that doesn't include
unofficial attributes. It's true that click/hover events fire with
pt.data, but drag events don't...
*/
var gd = document.getElementById(el.id);
var trace = gd.data[pt.curveNumber];
if (!trace._isSimpleKey) {
var attrsToAttach = ["key"];
} else {
// simple keys fire the whole key
obj.key = trace.key;
var attrsToAttach = [];
}
for (var i = 0; i < attrsToAttach.length ; i + + ) {
var attr = trace[attrsToAttach[i]];
if (Array.isArray(attr)) {
if (typeof pt.pointNumber === "number") {
obj[attrsToAttach[i]] = attr[pt.pointNumber];
} else if (Array.isArray(pt.pointNumber)) {
obj[attrsToAttach[i]] = attr[pt.pointNumber[0]][pt.pointNumber[1]];
} else if (Array.isArray(pt.pointNumbers)) {
obj[attrsToAttach[i]] = pt.pointNumbers.map(function(idx) { return attr[idx]; });
}
}
}
return obj;
});
}
var legendEventData = function(d) {
// if legendgroup is not relevant just return the trace
var trace = d.data[d.curveNumber];
if (!trace.legendgroup) return trace;
// if legendgroup was specified, return all traces that match the group
var legendgrps = d.data.map(function(trace){ return trace.legendgroup; });
var traces = [];
for (i = 0; i < legendgrps.length ; i + + ) {
if (legendgrps[i] == trace.legendgroup) {
traces.push(d.data[i]);
}
}
return traces;
};
// send user input event data to shiny
if (HTMLWidgets.shinyMode & & Shiny.setInputValue) {
// Some events clear other input values
// TODO: always register these?
var eventClearMap = {
plotly_deselect: ["plotly_selected", "plotly_selecting", "plotly_brushed", "plotly_brushing", "plotly_click"],
plotly_unhover: ["plotly_hover"],
plotly_doubleclick: ["plotly_click"]
};
Object.keys(eventClearMap).map(function(evt) {
graphDiv.on(evt, function() {
var inputsToClear = eventClearMap[evt];
inputsToClear.map(function(input) {
Shiny.setInputValue(input + "-" + x.source, null, {priority: "event"});
});
});
});
var eventDataFunctionMap = {
plotly_click: eventDataWithKey,
plotly_sunburstclick: eventDataWithKey,
plotly_hover: eventDataWithKey,
plotly_unhover: eventDataWithKey,
// If 'plotly_selected' has already been fired, and you click
// on the plot afterwards, this event fires `undefined`?!?
// That might be considered a plotly.js bug, but it doesn't make
// sense for this input change to occur if `d` is falsy because,
// even in the empty selection case, `d` is truthy (an object),
// and the 'plotly_deselect' event will reset this input
plotly_selected: function(d) { if (d) { return eventDataWithKey(d); } },
plotly_selecting: function(d) { if (d) { return eventDataWithKey(d); } },
plotly_brushed: function(d) {
if (d) { return d.range ? d.range : d.lassoPoints; }
},
plotly_brushing: function(d) {
if (d) { return d.range ? d.range : d.lassoPoints; }
},
plotly_legendclick: legendEventData,
plotly_legenddoubleclick: legendEventData,
plotly_clickannotation: function(d) { return d.fullAnnotation }
};
var registerShinyValue = function(event) {
var eventDataPreProcessor = eventDataFunctionMap[event] || function(d) { return d ? d : el.id };
// some events are unique to the R package
var plotlyJSevent = (event == "plotly_brushed") ? "plotly_selected" : (event == "plotly_brushing") ? "plotly_selecting" : event;
// register the event
graphDiv.on(plotlyJSevent, function(d) {
Shiny.setInputValue(
event + "-" + x.source,
JSON.stringify(eventDataPreProcessor(d)),
{priority: "event"}
);
});
}
var shinyEvents = x.shinyEvents || [];
shinyEvents.map(registerShinyValue);
}
// Given an array of {curveNumber: x, pointNumber: y} objects,
// return a hash of {
// set1: {value: [key1, key2, ...], _isSimpleKey: false},
// set2: {value: [key3, key4, ...], _isSimpleKey: false}
// }
function pointsToKeys(points) {
var keysBySet = {};
for (var i = 0; i < points.length ; i + + ) {
var trace = graphDiv.data[points[i].curveNumber];
if (!trace.key || !trace.set) {
continue;
}
// set defaults for this keySet
// note that we don't track the nested property (yet) since we always
// emit the union -- http://cpsievert.github.io/talks/20161212b/#21
keysBySet[trace.set] = keysBySet[trace.set] || {
value: [],
_isSimpleKey: trace._isSimpleKey
};
// Use pointNumber by default, but aggregated traces should emit pointNumbers
var ptNum = points[i].pointNumber;
var hasPtNum = typeof ptNum === "number";
var ptNum = hasPtNum ? ptNum : points[i].pointNumbers;
// selecting a point of a "simple" trace means: select the
// entire key attached to this trace, which is useful for,
// say clicking on a fitted line to select corresponding observations
var key = trace._isSimpleKey ? trace.key : Array.isArray(ptNum) ? ptNum.map(function(idx) { return trace.key[idx]; }) : trace.key[ptNum];
// http://stackoverflow.com/questions/10865025/merge-flatten-an-array-of-arrays-in-javascript
var keyFlat = trace._isNestedKey ? [].concat.apply([], key) : key;
// TODO: better to only add new values?
keysBySet[trace.set].value = keysBySet[trace.set].value.concat(keyFlat);
}
return keysBySet;
}
x.highlight.color = x.highlight.color || [];
// make sure highlight color is an array
if (!Array.isArray(x.highlight.color)) {
x.highlight.color = [x.highlight.color];
}
var traceManager = new TraceManager(graphDiv, x.highlight);
// Gather all *unique* sets.
var allSets = [];
for (var curveIdx = 0; curveIdx < x.data.length ; curveIdx + + ) {
var newSet = x.data[curveIdx].set;
if (newSet) {
if (allSets.indexOf(newSet) === -1) {
allSets.push(newSet);
}
}
}
// register event listeners for all sets
for (var i = 0; i < allSets.length ; i + + ) {
var set = allSets[i];
var selection = new crosstalk.SelectionHandle(set);
var filter = new crosstalk.FilterHandle(set);
var filterChange = function(e) {
removeBrush(el);
traceManager.updateFilter(set, e.value);
};
filter.on("change", filterChange);
var selectionChange = function(e) {
// Workaround for 'plotly_selected' now firing previously selected
// points (in addition to new ones) when holding shift key. In our case,
// we just want the new keys
if (x.highlight.on === "plotly_selected" & & x.highlight.persistentShift) {
// https://stackoverflow.com/questions/1187518/how-to-get-the-difference-between-two-arrays-in-javascript
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0 ; } ) ;
};
e.value = e.value.diff(e.oldValue);
}
// array of "event objects" tracking the selection history
// this is used to avoid adding redundant selections
var selectionHistory = crosstalk.var("plotlySelectionHistory").get() || [];
// Construct an event object "defining" the current event.
var event = {
receiverID: traceManager.gd.id,
plotlySelectionColour: crosstalk.group(set).var("plotlySelectionColour").get()
};
event[set] = e.value;
// TODO: is there a smarter way to check object equality?
if (selectionHistory.length > 0) {
var ev = JSON.stringify(event);
for (var i = 0; i < selectionHistory.length ; i + + ) {
var sel = JSON.stringify(selectionHistory[i]);
if (sel == ev) {
return;
}
}
}
// accumulate history for persistent selection
if (!x.highlight.persistent) {
selectionHistory = [event];
} else {
selectionHistory.push(event);
}
crosstalk.var("plotlySelectionHistory").set(selectionHistory);
// do the actual updating of traces, frames, and the selectize widget
traceManager.updateSelection(set, e.value);
// https://github.com/selectize/selectize.js/blob/master/docs/api.md#methods_items
if (x.selectize) {
if (!x.highlight.persistent || e.value === null) {
selectize.clear(true);
}
selectize.addItems(e.value, true);
selectize.close();
}
}
selection.on("change", selectionChange);
// Set a crosstalk variable selection value, triggering an update
var turnOn = function(e) {
if (e) {
var selectedKeys = pointsToKeys(e.points);
// Keys are group names, values are array of selected keys from group.
for (var set in selectedKeys) {
if (selectedKeys.hasOwnProperty(set)) {
selection.set(selectedKeys[set].value, {sender: el});
}
}
}
};
if (x.highlight.debounce > 0) {
turnOn = debounce(turnOn, x.highlight.debounce);
}
graphDiv.on(x.highlight.on, turnOn);
graphDiv.on(x.highlight.off, function turnOff(e) {
// remove any visual clues
removeBrush(el);
// remove any selection history
crosstalk.var("plotlySelectionHistory").set(null);
// trigger the actual removal of selection traces
selection.set(null, {sender: el});
});
// register a callback for selectize so that there is bi-directional
// communication between the widget and direct manipulation events
if (x.selectize) {
var selectizeID = Object.keys(x.selectize)[i];
var items = x.selectize[selectizeID].items;
var first = [{value: "", label: "(All)"}];
var opts = {
options: first.concat(items),
searchField: "label",
valueField: "value",
labelField: "label",
maxItems: 50
};
var select = $("#" + selectizeID).find("select")[0];
var selectize = $(select).selectize(opts)[0].selectize;
// NOTE: this callback is triggered when *directly* altering
// dropdown items
selectize.on("change", function() {
var currentItems = traceManager.groupSelections[set] || [];
if (!x.highlight.persistent) {
removeBrush(el);
for (var i = 0; i < currentItems.length ; i + + ) {
selectize.removeItem(currentItems[i], true);
}
}
var newItems = selectize.items.filter(function(idx) {
return currentItems.indexOf(idx) < 0 ;
});
if (newItems.length > 0) {
traceManager.updateSelection(set, newItems);
} else {
// Item has been removed...
// TODO: this logic won't work for dynamically changing palette
traceManager.updateSelection(set, null);
traceManager.updateSelection(set, selectize.items);
}
});
}
} // end of selectionChange
} // end of renderValue
}); // end of widget definition
/**
* @param graphDiv The Plotly graph div
* @param highlight An object with options for updating selection(s)
*/
function TraceManager(graphDiv, highlight) {
// The Plotly graph div
this.gd = graphDiv;
// Preserve the original data.
// TODO: try using Lib.extendFlat() as done in
// https://github.com/plotly/plotly.js/pull/1136
this.origData = JSON.parse(JSON.stringify(graphDiv.data));
// avoid doing this over and over
this.origOpacity = [];
for (var i = 0; i < this.origData.length ; i + + ) {
this.origOpacity[i] = this.origData[i].opacity === 0 ? 0 : (this.origData[i].opacity || 1);
}
// key: group name, value: null or array of keys representing the
// most recently received selection for that group.
this.groupSelections = {};
// selection parameters (e.g., transient versus persistent selection)
this.highlight = highlight;
}
TraceManager.prototype.close = function() {
// TODO: Unhook all event handlers
};
TraceManager.prototype.updateFilter = function(group, keys) {
if (typeof(keys) === "undefined" || keys === null) {
this.gd.data = JSON.parse(JSON.stringify(this.origData));
} else {
var traces = [];
for (var i = 0; i < this.origData.length ; i + + ) {
var trace = this.origData[i];
if (!trace.key || trace.set !== group) {
continue;
}
var matchFunc = getMatchFunc(trace);
var matches = matchFunc(trace.key, keys);
if (matches.length > 0) {
if (!trace._isSimpleKey) {
// subsetArrayAttrs doesn't mutate trace (it makes a modified clone)
trace = subsetArrayAttrs(trace, matches);
}
traces.push(trace);
}
}
}
this.gd.data = traces;
Plotly.redraw(this.gd);
// NOTE: we purposely do _not_ restore selection(s), since on filter,
// axis likely will update, changing the pixel -> data mapping, leading
// to a likely mismatch in the brush outline and highlighted marks
};
TraceManager.prototype.updateSelection = function(group, keys) {
if (keys !== null & & !Array.isArray(keys)) {
throw new Error("Invalid keys argument; null or array expected");
}
// if selection has been cleared, or if this is transient
// selection, delete the "selection traces"
var nNewTraces = this.gd.data.length - this.origData.length;
if (keys === null || !this.highlight.persistent & & nNewTraces > 0) {
var tracesToRemove = [];
for (var i = 0; i < this.gd.data.length ; i + + ) {
if (this.gd.data[i]._isCrosstalkTrace) tracesToRemove.push(i);
}
Plotly.deleteTraces(this.gd, tracesToRemove);
this.groupSelections[group] = keys;
} else {
// add to the groupSelection, rather than overwriting it
// TODO: can this be removed?
this.groupSelections[group] = this.groupSelections[group] || [];
for (var i = 0; i < keys.length ; i + + ) {
var k = keys[i];
if (this.groupSelections[group].indexOf(k) < 0 ) {
this.groupSelections[group].push(k);
}
}
}
if (keys === null) {
Plotly.restyle(this.gd, {"opacity": this.origOpacity});
} else if (keys.length >= 1) {
// placeholder for new "selection traces"
var traces = [];
// this variable is set in R/highlight.R
var selectionColour = crosstalk.group(group).var("plotlySelectionColour").get() ||
this.highlight.color[0];
for (var i = 0; i < this.origData.length ; i + + ) {
// TODO: try using Lib.extendFlat() as done in
// https://github.com/plotly/plotly.js/pull/1136
var trace = JSON.parse(JSON.stringify(this.gd.data[i]));
if (!trace.key || trace.set !== group) {
continue;
}
// Get sorted array of matching indices in trace.key
var matchFunc = getMatchFunc(trace);
var matches = matchFunc(trace.key, keys);
if (matches.length > 0) {
// If this is a "simple" key, that means select the entire trace
if (!trace._isSimpleKey) {
trace = subsetArrayAttrs(trace, matches);
}
// reach into the full trace object so we can properly reflect the
// selection attributes in every view
var d = this.gd._fullData[i];
/*
/ Recursively inherit selection attributes from various sources,
/ in order of preference:
/ (1) official plotly.js selected attribute
/ (2) highlight(selected = attrs_selected(...))
*/
// TODO: it would be neat to have a dropdown to dynamically specify these!
$.extend(true, trace, this.highlight.selected);
// if it is defined, override color with the "dynamic brush color""
if (d.marker) {
trace.marker = trace.marker || {};
trace.marker.color = selectionColour || trace.marker.color || d.marker.color;
}
if (d.line) {
trace.line = trace.line || {};
trace.line.color = selectionColour || trace.line.color || d.line.color;
}
if (d.textfont) {
trace.textfont = trace.textfont || {};
trace.textfont.color = selectionColour || trace.textfont.color || d.textfont.color;
}
if (d.fillcolor) {
// TODO: should selectionColour inherit alpha from the existing fillcolor?
trace.fillcolor = selectionColour || trace.fillcolor || d.fillcolor;
}
// attach a sensible name/legendgroup
trace.name = trace.name || keys.join("< br / > ");
trace.legendgroup = trace.legendgroup || keys.join("< br / > ");
// keep track of mapping between this new trace and the trace it targets
// (necessary for updating frames to reflect the selection traces)
trace._originalIndex = i;
trace._newIndex = this.gd._fullData.length + traces.length;
trace._isCrosstalkTrace = true;
traces.push(trace);
}
}
if (traces.length > 0) {
Plotly.addTraces(this.gd, traces).then(function(gd) {
// incrementally add selection traces to frames
// (this is heavily inspired by Plotly.Plots.modifyFrames()
// in src/plots/plots.js)
var _hash = gd._transitionData._frameHash;
var _frames = gd._transitionData._frames || [];
for (var i = 0; i < _frames.length ; i + + ) {
// add to _frames[i].traces *if* this frame references selected trace(s)
var newIndices = [];
for (var j = 0; j < traces.length ; j + + ) {
var tr = traces[j];
if (_frames[i].traces.indexOf(tr._originalIndex) > -1) {
newIndices.push(tr._newIndex);
_frames[i].traces.push(tr._newIndex);
}
}
// nothing to do...
if (newIndices.length === 0) {
continue;
}
var ctr = 0;
var nFrameTraces = _frames[i].data.length;
for (var j = 0; j < nFrameTraces ; j + + ) {
var frameTrace = _frames[i].data[j];
if (!frameTrace.key || frameTrace.set !== group) {
continue;
}
var matchFunc = getMatchFunc(frameTrace);
var matches = matchFunc(frameTrace.key, keys);
if (matches.length > 0) {
if (!trace._isSimpleKey) {
frameTrace = subsetArrayAttrs(frameTrace, matches);
}
var d = gd._fullData[newIndices[ctr]];
if (d.marker) {
frameTrace.marker = d.marker;
}
if (d.line) {
frameTrace.line = d.line;
}
if (d.textfont) {
frameTrace.textfont = d.textfont;
}
ctr = ctr + 1;
_frames[i].data.push(frameTrace);
}
}
// update gd._transitionData._frameHash
_hash[_frames[i].name] = _frames[i];
}
});
// dim traces that have a set matching the set of selection sets
var tracesToDim = [],
opacities = [],
sets = Object.keys(this.groupSelections),
n = this.origData.length;
for (var i = 0; i < n ; i + + ) {
var opacity = this.origOpacity[i] || 1;
// have we already dimmed this trace? Or is this even worth doing?
if (opacity !== this.gd._fullData[i].opacity || this.highlight.opacityDim === 1) {
continue;
}
// is this set an element of the set of selection sets?
var matches = findMatches(sets, [this.gd.data[i].set]);
if (matches.length) {
tracesToDim.push(i);
opacities.push(opacity * this.highlight.opacityDim);
}
}
if (tracesToDim.length > 0) {
Plotly.restyle(this.gd, {"opacity": opacities}, tracesToDim);
// turn off the selected/unselected API
Plotly.restyle(this.gd, {"selectedpoints": null});
}
}
}
};
/*
Note: in all of these match functions, we assume needleSet (i.e. the selected keys)
is a 1D (or flat) array. The real difference is the meaning of haystack.
findMatches() does the usual thing you'd expect for
linked brushing on a scatterplot matrix. findSimpleMatches() returns a match iff
haystack is a subset of the needleSet. findNestedMatches() returns
*/
function getMatchFunc(trace) {
return (trace._isNestedKey) ? findNestedMatches :
(trace._isSimpleKey) ? findSimpleMatches : findMatches;
}
// find matches for "flat" keys
function findMatches(haystack, needleSet) {
var matches = [];
haystack.forEach(function(obj, i) {
if (obj === null || needleSet.indexOf(obj) >= 0) {
matches.push(i);
}
});
return matches;
}
// find matches for "simple" keys
function findSimpleMatches(haystack, needleSet) {
var match = haystack.every(function(val) {
return val === null || needleSet.indexOf(val) >= 0;
});
// yes, this doesn't make much sense other than conforming
// to the output type of the other match functions
return (match) ? [0] : []
}
// find matches for a "nested" haystack (2D arrays)
function findNestedMatches(haystack, needleSet) {
var matches = [];
for (var i = 0; i < haystack.length ; i + + ) {
var hay = haystack[i];
var match = hay.every(function(val) {
return val === null || needleSet.indexOf(val) >= 0;
});
if (match) {
matches.push(i);
}
}
return matches;
}
function isPlainObject(obj) {
return (
Object.prototype.toString.call(obj) === '[object Object]' & &
Object.getPrototypeOf(obj) === Object.prototype
);
}
function subsetArrayAttrs(obj, indices) {
var newObj = {};
Object.keys(obj).forEach(function(k) {
var val = obj[k];
if (k.charAt(0) === "_") {
newObj[k] = val;
} else if (k === "transforms" & & Array.isArray(val)) {
newObj[k] = val.map(function(transform) {
return subsetArrayAttrs(transform, indices);
});
} else if (k === "colorscale" & & Array.isArray(val)) {
newObj[k] = val;
} else if (isPlainObject(val)) {
newObj[k] = subsetArrayAttrs(val, indices);
} else if (Array.isArray(val)) {
newObj[k] = subsetArray(val, indices);
} else {
newObj[k] = val;
}
});
return newObj;
}
function subsetArray(arr, indices) {
var result = [];
for (var i = 0; i < indices.length ; i + + ) {
result.push(arr[indices[i]]);
}
return result;
}
// Convenience function for removing plotly's brush
function removeBrush(el) {
var outlines = el.querySelectorAll(".select-outline");
for (var i = 0; i < outlines.length ; i + + ) {
outlines[i].remove();
}
}
// https://davidwalsh.name/javascript-debounce-function
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate & & !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
< / script > < br / >
< script > ( f u n c t i o n ( g l o b a l ) { " u s e s t r i c t " ; v a r u n d e f i n e d = v o i d 0 ; v a r M A X _ A R R A Y _ L E N G T H = 1 e 5 ; f u n c t i o n T y p e ( v ) { s w i t c h ( t y p e o f v ) { c a s e " u n d e f i n e d " : r e t u r n " u n d e f i n e d " ; c a s e " b o o l e a n " : r e t u r n " b o o l e a n " ; c a s e " n u m b e r " : r e t u r n " n u m b e r " ; c a s e " s t r i n g " : r e t u r n " s t r i n g " ; d e f a u l t : r e t u r n v = = = n u l l ? " n u l l " : " o b j e c t " } } f u n c t i o n C l a s s ( v ) { r e t u r n O b j e c t . p r o t o t y p e . t o S t r i n g . c a l l ( v ) . r e p l a c e ( / ^ \ [ o b j e c t * | \ ] $ / g , " " ) } f u n c t i o n I s C a l l a b l e ( o ) { r e t u r n t y p e o f o = = = " f u n c t i o n " } f u n c t i o n T o O b j e c t ( v ) { i f ( v = = = n u l l | | v = = = u n d e f i n e d ) t h r o w T y p e E r r o r ( ) ; r e t u r n O b j e c t ( v ) } f u n c t i o n T o I n t 3 2 ( v ) { r e t u r n v > > 0 } f u n c t i o n T o U i n t 3 2 ( v ) { r e t u r n v > > > 0 } v a r L N 2 = M a t h . L N 2 , a b s = M a t h . a b s , f l o o r = M a t h . f l o o r , l o g = M a t h . l o g , m a x = M a t h . m a x , m i n = M a t h . m i n , p o w = M a t h . p o w , r o u n d = M a t h . r o u n d ; ( f u n c t i o n ( ) { v a r o r i g = O b j e c t . d e f i n e P r o p e r t y ; v a r d o m _ o n l y = ! f u n c t i o n ( ) { t r y { r e t u r n O b j e c t . d e f i n e P r o p e r t y ( { } , " x " , { } ) } c a t c h ( _ ) { r e t u r n f a l s e } } ( ) ; i f ( ! o r i g | | d o m _ o n l y ) { O b j e c t . d e f i n e P r o p e r t y = f u n c t i o n ( o , p r o p , d e s c ) { i f ( o r i g ) t r y { r e t u r n o r i g ( o , p r o p , d e s c ) } c a t c h ( _ ) { } i f ( o ! = = O b j e c t ( o ) ) t h r o w T y p e E r r o r ( " O b j e c t . d e f i n e P r o p e r t y c a l l e d o n n o n - o b j e c t " ) ; i f ( O b j e c t . p r o t o t y p e . _ _ d e f i n e G e t t e r _ _ & & " g e t " i n d e s c ) O b j e c t . p r o t o t y p e . _ _ d e f i n e G e t t e r _ _ . c a l l ( o , p r o p , d e s c . g e t ) ; i f ( O b j e c t . p r o t o t y p e . _ _ d e f i n e S e t t e r _ _ & & " s e t " i n d e s c ) O b j e c t . p r o t o t y p e . _ _ d e f i n e S e t t e r _ _ . c a l l ( o , p r o p , d e s c . s e t ) ; i f ( " v a l u e " i n d e s c ) o [ p r o p ] = d e s c . v a l u e ; r e t u r n o } } } ) ( ) ; f u n c t i o n m a k e A r r a y A c c e s s o r s ( o b j ) { i f ( o b j . l e n g t h > M A X _ A R R A Y _ L E N G T H ) t h r o w R a n g e E r r o r ( " A r r a y t o o l a r g e f o r p o l y f i l l " ) ; f u n c t i o n m a k e A r r a y A c c e s s o r ( i n d e x ) { O b j e c t . d e f i n e P r o p e r t y ( o b j , i n d e x , { g e t : f u n c t i o n ( ) { r e t u r n o b j . _ g e t t e r ( i n d e x ) } , s e t : f u n c t i o n ( v ) { o b j . _ s e t t e r ( i n d e x , v ) } , e n u m e r a b l e : t r u e , c o n f i g u r a b l e : f a l s e } ) } v a r i ; f o r ( i = 0 ; i < o b j . l e n g t h ; i + = 1 ) { m a k e A r r a y A c c e s s o r ( i ) } } f u n c t i o n a s _ s i g n e d ( v a l u e , b i t s ) { v a r s = 3 2 - b i t s ; r e t u r n v a l u e < < s > > s } f u n c t i o n a s _ u n s i g n e d ( v a l u e , b i t s ) { v a r s = 3 2 - b i t s ; r e t u r n v a l u e < < s > > > s } f u n c t i o n p a c k I 8 ( n ) { r e t u r n [ n & 2 5 5 ] } f u n c t i o n u n p a c k I 8 ( b y t e s ) { r e t u r n a s _ s i g n e d ( b y t e s [ 0 ] , 8 ) } f u n c t i o n p a c k U 8 ( n ) { r e t u r n [ n & 2 5 5 ] } f u n c t i o n u n p a c k U 8 ( b y t e s ) { r e t u r n a s _ u n s i g n e d ( b y t e s [ 0 ] , 8 ) } f u n c t i o n p a c k U 8 C l a m p e d ( n ) { n = r o u n d ( N u m b e r ( n ) ) ; r e t u r n [ n < 0 ? 0 : n > 2 5 5 ? 2 5 5 : n & 2 5 5 ] } f u n c t i o n p a c k I 1 6 ( n ) { r e t u r n [ n > > 8 & 2 5 5 , n & 2 5 5 ] } f u n c t i o n u n p a c k I 1 6 ( b y t e s ) { r e t u r n a s _ s i g n e d ( b y t e s [ 0 ] < < 8 | b y t e s [ 1 ] , 1 6 ) } f u n c t i o n p a c k U 1 6 ( n ) { r e t u r n [ n > > 8 & 2 5 5 , n & 2 5 5 ] } f u n c t i o n u n p a c k U 1 6 ( b y t e s ) { r e t u r n a s _ u n s i g n e d ( b y t e s [ 0 ] < < 8 | b y t e s [ 1 ] , 1 6 ) } f u n c t i o n p a c k I 3 2 ( n ) { r e t u r n [ n > > 2 4 & 2 5 5 , n > > 1 6 & 2 5 5 , n > > 8 & 2 5 5 , n & 2 5 5 ] } f u n c t i o n u n p a c k I 3 2 ( b y t e s ) { r e t u r n a s _ s i g n e d ( b y t e s [ 0 ] < < 2 4 | b y t e s [ 1 ] < < 1 6 | b y t e s [ 2 ] < < 8 | b y t e s [ 3 ] , 3 2 ) } f u n c t i o n p a c k U 3 2 ( n ) { r e t u r n [ n > > 2 4 & 2 5 5 , n > > 1 6 & 2 5 5 , n > > 8 & 2 5 5 , n & 2 5 5 ] } f u n c t i o n u n p a c k U 3 2 ( b y t e s ) { r e t u r n a s _ u n s i g n e d ( b y t e s [ 0 ] < < 2 4 | b y t e s [ 1 ] < < 1 6 | b y t e s [ 2 ] < < 8 | b y t e s [ 3 ] , 3 2 ) } f u n c t i o n p a c k I E E E 7 5 4 ( v , e b i t s , f b i t s ) { v a r b i a s = ( 1 < < e b i t s - 1 ) - 1 , s , e , f , l n , i , b i t s , s t r , b y t e s ; f u n c t i o n r o u n d T o E v e n ( n ) { v a r w = f l o o r ( n ) , f = n - w ; i f ( f < . 5 ) r e t u r n w ; i f ( f > . 5 ) r e t u r n w + 1 ; r e t u r n w % 2 ? w + 1 : w } i f ( v ! = = v ) { e = ( 1 < < e b i t s ) - 1 ; f = p o w ( 2 , f b i t s - 1 ) ; s = 0 } e l s e i f ( v = = = I n f i n i t y | | v = = = - I n f i n i t y ) { e = ( 1 < < e b i t s ) - 1 ; f = 0 ; s = v < 0 ? 1 : 0 } e l s e i f ( v = = = 0 ) { e = 0 ; f = 0 ; s = 1 / v = = = - I n f i n i t y ? 1 : 0 } e l s e { s = v < 0 ; v = a b s ( v ) ; i f ( v > = p o w ( 2 , 1 - b i a s ) ) { e = m i n ( f l o o r ( l o g ( v ) / L N 2 ) , 1 0 2 3 ) ; f = r o u n d T o E v e n ( v / p o w ( 2 , e ) * p o w ( 2 , f b i t s ) ) ; i f ( f / p o w ( 2 , f b i t s ) > = 2 ) { e = e + 1 ; f = 1 } i f ( e > b i a s ) { e = ( 1 < < e b i t s ) - 1 ; f = 0 } e l s e { e = e + b i a s ; f = f - p o w ( 2 , f b i t s ) } } e l s e { e = 0 ; f = r o u n d T o E v e n ( v / p o w ( 2 , 1 - b i a s - f b i t s ) ) } } b i t s = [ ] ; f o r ( i = f b i t s ; i ; i - = 1 ) { b i t s . p u s h ( f % 2 ? 1 : 0 ) ; f = f l o o r ( f / 2 ) } f o r ( i = e b i t s ; i ; i - = 1 ) { b i t s . p u s h ( e % 2 ? 1 : 0 ) ; e = f l o o r ( e / 2 ) } b i t s . p u s h ( s ? 1 : 0 ) ; b i t s . r e v e r s e ( ) ; s t r = b i t s . j o i n ( " " ) ; b y t e s = [ ] ; w h i l e ( s t r . l e n g t h ) { b y t e s . p u s h ( p a r s e I n t ( s t r . s u b s t r i n g ( 0 , 8 ) , 2 ) ) ; s t r = s t r . s u b s t r i n g ( 8 ) } r e t u r n b y t e s } f u n c t i o n u n p a c k I E E E 7 5 4 ( b y t e s , e b i t s , f b i t s ) { v a r b i t s = [ ] , i , j , b , s t r , b i a s , s , e , f ; f o r ( i = b y t e s . l e n g t h ; i ; i - = 1 ) { b = b y t e s [ i - 1 ] ; f o r ( j = 8 ; j ; j - = 1 ) { b i t s . p u s h ( b % 2 ? 1 : 0 ) ; b = b > > 1 } } b i t s . r e v e r s e ( ) ; s t r = b i t s . j o i n ( " " ) ; b i a s = ( 1 < < e b i t s - 1 ) - 1 ; s = p a r s e I n t ( s t r . s u b s t r i n g ( 0 , 1 ) , 2 ) ? - 1 : 1 ; e = p a r s e I n t ( s t r . s u b s t r i n g ( 1 , 1 + e b i t s ) , 2 ) ; f = p a r s e I n t ( s t r . s u b s t r i n g ( 1 + e b i t s ) , 2 ) ; i f ( e = = = ( 1 < < e b i t s ) - 1 ) { r e t u r n f ! = = 0 ? N a N : s * I n f i n i t y } e l s e i f ( e > 0 ) { r e t u r n s * p o w ( 2 , e - b i a s ) * ( 1 + f / p o w ( 2 , f b i t s ) ) } e l s e i f ( f ! = = 0 ) { r e t u r n s * p o w ( 2 , - ( b i a s - 1 ) ) * ( f / p o w ( 2 , f b i t s ) ) } e l s e { r e t u r n s < 0 ? - 0 : 0 } } f u n c t i o n u n p a c k F 6 4 ( b ) { r e t u r n u n p a c k I E E E 7 5 4 ( b , 1 1 , 5 2 ) } f u n c t i o n p a c k F 6 4 ( v ) { r e t u r n p a c k I E E E 7 5 4 ( v , 1 1 , 5 2 ) } f u n c t i o n u n p a c k F 3 2 ( b ) { r e t u r n u n p a c k I E E E 7 5 4 ( b , 8 , 2 3 ) } f u n c t i o n p a c k F 3 2 ( v ) { r e
< script > / * ! j Q u e r y v 3 . 5 . 1 | ( c ) J S F o u n d a t i o n a n d o t h e r c o n t r i b u t o r s | j q u e r y . o r g / l i c e n s e * /
!function(e,t){"use strict";"object"==typeof module& & "object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e& & "number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0}; function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i); n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e& & "length"in e&&e.length,n=w(e); return!m(e)& & !x(e)& & ("array"===n||0===t||"number"==typeof t& & 0< t & & t-1 in e ) } S . fn = S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s . call ( this ) } , get:function ( e ) { return null = =e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t = S.merge(this.constructor(),e);return t . prevObject = this,t},each:function(e){return S . each ( this , e ) } , map:function ( n ) { return this . pushStack ( S . map ( this , function ( e , t ) { return n . call ( e , t , e ) } ) ) } , slice:function ( ) { return this . pushStack ( s . apply ( this , arguments ) ) } , first:function ( ) { return this . eq ( 0 ) } , last:function ( ) { return this . eq ( -1 ) } , even:function ( ) { return this . pushStack ( S . grep ( this , function ( e , t ) { return ( t + 1 ) % 2 } ) ) } , odd:function ( ) { return this . pushStack ( S . grep ( this , function ( e , t ) { return t % 2 } ) ) } , eq:function ( e ) { var t = this.length,n=+e+(e<0?t:0);return this . pushStack ( 0 < = n & & n < t ? [ this [ n ] ] : [ ] ) } , end:function ( ) { return this . prevObject | | this . constructor ( ) } , push:u , sort:t . sort , splice:t . splice } , S . extend = S.fn.extend=function(){var e , t , n , r , i , o , a = arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a & & ( l = a,a=arguments[s]||{},s++),"object"==typeof a | | m ( a ) | | ( a = {}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e ) r = e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0 ! = = r & & ( a [ t ] = r ) ) ; return a } , S . extend ( { expando: " jQuery " + ( f + Math . random ( ) ) . replace ( / \ D / g , " " ) , isReady: ! 0 , error:function ( e ) { throw new Error ( e ) } , noop:function ( ) { } , isPlainObject:function ( e ) { var t , n ; return ! ( ! e | | " [ object Object ] " ! = = o . call ( e ) ) & & ( ! ( t = r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t ; for ( t in e ) return ! 1 ; return ! 0 } , globalEval:function ( e , t , n ) { b ( e , { nonce:t & & t . nonce } , n ) } , each:function ( e , t ) { var n , r = 0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for ( r in e ) if ( ! 1 = ==t.call(e[r],r,e[r]))break;return e } , makeArray:function ( e , t ) { var n = t||[];return null ! = e & & ( p ( Object ( e ) ) ? S . merge ( n , " string " = = typeof e ? [ e ] :e ) :u . call ( n , e ) ) , n } , inArray:function ( e , t , n ) { return null = =t?-1:i.call(t,e,n)},merge:function(e,t){for(var n = +t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e . length = i,e},grep:function(e,t,n){for(var r = [],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r } , map:function ( e , t , n ) { var r , i , o = 0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for ( o in e ) null ! = ( i = t(e[o],o,n))&&a.push(i);return g ( a ) } , guid:1 , support:y } ) , " function " = = typeof Symbol & & ( S . fn [ Symbol . iterator ] = t [ Symbol . iterator ] ) , S . each ( " Boolean Number String Function Array Date RegExp Object Error Symbol " . split ( " " ) , function ( e , t ) { n [ " [ object " + t + " ] " ] = t . toLowerCase ( ) } ) ; var d = function(n){var e , d , b , o , i , h , f , g , w , u , l , T , C , a , E , v , s , c , y , S = "sizzle" + 1 * new Date , p = n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e = ==t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n = 0,r=e.length;
< / script > < br / >
< style type = "text/css" >
.container-fluid.crosstalk-bscols {
margin-left: -30px;
margin-right: -30px;
white-space: normal;
}
body > .container-fluid.crosstalk-bscols {
margin-left: auto;
margin-right: auto;
}
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
display: inline-block;
padding-right: 12px;
vertical-align: top;
}
@media only screen and (max-width:480px) {
.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {
display: block;
padding-right: inherit;
}
}
< / style > < br / >
< script > ! f u n c t i o n o ( u , a , l ) { f u n c t i o n s ( n , e ) { i f ( ! a [ n ] ) { i f ( ! u [ n ] ) { v a r t = " f u n c t i o n " = = t y p e o f r e q u i r e & & r e q u i r e ; i f ( ! e & & t ) r e t u r n t ( n , ! 0 ) ; i f ( f ) r e t u r n f ( n , ! 0 ) ; v a r r = n e w E r r o r ( " C a n n o t f i n d m o d u l e ' " + n + " ' " ) ; t h r o w r . c o d e = " M O D U L E _ N O T _ F O U N D " , r } v a r i = a [ n ] = { e x p o r t s : { } } ; u [ n ] [ 0 ] . c a l l ( i . e x p o r t s , f u n c t i o n ( e ) { v a r t = u [ n ] [ 1 ] [ e ] ; r e t u r n s ( t | | e ) } , i , i . e x p o r t s , o , u , a , l ) } r e t u r n a [ n ] . e x p o r t s } f o r ( v a r f = " f u n c t i o n " = = t y p e o f r e q u i r e & & r e q u i r e , e = 0 ; e < l . l e n g t h ; e + + ) s ( l [ e ] ) ; r e t u r n s } ( { 1 : [ f u n c t i o n ( e , t , n ) { " u s e s t r i c t " ; O b j e c t . d e f i n e P r o p e r t y ( n , " _ _ e s M o d u l e " , { v a l u e : ! 0 } ) ; v a r r = f u n c t i o n ( ) { f u n c t i o n r ( e , t ) { f o r ( v a r n = 0 ; n < t . l e n g t h ; n + + ) { v a r r = t [ n ] ; r . e n u m e r a b l e = r . e n u m e r a b l e | | ! 1 , r . c o n f i g u r a b l e = ! 0 , " v a l u e " i n r & & ( r . w r i t a b l e = ! 0 ) , O b j e c t . d e f i n e P r o p e r t y ( e , r . k e y , r ) } } r e t u r n f u n c t i o n ( e , t , n ) { r e t u r n t & & r ( e . p r o t o t y p e , t ) , n & & r ( e , n ) , e } } ( ) ; v a r i = f u n c t i o n ( ) { f u n c t i o n e ( ) { ! f u n c t i o n ( e , t ) { i f ( ! ( e i n s t a n c e o f t ) ) t h r o w n e w T y p e E r r o r ( " C a n n o t c a l l a c l a s s a s a f u n c t i o n " ) } ( t h i s , e ) , t h i s . _ t y p e s = { } , t h i s . _ s e q = 0 } r e t u r n r ( e , [ { k e y : " o n " , v a l u e : f u n c t i o n ( e , t ) { v a r n = t h i s . _ t y p e s [ e ] ; n | | ( n = t h i s . _ t y p e s [ e ] = { } ) ; v a r r = " s u b " + t h i s . _ s e q + + ; r e t u r n n [ r ] = t , r } } , { k e y : " o f f " , v a l u e : f u n c t i o n ( e , t ) { v a r n = t h i s . _ t y p e s [ e ] ; i f ( " f u n c t i o n " = = t y p e o f t ) { f o r ( v a r r i n n ) i f ( n . h a s O w n P r o p e r t y ( r ) & & n [ r ] = = = t ) r e t u r n d e l e t e n [ r ] , r ; r e t u r n ! 1 } i f ( " s t r i n g " = = t y p e o f t ) r e t u r n ! ( ! n | | ! n [ t ] ) & & ( d e l e t e n [ t ] , t ) ; t h r o w n e w E r r o r ( " U n e x p e c t e d t y p e f o r l i s t e n e r " ) } } , { k e y : " t r i g g e r " , v a l u e : f u n c t i o n ( e , t , n ) { v a r r = t h i s . _ t y p e s [ e ] ; f o r ( v a r i i n r ) r . h a s O w n P r o p e r t y ( i ) & & r [ i ] . c a l l ( n , t ) } } ] ) , e } ( ) ; n . d e f a u l t = i } , { } ] , 2 : [ f u n c t i o n ( e , t , n ) { " u s e s t r i c t " ; O b j e c t . d e f i n e P r o p e r t y ( n , " _ _ e s M o d u l e " , { v a l u e : ! 0 } ) , n . F i l t e r H a n d l e = v o i d 0 ; v a r r = f u n c t i o n ( ) { f u n c t i o n r ( e , t ) { f o r ( v a r n = 0 ; n < t . l e n g t h ; n + + ) { v a r r = t [ n ] ; r . e n u m e r a b l e = r . e n u m e r a b l e | | ! 1 , r . c o n f i g u r a b l e = ! 0 , " v a l u e " i n r & & ( r . w r i t a b l e = ! 0 ) , O b j e c t . d e f i n e P r o p e r t y ( e , r . k e y , r ) } } r e t u r n f u n c t i o n ( e , t , n ) { r e t u r n t & & r ( e . p r o t o t y p e , t ) , n & & r ( e , n ) , e } } ( ) , i = l ( e ( " . / e v e n t s " ) ) , o = l ( e ( " . / f i l t e r s e t " ) ) , u = l ( e ( " . / g r o u p " ) ) , a = f u n c t i o n ( e ) { { i f ( e & & e . _ _ e s M o d u l e ) r e t u r n e ; v a r t = { } ; i f ( n u l l ! = e ) f o r ( v a r n i n e ) O b j e c t . p r o t o t y p e . h a s O w n P r o p e r t y . c a l l ( e , n ) & & ( t [ n ] = e [ n ] ) ; r e t u r n t . d e f a u l t = e , t } } ( e ( " . / u t i l " ) ) ; f u n c t i o n l ( e ) { r e t u r n e & & e . _ _ e s M o d u l e ? e : { d e f a u l t : e } } v a r s = 1 ; n . F i l t e r H a n d l e = f u n c t i o n ( ) { f u n c t i o n n ( e , t ) { ! f u n c t i o n ( e , t ) { i f ( ! ( e i n s t a n c e o f t ) ) t h r o w n e w T y p e E r r o r ( " C a n n o t c a l l a c l a s s a s a f u n c t i o n " ) } ( t h i s , n ) , t h i s . _ e v e n t R e l a y = n e w i . d e f a u l t , t h i s . _ e m i t t e r = n e w a . S u b s c r i p t i o n T r a c k e r ( t h i s . _ e v e n t R e l a y ) , t h i s . _ g r o u p = n u l l , t h i s . _ f i l t e r S e t = n u l l , t h i s . _ f i l t e r V a r = n u l l , t h i s . _ v a r O n C h a n g e S u b = n u l l , t h i s . _ e x t r a I n f o = a . e x t e n d ( { s e n d e r : t h i s } , t ) , t h i s . _ i d = " f i l t e r " + s + + , t h i s . s e t G r o u p ( e ) } r e t u r n r ( n , [ { k e y : " s e t G r o u p " , v a l u e : f u n c t i o n ( e ) { v a r t , n , r = t h i s ; i f ( t h i s . _ g r o u p ! = = e & & ( ( t h i s . _ g r o u p | | e ) & & ( t h i s . _ f i l t e r V a r & & ( t h i s . _ f i l t e r V a r . o f f ( " c h a n g e " , t h i s . _ v a r O n C h a n g e S u b ) , t h i s . c l e a r ( ) , t h i s . _ v a r O n C h a n g e S u b = n u l l , t h i s . _ f i l t e r V a r = n u l l , t h i s . _ f i l t e r S e t = n u l l ) , t h i s . _ g r o u p = e ) ) ) { e = ( 0 , u . d e f a u l t ) ( e ) , t h i s . _ f i l t e r S e t = ( t = e . v a r ( " f i l t e r s e t " ) , ( n = t . g e t ( ) ) | | ( n = n e w o . d e f a u l t , t . s e t ( n ) ) , n ) , t h i s . _ f i l t e r V a r = ( 0 , u . d e f a u l t ) ( e ) . v a r ( " f i l t e r " ) ; v a r i = t h i s . _ f i l t e r V a r . o n ( " c h a n g e " , f u n c t i o n ( e ) { r . _ e v e n t R e l a y . t r i g g e r ( " c h a n g e " , e , r ) } ) ; t h i s . _ v a r O n C h a n g e S u b = i } } } , { k e y : " _ m e r g e E x t r a I n f o " , v a l u e : f u n c t i o n ( e ) { r e t u r n a . e x t e n d ( { } , t h i s . _ e x t r a I n f o ? t h i s . _ e x t r a I n f o : n u l l , e | | n u l l ) } } , { k e y : " c l o s e " , v a l u e : f u n c t i o n ( ) { t h i s . _ e m i t t e r . r e m o v e A l l L i s t e n e r s ( ) , t h i s . c l e a r ( ) , t h i s . s e t G r o u p ( n u l l ) } } , { k e y : " c l e a r " , v a l u e : f u n c t i o n ( e ) { t h i s . _ f i l t e r S e t & & ( t h i s . _ f i l t e r S e t . c l e a r ( t h i s . _ i d ) , t h i s . _ o n C h a n g e ( e ) ) } } , { k e y : " s e t " , v a l u e : f u n c t i o n ( e , t ) { t h i s . _ f i l t e r S e t & & ( t h i s . _ f i l t e r S e t . u p d a t e ( t h i s . _ i d , e ) , t h i s . _ o n C h a n g e ( t ) ) } } , { k e y : " o n " , v a l u e : f u n c t i o n ( e , t ) { r e t u r n t h i s . _ e m i t t e r . o n ( e , t ) } } , { k e y : " o f f " , v a l u e : f u n c t i o n ( e , t ) { r e t u r n t h i s . _ e m i t t e r . o f f ( e , t ) } } , { k e y : " _ o n C h a n g e " , v a l u e : f u n c t i o n ( e ) { t h i s . _ f i l t e r S e t & & t h i s . _ f i l t e r V a r . s e t ( t h i s . _ f i l t e r S e t . v a l u e , t h i s . _ m e r g e E x t r a I n f o ( e ) ) } } , { k e y : " f i l t e r e d K e y s " , g e t : f u n c t i o n ( ) { r e t u r n t h i s . _ f i l t e r S e t ? t h i s . _ f i l t e r S e t . v a l u e : n u l l } } ] ) , n } ( ) } , { " . / e v e n t s " : 1 , " . / f i l t e r s e t " : 3 , " . / g r o u p " : 4 , " . / u t i l " : 1 1 } ] , 3 : [ f u n c t i o n ( e , t , n ) { " u s e s t r i c t " ; O b j e c t . d e f i n e P r o p e r t y ( n , " _ _ e s M o d u l e " , { v a l u e : ! 0 } ) ; v a r r = f u n c t i o n ( ) { f u n c t i o n r ( e , t ) { f o r ( v a r n = 0 ; n < t . l e n g t h ; n + + ) { v a r r = t [ n ] ; r . e n u m e r a b l e = r . e n u m e r a b l e | | ! 1 , r . c o n f i g u r a b l e = ! 0 , " v a l u e " i n r & & ( r . w r i t a b l e = ! 0 ) , O b j e c t . d e f i n e P r o p e r t y ( e , r . k
//# sourceMappingURL=crosstalk.min.js.map< / script > < br / >
< style type = "text/css" >
slide:not(.current) .plotly.html-widget{
display: none;
}
< / style > < br / >
< script > / * *
* plotly.js v1.57.1
* Copyright 2012-2020, Plotly, Inc.
* All rights reserved.
* Licensed under the MIT license
*/
!function(t){if("object"==typeof exports& & "undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t); else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Plotly=t()}}((function(){return function t(e,r,n){function i(o,s){if(!r[o]){if(!e[o]){var l="function"==typeof require&&require; if(!s& & l)return l(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var u=r[o]={exports:{}};e[o][0].call(u.exports,(function(t){return i(e[o][1][t]||t)}),u,u.exports,t,e,r,n)}return r[o].exports}for(var a="function"==typeof require&&require,o=0; o< n.length ; o + + ) i ( n [ o ] ) ; return i } ( { 1: [ function ( t , e , r ) { " use strict " ; var n = t("../src/lib"),i={"X,X div " : " direction:ltr ; font-family: ' Open Sans ' , verdana , arial , sans-serif ; margin:0 ; padding:0 ; " , " X input , X button " : " font-family: ' Open Sans ' , verdana , arial , sans-serif ; " , " X input:focus , X button:focus " : " outline:none ; " , " X a " : " text-decoration:none ; " , " X a:hover " : " text-decoration:none ; " , " X . crisp " : " shape-rendering:crispEdges ; " , " X . user-select-none " : " -webkit-user-select:none ; -moz-user-select:none ; -ms-user-select:none ; -o-user-select:none ; user-select:none ; " , " X svg " : " overflow:hidden ; " , " X svg a " : " fill: # 447adb ; " , " X svg a:hover " : " fill: # 3c6dc5 ; " , " X . main-svg " : " position:absolute ; top:0 ; left:0 ; pointer-events:none ; " , " X . main-svg . draglayer " : " pointer-events:all ; " , " X . cursor-default " : " cursor:default ; " , " X . cursor-pointer " : " cursor:pointer ; " , " X . cursor-crosshair " : " cursor:crosshair ; " , " X . cursor-move " : " cursor:move ; " , " X . cursor-col-resize " : " cursor:col-resize ; " , " X . cursor-row-resize " : " cursor:row-resize ; " , " X . cursor-ns-resize " : " cursor:ns-resize ; " , " X . cursor-ew-resize " : " cursor:ew-resize ; " , " X . cursor-sw-resize " : " cursor:sw-resize ; " , " X . cursor-s-resize " : " cursor:s-resize ; " , " X . cursor-se-resize " : " cursor:se-resize ; " , " X . cursor-w-resize " : " cursor:w-resize ; " , " X . cursor-e-resize " : " cursor:e-resize ; " , " X . cursor-nw-resize " : " cursor:nw-resize ; " , " X . cursor-n-resize " : " cursor:n-resize ; " , " X . cursor-ne-resize " : " cursor:ne-resize ; " , " X . cursor-grab " : " cursor:-webkit-grab ; cursor:grab ; " , " X . modebar " : " position:absolute ; top:2px ; right:2px ; " , " X . ease-bg " : " -webkit-transition:background-color 0 . 3s ease 0s ; -moz-transition:background-color 0 . 3s ease 0s ; -ms-transition:background-color 0 . 3s ease 0s ; -o-transition:background-color 0 . 3s ease 0s ; transition:background-color 0 . 3s ease 0s ; " , " X . modebar--hover > :not(.watermark)":"opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;","X:hover .modebar--hover .modebar-group":"opacity:1;","X .modebar-group":"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;","X .modebar-btn":"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;","X .modebar-btn svg":"position:relative;top:2px;","X .modebar.vertical":"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;","X .modebar.vertical svg":"top:-1px;","X .modebar.vertical .modebar-group":"display:block;float:none;padding-left:0px;padding-bottom:8px;","X .modebar.vertical .modebar-group .modebar-btn":"display:block;text-align:center;","X [data-title]:before,X [data-title]:after":"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;","X [data-title]:hover:before,X [data-title]:hover:after":"display:block;opacity:1;","X [data-title]:before":"content:'';position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;","X [data-title]:after":"content:attr(data-title);background:#69738a;color:white;padding:8px 10px;font-size:12px;line-heigh
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh < feross @ feross . org > < http: / / feross . org >
* @license MIT
*/function i(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i< a ; + + i ) if ( t [ i ] ! = = e [ i ] ) { r = t[i],n=e[i];break}return r < n ? -1:n < r ? 1:0 } function a ( t ) { return r . Buffer & & " function " = = typeof r . Buffer . isBuffer ? r . Buffer . isBuffer ( t ) : ! ( null = =t||!t._isBuffer)}var o = t("util/"),s=Object.prototype.hasOwnProperty,l=Array.prototype.slice,c="foo"===function(){}.name;function u ( t ) { return Object . prototype . toString . call ( t ) } function h ( t ) { return ! a ( t ) & & ( " function " = = typeof r . ArrayBuffer & & ( " function " = = typeof ArrayBuffer . isView ? ArrayBuffer . isView ( t ) : ! ! t & & ( t instanceof DataView | | ! ! ( t . buffer & & t . buffer instanceof ArrayBuffer ) ) ) ) } var f = e.exports=y,p=/\s*function\s+([^\(\s]*)\s*/;function d ( t ) { if ( o . isFunction ( t ) ) { if ( c ) return t . name ; var e = t.toString().match(p);return e & & e [ 1 ] } } function g ( t , e ) { return " string " = = typeof t ? t . length < e ? t:t . slice ( 0 , e ) :t } function m ( t ) { if ( c | | ! o . isFunction ( t ) ) return o . inspect ( t ) ; var e = d(t);return"[Function"+(e?": " + e: " " ) + " ] " } function v ( t , e , r , n , i ) { throw new f . AssertionError ( { message:r , actual:t , expected:e , operator:n , stackStartFunction:i } ) } function y ( t , e ) { t | | v ( t , ! 0 , e , " = = " , f . ok ) } function x ( t , e , r , n ) { if ( t = ==e)return!0;if(a(t)&&a(e))return 0 = ==i(t,e);if(o.isDate(t)&&o.isDate(e))return t . getTime ( ) = = = e . getTime ( ) ; if ( o . isRegExp ( t ) & & o . isRegExp ( e ) ) return t . source = ==e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&"object"==typeof t | | null ! = = e & & " object " = = typeof e ) { if ( h ( t ) & & h ( e ) & & u ( t ) = = = u ( e ) & & ! ( t instanceof Float32Array | | t instanceof Float64Array ) ) return 0 = ==i(new Uint8Array ( t . buffer ) , new Uint8Array ( e . buffer ) ) ; if ( a ( t ) ! = = a ( e ) ) return ! 1 ; var s = (n=n||{actual:[],expected:[]}).actual.indexOf(t);return-1!==s&&s===n.expected.indexOf(e)||(n.actual.push(t),n.expected.push(e),function(t,e,r,n){if(null==t||null==e)return!1;if(o.isPrimitive(t)||o.isPrimitive(e))return t = ==e;if(r&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var i = b(t),a=b(e);if(i&&!a||!i&&a)return!1;if(i)return t = l.call(t),e=l.call(e),x(t,e,r);var s , c , u = T(t),h=T(e);if(u.length!==h.length)return!1;for(u.sort(),h.sort(),c=u.length-1;c > =0;c--)if(u[c]!==h[c])return!1;for(c=u.length-1;c>=0;c--)if(s=u[c],!x(t[s],e[s],r,n))return!1;return!0}(t,e,r,n))}return r?t===e:t==e}function b(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function _(t,e){if(!t||!e)return!1;if("[object RegExp]"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)& & !0===e.call({},t)}function w(t,e,r,n){var i;if("function"!=typeof e)throw new TypeError('"block" argument must be a function');"string"==typeof r& & (n=r,r=null),i=function(t){var e;try{t()}catch(t){e=t}return e}(e),n=(r& & r.name?" ("+r.name+").":".")+(n?" "+n:"."),t& & !i& & v(i,r,"Missing expected exception"+n);var a="string"==typeof n,s=!t&&i&&!r; if((!t& & o.isError(i)& & a& & _(i,r)||s)& & v(i,r,"Got unwanted exception"+n),t& & i& & r& & !_(i,r)||!t& & i)throw i}f.AssertionError=function(t){this.name="AssertionError",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=function(t){return g(m(t.actual),128)+" "+t.operator+" "+g(m(t.expected),128)}(this),this.generatedMessage=!0);var e=t.stackStartFunction||v;if(Error.captureStackTrace)Error.captureStackTrace(this,e);else{var r=new Error;if(r.stack){var n=r.stack,i=d(e),a=n.indexOf("\n"+i);if(a>=0){var o=n.indexOf("\n",a+1);n=n.substring(o+1)}this.stack=n}}},o.inherits(f.AssertionError,Error),f.fail=v,f.ok=y,f.equal=function(t,e,r){t!=e& & v(t,e,r,"==",f.equal)},f.notEqual=function(t,e,r){t==e& & v(t,e,r,"!=",f.notEqual)},f.deepEqual=function(t,e,r){x(t,e,!1)||v(t,e,r,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(t,e,r){x(t,e,!0)||v(t,e,r,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(t,e,r){x(t,e,!1)& & v(t,e,r,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function t(e,r,n){x(e,r,!0)& & v(e,r,n,"notDeepStrictEqual",t)},f.strictEqual=function(t,e,r){t!==e& & v(t,e,r,"===",f.strictEqual)},f.notStrictEqual=function(t,e,r){t===e& & v(t,e,r,
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh < https: / / feross . org >
* @license MIT
*/
"use strict";var n=t("base64-js"),i=t("ieee754");r.Buffer=e,r.SlowBuffer=function(t){+t!=t&&(t=0); return e.alloc(+t)},r.INSPECT_MAX_BYTES=50;function a(t){if(t>2147483647)throw new RangeError('The value "'+t+'" is invalid for option "size"');var r=new Uint8Array(t);return r.__proto__=e.prototype,r}function e(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return l(t)}return o(t,e,r)}function o(t,r,n){if("string"==typeof t)return function(t,r){"string"==typeof r&&""!==r||(r="utf8"); if(!e.isEncoding(r))throw new TypeError("Unknown encoding: "+r);var n=0|h(t,r),i=a(n),o=i.write(t,r);o!==n&&(i=i.slice(0,o)); return i}(t,r);if(ArrayBuffer.isView(t))return c(t);if(null==t)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(B(t,ArrayBuffer)||t& & B(t.buffer,ArrayBuffer))return function(t,r,n){if(r< 0 | | t . byteLength < r ) throw new RangeError ( ' " offset " is outside of buffer bounds ' ) ; if ( t . byteLength < r + ( n | | 0 ) ) throw new RangeError ( ' " length " is outside of buffer bounds ' ) ; var i ; i = void 0 = ==r&&void 0 = ==n?new Uint8Array ( t ) :void 0 = ==n?new Uint8Array ( t , r ) :new Uint8Array ( t , r , n ) ; return i . __proto__ = e.prototype,i}(t,r,n);if("number"==typeof t ) throw new TypeError ( ' The " value " argument must not be of type number . Received type number ' ) ; var i = t.valueOf&&t.valueOf();if(null!=i&&i!==t)return e . from ( i , r , n ) ; var o = function(t){if(e.isBuffer(t)){var r = 0|u(t.length),n=a(r);return 0 = ==n.length||t.copy(n,0,0,r),n}if(void 0 ! = = t . length ) return " number " ! = typeof t . length | | N ( t . length ) ? a ( 0 ) :c ( t ) ; if ( " Buffer " = = = t . type & & Array . isArray ( t . data ) ) return c ( t . data ) } ( t ) ; if ( o ) return o ; if ( " undefined " ! = typeof Symbol & & null ! = Symbol . toPrimitive & & " function " = = typeof t [ Symbol . toPrimitive ] ) return e . from ( t [ Symbol . toPrimitive ] ( " string " ) , r , n ) ; throw new TypeError ( " The first argument must be one of type string , Buffer , ArrayBuffer , Array , or Array-like Object . Received type " + typeof t ) } function s ( t ) { if ( " number " ! = typeof t ) throw new TypeError ( ' " size " argument must be of type number ' ) ; if ( t < 0 ) throw new RangeError ( ' The value " ' + t + ' " is invalid for option " size " ' ) } function l ( t ) { return s ( t ) , a ( t < 0 ? 0:0 | u ( t ) ) } function c ( t ) { for ( var e = t.length<0?0:0|u(t.length),r=a(e),n=0;n<e;n+=1)r[n]=255&t[n];return r } function u ( t ) { if ( t > =2147483647)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+2147483647..toString(16)+" bytes");return 0|t}function h(t,r){if(e.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||B(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);var n=t.length,i=arguments.length>2&&!0===arguments[2]; if(!i& & 0===n)return 0;for(var a=!1;;)switch(r){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return D(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return R(t).length;default:if(a)return i?-1:D(t).length;r=(""+r).toLowerCase(),a=!0}}function f(t,e,r){var n=!1;if((void 0===e||e< 0 ) & & ( e = 0),e > this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return""; if((r>>>=0)< =(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return A(this,e,r);case"utf8":case"utf-8":return T(this,e,r);case"ascii":return k(this,e,r);case"latin1":case"binary":return M(this,e,r);case"base64":return w(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function p(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function d(t,r,n,i,a){if(0===t.length)return-1;if("string"==typeof n?(i=n,n=0):n>2147483647?n=2147483647:n< -2147483648 & & ( n = -2147483648),N(n=+n)&&(n=a?0:t.length-1),n<0&&(n=t.length+n),n > =t.length){if(a)return-1;n=t.length-1}else if(n< 0 ) { if ( ! a ) return-1 ; n = 0}if("string"==typeof r & & ( r = e.from(r,i)),e.isBuffer(r))return 0 = ==r.length?-1:g(t,r,n,i,a);if("number"==typeof r ) return r & = 255 , " functio
/*!
* @overview es6-promise - a tiny implementation of Promises/A+.
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
* @license Licensed under MIT license
* See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
* @version v4.2.8+1e68dce6
*/
!function(t,n){"object"==typeof r& & "undefined"!=typeof e?e.exports=n():t.ES6Promise=n()}(this,(function(){"use strict";function e(t){return"function"==typeof t}var r=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},a=0,o=void 0,s=void 0,l=function(t,e){g[a]=t,g[a+1]=e,2===(a+=2)&&(s?s(m):_())}; var c="undefined"!=typeof window?window:void 0,u=c||{},h=u.MutationObserver||u.WebKitMutationObserver,f="undefined"==typeof self& & "undefined"!=typeof n& & "[object process]"==={}.toString.call(n),p="undefined"!=typeof Uint8ClampedArray& & "undefined"!=typeof importScripts& & "undefined"!=typeof MessageChannel;function d(){var t=setTimeout;return function(){return t(m,1)}}var g=new Array(1e3);function m(){for(var t=0;t< a ; t + = 2 ) { ( 0 , g [ t ] ) ( g [ t + 1 ] ) , g [ t ] = void 0 , g [ t + 1 ] = void 0 } a = 0}var v , y , x , b , _ = void 0 ; function w ( t , e ) { var r = this,n=new this . constructor ( M ) ; void 0 = ==n[k]&&D(n);var i = r._state;if(i){var a = arguments[i-1];l((function(){return z ( i , n , a , r . _result ) } ) ) } else P ( r , n , t , e ) ; return n } function T ( t ) { if ( t & & " object " = = typeof t & & t . constructor = ==this)return t ; var e = new this ( M ) ; return S ( e , t ) , e } f ? _ = function(){return n . nextTick ( m ) } :h ? ( y = 0,x=new h ( m ) , b = document.createTextNode(""),x.observe(b,{characterData:!0}),_=function(){b.data=y=++y%2}):p?((v=new MessageChannel ) . port1 . onmessage = m,_=function(){return v . port2 . postMessage ( 0 ) } ) :_ = void 0 = ==c&&"function"==typeof t ? function ( ) { try { var t = Function("return this " ) ( ) . require ( " vertx " ) ; return " undefined " ! = typeof ( o = t.runOnLoop||t.runOnContext)?function(){o(m)}:d()}catch(t){return d ( ) } } ( ) :d ( ) ; var k = Math.random().toString(36).substring(2);function M ( ) { } function A ( t , r , n ) { r . constructor = ==t.constructor&&n===w&&r.constructor.resolve===T?function(t,e){1===e._state?C(t,e._result):2===e._state?L(t,e._result):P(e,void 0 , ( function ( e ) { return S ( t , e ) } ) , ( function ( e ) { return L ( t , e ) } ) ) } ( t , r ) :void 0 = ==n?C(t,r):e(n)?function(t,e,r){l((function(t){var n = !1,i=function(t,e,r,n){try{t.call(e,r,n)}catch(t){return t } } ( r , e , ( function ( r ) { n | | ( n = !0,e!==r?S(t,r):C(t,r))}),(function(e){n||(n=!0,L(t,e))}),t._label);!n&&i&&(n=!0,L(t,i))}),t)}(t,r,n):C(t,r)}function S ( t , e ) { if ( t = ==e)L(t,new TypeError ( " You cannot resolve a promise with itself " ) ) ; else if ( i = typeof(n=e),null===n||"object"!==i&&"function"!==i)C(t,e);else{var r = void 0 ; try { r = e.then}catch(e){return void L ( t , e ) } A ( t , e , r ) } var n , i } function E ( t ) { t . _onerror & & t . _onerror ( t . _result ) , I ( t ) } function C ( t , e ) { void 0 = ==t._state&&(t._result=e,t._state=1,0!==t._subscribers.length&&l(I,t))}function L ( t , e ) { void 0 = ==t._state&&(t._state=2,t._result=e,l(E,t))}function P ( t , e , r , n ) { var i = t._subscribers,a=i.length;t._onerror=null,i[a]=e,i[a+1]=r,i[a+2]=n,0===a&&t._state&&l(I,t)}function I ( t ) { var e = t._subscribers,r=t._state;if(0!==e.length){for(var n = void 0 , i = void 0 , a = t._result,o=0;o<e.length;o+=3)n=e[o],i=e[o+r],n?z(r,n,i,a):i(a);t._subscribers.length=0}}function z ( t , r , n , i ) { var a = e(n),o=void 0 , s = void 0 , l = !0;if(a){try{o=n(i)}catch(t){l=!1,s=t}if(r===o)return void L ( r , new TypeError ( " A promises callback cannot return that same promise . " ) ) } else o = i;void 0 ! = = r . _state | | ( a & & l ? S ( r , o ) : ! 1 = ==l?L(r,s):1===t?C(r,o):2===t&&L(r,o))}var O = 0;function D ( t ) { t [ k ] = O + + , t . _state = void 0 , t . _result = void 0 , t . _subscribers = []}var R = function(){function t ( t , e ) { this . _instanceConstructor = t,this.promise=new t ( M ) , this . promise [ k ] | | D ( this . promise ) , r ( e ) ? ( this . length = e.length,this._remaining=e.length,this._result=new Array ( this . length ) , 0 = ==this.length?C(this.promise,this._result):(this.length=this.length||0,this._enumerate(e),0===this._remaining&&C(this.promise,this._result))):L(this.promise,new Error ( " Array Methods must be provided an Array " ) ) } return t . prototype . _enumerate = function(t){for(var e = 0;void 0 = ==this._state&&e<t.length;e++)this._eachEntry(t[e],e)},t.prototype._eachEntry=function(t,e){var r = this._instanceConstructor,n=r.resolve;if(n===T){var i = void 0 , a = void 0 , o = !1;try{i=t.then}catch(t){o=!0,a=t}if(i===w&&void 0 ! = = t . _state ) this . _settledAt ( t . _state , e , t . _result ) ; else if ( " function " ! = typeof i ) this . _remaining-- , this . _result [ e ] = t ; else if ( r = ==F){var s = new r ( M ) ; o ? L ( s , a ) :A ( s , t , i ) , this . _willSettleAt ( s , e ) } else this .
/*!
* Determine if an object is a Buffer
*
* @author Feross Aboukhadijeh < https: / / feross . org >
* @license MIT
*/
e.exports=function(t){return null!=t& & (n(t)||function(t){return"function"==typeof t.readFloatLE& & "function"==typeof t.slice& & n(t.slice(0,0))}(t)||!!t._isBuffer)}},{}],440:[function(t,e,r){"use strict";e.exports="undefined"!=typeof navigator& & (/MSIE/.test(navigator.userAgent)||/Trident\//.test(navigator.appVersion))},{}],441:[function(t,e,r){"use strict";e.exports=a,e.exports.isMobile=a,e.exports.default=a;var n=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,i=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i;function a(t){t||(t={});var e=t.ua;if(e||"undefined"==typeof navigator||(e=navigator.userAgent),e& & e.headers& & "string"==typeof e.headers["user-agent"]& & (e=e.headers["user-agent"]),"string"!=typeof e)return!1;var r=t.tablet?i.test(e):n.test(e);return!r& & t.tablet& & t.featureDetect& & navigator& & navigator.maxTouchPoints>1& & -1!==e.indexOf("Macintosh")& & -1!==e.indexOf("Safari")& & (r=!0),r}},{}],442:[function(t,e,r){"use strict";e.exports=function(t){var e=typeof t;return null!==t& & ("object"===e||"function"===e)}},{}],443:[function(t,e,r){"use strict";var n=Object.prototype.toString;e.exports=function(t){var e;return"[object Object]"===n.call(t)& & (null===(e=Object.getPrototypeOf(t))||e===Object.getPrototypeOf({}))}},{}],444:[function(t,e,r){"use strict";e.exports=function(t){for(var e,r=t.length,n=0;n< r ; n + + ) if ( ( ( e = t.charCodeAt(n))<9||e > 13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1; return!0}},{}],445:[function(t,e,r){"use strict";e.exports=function(t){return"string"==typeof t& & (t=t.trim(),!!(/^[mzlhvcsqta]\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)& & /[\dz]$/i.test(t)& & t.length>4))}},{}],446:[function(t,e,r){e.exports=function(t,e,r){return t*(1-r)+e*r}},{}],447:[function(t,e,r){!function(t,n){"object"==typeof r& & "undefined"!=typeof e?e.exports=n():(t=t||self).mapboxgl=n()}(this,(function(){"use strict";var t,e,r;function n(n,i){if(t)if(e){var a="var sharedChunk = {}; ("+t+")(sharedChunk); ("+e+")(sharedChunk);",o={};t(o),(r=i(o)).workerUrl=window.URL.createObjectURL(new Blob([a],{type:"text/javascript"}))}else e=i;else t=i}return n(0,(function(t){function e(t,e){return t(e={exports:{}},e.exports),e.exports}var r=n;function n(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=r,this.p2y=n}n.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},n.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},n.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},n.prototype.solveCurveX=function(t,e){var r,n,i,a,o;for(void 0===e&&(e=1e-6),i=t,o=0; o< 8 ; o + + ) { if ( a = this.sampleCurveX(i)-t,Math.abs(a)<e)return i ; var s = this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=a/s}if((i=t)<(r=0))return r ; if ( i > (n=1))return n;for(;r< n ; ) { if ( a = this.sampleCurveX(i),Math.abs(a-t)<e)return i ; t > a?r=i:n=i,i=.5*(n-r)+r}return i},n.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var i=a;function a(t,e){this.x=t,this.y=e}function o(t,e,n,i){var a=new r(t,e,n,i);return function(t){return a.solve(t)}}a.prototype={clone:function(){return new a(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){retur
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
"use strict";var n=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function o(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}e.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r< 10 ; r + + ) e [ " _ " + String . fromCharCode ( r ) ] = r ; if ( " 0123456789 " ! = = Object . getOwnPropertyNames ( e ) . map ( ( function ( t ) { return e [ t ] } ) ) . join ( " " ) ) return ! 1 ; var n = {};return"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r , s , l = o(t),c=1;c<arguments.length;c++){for(var u in r = Object(arguments[c]))i.call(r,u)&&(l[u]=r[u]);if(n){s=n(r);for(var h = 0;h<s.length;h++)a.call(r,s[h])&&(l[s[h]]=r[s[h]])}}return l } } , { } ] , 474: [ function ( t , e , r ) { " use strict " ; e . exports = function(t,e,r,n,i,a,o,s,l,c){var u = e+a+c;if(h > 0){var h=Math.sqrt(u+1);t[0]=.5*(o-l)/h,t[1]=.5*(s-n)/h,t[2]=.5*(r-a)/h,t[3]=.5*h}else{var f=Math.max(e,a,c);h=Math.sqrt(2*f-u+1);e>=f?(t[0]=.5*h,t[1]=.5*(i+r)/h,t[2]=.5*(s+n)/h,t[3]=.5*(o-l)/h):a>=f?(t[0]=.5*(r+i)/h,t[1]=.5*h,t[2]=.5*(l+o)/h,t[3]=.5*(s-n)/h):(t[0]=.5*(n+s)/h,t[1]=.5*(o+l)/h,t[2]=.5*h,t[3]=.5*(r-i)/h)}return t}},{}],475:[function(t,e,r){"use strict";e.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.rotation||[0,0,0,1],n=t.radius||1;e=[].slice.call(e,0,3),u(r=[].slice.call(r,0,4),r);var i=new h(r,e,Math.log(n));i.setDistanceLimits(t.zoomMin,t.zoomMax),("eye"in t||"up"in t)&&i.lookAt(0,t.eye,t.center,t.up); return i};var n=t("filtered-vector"),i=t("gl-mat4/lookAt"),a=t("gl-mat4/fromQuat"),o=t("gl-mat4/invert"),s=t("./lib/quatFromFrame");function l(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function c(t,e,r,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2)+Math.pow(n,2))}function u(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=c(r,n,i,a);o>1e-6?(t[0]=r/o,t[1]=n/o,t[2]=i/o,t[3]=a/o):(t[0]=t[1]=t[2]=0,t[3]=1)}function h(t,e,r){this.radius=n([r]),this.center=n(e),this.rotation=n(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var f=h.prototype;f.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},f.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;u(e,e);var r=this.computedMatrix;a(r,e);var n=this.computedCenter,i=this.computedEye,o=this.computedUp,s=Math.exp(this.computedRadius[0]);i[0]=n[0]+s*r[2],i[1]=n[1]+s*r[6],i[2]=n[2]+s*r[10],o[0]=r[1],o[1]=r[5],o[2]=r[9];for(var l=0;l< 3 ; + + l ) { for ( var c = 0,h=0;h<3;++h)c+=r[l+4*h]*i[h];r[12+l]=-c}},f.getMatrix=function(t,e){this.recalcMatrix(t);var r = this.computedMatrix;if(e){for(var n = 0;n<16;++n)e[n]=r[n];return e } return r } , f . idle = function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},f.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},f.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i = this.computedMatrix,a=i[1],o=i[5],s=i[9],c=l(a,o,s);a/=c,o/=c,s/=c;var u = i[0],h=i[4],f=i[8],p=u*a+h*o+f*s,d=l(u-=a*p,h-=o*p,f-=s*p);u/=d,h/=d,f/=d;var g = i[2],m=i[6],v=i[10],y=g*a+m*o+v*s,x=g*u+m*h+v*f,b=l(g-=y*a+x*u,m-=y*o+x*h,v-=y*s+x*f);g/=b,m/=b,v/=b;var _ = u*e+a*r,w=h*e+o*r,T=f*e+s*r;this.center.move(t,_,w,T);var k = Math.exp(this.computedRadius[0]);k=Math.max(1e-4,k+n),this.radius.set(t,Math.log(k))},f.rotate=function(t,e,r,n){this.recalcMatrix(t),e=e||0,r=r||0;var i = this.computedMatrix,a=i[0],o=i[4],s=i[8],u=i[1],h=i[5],f=i[9],p=i[2],d=i[6],g=i[10],m=e*a+r*u,v=e*o+r*h,y=e*s+r*f,x=-(d*y-g*v),b=-(g*m-p*y),_=-(p*v-d*m),w=Math.sqrt(Math.max(0,1-Math.pow(x,2)-Math.pow(b,2)-Math.pow(_,2))),T=c(x,b,_,w);T > 1e-6?(x/=T,b/=T,_/=T,w/=T):(x=b=_=0,w=1);var k=this.computedRota
/*!
* pad-left < https: / / github . com / jonschlinkert / pad-left >
*
* Copyright (c) 2014-2015, Jon Schlinkert.
* Licensed under the MIT license.
*/
"use strict";var n=t("repeat-string");e.exports=function(t,e,r){return n(r="undefined"!=typeof r?r+"":" ",e)+t}},{"repeat-string":513}],477:[function(t,e,r){"use strict";function n(t,e){if("string"!=typeof t)return[t];var r=[t];"string"==typeof e||Array.isArray(e)?e={brackets:e}:e||(e={});var n=e.brackets?Array.isArray(e.brackets)?e.brackets:[e.brackets]:["{}","[]","()"],i=e.escape||"___",a=!!e.flat;n.forEach((function(t){var e=new RegExp(["\\",t[0],"[^\\",t[0],"\\",t[1],"]*\\",t[1]].join("")),n=[];function a(e,a,o){var s=r.push(e.slice(t[0].length,-t[1].length))-1;return n.push(s),i+s+i}r.forEach((function(t,n){for(var i,o=0;t!=i;)if(i=t,t=t.replace(e,a),o++>1e4)throw Error("References have circular dependency. Please, check them.");r[n]=t})),n=n.reverse(),r=r.map((function(e){return n.forEach((function(r){e=e.replace(new RegExp("(\\"+i+r+"\\"+i+")","g"),t[0]+"$1"+t[1])})),e}))}));var o=new RegExp("\\"+i+"([0-9]+)\\"+i);return a?r:function t(e,r,n){for(var i,a=[],s=0;i=o.exec(e);){if(s++>1e4)throw Error("Circular references in parenthesis");a.push(e.slice(0,i.index)),a.push(t(r[i[1]],r)),e=e.slice(i.index+i[0].length)}return a.push(e),a}(r[0],r)}function i(t,e){if(e& & e.flat){var r,n=e&&e.escape||"___",i=t[0]; if(!i)return"";for(var a=new RegExp("\\"+n+"([0-9]+)\\"+n),o=0;i!=r;){if(o++>1e4)throw Error("Circular references in "+t);r=i,i=i.replace(a,s)}return i}return t.reduce((function t(e,r){return Array.isArray(r)&&(r=r.reduce(t,"")),e+r}),""); function s(e,r){if(null==t[r])throw Error("Reference "+r+"is undefined");return t[r]}}function a(t,e){return Array.isArray(t)?i(t,e):n(t,e)}a.parse=n,a.stringify=i,e.exports=a},{}],478:[function(t,e,r){"use strict";var n=t("pick-by-alias");e.exports=function(t){var e;arguments.length>1&&(t=arguments); "string"==typeof t?t=t.split(/\s/).map(parseFloat):"number"==typeof t&&(t=[t]); t.length& & "number"==typeof t[0]?e=1===t.length?{width:t[0],height:t[0],x:0,y:0}:2===t.length?{width:t[0],height:t[1],x:0,y:0}:{x:t[0],y:t[1],width:t[2]-t[0]||0,height:t[3]-t[1]||0}:t& & (t=n(t,{left:"x l left Left",top:"y t top Top",width:"w width W Width",height:"h height W Width",bottom:"b bottom Bottom",right:"r right Right"}),e={x:t.left||0,y:t.top||0},null==t.width?t.right?e.width=t.right-e.x:e.width=0:e.width=t.width,null==t.height?t.bottom?e.height=t.bottom-e.y:e.height=0:e.height=t.height);return e}},{"pick-by-alias":485}],479:[function(t,e,r){e.exports=function(t){var e=[];return t.replace(i,(function(t,r,i){var o=r.toLowerCase();for(i=function(t){var e=t.match(a);return e?e.map(Number):[]}(i),"m"==o&&i.length>2&&(e.push([r].concat(i.splice(0,2))),o="l",r="m"==r?"l":"L"); ;){if(i.length==n[o])return i.unshift(r),e.push(i);if(i.length< n [ o ] ) throw new Error ( " malformed path data " ) ; e . push ( [ r ] . concat ( i . splice ( 0 , n [ o ] ) ) ) } } ) ) , e } ; var n = {a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=/([astvzqmhlc])([^astvzqmhlc]*)/gi;var a = /-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/gi},{}],480:[function(t,e,r){e.exports=function(t,e){e||(e=[0,""]),t=String(t);var r = parseFloat(t,10);return e [ 0 ] = r , e [ 1 ] = t . match ( / [ \ d . \ - \ + ] * \ s * ( . * ) / ) [ 1 ] | | " " , e } } , { } ] , 481: [ function ( t , e , r ) { ( function ( t ) { function e ( t , e ) { for ( var r = 0,n=t.length-1;n > =0;n--){var i=t[n];"."===i?t.splice(n,1):".."===i?(t.splice(n,1),r++):r&&(t.splice(n,1),r--)}if(e)for(; r--;r)t.unshift("..");return t}function n(t,e){if(t.filter)return t.filter(e);for(var r=[],n=0;n< t.length ; n + + ) e ( t [ n ] , n , t ) & & r . push ( t [ n ] ) ; return r } r . resolve = function(){for(var r = "" , i = !1,a=arguments.length-1;a > =-1&&!i; a--){var o=a>=0?arguments[a]:t.cwd();if("string"!=typeof o)throw new TypeError("Arguments to path.resolve must be strings");o& & (r=o+"/"+r,i="/"===o.charAt(0))}return(i?"/":"")+(r=e(n(r.split("/"),(function(t){return!!t})),!i).join("/"))||"."},r.normalize=function(t){var a=r.isAbsolute(t),o="/"===i(t,-1);return(t=e(n(t.split("/"),(function(t){return!!t})),!a).join("/"))||a||(t="."),t& & o& & (t+="/"),(a?"/":"")+t},r.isAbsolute=function(t){return"/"===t.charAt(0)},r.join=function(){var t=Array.prototype.slice.call(arguments,0);return r.normalize(n(t,(function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to p
/*
* @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
* @license MIT
* @preserve Project Home: https://github.com/voidqk/polybooljs
*/
var n,i=t("./lib/build-log"),a=t("./lib/epsilon"),o=t("./lib/intersecter"),s=t("./lib/segment-chainer"),l=t("./lib/segment-selector"),c=t("./lib/geojson"),u=!1,h=a();function f(t,e,r){var i=n.segments(t),a=n.segments(e),o=r(n.combine(i,a));return n.polygon(o)}n={buildLog:function(t){return!0===t?u=i():!1===t& & (u=!1),!1!==u& & u.list},epsilon:function(t){return h.epsilon(t)},segments:function(t){var e=o(!0,h,u);return t.regions.forEach(e.addRegion),{segments:e.calculate(t.inverted),inverted:t.inverted}},combine:function(t,e){return{combined:o(!1,h,u).calculate(t.segments,t.inverted,e.segments,e.inverted),inverted1:t.inverted,inverted2:e.inverted}},selectUnion:function(t){return{segments:l.union(t.combined,u),inverted:t.inverted1||t.inverted2}},selectIntersect:function(t){return{segments:l.intersect(t.combined,u),inverted:t.inverted1& & t.inverted2}},selectDifference:function(t){return{segments:l.difference(t.combined,u),inverted:t.inverted1& & !t.inverted2}},selectDifferenceRev:function(t){return{segments:l.differenceRev(t.combined,u),inverted:!t.inverted1& & t.inverted2}},selectXor:function(t){return{segments:l.xor(t.combined,u),inverted:t.inverted1!==t.inverted2}},polygon:function(t){return{regions:s(t.segments,h,u),inverted:t.inverted}},polygonFromGeoJSON:function(t){return c.toPolygon(n,t)},polygonToGeoJSON:function(t){return c.fromPolygon(n,h,t)},union:function(t,e){return f(t,e,n.selectUnion)},intersect:function(t,e){return f(t,e,n.selectIntersect)},difference:function(t,e){return f(t,e,n.selectDifference)},differenceRev:function(t,e){return f(t,e,n.selectDifferenceRev)},xor:function(t,e){return f(t,e,n.selectXor)}},"object"==typeof window& & (window.PolyBool=n),e.exports=n},{"./lib/build-log":492,"./lib/epsilon":493,"./lib/geojson":494,"./lib/intersecter":495,"./lib/segment-chainer":497,"./lib/segment-selector":498}],492:[function(t,e,r){e.exports=function(){var t,e=0,r=!1;function n(e,r){return t.list.push({type:e,data:r?JSON.parse(JSON.stringify(r)):void 0}),t}return t={list:[],segmentId:function(){return e++},checkIntersection:function(t,e){return n("check",{seg1:t,seg2:e})},segmentChop:function(t,e){return n("div_seg",{seg:t,pt:e}),n("chop",{seg:t,pt:e})},statusRemove:function(t){return n("pop_seg",{seg:t})},segmentUpdate:function(t){return n("seg_update",{seg:t})},segmentNew:function(t,e){return n("new_seg",{seg:t,primary:e})},segmentRemove:function(t){return n("rem_seg",{seg:t})},tempStatus:function(t,e,r){return n("temp_status",{seg:t,above:e,below:r})},rewind:function(t){return n("rewind",{seg:t})},status:function(t,e,r){return n("status",{seg:t,above:e,below:r})},vert:function(e){return e===r?t:(r=e,n("vert",{x:e}))},log:function(t){return"string"!=typeof t& & (t=JSON.stringify(t,!1," ")),n("log",{txt:t})},reset:function(){return n("reset")},selected:function(t){return n("selected",{segs:t})},chainStart:function(t){return n("chain_start",{seg:t})},chainRemoveHead:function(t,e){return n("chain_rem_head",{index:t,pt:e})},chainRemoveTail:function(t,e){return n("chain_rem_tail",{index:t,pt:e})},chainNew:function(t,e){return n("chain_new",{pt1:t,pt2:e})},chainMatch:function(t){return n("chain_match",{index:t})},chainClose:function(t){return n("chain_close",{index:t})},chainAddHead:function(t,e){return n("chain_add_head",{index:t,pt:e})},chainAddTail:function(t,e){return n("chain_add_tail",{index:t,pt:e})},chainConnect:function(t,e){return n("chain_con",{index1:t,index2:e})},chainReverse:function(t){return n("chain_rev",{index:t})},chainJoin:function(t,e){return n("chain_join",{index1:t,index2:e})},done:function(){return n("done")}}}},{}],493:[function(t,e,r){e.exports=function(t){"number"!=typeof t&&(t=1e-10); var e={epsilon:function(e){return"number"==typeof e& & (t=e),t},pointAboveOrOnLine:function(e,r,n){var i=r[0],a=r[1],o=n[0],s=n[1],l=e[0];return(o-i)*(e[1]-a)-(s-a)*(l-i)>=-t},pointBetween:function(e,r,n){var i=e[1]-r[1],a=n[0]-r[0],o=e[0]-r[0],s=n[1]-r[1],l=o*a+i*s;return!(l< t ) & & ! ( l- ( a * a + s * s ) > -t)},pointsSameX:function(e,r){return Math.abs(e[0]-r[0])< t } , pointsSameY:function ( e , r ) { return Math . abs ( e [ 1 ] -r [ 1 ] ) < t } , pointsSam
/*!
* repeat-string < https: / / github . com / jonschlinkert / repeat-string >
*
* Copyright (c) 2014-2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
"use strict";var n,i="";e.exports=function(t,e){if("string"!=typeof t)throw new TypeError("expected a string");if(1===e)return t;if(2===e)return t+t;var r=t.length*e;if(n!==t||"undefined"==typeof n)n=t,i="";else if(i.length>=r)return i.substr(0,r);for(;r>i.length&&e>1; )1&e&&(i+=t),e>>=1,t+=t; return i=(i+=t).substr(0,r)}},{}],514:[function(t,e,r){(function(t){e.exports=t.performance& & t.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],515:[function(t,e,r){"use strict";e.exports=function(t){for(var e=t.length,r=t[t.length-1],n=e,i=e-2;i>=0;--i){var a=r,o=t[i];(l=o-((r=a+o)-a))& & (t[--n]=r,r=l)}var s=0;for(i=n;i< e ; + + i ) { var l ; a = t[i];(l=(o=r)-((r=a+o)-a))&&(t[s++]=l)}return t [ s + + ] = r , t . length = s,t}},{}],516:[function(t,e,r){"use strict " ; var n = t("two-product"),i=t("robust-sum"),a=t("robust-scale"),o=t("robust-compress");function s ( t , e ) { for ( var r = new Array ( t . length-1 ) , n = 1;n<t.length;++n)for(var i = r[n-1]=new Array ( t . length-1 ) , a = 0,o=0;a<t.length;++a)a!==e&&(i[o++]=t[n][a]);return r } function l ( t ) { for ( var e = new Array ( t ) , r = 0;r<t;++r){e[r]=new Array ( t ) ; for ( var n = 0;n<t;++n)e[r][n]=["m[",r,"][",n,"]"].join("")}return e } function c ( t ) { if ( 2 = ==t.length)return["sum(prod(",t[0][0],",",t[1][1],"),prod(-",t[0][1],",",t[1][0],"))"].join("");for(var e = [],r=0;r<t.length;++r)e.push(["scale(",c(s(t,r)),",",(n=r,1&n?"-":""),t[0][r],")"].join(""));return function t ( e ) { if ( 1 = ==e.length)return e [ 0 ] ; if ( 2 = ==e.length)return["sum(",e[0],",",e[1],")"].join("");var r = e.length > >1;return["sum(",t(e.slice(0,r)),",",t(e.slice(r)),")"].join("")}(e);var n}function u(t){return new Function("sum","scale","prod","compress",["function robustDeterminant",t,"(m){return compress(",c(l(t)),")};return robustDeterminant",t].join(""))(i,a,n,o)}var h=[function(){return[0]},function(t){return[t[0][0]]}];!function(){for(;h.length< 6 ; ) h . push ( u ( h . length ) ) ; for ( var t = [],r=["function robustDeterminant ( m ) { switch ( m . length ) { " ] , n = 0;n<6;++n)t.push("det"+n),r.push("case " , n , " :return det " , n , " ( m ) ; " ) ; r . push ( " } var det = CACHE[m.length];if(!det)det=CACHE[m.length]=gen(m.length);return det ( m ) ; } return robustDeterminant " ) , t . push ( " CACHE " , " gen " , r . join ( " " ) ) ; var i = Function.apply(void 0 , t ) ; for ( e . exports = i.apply(void 0 , h . concat ( [ h , u ] ) ) , n = 0;n<h.length;++n)e.exports[n]=h[n]}()},{"robust-compress":515,"robust-scale":522,"robust-sum":525,"two-product":554}],517:[function(t,e,r){"use strict " ; var n = t("two-product"),i=t("robust-sum");e.exports=function(t,e){for(var r = n(t[0],e[0]),a=1;a<t.length;++a)r=i(r,n(t[a],e[a]));return r } } , { " robust-sum " :525 , " two-product " :554 } ] , 518: [ function ( t , e , r ) { " use strict " ; var n = t("two-product"),i=t("robust-sum"),a=t("robust-subtract"),o=t("robust-scale");function s ( t , e ) { for ( var r = new Array ( t . length-1 ) , n = 1;n<t.length;++n)for(var i = r[n-1]=new Array ( t . length-1 ) , a = 0,o=0;a<t.length;++a)a!==e&&(i[o++]=t[n][a]);return r } function l ( t ) { if ( 1 = ==t.length)return t [ 0 ] ; if ( 2 = ==t.length)return["sum(",t[0],",",t[1],")"].join("");var e = t.length > >1;return["sum(",l(t.slice(0,e)),",",l(t.slice(e)),")"].join("")}function c(t,e){if("m"===t.charAt(0)){if("w"===e.charAt(0)){var r=t.split("[");return["w",e.substr(1),"m",r[0].substr(1)].join("")}return["prod(",t,",",e,")"].join("")}return c(e,t)}function u(t){if(2===t.length)return[["diff(",c(t[0][0],t[1][1]),",",c(t[1][0],t[0][1]),")"].join("")];for(var e=[],r=0;r< t.length ; + + r ) e . push ( [ " scale ( " , l ( u ( s ( t , r ) ) ) , " , " , ( n = r,!0&n?"-":""),t[0][r],")"].join(""));return e ; var n } function h ( t , e ) { for ( var r = [],n=0;n<e-2;++n)r.push(["prod(m",t,"[",n,"],m",t,"[",n,"])"].join(""));return l ( r ) } function f ( t ) { for ( var e = [],r=[],c=function(t){for(var e = new Array ( t ) , r = 0;r<t;++r){e[r]=new Array ( t ) ; for ( var n = 0;n<t;++n)e[r][n]=["m",n,"[",t-r-2,"]"].join("")}return e } ( t ) , f = 0;f<t;++f)c[0][f]="1",c[t-1][f]="w"+f;for(f=0;f<t;++f)0==(1&f)?e.push.apply(e,u(s(c,f))):r.push.apply(r,u(s(c,f)));var p = l(e),d=l(r),g="exactInSphere"+t,m=[];for(f=0;f<t;++f)m.push("m"+f);var v = ["function " , g , " ( " , m . join ( ) , " ) { " ] ; for ( f = 0;f<t;++f){v.push("var w " , f , " = " , h (
< / head >
< body style = "background-color: white;" >
< div id = "htmlwidget_container" >
2024-05-26 17:17:22 -05:00
< div id = "htmlwidget-b3baf35d3f25f188b807" class = "plotly html-widget" style = "width:100%;height:400px;" >
2024-01-10 08:17:44 -06:00
< / div >
< / div >
2024-05-26 17:17:22 -05:00
< script type = "application/json" data-for = "htmlwidget-b3baf35d3f25f188b807" > { " x " : { " d a t a " : [ { " x " : [ 1 6 2 2 1 , 1 6 3 4 9 , 1 6 3 6 4 , 1 6 4 1 2 , 1 6 4 4 4 , 1 6 4 7 7 , 1 6 4 8 0 , 1 6 5 1 0 , 1 6 5 1 2 , 1 6 5 4 8 , 1 6 6 9 7 , 1 6 7 2 9 , 1 6 7 6 0 , 1 6 7 9 1 , 1 6 8 2 3 , 1 6 8 5 4 , 1 6 8 8 6 , 1 6 9 4 2 , 1 6 9 7 3 , 1 7 0 0 5 , 1 7 0 3 8 , 1 7 0 7 1 , 1 7 1 0 6 , 1 7 1 0 7 , 1 7 1 5 2 , 1 7 2 6 3 , 1 7 2 9 1 , 1 7 3 2 3 , 1 7 3 3 8 , 1 7 4 6 1 , 1 7 5 8 6 , 1 7 6 1 7 , 1 7 6 5 2 , 1 7 6 8 5 , 1 7 7 1 6 , 1 7 7 4 8 , 1 7 7 7 0 , 1 7 7 7 1 , 1 7 7 7 9 , 1 7 8 0 5 , 1 7 8 1 0 , 1 7 8 1 1 , 1 7 8 1 8 , 1 7 8 3 6 , 1 7 8 4 3 , 1 7 8 7 0 , 1 7 8 7 5 , 1 7 9 0 2 , 1 7 9 0 6 , 1 7 9 3 3 , 1 7 9 4 7 , 1 7 9 6 7 , 1 7 9 7 9 , 1 8 0 0 0 , 1 8 0 1 3 , 1 8 0 3 2 , 1 8 0 4 4 , 1 8 0 6 3 , 1 8 0 7 7 , 1 8 1 0 4 , 1 8 1 0 9 , 1 8 1 1 2 , 1 8 1 4 1 , 1 8 1 4 4 , 1 8 2 0 0 , 1 8 2 3 1 , 1 8 2 6 1 , 1 8 2 9 2 , 1 8 3 8 9 , 1 8 4 8 4 , 1 8 5 2 3 , 1 8 5 6 0 , 1 8 5 7 4 , 1 8 5 9 6 , 1 8 6 5 0 , 1 8 6 8 3 , 1 8 7 2 7 , 1 8 7 5 3 , 1 8 7 5 6 , 1 8 7 8 4 , 1 8 7 9 8 , 1 8 8 0 1 , 1 8 8 9 8 , 1 8 9 6 4 , 1 9 0 8 8 , 1 9 1 3 9 , 1 9 2 5 5 , 1 9 2 6 6 , 1 9 3 3 3 , 1 9 4 4 6 , 1 9 4 7 0 , 1 9 6 2 4 , 1 9 7 4 1 , 1 9 7 4 4 , 1 9 7 4 5 , 1 9 7 4 7 , 1 9 7 4 9 , 1 9 7 5 0 , 1 9 7 5 2 , 1 9 7 5 3 , 1 9 7 5 5 , 1 9 7 5 6 , 1 9 7 5 8 , 1 9 7 5 9 , 1 9 7 6 1 , 1 9 7 6 2 , 1 9 7 6 4 , 1 9 7 6 6 , 1 9 7 6 7 , 1 9 7 6 8 , 1 9 7 6 9 ] , " y " : [ 7 8 0 1 5 0 , 7 8 3 3 2 7 , 7 8 3 6 8 3 , 7 8 6 5 1 5 , 7 8 6 8 6 0 , 7 8 7 4 3 0 , 7 8 7 7 6 5 , 7 8 8 6 2 1 , 7 8 8 6 0 5 , 7 9 0 6 2 2 , 7 9 3 9 6 4 , 7 9 5 1 2 1 , 7 9 6 9 4 2 , 7 9 8 1 4 8 , 7 9 8 0 3 1 , 7 9 9 1 1 3 , 8 0 1 5 7 2 , 8 0 3 8 0 4 , 8 0 4 1 7 4 , 8 0 3 0 7 0 , 8 0 3 4 4 3 , 8 0 3 9 7 0 , 8 0 5 0 5 4 , 8 0 5 0 6 1 , 8 0 6 7 5 1 , 8 0 9 5 3 7 , 8 1 0 0 3 1 , 8 1 0 6 5 2 , 8 1 0 7 6 2 , 8 1 2 5 6 6 , 8 1 7 0 2 2 , 8 1 8 2 4 7 , 8 1 9 0 4 0 , 8 2 0 0 6 5 , 8 2 0 9 3 6 , 8 2 1 0 5 1 , 8 2 1 1 4 2 , 8 2 1 2 9 8 , 8 2 1 2 2 4 , 8 2 1 4 0 8 , 8 2 1 4 0 1 , 8 2 1 4 0 1 , 8 2 1 2 5 5 , 8 2 2 2 7 6 , 8 2 1 9 1 1 , 8 2 2 4 3 0 , 8 2 2 2 2 4 , 8 2 2 3 2 3 , 8 2 2 3 2 3 , 8 2 4 5 2 7 , 8 2 2 4 2 5 , 8 2 2 6 6 3 , 8 2 2 6 2 0 , 8 2 2 5 8 2 , 8 2 2 9 8 6 , 8 2 2 7 9 0 , 8 2 2 9 4 3 , 8 2 2 9 0 5 , 8 2 2 8 0 1 , 8 2 2 9 2 3 , 8 2 3 0 0 9 , 8 2 3 0 0 0 , 8 2 3 4 3 8 , 8 2 3 4 0 5 , 8 2 4 2 7 5 , 8 2 4 9 1 6 , 8 2 4 9 5 7 , 8 2 4 9 1 5 , 8 2 3 4 3 2 , 8 2 5 2 0 6 , 8 2 7 1 1 9 , 8 2 9 0 8 4 , 8 2 9 2 0 5 , 8 2 9 9 5 3 , 8 3 1 7 2 8 , 8 3 4 0 2 1 , 8 3 7 1 2 0 , 8 3 7 5 2 2 , 8 3 7 3 7 4 , 8 3 7 8 0 1 , 8 3 7 7 9 2 , 8 3 8 0 2 6 , 8 4 0 2 3 6 , 8 4 1 6 4 7 , 8 4 4 1 4 0 , 8 4 5 2 4 9 , 8 4 6 3 1 8 , 8 4 6 4 7 3 , 8 4 7 2 7 2 , 8 4 9 1 0 8 , 8 4 9 1 4 2 , 8 4 9 1 4 0 , 8 4 8 7 5 7 , 8 4 8 9 0 1 , 8 4 8 9 0 2 , 8 4 8 7 1 1 , 8 4 8 7 9 2 , 8 4 8 7 9 2 , 8 4 8 7 7 7 , 8 4 8 7 1 6 , 8 4 8 7 0 6 , 8 4 8 6 5 6 , 8 4 8 6 9 6 , 8 4 8 6 9 3 , 8 4 8 5 8 6 , 8 4 8 6 3 0 , 8 4 8 6 2 2 , 8 4 8 6 4 4 , 8 4 8 4 8 6 , 8 4 8 4 3 8 , 8 4 8 3 3 5 ] , " t e x t " : [ " D a t e : 2 0 1 4 - 0 5 - 3 1 < b r / > T o t a l : 7 8 0 1 5 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 4 - 1 0 - 0 6 < b r / > T o t a l : 7 8 3 3 2 7 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 4 - 1 0 - 2 1 < b r / > T o t a l : 7 8 3 6 8 3 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 4 - 1 2 - 0 8 < b r / > T o t a l : 7 8 6 5 1 5 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 1 - 0 9 < b r / > T o t a l : 7 8 6 8 6 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 2 - 1 1 < b r / > T o t a l : 7 8 7 4 3 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 2 - 1 4 < b r / > T o t a l : 7 8 7 7 6 5 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 3 - 1 6 < b r / > T o t a l : 7 8 8 6 2 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 3 - 1 8 < b r / > T o t a l : 7 8 8 6 0 5 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 4 - 2 3 < b r / > T o t a l : 7 9 0 6 2 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 0 9 - 1 9 < b r / > T o t a l : 7 9 3 9 6 4 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 1 0 - 2 1 < b r / > T o t a l : 7 9 5 1 2 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 1 1 - 2 1 < b r / > T o t a l : 7 9 6 9 4 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 5 - 1 2 - 2 2 < b r / > T o t a l : 7 9 8 1 4 8 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 1 - 2 3 < b r / > T o t a l : 7 9 8 0 3 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 2 - 2 3 < b r / > T o t a l : 7 9 9 1 1 3 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 3 - 2 6 < b r / > T o t a l : 8 0 1 5 7 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 5 - 2 1 < b r / > T o t a l : 8 0 3 8 0 4 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 6 - 2 1 < b r / > T o t a l : 8 0 4 1 7 4 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 7 - 2 3 < b r / > T o t a l : 8 0 3 0 7 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 8 - 2 5 < b r / > T o t a l : 8 0 3 4 4 3 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 0 9 - 2 7 < b r / > T o t a l : 8 0 3 9 7 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 1 1 - 0 1 < b r / > T o t a l : 8 0 5 0 5 4 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 1 1 - 0 2 < b r / > T o t a l : 8 0 5 0 6 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 6 - 1 2 - 1 7 < b r / > T o t a l : 8 0 6 7 5 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 7 - 0 4 - 0 7 < b r / > T o t a l : 8 0 9 5 3 7 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 7 - 0 5 - 0 5 < b r / > T o t a l : 8 1 0 0 3 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 7 - 0 6 - 0 6 < b r / > T o t a l : 8 1 0 6 5 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 7 - 0 6 - 2 1 < b r / > T o t a l : 8 1 0 7 6 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 7 - 1 0 - 2 2 < b r / > T o t a l : 8 1 2 5 6 6 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 2 - 2 4 < b r / > T o t a l : 8 1 7 0 2 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 3 - 2 7 < b r / > T o t a l : 8 1 8 2 4 7 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 5 - 0 1 < b r / > T o t a l : 8 1 9 0 4 0 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 6 - 0 3 < b r / > T o t a l : 8 2 0 0 6 5 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 7 - 0 4 < b r / > T o t a l : 8 2 0 9 3 6 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 8 - 0 5 < b r / > T o t a l : 8 2 1 0 5 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 8 - 2 7 < b r / > T o t a l : 8 2 1 1 4 2 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 8 - 2 8 < b r / > T o t a l : 8 2 1 2 9 8 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 0 9 - 0 5 < b r / > T o t a l : 8 2 1 2 2 4 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 1 0 - 0 1 < b r / > T o t a l : 8 2 1 4 0 8 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 1 0 - 0 6 < b r / > T o t a l : 8 2 1 4 0 1 < b r / > s o u r c e _ n a m e : A E 7 Q " , " D a t e : 2 0 1 8 - 1 0 - 0 7 < b r / > T o t a l : 8 2 1 4 0 1 < b r /
< script type = "application/htmlwidget-sizing" data-for = "htmlwidget-b3baf35d3f25f188b807" > { "viewer" : { "width" : "100%" , "height" : 400 , "padding" : 0 , "fill" : true } , "browser" : { "width" : "100%" , "height" : 400 , "padding" : 0 , "fill" : true } } < / script >
2024-01-10 08:17:44 -06:00
< / body >
< / html >